-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathsetup-exit-signals.test.js
More file actions
116 lines (93 loc) · 2.92 KB
/
Copy pathsetup-exit-signals.test.js
File metadata and controls
116 lines (93 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
const webpack = require('@rspack/core');
const { RspackDevServer: Server } = require('@rspack/dev-server');
const config = require('../fixtures/simple-config/webpack.config');
const runBrowser = require('../helpers/run-browser');
const port = require('../helpers/ports-map')['setup-exit-signals-option'];
describe('setupExitSignals option', () => {
describe("should handle 'SIGINT' and 'SIGTERM' signals", () => {
let compiler;
let server;
let page;
let browser;
let pageErrors;
let consoleMessages;
let doExit;
let exitSpy;
let stopCallbackSpy;
let stdinResumeSpy;
let closeCallbackSpy;
const signals = ['SIGINT', 'SIGTERM'];
beforeEach(async () => {
compiler = webpack(config);
server = new Server(
{
setupExitSignals: true,
port,
},
compiler,
);
await server.start();
({ page, browser } = await runBrowser());
pageErrors = [];
consoleMessages = [];
doExit = false;
exitSpy = rs.spyOn(process, 'exit').mockImplementation(() => {
doExit = true;
});
stdinResumeSpy = rstest
.spyOn(process.stdin, 'resume')
.mockImplementation(() => {});
stopCallbackSpy = rs.spyOn(server, 'stopCallback');
if (server.compiler.close) {
closeCallbackSpy = rs.spyOn(server.compiler, 'close');
}
});
afterEach(async () => {
exitSpy.mockReset();
stdinResumeSpy.mockReset();
for (const signal of signals) {
process.removeAllListeners(signal);
}
process.stdin.removeAllListeners('end');
await browser.close();
await server.stop();
});
it.each(signals)('should close and exit on %s', async (signal) => {
page
.on('console', (message) => {
consoleMessages.push(message);
})
.on('pageerror', (error) => {
pageErrors.push(error);
});
const response = await page.goto(`http://127.0.0.1:${port}/`, {
waitUntil: 'networkidle0',
});
expect(response.status()).toMatchSnapshot('response status');
process.emit(signal);
await new Promise((resolve) => {
const interval = setInterval(() => {
if (doExit) {
expect(stopCallbackSpy.mock.calls.length).toEqual(1);
if (server.compiler.close) {
expect(closeCallbackSpy.mock.calls.length).toEqual(1);
}
clearInterval(interval);
resolve();
}
}, 100);
});
consoleMessages = consoleMessages.filter(
(message) =>
!(
message.text().includes('Trying to reconnect...') ||
message.text().includes('Disconnected')
),
);
expect(consoleMessages.map((message) => message.text())).toMatchSnapshot(
'console messages',
);
expect(pageErrors).toMatchSnapshot('page errors');
});
});
});