summaryrefslogtreecommitdiff
path: root/test/parallel/test-vm-sigint-existing-handler.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/parallel/test-vm-sigint-existing-handler.js')
-rw-r--r--test/parallel/test-vm-sigint-existing-handler.js77
1 files changed, 77 insertions, 0 deletions
diff --git a/test/parallel/test-vm-sigint-existing-handler.js b/test/parallel/test-vm-sigint-existing-handler.js
new file mode 100644
index 0000000000..e86bbeec0b
--- /dev/null
+++ b/test/parallel/test-vm-sigint-existing-handler.js
@@ -0,0 +1,77 @@
+'use strict';
+const common = require('../common');
+const assert = require('assert');
+const vm = require('vm');
+
+const spawn = require('child_process').spawn;
+
+if (process.platform === 'win32') {
+ // No way to send CTRL_C_EVENT to processes from JS right now.
+ common.skip('platform not supported');
+ return;
+}
+
+if (process.argv[2] === 'child') {
+ const parent = +process.env.REPL_TEST_PPID;
+ assert.ok(parent);
+
+ let firstHandlerCalled = 0;
+ process.on('SIGINT', common.mustCall(() => {
+ firstHandlerCalled++;
+ // Handler attached _before_ execution.
+ }, 2));
+
+ let onceHandlerCalled = 0;
+ process.once('SIGINT', common.mustCall(() => {
+ onceHandlerCalled++;
+ // Handler attached _before_ execution.
+ }));
+
+ assert.throws(() => {
+ vm.runInThisContext(`process.kill(${parent}, 'SIGUSR2'); while(true) {}`, {
+ breakOnSigint: true
+ });
+ }, /Script execution interrupted/);
+
+ assert.strictEqual(firstHandlerCalled, 0);
+ assert.strictEqual(onceHandlerCalled, 0);
+
+ // Keep the process alive for a while so that the second SIGINT can be caught.
+ const timeout = setTimeout(() => {}, 1000);
+
+ let afterHandlerCalled = 0;
+
+ process.on('SIGINT', common.mustCall(() => {
+ // Handler attached _after_ execution.
+ if (afterHandlerCalled++ == 0) {
+ // The first time it just bounces back to check that the `once()`
+ // handler is not called the second time.
+ process.kill(parent, 'SIGUSR2');
+ return;
+ }
+
+ assert.strictEqual(onceHandlerCalled, 1);
+ assert.strictEqual(firstHandlerCalled, 2);
+ timeout.unref();
+ }, 2));
+
+ process.kill(parent, 'SIGUSR2');
+
+ return;
+}
+
+process.env.REPL_TEST_PPID = process.pid;
+const child = spawn(process.execPath, [ __filename, 'child' ], {
+ stdio: [null, 'inherit', 'inherit']
+});
+
+process.on('SIGUSR2', common.mustCall(() => {
+ // First kill() breaks the while(true) loop, second one invokes the real
+ // signal handlers.
+ process.kill(child.pid, 'SIGINT');
+}, 3));
+
+child.on('close', function(code, signal) {
+ assert.strictEqual(signal, null);
+ assert.strictEqual(code, 0);
+});