• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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