// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. import { assert, assertEquals, assertThrows, deferred, delay, unitTest, } from "./test_util.ts"; unitTest( { ignore: Deno.build.os !== "windows" }, 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 === "windows", perms: { run: true, net: true } }, async function signalStreamTest(): Promise { const resolvable = deferred(); // This prevents the program from exiting. const t = setInterval(() => {}, 1000); let c = 0; const sig = Deno.signal(Deno.Signal.SIGUSR1); setTimeout(async () => { await delay(20); for (const _ of Array(3)) { // Sends SIGUSR1 3 times. Deno.kill(Deno.pid, Deno.Signal.SIGUSR1); await delay(20); } sig.dispose(); resolvable.resolve(); }); for await (const _ of sig) { c += 1; } assertEquals(c, 3); clearInterval(t); await resolvable; }, ); // This tests that pending op_signal_poll doesn't block the runtime from exiting the process. unitTest( { ignore: Deno.build.os === "windows", perms: { run: true, read: true } }, async function signalStreamExitTest(): Promise { const p = Deno.run({ cmd: [ Deno.execPath(), "eval", "--unstable", "(async () => { for await (const _ of Deno.signals.io()) {} })()", ], }); const res = await p.status(); assertEquals(res.code, 0); p.close(); }, ); unitTest( { ignore: Deno.build.os === "windows", perms: { run: true } }, async function signalPromiseTest(): Promise { const resolvable = deferred(); // 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); await resolvable; }, ); // https://github.com/denoland/deno/issues/9806 unitTest( { ignore: Deno.build.os === "windows", perms: { run: true } }, async function signalPromiseTest2(): Promise { const resolvable = deferred(); // This prevents the program from exiting. const t = setInterval(() => {}, 1000); let called = false; const sig = Deno.signal(Deno.Signal.SIGUSR1); sig.then(() => { called = true; }); setTimeout(() => { sig.dispose(); setTimeout(() => { resolvable.resolve(); }, 10); }, 10); clearInterval(t); await resolvable; // Promise callback is not called because it didn't get // the corresponding signal. assert(!called); }, ); unitTest( { ignore: Deno.build.os === "windows", 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(); }, );