Skip to content

Commit b1fef05

Browse files
jasnelladdaleax
authored andcommitted
test: improvements to various http tests
* Add common/countdown utility * Numerous improvements to http tests Backport-PR-URL: #14583 Backport-Reviewed-By: Anna Henningsen <[email protected]> PR-URL: #14315 Reviewed-By: Benjamin Gruenbaum <[email protected]>
1 parent ce9e3cf commit b1fef05

26 files changed

+394
-477
lines changed

test/common/README.md

+36
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,42 @@ The realpath of the 'tmp' directory.
338338

339339
Name of the temp directory used by tests.
340340

341+
## Countdown Module
342+
343+
The `Countdown` module provides a simple countdown mechanism for tests that
344+
require a particular action to be taken after a given number of completed
345+
tasks (for instance, shutting down an HTTP server after a specific number of
346+
requests).
347+
348+
<!-- eslint-disable strict, required-modules -->
349+
```js
350+
const Countdown = require('../common/countdown');
351+
352+
function doSomething() {
353+
console.log('.');
354+
}
355+
356+
const countdown = new Countdown(2, doSomething);
357+
countdown.dec();
358+
countdown.dec();
359+
```
360+
361+
### new Countdown(limit, callback)
362+
363+
* `limit` {number}
364+
* `callback` {function}
365+
366+
Creates a new `Countdown` instance.
367+
368+
### Countdown.prototype.dec()
369+
370+
Decrements the `Countdown` counter.
371+
372+
### Coutndown.prototype.remaining
373+
374+
Specifies the remaining number of times `Countdown.prototype.dec()` must be
375+
called before the callback is invoked.
376+
341377
## WPT Module
342378

343379
The wpt.js module is a port of parts of

test/common/countdown.js

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/* eslint-disable required-modules */
2+
'use strict';
3+
4+
const assert = require('assert');
5+
const kLimit = Symbol('limit');
6+
const kCallback = Symbol('callback');
7+
8+
class Countdown {
9+
constructor(limit, cb) {
10+
assert.strictEqual(typeof limit, 'number');
11+
assert.strictEqual(typeof cb, 'function');
12+
this[kLimit] = limit;
13+
this[kCallback] = cb;
14+
}
15+
16+
dec() {
17+
assert(this[kLimit] > 0, 'Countdown expired');
18+
if (--this[kLimit] === 0)
19+
this[kCallback]();
20+
}
21+
22+
get remaining() {
23+
return this[kLimit];
24+
}
25+
}
26+
27+
module.exports = Countdown;
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
const Countdown = require('../common/countdown');
6+
7+
let done = '';
8+
9+
const countdown = new Countdown(2, common.mustCall(() => done = true));
10+
assert.strictEqual(countdown.remaining, 2);
11+
countdown.dec();
12+
assert.strictEqual(countdown.remaining, 1);
13+
countdown.dec();
14+
assert.strictEqual(countdown.remaining, 0);
15+
assert.strictEqual(done, true);

test/parallel/test-http-abort-client.js

+8-26
Original file line numberDiff line numberDiff line change
@@ -24,42 +24,24 @@ const common = require('../common');
2424
const http = require('http');
2525

2626
let serverRes;
27-
const server = http.Server(function(req, res) {
28-
console.log('Server accepted request.');
27+
const server = http.Server((req, res) => {
2928
serverRes = res;
3029
res.writeHead(200);
3130
res.write('Part of my res.');
3231
});
3332

34-
server.listen(0, common.mustCall(function() {
33+
server.listen(0, common.mustCall(() => {
3534
http.get({
36-
port: this.address().port,
35+
port: server.address().port,
3736
headers: { connection: 'keep-alive' }
38-
}, common.mustCall(function(res) {
37+
}, common.mustCall((res) => {
3938
server.close();
4039
serverRes.destroy();
4140

42-
console.log(`Got res: ${res.statusCode}`);
43-
console.dir(res.headers);
44-
45-
res.on('data', function(chunk) {
46-
console.log(`Read ${chunk.length} bytes`);
47-
console.log(' chunk=%j', chunk.toString());
48-
});
49-
50-
res.on('end', function() {
51-
console.log('Response ended.');
52-
});
53-
54-
res.on('aborted', function() {
55-
console.log('Response aborted.');
56-
});
57-
58-
res.socket.on('close', function() {
59-
console.log('socket closed, but not res');
60-
});
61-
62-
// it would be nice if this worked:
41+
res.resume();
42+
res.on('end', common.mustCall());
43+
res.on('aborted', common.mustCall());
6344
res.on('close', common.mustCall());
45+
res.socket.on('close', common.mustCall());
6446
}));
6547
}));

test/parallel/test-http-abort-queued.js

+13-22
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020
// USE OR OTHER DEALINGS IN THE SOFTWARE.
2121

2222
'use strict';
23-
require('../common');
23+
const common = require('../common');
2424
const assert = require('assert');
2525
const http = require('http');
2626

2727
let complete;
2828

29-
const server = http.createServer(function(req, res) {
29+
const server = http.createServer((req, res) => {
3030
// We should not see the queued /thatotherone request within the server
3131
// as it should be aborted before it is sent.
3232
assert.strictEqual(req.url, '/');
@@ -40,10 +40,8 @@ const server = http.createServer(function(req, res) {
4040
});
4141

4242

43-
server.listen(0, function() {
44-
console.log('listen', server.address().port);
45-
46-
const agent = new http.Agent({maxSockets: 1});
43+
server.listen(0, () => {
44+
const agent = new http.Agent({ maxSockets: 1 });
4745
assert.strictEqual(Object.keys(agent.sockets).length, 0);
4846

4947
const options = {
@@ -55,7 +53,7 @@ server.listen(0, function() {
5553
};
5654

5755
const req1 = http.request(options);
58-
req1.on('response', function(res1) {
56+
req1.on('response', (res1) => {
5957
assert.strictEqual(Object.keys(agent.sockets).length, 1);
6058
assert.strictEqual(Object.keys(agent.requests).length, 0);
6159

@@ -69,7 +67,9 @@ server.listen(0, function() {
6967
assert.strictEqual(Object.keys(agent.sockets).length, 1);
7068
assert.strictEqual(Object.keys(agent.requests).length, 1);
7169

72-
req2.on('error', function(err) {
70+
// TODO(jasnell): This event does not appear to currently be triggered.
71+
// is this handler actually required?
72+
req2.on('error', (err) => {
7373
// This is expected in response to our explicit abort call
7474
assert.strictEqual(err.code, 'ECONNRESET');
7575
});
@@ -80,25 +80,16 @@ server.listen(0, function() {
8080
assert.strictEqual(Object.keys(agent.sockets).length, 1);
8181
assert.strictEqual(Object.keys(agent.requests).length, 1);
8282

83-
console.log(`Got res: ${res1.statusCode}`);
84-
console.dir(res1.headers);
85-
86-
res1.on('data', function(chunk) {
87-
console.log(`Read ${chunk.length} bytes`);
88-
console.log(' chunk=%j', chunk.toString());
89-
complete();
90-
});
83+
res1.on('data', (chunk) => complete());
9184

92-
res1.on('end', function() {
93-
console.log('Response ended.');
94-
95-
setTimeout(function() {
85+
res1.on('end', common.mustCall(() => {
86+
setTimeout(common.mustCall(() => {
9687
assert.strictEqual(Object.keys(agent.sockets).length, 0);
9788
assert.strictEqual(Object.keys(agent.requests).length, 0);
9889

9990
server.close();
100-
}, 100);
101-
});
91+
}), 100);
92+
}));
10293
});
10394

10495
req1.end();

test/parallel/test-http-abort-stream-end.js

+12-13
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,29 @@
2020
// USE OR OTHER DEALINGS IN THE SOFTWARE.
2121

2222
'use strict';
23-
require('../common');
23+
const common = require('../common');
2424
const assert = require('assert');
2525

2626
const http = require('http');
2727

2828
const maxSize = 1024;
2929
let size = 0;
3030

31-
const s = http.createServer(function(req, res) {
32-
this.close();
31+
const server = http.createServer(common.mustCall((req, res) => {
32+
server.close();
3333

3434
res.writeHead(200, {'Content-Type': 'text/plain'});
3535
for (let i = 0; i < maxSize; i++) {
36-
res.write('x' + i);
36+
res.write(`x${i}`);
3737
}
3838
res.end();
39-
});
39+
}));
4040

4141
let aborted = false;
42-
s.listen(0, function() {
43-
const req = http.get('http://localhost:' + s.address().port, function(res) {
44-
res.on('data', function(chunk) {
42+
server.listen(0, () => {
43+
44+
const res = common.mustCall((res) => {
45+
res.on('data', (chunk) => {
4546
size += chunk.length;
4647
assert(!aborted, 'got data after abort');
4748
if (size > maxSize) {
@@ -50,11 +51,9 @@ s.listen(0, function() {
5051
size = maxSize;
5152
}
5253
});
54+
55+
req.on('abort', common.mustCall(() => assert.strictEqual(size, maxSize)));
5356
});
54-
});
5557

56-
process.on('exit', function() {
57-
assert(aborted);
58-
assert.strictEqual(size, maxSize);
59-
console.log('ok');
58+
const req = http.get(`http://localhost:${server.address().port}`, res);
6059
});

test/parallel/test-http-after-connect.js

+20-30
Original file line numberDiff line numberDiff line change
@@ -23,61 +23,51 @@
2323
const common = require('../common');
2424
const assert = require('assert');
2525
const http = require('http');
26+
const Countdown = require('../common/countdown');
2627

27-
let clientResponses = 0;
28-
29-
const server = http.createServer(common.mustCall(function(req, res) {
30-
console.error('Server got GET request');
28+
const server = http.createServer(common.mustCall((req, res) => {
3129
req.resume();
3230
res.writeHead(200);
3331
res.write('');
34-
setTimeout(function() {
35-
res.end(req.url);
36-
}, 50);
32+
setTimeout(() => res.end(req.url), 50);
3733
}, 2));
38-
server.on('connect', common.mustCall(function(req, socket) {
39-
console.error('Server got CONNECT request');
34+
35+
const countdown = new Countdown(2, common.mustCall(() => server.close()));
36+
37+
server.on('connect', common.mustCall((req, socket) => {
4038
socket.write('HTTP/1.1 200 Connection established\r\n\r\n');
4139
socket.resume();
42-
socket.on('end', function() {
43-
socket.end();
44-
});
40+
socket.on('end', () => socket.end());
4541
}));
46-
server.listen(0, function() {
42+
43+
server.listen(0, common.mustCall(() => {
4744
const req = http.request({
48-
port: this.address().port,
45+
port: server.address().port,
4946
method: 'CONNECT',
5047
path: 'google.com:80'
5148
});
52-
req.on('connect', common.mustCall(function(res, socket) {
53-
console.error('Client got CONNECT response');
49+
req.on('connect', common.mustCall((res, socket) => {
5450
socket.end();
55-
socket.on('end', function() {
51+
socket.on('end', common.mustCall(() => {
5652
doRequest(0);
5753
doRequest(1);
58-
});
54+
}));
5955
socket.resume();
6056
}));
6157
req.end();
62-
});
58+
}));
6359

6460
function doRequest(i) {
6561
http.get({
6662
port: server.address().port,
6763
path: `/request${i}`
68-
}, common.mustCall(function(res) {
69-
console.error('Client got GET response');
64+
}, common.mustCall((res) => {
7065
let data = '';
7166
res.setEncoding('utf8');
72-
res.on('data', function(chunk) {
73-
data += chunk;
74-
});
75-
res.on('end', function() {
67+
res.on('data', (chunk) => data += chunk);
68+
res.on('end', common.mustCall(() => {
7669
assert.strictEqual(data, `/request${i}`);
77-
++clientResponses;
78-
if (clientResponses === 2) {
79-
server.close();
80-
}
81-
});
70+
countdown.dec();
71+
}));
8272
}));
8373
}

0 commit comments

Comments
 (0)