summaryrefslogtreecommitdiff
path: root/js/os_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'js/os_test.ts')
-rw-r--r--js/os_test.ts91
1 files changed, 84 insertions, 7 deletions
diff --git a/js/os_test.ts b/js/os_test.ts
index ad3772631..0d07df1b4 100644
--- a/js/os_test.ts
+++ b/js/os_test.ts
@@ -14,21 +14,98 @@ testPerm({ env: true }, function envSuccess(): void {
env.test_var = "Hello World";
const newEnv = Deno.env();
assertEquals(env.test_var, newEnv.test_var);
+ assertEquals(Deno.env("test_var"), env.test_var);
});
-test(function envFailure(): void {
- let caughtError = false;
+testPerm({ env: true }, function envNotFound(): void {
+ const r = Deno.env("env_var_does_not_exist!");
+ assertEquals(r, undefined);
+});
+
+test(function envPermissionDenied1(): void {
+ let err;
try {
Deno.env();
- } catch (err) {
- caughtError = true;
- assertEquals(err.kind, Deno.ErrorKind.PermissionDenied);
- assertEquals(err.name, "PermissionDenied");
+ } catch (e) {
+ err = e;
}
+ assertNotEquals(err, undefined);
+ assertEquals(err.kind, Deno.ErrorKind.PermissionDenied);
+ assertEquals(err.name, "PermissionDenied");
+});
- assert(caughtError);
+test(function envPermissionDenied2(): void {
+ let err;
+ try {
+ Deno.env("PATH");
+ } catch (e) {
+ err = e;
+ }
+ assertNotEquals(err, undefined);
+ assertEquals(err.kind, Deno.ErrorKind.PermissionDenied);
+ assertEquals(err.name, "PermissionDenied");
});
+if (Deno.build.os === "win") {
+ // This test verifies that on Windows, environment variables are
+ // case-insensitive. Case normalization needs be done using the collation
+ // that Windows uses, rather than naively using String.toLowerCase().
+ testPerm({ env: true, run: true }, async function envCaseInsensitive() {
+ // Utility function that runs a Deno subprocess with the environment
+ // specified in `inputEnv`. The subprocess reads the environment variables
+ // which are in the keys of `expectedEnv` and writes them to stdout as JSON.
+ // It is then verified that these match with the values of `expectedEnv`.
+ const checkChildEnv = async (inputEnv, expectedEnv): Promise<void> => {
+ const src = `
+ console.log(
+ ${JSON.stringify(Object.keys(expectedEnv))}.map(k => Deno.env(k))
+ )`;
+ const proc = Deno.run({
+ args: [Deno.execPath(), "eval", src],
+ env: inputEnv,
+ stdout: "piped"
+ });
+ const status = await proc.status();
+ assertEquals(status.success, true);
+ const expectedValues = Object.values(expectedEnv);
+ const actualValues = JSON.parse(
+ new TextDecoder().decode(await proc.output())
+ );
+ assertEquals(actualValues, expectedValues);
+ };
+
+ assertEquals(Deno.env("path"), Deno.env("PATH"));
+ assertEquals(Deno.env("Path"), Deno.env("PATH"));
+
+ // Check 'foo', 'Foo' and 'Foo' are case folded.
+ await checkChildEnv({ foo: "X" }, { foo: "X", Foo: "X", FOO: "X" });
+
+ // Check that 'µ' and 'Μ' are not case folded.
+ const lc1 = "µ";
+ const uc1 = lc1.toUpperCase();
+ assertNotEquals(lc1, uc1);
+ await checkChildEnv(
+ { [lc1]: "mu", [uc1]: "MU" },
+ { [lc1]: "mu", [uc1]: "MU" }
+ );
+
+ // Check that 'dž' and 'DŽ' are folded, but 'Dž' is preserved.
+ const c2 = "Dž";
+ const lc2 = c2.toLowerCase();
+ const uc2 = c2.toUpperCase();
+ assertNotEquals(c2, lc2);
+ assertNotEquals(c2, uc2);
+ await checkChildEnv(
+ { [c2]: "Dz", [lc2]: "dz" },
+ { [c2]: "Dz", [lc2]: "dz", [uc2]: "dz" }
+ );
+ await checkChildEnv(
+ { [c2]: "Dz", [uc2]: "DZ" },
+ { [c2]: "Dz", [uc2]: "DZ", [lc2]: "DZ" }
+ );
+ });
+}
+
test(function osPid(): void {
console.log("pid", Deno.pid);
assert(Deno.pid > 0);