1// Flags: --expose-internals
2'use strict';
3const common = require('../common');
4if (common.isWindows) {
5  // No way to send CTRL_C_EVENT to processes from JS right now.
6  common.skip('platform not supported');
7}
8
9const assert = require('assert');
10const { internalBinding } = require('internal/test/binding');
11const binding = internalBinding('contextify');
12
13[(next) => {
14  // Test with no signal observed.
15  binding.startSigintWatchdog();
16  const hadPendingSignals = binding.stopSigintWatchdog();
17  assert.strictEqual(hadPendingSignals, false);
18  next();
19},
20 (next) => {
21   // Test with one call to the watchdog, one signal.
22   binding.startSigintWatchdog();
23   process.kill(process.pid, 'SIGINT');
24   waitForPendingSignal(common.mustCall(() => {
25     const hadPendingSignals = binding.stopSigintWatchdog();
26     assert.strictEqual(hadPendingSignals, true);
27     next();
28   }));
29 },
30 (next) => {
31   // Nested calls are okay.
32   binding.startSigintWatchdog();
33   binding.startSigintWatchdog();
34   process.kill(process.pid, 'SIGINT');
35   waitForPendingSignal(common.mustCall(() => {
36     const hadPendingSignals1 = binding.stopSigintWatchdog();
37     const hadPendingSignals2 = binding.stopSigintWatchdog();
38     assert.strictEqual(hadPendingSignals1, true);
39     assert.strictEqual(hadPendingSignals2, false);
40     next();
41   }));
42 },
43 () => {
44   // Signal comes in after first call to stop.
45   binding.startSigintWatchdog();
46   binding.startSigintWatchdog();
47   const hadPendingSignals1 = binding.stopSigintWatchdog();
48   process.kill(process.pid, 'SIGINT');
49   waitForPendingSignal(common.mustCall(() => {
50     const hadPendingSignals2 = binding.stopSigintWatchdog();
51     assert.strictEqual(hadPendingSignals1, false);
52     assert.strictEqual(hadPendingSignals2, true);
53   }));
54 }].reduceRight((a, b) => common.mustCall(b).bind(null, a))();
55
56function waitForPendingSignal(cb) {
57  if (binding.watchdogHasPendingSigint())
58    cb();
59  else
60    setTimeout(waitForPendingSignal, 10, cb);
61}
62