Skip to content

Commit 05bdb0c

Browse files
knagaitsevevilebottnawi
authored andcommitted
test(e2e): improve puppeteer argument flags (#2127)
1 parent 75718b7 commit 05bdb0c

15 files changed

+321
-124
lines changed

jest.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ module.exports = {
88
testMatch: ['**/test/**/*.test.js'],
99
setupFilesAfterEnv: ['<rootDir>/setupTest.js'],
1010
globalSetup: '<rootDir>/globalSetupTest.js',
11+
testSequencer: '<rootDir>/test/testSequencer.js',
1112
};

lib/servers/SockJSServer.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ module.exports = class SockJSServer extends BaseServer {
4949
}
5050

5151
send(connection, message) {
52+
// prevent cases where the server is trying to send data while connection is closing
53+
if (connection.readyState !== 1) {
54+
return;
55+
}
56+
5257
connection.write(message);
5358
}
5459

lib/servers/WebsocketServer.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ module.exports = class WebsocketServer extends BaseServer {
2020
}
2121

2222
send(connection, message) {
23+
// prevent cases where the server is trying to send data while connection is closing
24+
if (connection.readyState !== 1) {
25+
return;
26+
}
27+
2328
connection.send(message);
2429
}
2530

test/e2e/Client.test.js

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
/**
2+
* @jest-environment node
3+
*/
4+
15
'use strict';
26

37
/* eslint-disable
@@ -9,6 +13,10 @@ const testServer = require('../helpers/test-server');
913
const reloadConfig = require('../fixtures/reload-config/webpack.config');
1014
const runBrowser = require('../helpers/run-browser');
1115
const port = require('../ports-map').Client;
16+
const {
17+
reloadReadyDelay,
18+
completeReloadDelay,
19+
} = require('../helpers/puppeteer-constants');
1220

1321
const cssFilePath = resolve(__dirname, '../fixtures/reload-config/main.css');
1422

@@ -53,7 +61,7 @@ describe('reload', () => {
5361
host: '0.0.0.0',
5462
inline: true,
5563
watchOptions: {
56-
poll: 500,
64+
poll: true,
5765
},
5866
},
5967
mode.options
@@ -91,27 +99,29 @@ describe('reload', () => {
9199
}
92100
req.continue();
93101
});
94-
fs.writeFileSync(
95-
cssFilePath,
96-
'body { background-color: rgb(255, 0, 0); }'
97-
);
98-
page.waitFor(10000).then(() => {
99-
page
100-
.evaluate(() => {
101-
const body = document.body;
102-
const bgColor = getComputedStyle(body)[
103-
'background-color'
104-
];
105-
return bgColor;
106-
})
107-
.then((color2) => {
108-
browser.close().then(() => {
109-
expect(color).toEqual('rgb(0, 0, 255)');
110-
expect(color2).toEqual('rgb(255, 0, 0)');
111-
expect(refreshed).toEqual(mode.shouldRefresh);
112-
done();
102+
page.waitFor(reloadReadyDelay).then(() => {
103+
fs.writeFileSync(
104+
cssFilePath,
105+
'body { background-color: rgb(255, 0, 0); }'
106+
);
107+
page.waitFor(completeReloadDelay).then(() => {
108+
page
109+
.evaluate(() => {
110+
const body = document.body;
111+
const bgColor = getComputedStyle(body)[
112+
'background-color'
113+
];
114+
return bgColor;
115+
})
116+
.then((color2) => {
117+
browser.close().then(() => {
118+
expect(color).toEqual('rgb(0, 0, 255)');
119+
expect(color2).toEqual('rgb(255, 0, 0)');
120+
expect(refreshed).toEqual(mode.shouldRefresh);
121+
done();
122+
});
113123
});
114-
});
124+
});
115125
});
116126
});
117127
});

test/e2e/ClientMode.test.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ const testServer = require('../helpers/test-server');
44
const config = require('../fixtures/client-config/webpack.config');
55
const runBrowser = require('../helpers/run-browser');
66
const port = require('../ports-map').ClientMode;
7+
const {
8+
initConsoleDelay,
9+
awaitServerCloseDelay,
10+
} = require('../helpers/puppeteer-constants');
711

812
describe('clientMode', () => {
913
const modes = [
@@ -54,17 +58,29 @@ describe('clientMode', () => {
5458
res.push(_text);
5559
});
5660

57-
setTimeout(() => {
61+
page.waitFor(initConsoleDelay).then(() => {
5862
testServer.close(() => {
5963
// make sure the client gets the close message
60-
setTimeout(() => {
64+
page.waitFor(awaitServerCloseDelay).then(() => {
6165
browser.close().then(() => {
66+
for (let i = res.length - 1; i >= 0; i--) {
67+
if (res[i] === '[WDS] Disconnected!') {
68+
break;
69+
} else if (
70+
res[i] === 'close' ||
71+
res[i].includes('net::ERR_CONNECTION_REFUSED')
72+
) {
73+
// remove additional logging for the now failing connection,
74+
// since this could be a variable number of error messages
75+
res.splice(i, 1);
76+
}
77+
}
6278
expect(res).toMatchSnapshot();
6379
done();
6480
});
65-
}, 1000);
81+
});
6682
});
67-
}, 3000);
83+
});
6884
});
6985
});
7086
});

test/e2e/ClientOptions.test.js

Lines changed: 65 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const testServer = require('../helpers/test-server');
77
const config = require('../fixtures/client-config/webpack.config');
88
const runBrowser = require('../helpers/run-browser');
99
const [port1, port2, port3] = require('../ports-map').ClientOptions;
10+
const { beforeBrowserCloseDelay } = require('../helpers/puppeteer-constants');
1011

1112
describe('Client code', () => {
1213
function startProxy(port) {
@@ -70,13 +71,15 @@ describe('Client code', () => {
7071
page
7172
.waitForRequest((requestObj) => requestObj.url().match(/sockjs-node/))
7273
.then((requestObj) => {
73-
browser.close().then(() => {
74-
expect(
75-
requestObj
76-
.url()
77-
.includes(`http://localhost:${port1}/sockjs-node`)
78-
).toBeTruthy();
79-
done();
74+
page.waitFor(beforeBrowserCloseDelay).then(() => {
75+
browser.close().then(() => {
76+
expect(
77+
requestObj
78+
.url()
79+
.includes(`http://localhost:${port1}/sockjs-node`)
80+
).toBeTruthy();
81+
done();
82+
});
8083
});
8184
});
8285
page.goto(`http://localhost:${port2}/main`);
@@ -111,13 +114,15 @@ describe('Client complex inline script path', () => {
111114
requestObj.url().match(/foo\/test\/bar/)
112115
)
113116
.then((requestObj) => {
114-
browser.close().then(() => {
115-
expect(
116-
requestObj
117-
.url()
118-
.includes(`http://myhost.test:${port2}/foo/test/bar/`)
119-
).toBeTruthy();
120-
done();
117+
page.waitFor(beforeBrowserCloseDelay).then(() => {
118+
browser.close().then(() => {
119+
expect(
120+
requestObj
121+
.url()
122+
.includes(`http://myhost.test:${port2}/foo/test/bar/`)
123+
).toBeTruthy();
124+
done();
125+
});
121126
});
122127
});
123128
page.goto(`http://localhost:${port2}/main`);
@@ -152,13 +157,15 @@ describe('Client complex inline script path with sockPort', () => {
152157
requestObj.url().match(/foo\/test\/bar/)
153158
)
154159
.then((requestObj) => {
155-
browser.close().then(() => {
156-
expect(
157-
requestObj
158-
.url()
159-
.includes(`http://localhost:${port3}/foo/test/bar`)
160-
).toBeTruthy();
161-
done();
160+
page.waitFor(beforeBrowserCloseDelay).then(() => {
161+
browser.close().then(() => {
162+
expect(
163+
requestObj
164+
.url()
165+
.includes(`http://localhost:${port3}/foo/test/bar`)
166+
).toBeTruthy();
167+
done();
168+
});
162169
});
163170
});
164171

@@ -194,13 +201,15 @@ describe('Client complex inline script path with sockPort, no sockPath', () => {
194201
page
195202
.waitForRequest((requestObj) => requestObj.url().match(/sockjs-node/))
196203
.then((requestObj) => {
197-
browser.close().then(() => {
198-
expect(
199-
requestObj
200-
.url()
201-
.includes(`http://localhost:${port3}/sockjs-node`)
202-
).toBeTruthy();
203-
done();
204+
page.waitFor(beforeBrowserCloseDelay).then(() => {
205+
browser.close().then(() => {
206+
expect(
207+
requestObj
208+
.url()
209+
.includes(`http://localhost:${port3}/sockjs-node`)
210+
).toBeTruthy();
211+
done();
212+
});
204213
});
205214
});
206215
page.goto(`http://localhost:${port2}/main`);
@@ -232,13 +241,15 @@ describe('Client complex inline script path with sockHost', () => {
232241
page
233242
.waitForRequest((requestObj) => requestObj.url().match(/sockjs-node/))
234243
.then((requestObj) => {
235-
browser.close().then(() => {
236-
expect(
237-
requestObj
238-
.url()
239-
.includes(`http://myhost.test:${port2}/sockjs-node`)
240-
).toBeTruthy();
241-
done();
244+
page.waitFor(beforeBrowserCloseDelay).then(() => {
245+
browser.close().then(() => {
246+
expect(
247+
requestObj
248+
.url()
249+
.includes(`http://myhost.test:${port2}/sockjs-node`)
250+
).toBeTruthy();
251+
done();
252+
});
242253
});
243254
});
244255
page.goto(`http://localhost:${port2}/main`);
@@ -286,38 +297,47 @@ describe('Client console.log', () => {
286297
},
287298
];
288299

289-
for (const { title, options } of cases) {
290-
it(title, () => {
300+
cases.forEach(({ title, options }) => {
301+
it(title, (done) => {
291302
const res = [];
292303
const testOptions = Object.assign({}, baseOptions, options);
293304

294305
// TODO: use async/await when Node.js v6 support is dropped
295-
return Promise.resolve()
306+
Promise.resolve()
296307
.then(() => {
297308
return new Promise((resolve) => {
298309
testServer.startAwaitingCompilation(config, testOptions, resolve);
299310
});
300311
})
301-
.then(runBrowser)
312+
.then(() => {
313+
// make sure the previous Promise is not passing along strange arguments to runBrowser
314+
return runBrowser();
315+
})
302316
.then(({ page, browser }) => {
303317
return new Promise((resolve) => {
304318
page.goto(`http://localhost:${port2}/main`);
305319
page.on('console', ({ _text }) => {
306320
res.push(_text);
307321
});
308-
setTimeout(() => {
309-
browser.close().then(() => {
310-
expect(res).toMatchSnapshot();
311-
resolve();
322+
// wait for load before closing the browser
323+
page.waitForNavigation({ waitUntil: 'load' }).then(() => {
324+
page.waitFor(beforeBrowserCloseDelay).then(() => {
325+
browser.close().then(() => {
326+
resolve();
327+
});
312328
});
313-
}, 1000);
329+
});
314330
});
315331
})
316332
.then(() => {
317333
return new Promise((resolve) => {
318334
testServer.close(resolve);
319335
});
336+
})
337+
.then(() => {
338+
expect(res).toMatchSnapshot();
339+
done();
320340
});
321341
});
322-
}
342+
});
323343
});

test/e2e/Iframe.test.js

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const testServer = require('../helpers/test-server');
44
const config = require('../fixtures/client-config/webpack.config');
55
const runBrowser = require('../helpers/run-browser');
66
const port = require('../ports-map').Iframe;
7+
const { beforeBrowserCloseDelay } = require('../helpers/puppeteer-constants');
78

89
// iframe mode should be tested while still supported, because
910
// its sources differ from those of inline mode, which can cause unexpected
@@ -46,38 +47,46 @@ describe('Client iframe console.log', () => {
4647
},
4748
];
4849

49-
for (const { title, options } of cases) {
50-
it(title, () => {
50+
cases.forEach(({ title, options }) => {
51+
it(title, (done) => {
5152
const res = [];
5253
const testOptions = Object.assign({}, baseOptions, options);
5354

5455
// TODO: use async/await when Node.js v6 support is dropped
55-
return Promise.resolve()
56+
Promise.resolve()
5657
.then(() => {
5758
return new Promise((resolve) => {
5859
testServer.startAwaitingCompilation(config, testOptions, resolve);
5960
});
6061
})
61-
.then(runBrowser)
62+
.then(() => {
63+
// make sure the previous Promise is not passing along strange arguments to runBrowser
64+
return runBrowser();
65+
})
6266
.then(({ page, browser }) => {
6367
return new Promise((resolve) => {
6468
page.goto(`http://localhost:${port}/webpack-dev-server/main`);
6569
page.on('console', ({ _text }) => {
6670
res.push(_text);
6771
});
68-
setTimeout(() => {
69-
browser.close().then(() => {
70-
expect(res).toMatchSnapshot();
71-
resolve();
72+
page.waitForNavigation({ waitUntil: 'load' }).then(() => {
73+
page.waitFor(beforeBrowserCloseDelay).then(() => {
74+
browser.close().then(() => {
75+
resolve();
76+
});
7277
});
73-
}, 3000);
78+
});
7479
});
7580
})
7681
.then(() => {
7782
return new Promise((resolve) => {
7883
testServer.close(resolve);
7984
});
85+
})
86+
.then(() => {
87+
expect(res).toMatchSnapshot();
88+
done();
8089
});
8190
});
82-
}
91+
});
8392
});

0 commit comments

Comments
 (0)