2021-01-11 12:13:41 -05:00
|
|
|
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
|
2020-01-24 08:15:31 -05:00
|
|
|
import {
|
|
|
|
assert,
|
|
|
|
assertEquals,
|
2020-03-03 12:22:53 -05:00
|
|
|
assertThrows,
|
2020-11-26 11:22:36 -05:00
|
|
|
deferred,
|
2020-09-27 06:22:32 -04:00
|
|
|
unitTest,
|
2020-01-24 08:15:31 -05:00
|
|
|
} from "./test_util.ts";
|
|
|
|
|
|
|
|
function defer(n: number): Promise<void> {
|
2020-02-19 15:36:18 -05:00
|
|
|
return new Promise((resolve: () => void, _) => {
|
2020-01-24 08:15:31 -05:00
|
|
|
setTimeout(resolve, n);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-03-04 11:31:14 -05:00
|
|
|
unitTest(
|
2020-04-28 12:35:23 -04:00
|
|
|
{ ignore: Deno.build.os !== "windows" },
|
2020-03-20 09:38:34 -04:00
|
|
|
function signalsNotImplemented(): void {
|
2020-01-24 08:15:31 -05:00
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signal(1);
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signals.alarm(); // for SIGALRM
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signals.child(); // for SIGCHLD
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signals.hungup(); // for SIGHUP
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signals.interrupt(); // for SIGINT
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signals.io(); // for SIGIO
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signals.pipe(); // for SIGPIPE
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signals.quit(); // for SIGQUIT
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signals.terminate(); // for SIGTERM
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signals.userDefined1(); // for SIGUSR1
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signals.userDefined2(); // for SIGURS2
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
|
|
|
assertThrows(
|
|
|
|
() => {
|
|
|
|
Deno.signals.windowChange(); // for SIGWINCH
|
|
|
|
},
|
|
|
|
Error,
|
2020-07-14 15:24:17 -04:00
|
|
|
"not implemented",
|
2020-01-24 08:15:31 -05:00
|
|
|
);
|
2020-07-14 15:24:17 -04:00
|
|
|
},
|
2020-03-04 11:31:14 -05:00
|
|
|
);
|
|
|
|
|
|
|
|
unitTest(
|
2020-04-28 12:35:23 -04:00
|
|
|
{ ignore: Deno.build.os === "windows", perms: { run: true, net: true } },
|
2020-03-04 11:31:14 -05:00
|
|
|
async function signalStreamTest(): Promise<void> {
|
2020-11-26 11:22:36 -05:00
|
|
|
const resolvable = deferred();
|
2020-01-24 08:15:31 -05:00
|
|
|
// 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();
|
2020-03-03 12:22:53 -05:00
|
|
|
resolvable.resolve();
|
2020-01-24 08:15:31 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
for await (const _ of sig) {
|
|
|
|
c += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
assertEquals(c, 3);
|
|
|
|
|
2020-03-03 12:22:53 -05:00
|
|
|
clearInterval(t);
|
|
|
|
await resolvable;
|
2020-07-14 15:24:17 -04:00
|
|
|
},
|
2020-03-04 11:31:14 -05:00
|
|
|
);
|
2020-01-24 08:15:31 -05:00
|
|
|
|
2020-03-04 11:31:14 -05:00
|
|
|
unitTest(
|
2020-04-28 12:35:23 -04:00
|
|
|
{ ignore: Deno.build.os === "windows", perms: { run: true } },
|
2020-03-04 11:31:14 -05:00
|
|
|
async function signalPromiseTest(): Promise<void> {
|
2020-11-26 11:22:36 -05:00
|
|
|
const resolvable = deferred();
|
2020-03-03 12:22:53 -05:00
|
|
|
// This prevents the program from exiting.
|
|
|
|
const t = setInterval(() => {}, 1000);
|
2020-01-24 08:15:31 -05:00
|
|
|
|
2020-03-03 12:22:53 -05:00
|
|
|
const sig = Deno.signal(Deno.Signal.SIGUSR1);
|
|
|
|
setTimeout(() => {
|
|
|
|
Deno.kill(Deno.pid, Deno.Signal.SIGUSR1);
|
|
|
|
resolvable.resolve();
|
|
|
|
}, 20);
|
|
|
|
await sig;
|
|
|
|
sig.dispose();
|
2020-01-24 08:15:31 -05:00
|
|
|
|
2020-03-03 12:22:53 -05:00
|
|
|
clearInterval(t);
|
|
|
|
await resolvable;
|
2020-07-14 15:24:17 -04:00
|
|
|
},
|
2020-03-04 11:31:14 -05:00
|
|
|
);
|
2020-01-24 08:15:31 -05:00
|
|
|
|
2021-06-22 02:17:44 -04:00
|
|
|
// https://github.com/denoland/deno/issues/9806
|
|
|
|
unitTest(
|
|
|
|
{ ignore: Deno.build.os === "windows", perms: { run: true } },
|
|
|
|
async function signalPromiseTest2(): Promise<void> {
|
|
|
|
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);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
2020-03-04 11:31:14 -05:00
|
|
|
unitTest(
|
2020-04-28 12:35:23 -04:00
|
|
|
{ ignore: Deno.build.os === "windows", perms: { run: true } },
|
2020-03-20 09:38:34 -04:00
|
|
|
function signalShorthandsTest(): void {
|
2020-01-24 08:15:31 -05:00
|
|
|
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();
|
2020-07-14 15:24:17 -04:00
|
|
|
},
|
2020-03-04 11:31:14 -05:00
|
|
|
);
|