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