// 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 { return new Promise((resolve: () => void, _) => { setTimeout(resolve, n); }); } unitTest( { ignore: Deno.build.os !== "win" }, function signalsNotImplemented(): 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( { ignore: Deno.build.os === "win", perms: { run: true, net: true } }, async function signalStreamTest(): Promise { 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( { ignore: Deno.build.os === "win", perms: { run: true } }, async function signalPromiseTest(): Promise { 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( { ignore: Deno.build.os === "win", perms: { run: true } }, function signalShorthandsTest(): 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(); } );