summaryrefslogtreecommitdiff
path: root/js/test_util.ts
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2018-08-23 19:47:43 -0400
committerRyan Dahl <ry@tinyclouds.org>2018-08-27 17:51:24 -0400
commite13f3c10cac4fabff7e6cd4a4736703ca7c56d2d (patch)
treedf74f8c9fa5b917911b78cecb3c0bd450bbf79e5 /js/test_util.ts
parent722c7e4a1b5acda4472338f021f1a216ad9c6c08 (diff)
Add ability to unit test by permissions.
Diffstat (limited to 'js/test_util.ts')
-rw-r--r--js/test_util.ts70
1 files changed, 70 insertions, 0 deletions
diff --git a/js/test_util.ts b/js/test_util.ts
new file mode 100644
index 000000000..7124222a7
--- /dev/null
+++ b/js/test_util.ts
@@ -0,0 +1,70 @@
+// Copyright 2018 the Deno authors. All rights reserved. MIT license.
+//
+// We want to test many ops in deno which have different behavior depending on
+// the permissions set. These tests can specify which permissions they expect,
+// which appends a special string like "permW1N0" to the end of the test name.
+// Here we run several copies of deno with different permissions, filtering the
+// tests by the special string. permW0N0 means allow-write but not allow-net.
+// See tools/unit_tests.py for more details.
+
+import * as deno from "deno";
+import * as testing from "./testing/testing.ts";
+export { assert, assertEqual } from "./testing/testing.ts";
+
+// testing.setFilter must be run before any tests are defined.
+const permFilter = deno.argv[1];
+permFromString(permFilter);
+testing.setFilter(permFilter);
+
+interface DenoPermissions {
+ write?: boolean;
+ net?: boolean;
+}
+
+function permToString(perms: DenoPermissions): string {
+ const w = perms.write ? 1 : 0;
+ const n = perms.net ? 1 : 0;
+ return `permW${w}N${n}`;
+}
+
+function permFromString(s: string): DenoPermissions {
+ const re = /^permW([01])N([01])$/;
+ const found = s.match(re);
+ if (!found) {
+ throw Error("Not a permission string");
+ }
+ return {
+ write: Boolean(Number(found[1])),
+ net: Boolean(Number(found[2]))
+ };
+}
+
+export function testPerm(perms: DenoPermissions, fn: testing.TestFunction) {
+ const name = `${fn.name}_${permToString(perms)}`;
+ testing.test({ fn, name });
+}
+
+export function test(fn: testing.TestFunction) {
+ testPerm({ write: false, net: false }, fn);
+}
+
+test(function permSerialization() {
+ for (let write of [true, false]) {
+ for (let net of [true, false]) {
+ let perms: DenoPermissions = { write, net };
+ testing.assertEqual(perms, permFromString(permToString(perms)));
+ }
+ }
+});
+
+// To better catch internal errors, permFromString should throw if it gets an
+// invalid permission string.
+test(function permFromStringThrows() {
+ let threw = false;
+ try {
+ permFromString("bad");
+ } catch (e) {
+ threw = true;
+ }
+ testing.assert(threw);
+});