2024-01-01 14:58:21 -05:00
|
|
|
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
2019-06-25 12:05:41 -04:00
|
|
|
|
import {
|
|
|
|
|
assert,
|
|
|
|
|
assertEquals,
|
2019-12-15 00:14:20 -05:00
|
|
|
|
assertNotEquals,
|
2020-03-04 11:31:14 -05:00
|
|
|
|
assertThrows,
|
2019-06-25 12:05:41 -04:00
|
|
|
|
} from "./test_util.ts";
|
2018-08-30 13:49:24 -04:00
|
|
|
|
|
2021-11-23 11:45:18 -05:00
|
|
|
|
Deno.test({ permissions: { env: true } }, function envSuccess() {
|
2020-04-29 14:48:19 -04:00
|
|
|
|
Deno.env.set("TEST_VAR", "A");
|
|
|
|
|
const env = Deno.env.toObject();
|
|
|
|
|
Deno.env.set("TEST_VAR", "B");
|
|
|
|
|
assertEquals(env["TEST_VAR"], "A");
|
|
|
|
|
assertNotEquals(Deno.env.get("TEST_VAR"), env["TEST_VAR"]);
|
2018-08-31 07:51:12 -04:00
|
|
|
|
});
|
|
|
|
|
|
2021-11-23 11:45:18 -05:00
|
|
|
|
Deno.test({ permissions: { env: true } }, function envNotFound() {
|
2020-04-29 14:48:19 -04:00
|
|
|
|
const r = Deno.env.get("env_var_does_not_exist!");
|
2019-10-02 11:55:28 -04:00
|
|
|
|
assertEquals(r, undefined);
|
|
|
|
|
});
|
|
|
|
|
|
2021-11-23 11:45:18 -05:00
|
|
|
|
Deno.test({ permissions: { env: true } }, function deleteEnv() {
|
2020-06-09 08:58:30 -04:00
|
|
|
|
Deno.env.set("TEST_VAR", "A");
|
|
|
|
|
assertEquals(Deno.env.get("TEST_VAR"), "A");
|
|
|
|
|
assertEquals(Deno.env.delete("TEST_VAR"), undefined);
|
|
|
|
|
assertEquals(Deno.env.get("TEST_VAR"), undefined);
|
|
|
|
|
});
|
|
|
|
|
|
2023-01-09 14:19:55 -05:00
|
|
|
|
Deno.test({ permissions: { env: true } }, function hasEnv() {
|
|
|
|
|
Deno.env.set("TEST_VAR", "A");
|
|
|
|
|
assert(Deno.env.has("TEST_VAR"));
|
|
|
|
|
Deno.env.delete("TEST_VAR");
|
|
|
|
|
assert(!Deno.env.has("TEST_VAR"));
|
|
|
|
|
});
|
|
|
|
|
|
2021-11-23 11:45:18 -05:00
|
|
|
|
Deno.test({ permissions: { env: true } }, function avoidEmptyNamedEnv() {
|
2021-02-23 04:24:59 -05:00
|
|
|
|
assertThrows(() => Deno.env.set("", "v"), TypeError);
|
|
|
|
|
assertThrows(() => Deno.env.set("a=a", "v"), TypeError);
|
|
|
|
|
assertThrows(() => Deno.env.set("a\0a", "v"), TypeError);
|
|
|
|
|
assertThrows(() => Deno.env.set("TEST_VAR", "v\0v"), TypeError);
|
|
|
|
|
|
|
|
|
|
assertThrows(() => Deno.env.get(""), TypeError);
|
|
|
|
|
assertThrows(() => Deno.env.get("a=a"), TypeError);
|
|
|
|
|
assertThrows(() => Deno.env.get("a\0a"), TypeError);
|
|
|
|
|
|
|
|
|
|
assertThrows(() => Deno.env.delete(""), TypeError);
|
|
|
|
|
assertThrows(() => Deno.env.delete("a=a"), TypeError);
|
|
|
|
|
assertThrows(() => Deno.env.delete("a\0a"), TypeError);
|
|
|
|
|
});
|
|
|
|
|
|
2024-09-10 14:12:24 -04:00
|
|
|
|
Deno.test({ permissions: { env: false } }, function envPerm1() {
|
2020-06-24 18:57:08 -04:00
|
|
|
|
assertThrows(() => {
|
2020-04-29 14:48:19 -04:00
|
|
|
|
Deno.env.toObject();
|
2024-09-10 14:12:24 -04:00
|
|
|
|
}, Deno.errors.NotCapable);
|
2019-10-02 11:55:28 -04:00
|
|
|
|
});
|
2018-08-31 07:51:12 -04:00
|
|
|
|
|
2024-09-10 14:12:24 -04:00
|
|
|
|
Deno.test({ permissions: { env: false } }, function envPerm2() {
|
2020-06-24 18:57:08 -04:00
|
|
|
|
assertThrows(() => {
|
2020-04-29 14:48:19 -04:00
|
|
|
|
Deno.env.get("PATH");
|
2024-09-10 14:12:24 -04:00
|
|
|
|
}, Deno.errors.NotCapable);
|
2018-08-31 07:51:12 -04:00
|
|
|
|
});
|
2019-01-06 14:16:42 -05:00
|
|
|
|
|
2020-03-04 11:31:14 -05:00
|
|
|
|
// 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().
|
2021-11-23 11:45:18 -05:00
|
|
|
|
Deno.test(
|
2020-05-06 15:51:33 -04:00
|
|
|
|
{
|
|
|
|
|
ignore: Deno.build.os !== "windows",
|
2021-09-22 19:50:50 -04:00
|
|
|
|
permissions: { read: true, env: true, run: true },
|
2020-05-06 15:51:33 -04:00
|
|
|
|
},
|
2020-03-04 11:31:14 -05:00
|
|
|
|
async function envCaseInsensitive() {
|
2019-10-02 11:55:28 -04:00
|
|
|
|
// 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`.
|
2020-02-19 15:36:18 -05:00
|
|
|
|
const checkChildEnv = async (
|
|
|
|
|
inputEnv: Record<string, string>,
|
2020-07-14 15:24:17 -04:00
|
|
|
|
expectedEnv: Record<string, string>,
|
2021-08-05 07:08:58 -04:00
|
|
|
|
) => {
|
2019-10-02 11:55:28 -04:00
|
|
|
|
const src = `
|
2020-03-04 11:31:14 -05:00
|
|
|
|
console.log(
|
2024-09-16 16:39:37 -04:00
|
|
|
|
${
|
|
|
|
|
JSON.stringify(Object.keys(expectedEnv))
|
|
|
|
|
}.map(k => Deno.env.get(k) ?? null)
|
2020-03-04 11:31:14 -05:00
|
|
|
|
)`;
|
2022-12-02 08:43:17 -05:00
|
|
|
|
const { success, stdout } = await new Deno.Command(Deno.execPath(), {
|
2022-05-18 16:00:11 -04:00
|
|
|
|
args: ["eval", src],
|
2020-09-14 06:46:50 -04:00
|
|
|
|
env: { ...inputEnv, NO_COLOR: "1" },
|
2022-12-02 08:43:17 -05:00
|
|
|
|
}).output();
|
2022-07-18 09:16:12 -04:00
|
|
|
|
assertEquals(success, true);
|
2019-10-02 11:55:28 -04:00
|
|
|
|
const expectedValues = Object.values(expectedEnv);
|
2022-05-18 16:00:11 -04:00
|
|
|
|
const actualValues = JSON.parse(new TextDecoder().decode(stdout));
|
2019-10-02 11:55:28 -04:00
|
|
|
|
assertEquals(actualValues, expectedValues);
|
|
|
|
|
};
|
|
|
|
|
|
2020-04-29 14:48:19 -04:00
|
|
|
|
assertEquals(Deno.env.get("path"), Deno.env.get("PATH"));
|
|
|
|
|
assertEquals(Deno.env.get("Path"), Deno.env.get("PATH"));
|
2019-10-02 11:55:28 -04:00
|
|
|
|
|
|
|
|
|
// 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" },
|
2020-07-14 15:24:17 -04:00
|
|
|
|
{ [lc1]: "mu", [uc1]: "MU" },
|
2019-10-02 11:55:28 -04:00
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// 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" },
|
2020-07-14 15:24:17 -04:00
|
|
|
|
{ [c2]: "Dz", [lc2]: "dz", [uc2]: "dz" },
|
2019-10-02 11:55:28 -04:00
|
|
|
|
);
|
|
|
|
|
await checkChildEnv(
|
|
|
|
|
{ [c2]: "Dz", [uc2]: "DZ" },
|
2020-07-14 15:24:17 -04:00
|
|
|
|
{ [c2]: "Dz", [uc2]: "DZ", [lc2]: "DZ" },
|
2019-10-02 11:55:28 -04:00
|
|
|
|
);
|
2020-07-14 15:24:17 -04:00
|
|
|
|
},
|
2020-03-04 11:31:14 -05:00
|
|
|
|
);
|
2019-10-02 11:55:28 -04:00
|
|
|
|
|
2022-09-21 02:18:58 -04:00
|
|
|
|
Deno.test({ permissions: { env: true } }, function envInvalidChars() {
|
|
|
|
|
assertThrows(() => Deno.env.get(""), TypeError, "Key is an empty string");
|
|
|
|
|
assertThrows(
|
|
|
|
|
() => Deno.env.get("\0"),
|
|
|
|
|
TypeError,
|
|
|
|
|
'Key contains invalid characters: "\\0"',
|
|
|
|
|
);
|
|
|
|
|
assertThrows(
|
|
|
|
|
() => Deno.env.get("="),
|
|
|
|
|
TypeError,
|
|
|
|
|
'Key contains invalid characters: "="',
|
|
|
|
|
);
|
|
|
|
|
assertThrows(
|
|
|
|
|
() => Deno.env.set("", "foo"),
|
|
|
|
|
TypeError,
|
|
|
|
|
"Key is an empty string",
|
|
|
|
|
);
|
|
|
|
|
assertThrows(
|
|
|
|
|
() => Deno.env.set("\0", "foo"),
|
|
|
|
|
TypeError,
|
|
|
|
|
'Key contains invalid characters: "\\0"',
|
|
|
|
|
);
|
|
|
|
|
assertThrows(
|
|
|
|
|
() => Deno.env.set("=", "foo"),
|
|
|
|
|
TypeError,
|
|
|
|
|
'Key contains invalid characters: "="',
|
|
|
|
|
);
|
|
|
|
|
assertThrows(
|
|
|
|
|
() => Deno.env.set("foo", "\0"),
|
|
|
|
|
TypeError,
|
|
|
|
|
'Value contains invalid characters: "\\0"',
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
2021-11-23 11:45:18 -05:00
|
|
|
|
Deno.test(function osPid() {
|
2024-01-30 01:34:31 -05:00
|
|
|
|
assertEquals(typeof Deno.pid, "number");
|
2019-02-12 10:08:56 -05:00
|
|
|
|
assert(Deno.pid > 0);
|
2019-01-06 14:16:42 -05:00
|
|
|
|
});
|
2019-02-02 22:05:30 -05:00
|
|
|
|
|
2021-11-23 11:45:18 -05:00
|
|
|
|
Deno.test(function osPpid() {
|
2024-01-30 01:34:31 -05:00
|
|
|
|
assertEquals(typeof Deno.ppid, "number");
|
2020-07-08 10:35:45 -04:00
|
|
|
|
assert(Deno.ppid > 0);
|
|
|
|
|
});
|
|
|
|
|
|
2021-11-23 11:45:18 -05:00
|
|
|
|
Deno.test(
|
2021-09-22 19:50:50 -04:00
|
|
|
|
{ permissions: { run: true, read: true } },
|
2021-08-05 07:08:58 -04:00
|
|
|
|
async function osPpidIsEqualToPidOfParentProcess() {
|
2020-07-08 10:35:45 -04:00
|
|
|
|
const decoder = new TextDecoder();
|
2022-12-02 08:43:17 -05:00
|
|
|
|
const { stdout } = await new Deno.Command(Deno.execPath(), {
|
2024-09-10 07:28:59 -04:00
|
|
|
|
args: ["eval", "-p", "Deno.ppid"],
|
2020-07-08 10:35:45 -04:00
|
|
|
|
env: { NO_COLOR: "true" },
|
2022-12-02 08:43:17 -05:00
|
|
|
|
}).output();
|
2020-07-08 10:35:45 -04:00
|
|
|
|
|
|
|
|
|
const expected = Deno.pid;
|
2022-05-18 16:00:11 -04:00
|
|
|
|
const actual = parseInt(decoder.decode(stdout));
|
2020-07-08 10:35:45 -04:00
|
|
|
|
assertEquals(actual, expected);
|
2020-07-14 15:24:17 -04:00
|
|
|
|
},
|
2020-07-08 10:35:45 -04:00
|
|
|
|
);
|
|
|
|
|
|
2021-11-23 11:45:18 -05:00
|
|
|
|
Deno.test({ permissions: { read: true } }, function execPath() {
|
2019-08-06 17:05:47 -04:00
|
|
|
|
assertNotEquals(Deno.execPath(), "");
|
2019-08-03 21:34:13 -04:00
|
|
|
|
});
|
|
|
|
|
|
2021-11-23 11:45:18 -05:00
|
|
|
|
Deno.test({ permissions: { read: false } }, function execPathPerm() {
|
2020-05-29 11:27:43 -04:00
|
|
|
|
assertThrows(
|
|
|
|
|
() => {
|
|
|
|
|
Deno.execPath();
|
|
|
|
|
},
|
2024-09-10 14:12:24 -04:00
|
|
|
|
Deno.errors.NotCapable,
|
2021-03-17 17:45:12 -04:00
|
|
|
|
"Requires read access to <exec_path>, run again with the --allow-read flag",
|
2020-05-29 11:27:43 -04:00
|
|
|
|
);
|
2019-08-03 21:34:13 -04:00
|
|
|
|
});
|
2019-09-27 19:09:42 -04:00
|
|
|
|
|
2024-08-19 16:21:27 -04:00
|
|
|
|
Deno.test(
|
|
|
|
|
{
|
|
|
|
|
ignore: Deno.build.os !== "linux",
|
|
|
|
|
permissions: { read: true, run: false },
|
|
|
|
|
},
|
|
|
|
|
function procRequiresAllowAll() {
|
|
|
|
|
assertThrows(
|
|
|
|
|
() => {
|
|
|
|
|
Deno.readTextFileSync("/proc/net/dev");
|
|
|
|
|
},
|
2024-09-10 14:12:24 -04:00
|
|
|
|
Deno.errors.NotCapable,
|
2024-08-19 16:21:27 -04:00
|
|
|
|
`Requires all access to "/proc/net/dev", run again with the --allow-all flag`,
|
2024-08-19 13:45:10 -04:00
|
|
|
|
);
|
2024-08-19 16:21:27 -04:00
|
|
|
|
},
|
|
|
|
|
);
|
2024-08-19 13:45:10 -04:00
|
|
|
|
|
2022-09-28 08:46:50 -04:00
|
|
|
|
Deno.test(
|
|
|
|
|
{ permissions: { sys: ["loadavg"] } },
|
|
|
|
|
function loadavgSuccess() {
|
|
|
|
|
const load = Deno.loadavg();
|
|
|
|
|
assertEquals(load.length, 3);
|
|
|
|
|
},
|
|
|
|
|
);
|
2020-02-22 18:46:52 -05:00
|
|
|
|
|
2022-09-28 08:46:50 -04:00
|
|
|
|
Deno.test({ permissions: { sys: false } }, function loadavgPerm() {
|
2020-06-24 18:57:08 -04:00
|
|
|
|
assertThrows(() => {
|
2020-02-22 18:46:52 -05:00
|
|
|
|
Deno.loadavg();
|
2024-09-10 14:12:24 -04:00
|
|
|
|
}, Deno.errors.NotCapable);
|
2020-02-22 18:46:52 -05:00
|
|
|
|
});
|
|
|
|
|
|
2022-09-28 08:46:50 -04:00
|
|
|
|
Deno.test(
|
|
|
|
|
{ permissions: { sys: ["hostname"] } },
|
|
|
|
|
function hostnameDir() {
|
|
|
|
|
assertNotEquals(Deno.hostname(), "");
|
|
|
|
|
},
|
|
|
|
|
);
|
2019-09-27 19:09:42 -04:00
|
|
|
|
|
2022-11-03 15:00:53 -04:00
|
|
|
|
Deno.test(
|
|
|
|
|
{ permissions: { run: [Deno.execPath()], read: true } },
|
|
|
|
|
// See https://github.com/denoland/deno/issues/16527
|
|
|
|
|
async function hostnameWithoutOtherNetworkUsages() {
|
2022-12-02 08:43:17 -05:00
|
|
|
|
const { stdout } = await new Deno.Command(Deno.execPath(), {
|
2022-11-03 15:00:53 -04:00
|
|
|
|
args: ["eval", "-p", "Deno.hostname()"],
|
2024-08-28 21:11:37 -04:00
|
|
|
|
env: {
|
|
|
|
|
LD_PRELOAD: "",
|
|
|
|
|
LD_LIBRARY_PATH: "",
|
|
|
|
|
DYLD_FALLBACK_LIBRARY_PATH: "",
|
|
|
|
|
},
|
2022-12-02 08:43:17 -05:00
|
|
|
|
}).output();
|
2022-11-03 15:00:53 -04:00
|
|
|
|
const hostname = new TextDecoder().decode(stdout).trim();
|
|
|
|
|
assert(hostname.length > 0);
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
2022-09-28 08:46:50 -04:00
|
|
|
|
Deno.test({ permissions: { sys: false } }, function hostnamePerm() {
|
2020-06-24 18:57:08 -04:00
|
|
|
|
assertThrows(() => {
|
2019-09-27 19:09:42 -04:00
|
|
|
|
Deno.hostname();
|
2024-09-10 14:12:24 -04:00
|
|
|
|
}, Deno.errors.NotCapable);
|
2019-09-27 19:09:42 -04:00
|
|
|
|
});
|
2020-02-24 08:35:45 -05:00
|
|
|
|
|
2022-09-28 08:46:50 -04:00
|
|
|
|
Deno.test(
|
|
|
|
|
{ permissions: { sys: ["osRelease"] } },
|
|
|
|
|
function releaseDir() {
|
|
|
|
|
assertNotEquals(Deno.osRelease(), "");
|
|
|
|
|
},
|
|
|
|
|
);
|
2020-02-24 08:35:45 -05:00
|
|
|
|
|
2022-09-28 08:46:50 -04:00
|
|
|
|
Deno.test({ permissions: { sys: false } }, function releasePerm() {
|
2020-06-24 18:57:08 -04:00
|
|
|
|
assertThrows(() => {
|
2020-02-24 08:35:45 -05:00
|
|
|
|
Deno.osRelease();
|
2024-09-10 14:12:24 -04:00
|
|
|
|
}, Deno.errors.NotCapable);
|
2020-02-24 08:35:45 -05:00
|
|
|
|
});
|
2020-09-10 04:38:17 -04:00
|
|
|
|
|
2022-12-26 18:16:12 -05:00
|
|
|
|
Deno.test({ permissions: { sys: ["osUptime"] } }, function osUptime() {
|
|
|
|
|
const uptime = Deno.osUptime();
|
|
|
|
|
assert(typeof uptime === "number");
|
|
|
|
|
assert(uptime > 0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Deno.test({ permissions: { sys: false } }, function osUptimePerm() {
|
|
|
|
|
assertThrows(() => {
|
|
|
|
|
Deno.osUptime();
|
2024-09-10 14:12:24 -04:00
|
|
|
|
}, Deno.errors.NotCapable);
|
2022-12-26 18:16:12 -05:00
|
|
|
|
});
|
|
|
|
|
|
2022-09-28 08:46:50 -04:00
|
|
|
|
Deno.test(
|
|
|
|
|
{ permissions: { sys: ["systemMemoryInfo"] } },
|
|
|
|
|
function systemMemoryInfo() {
|
|
|
|
|
const info = Deno.systemMemoryInfo();
|
|
|
|
|
assert(info.total >= 0);
|
|
|
|
|
assert(info.free >= 0);
|
|
|
|
|
assert(info.available >= 0);
|
|
|
|
|
assert(info.buffers >= 0);
|
|
|
|
|
assert(info.cached >= 0);
|
|
|
|
|
assert(info.swapTotal >= 0);
|
|
|
|
|
assert(info.swapFree >= 0);
|
|
|
|
|
},
|
|
|
|
|
);
|
2022-01-31 00:44:19 -05:00
|
|
|
|
|
2022-10-26 16:37:48 -04:00
|
|
|
|
Deno.test({ permissions: { sys: ["uid"] } }, function getUid() {
|
2022-01-31 00:44:19 -05:00
|
|
|
|
if (Deno.build.os === "windows") {
|
2022-10-26 16:37:48 -04:00
|
|
|
|
assertEquals(Deno.uid(), null);
|
2022-01-31 00:44:19 -05:00
|
|
|
|
} else {
|
2022-10-26 16:37:48 -04:00
|
|
|
|
const uid = Deno.uid();
|
2022-01-31 00:44:19 -05:00
|
|
|
|
assert(typeof uid === "number");
|
|
|
|
|
assert(uid > 0);
|
|
|
|
|
}
|
|
|
|
|
});
|
2022-05-31 04:42:44 -04:00
|
|
|
|
|
2022-10-26 16:37:48 -04:00
|
|
|
|
Deno.test({ permissions: { sys: ["gid"] } }, function getGid() {
|
2022-05-31 04:42:44 -04:00
|
|
|
|
if (Deno.build.os === "windows") {
|
2022-10-26 16:37:48 -04:00
|
|
|
|
assertEquals(Deno.gid(), null);
|
2022-05-31 04:42:44 -04:00
|
|
|
|
} else {
|
2022-10-26 16:37:48 -04:00
|
|
|
|
const gid = Deno.gid();
|
2022-05-31 04:42:44 -04:00
|
|
|
|
assert(typeof gid === "number");
|
|
|
|
|
assert(gid > 0);
|
|
|
|
|
}
|
|
|
|
|
});
|
2022-12-17 17:25:51 -05:00
|
|
|
|
|
|
|
|
|
Deno.test(function memoryUsage() {
|
|
|
|
|
const mem = Deno.memoryUsage();
|
|
|
|
|
assert(typeof mem.rss === "number");
|
|
|
|
|
assert(typeof mem.heapTotal === "number");
|
|
|
|
|
assert(typeof mem.heapUsed === "number");
|
|
|
|
|
assert(typeof mem.external === "number");
|
|
|
|
|
assert(mem.rss >= mem.heapTotal);
|
|
|
|
|
});
|
2024-06-02 21:29:01 -04:00
|
|
|
|
|
|
|
|
|
Deno.test("Deno.exitCode getter and setter", () => {
|
|
|
|
|
// Initial value is 0
|
|
|
|
|
assertEquals(Deno.exitCode, 0);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// Set a new value
|
|
|
|
|
Deno.exitCode = 5;
|
|
|
|
|
assertEquals(Deno.exitCode, 5);
|
|
|
|
|
} finally {
|
|
|
|
|
// Reset to initial value
|
|
|
|
|
Deno.exitCode = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assertEquals(Deno.exitCode, 0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Deno.test("Setting Deno.exitCode to non-number throws TypeError", () => {
|
|
|
|
|
// Throws on non-number values
|
|
|
|
|
assertThrows(
|
|
|
|
|
() => {
|
|
|
|
|
// @ts-expect-error Testing for runtime error
|
|
|
|
|
Deno.exitCode = "123";
|
|
|
|
|
},
|
|
|
|
|
TypeError,
|
|
|
|
|
"Exit code must be a number, got: 123 (string)",
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Throws on bigint values
|
|
|
|
|
assertThrows(
|
|
|
|
|
() => {
|
|
|
|
|
// @ts-expect-error Testing for runtime error
|
|
|
|
|
Deno.exitCode = 1n;
|
|
|
|
|
},
|
|
|
|
|
TypeError,
|
|
|
|
|
"Exit code must be a number, got: 1 (bigint)",
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Deno.test("Setting Deno.exitCode to non-integer throws RangeError", () => {
|
|
|
|
|
// Throws on non-integer values
|
|
|
|
|
assertThrows(
|
|
|
|
|
() => {
|
|
|
|
|
Deno.exitCode = 3.14;
|
|
|
|
|
},
|
|
|
|
|
RangeError,
|
|
|
|
|
"Exit code must be an integer, got: 3.14",
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Deno.test("Setting Deno.exitCode does not cause an immediate exit", () => {
|
|
|
|
|
let exited = false;
|
|
|
|
|
|
|
|
|
|
const originalExit = Deno.exit;
|
|
|
|
|
// @ts-expect-error; read-only
|
|
|
|
|
Deno.exit = () => {
|
|
|
|
|
exited = true;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
Deno.exitCode = 1;
|
|
|
|
|
assertEquals(exited, false);
|
|
|
|
|
} finally {
|
|
|
|
|
Deno.exit = originalExit;
|
|
|
|
|
Deno.exitCode = 0;
|
|
|
|
|
}
|
|
|
|
|
});
|