1// Flags: --experimental-abortcontroller 2'use strict'; 3 4const common = require('../common'); 5const assert = require('assert'); 6const { spawn } = require('child_process'); 7const fixtures = require('../common/fixtures'); 8 9const aliveScript = fixtures.path('child-process-stay-alive-forever.js'); 10{ 11 // Verify that passing an AbortSignal works 12 const controller = new AbortController(); 13 const { signal } = controller; 14 15 const cp = spawn(process.execPath, [aliveScript], { 16 signal, 17 }); 18 19 cp.on('exit', common.mustCall((code, killSignal) => { 20 assert.strictEqual(code, null); 21 assert.strictEqual(killSignal, 'SIGTERM'); 22 })); 23 24 cp.on('error', common.mustCall((e) => { 25 assert.strictEqual(e.name, 'AbortError'); 26 })); 27 28 controller.abort(); 29} 30 31{ 32 // Verify that passing an already-aborted signal works. 33 const controller = new AbortController(); 34 const { signal } = controller; 35 36 controller.abort(); 37 38 const cp = spawn(process.execPath, [aliveScript], { 39 signal, 40 }); 41 cp.on('exit', common.mustCall((code, killSignal) => { 42 assert.strictEqual(code, null); 43 assert.strictEqual(killSignal, 'SIGTERM'); 44 })); 45 46 cp.on('error', common.mustCall((e) => { 47 assert.strictEqual(e.name, 'AbortError'); 48 })); 49} 50 51{ 52 // Verify that waiting a bit and closing works 53 const controller = new AbortController(); 54 const { signal } = controller; 55 56 const cp = spawn(process.execPath, [aliveScript], { 57 signal, 58 }); 59 60 cp.on('exit', common.mustCall((code, killSignal) => { 61 assert.strictEqual(code, null); 62 assert.strictEqual(killSignal, 'SIGTERM'); 63 })); 64 65 cp.on('error', common.mustCall((e) => { 66 assert.strictEqual(e.name, 'AbortError'); 67 })); 68 69 setTimeout(() => controller.abort(), 1); 70} 71 72{ 73 // Test passing a different killSignal 74 const controller = new AbortController(); 75 const { signal } = controller; 76 77 const cp = spawn(process.execPath, [aliveScript], { 78 signal, 79 killSignal: 'SIGKILL', 80 }); 81 82 cp.on('exit', common.mustCall((code, killSignal) => { 83 assert.strictEqual(code, null); 84 assert.strictEqual(killSignal, 'SIGKILL'); 85 })); 86 87 cp.on('error', common.mustCall((e) => { 88 assert.strictEqual(e.name, 'AbortError'); 89 })); 90 91 setTimeout(() => controller.abort(), 1); 92} 93 94{ 95 // Test aborting a cp before close but after exit 96 const controller = new AbortController(); 97 const { signal } = controller; 98 99 const cp = spawn(process.execPath, [aliveScript], { 100 signal, 101 }); 102 103 cp.on('exit', common.mustCall(() => { 104 controller.abort(); 105 })); 106 107 cp.on('error', common.mustNotCall()); 108 109 setTimeout(() => cp.kill(), 1); 110} 111