mirror of
https://github.com/denoland/deno.git
synced 2024-12-23 07:44:48 -05:00
9ab03389f0
Co-authored-by: Greg Altman <g.s.altman@gmail.com>
89 lines
2.5 KiB
TypeScript
89 lines
2.5 KiB
TypeScript
// Copyright 2018-2019 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 "./deps/https/deno.land/x/std/testing/mod.ts";
|
|
export {
|
|
assert,
|
|
assertEqual
|
|
} from "./deps/https/deno.land/x/std/testing/mod.ts";
|
|
|
|
// testing.setFilter must be run before any tests are defined.
|
|
testing.setFilter(deno.args[1]);
|
|
|
|
interface DenoPermissions {
|
|
read?: boolean;
|
|
write?: boolean;
|
|
net?: boolean;
|
|
env?: boolean;
|
|
run?: boolean;
|
|
}
|
|
|
|
function permToString(perms: DenoPermissions): string {
|
|
const r = perms.read ? 1 : 0;
|
|
const w = perms.write ? 1 : 0;
|
|
const n = perms.net ? 1 : 0;
|
|
const e = perms.env ? 1 : 0;
|
|
const u = perms.run ? 1 : 0;
|
|
return `permR${r}W${w}N${n}E${e}U${u}`;
|
|
}
|
|
|
|
function permFromString(s: string): DenoPermissions {
|
|
const re = /^permR([01])W([01])N([01])E([01])U([01])$/;
|
|
const found = s.match(re);
|
|
if (!found) {
|
|
throw Error("Not a permission string");
|
|
}
|
|
return {
|
|
read: Boolean(Number(found[1])),
|
|
write: Boolean(Number(found[2])),
|
|
net: Boolean(Number(found[3])),
|
|
env: Boolean(Number(found[4])),
|
|
run: Boolean(Number(found[5]))
|
|
};
|
|
}
|
|
|
|
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(
|
|
{ read: false, write: false, net: false, env: false, run: false },
|
|
fn
|
|
);
|
|
}
|
|
|
|
test(function permSerialization() {
|
|
for (const write of [true, false]) {
|
|
for (const net of [true, false]) {
|
|
for (const env of [true, false]) {
|
|
for (const run of [true, false]) {
|
|
for (const read of [true, false]) {
|
|
const perms: DenoPermissions = { write, net, env, run, read };
|
|
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);
|
|
});
|