summaryrefslogtreecommitdiff
path: root/cli/js/tests/signal_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'cli/js/tests/signal_test.ts')
-rw-r--r--cli/js/tests/signal_test.ts201
1 files changed, 201 insertions, 0 deletions
diff --git a/cli/js/tests/signal_test.ts b/cli/js/tests/signal_test.ts
new file mode 100644
index 000000000..e1d00c669
--- /dev/null
+++ b/cli/js/tests/signal_test.ts
@@ -0,0 +1,201 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+import {
+ unitTest,
+ assert,
+ assertEquals,
+ assertThrows,
+ createResolvable
+} from "./test_util.ts";
+
+function defer(n: number): Promise<void> {
+ return new Promise((resolve: () => void, _) => {
+ setTimeout(resolve, n);
+ });
+}
+
+unitTest(
+ { skip: Deno.build.os !== "win" },
+ async function signalsNotImplemented(): Promise<void> {
+ assertThrows(
+ () => {
+ Deno.signal(1);
+ },
+ Error,
+ "not implemented"
+ );
+ assertThrows(
+ () => {
+ Deno.signals.alarm(); // for SIGALRM
+ },
+ Error,
+ "not implemented"
+ );
+ assertThrows(
+ () => {
+ Deno.signals.child(); // for SIGCHLD
+ },
+ Error,
+ "not implemented"
+ );
+ assertThrows(
+ () => {
+ Deno.signals.hungup(); // for SIGHUP
+ },
+ Error,
+ "not implemented"
+ );
+ assertThrows(
+ () => {
+ Deno.signals.interrupt(); // for SIGINT
+ },
+ Error,
+ "not implemented"
+ );
+ assertThrows(
+ () => {
+ Deno.signals.io(); // for SIGIO
+ },
+ Error,
+ "not implemented"
+ );
+ assertThrows(
+ () => {
+ Deno.signals.pipe(); // for SIGPIPE
+ },
+ Error,
+ "not implemented"
+ );
+ assertThrows(
+ () => {
+ Deno.signals.quit(); // for SIGQUIT
+ },
+ Error,
+ "not implemented"
+ );
+ assertThrows(
+ () => {
+ Deno.signals.terminate(); // for SIGTERM
+ },
+ Error,
+ "not implemented"
+ );
+ assertThrows(
+ () => {
+ Deno.signals.userDefined1(); // for SIGUSR1
+ },
+ Error,
+ "not implemented"
+ );
+ assertThrows(
+ () => {
+ Deno.signals.userDefined2(); // for SIGURS2
+ },
+ Error,
+ "not implemented"
+ );
+ assertThrows(
+ () => {
+ Deno.signals.windowChange(); // for SIGWINCH
+ },
+ Error,
+ "not implemented"
+ );
+ }
+);
+
+unitTest(
+ { skip: Deno.build.os === "win", perms: { run: true, net: true } },
+ async function signalStreamTest(): Promise<void> {
+ const resolvable = createResolvable();
+ // This prevents the program from exiting.
+ const t = setInterval(() => {}, 1000);
+
+ let c = 0;
+ const sig = Deno.signal(Deno.Signal.SIGUSR1);
+ setTimeout(async () => {
+ await defer(20);
+ for (const _ of Array(3)) {
+ // Sends SIGUSR1 3 times.
+ Deno.kill(Deno.pid, Deno.Signal.SIGUSR1);
+ await defer(20);
+ }
+ sig.dispose();
+ resolvable.resolve();
+ });
+
+ for await (const _ of sig) {
+ c += 1;
+ }
+
+ assertEquals(c, 3);
+
+ clearInterval(t);
+ // Defer for a moment to allow async op from `setInterval` to resolve;
+ // for more explanation see `FIXME` in `cli/js/timers.ts::setGlobalTimeout`
+ await defer(20);
+ await resolvable;
+ }
+);
+
+unitTest(
+ { skip: Deno.build.os === "win", perms: { run: true } },
+ async function signalPromiseTest(): Promise<void> {
+ const resolvable = createResolvable();
+ // This prevents the program from exiting.
+ const t = setInterval(() => {}, 1000);
+
+ const sig = Deno.signal(Deno.Signal.SIGUSR1);
+ setTimeout(() => {
+ Deno.kill(Deno.pid, Deno.Signal.SIGUSR1);
+ resolvable.resolve();
+ }, 20);
+ await sig;
+ sig.dispose();
+
+ clearInterval(t);
+ // Defer for a moment to allow async op from `setInterval` to resolve;
+ // for more explanation see `FIXME` in `cli/js/timers.ts::setGlobalTimeout`
+ await defer(20);
+ await resolvable;
+ }
+);
+
+unitTest(
+ { skip: Deno.build.os === "win", perms: { run: true } },
+ async function signalShorthandsTest(): Promise<void> {
+ let s: Deno.SignalStream;
+ s = Deno.signals.alarm(); // for SIGALRM
+ assert(s instanceof Deno.SignalStream);
+ s.dispose();
+ s = Deno.signals.child(); // for SIGCHLD
+ assert(s instanceof Deno.SignalStream);
+ s.dispose();
+ s = Deno.signals.hungup(); // for SIGHUP
+ assert(s instanceof Deno.SignalStream);
+ s.dispose();
+ s = Deno.signals.interrupt(); // for SIGINT
+ assert(s instanceof Deno.SignalStream);
+ s.dispose();
+ s = Deno.signals.io(); // for SIGIO
+ assert(s instanceof Deno.SignalStream);
+ s.dispose();
+ s = Deno.signals.pipe(); // for SIGPIPE
+ assert(s instanceof Deno.SignalStream);
+ s.dispose();
+ s = Deno.signals.quit(); // for SIGQUIT
+ assert(s instanceof Deno.SignalStream);
+ s.dispose();
+ s = Deno.signals.terminate(); // for SIGTERM
+ assert(s instanceof Deno.SignalStream);
+ s.dispose();
+ s = Deno.signals.userDefined1(); // for SIGUSR1
+ assert(s instanceof Deno.SignalStream);
+ s.dispose();
+ s = Deno.signals.userDefined2(); // for SIGURS2
+ assert(s instanceof Deno.SignalStream);
+ s.dispose();
+ s = Deno.signals.windowChange(); // for SIGWINCH
+ assert(s instanceof Deno.SignalStream);
+ s.dispose();
+ }
+);