Skip to content

Commit b0a8a7c

Browse files
committed
test: improvements to various http tests
* Add common/countdown utility * Numerous improvements to http tests PR-URL: #14315 Reviewed-By: Benjamin Gruenbaum <[email protected]>
1 parent ed21cb1 commit b0a8a7c

26 files changed

+390
-473
lines changed

‎test/common/README.md‎

Lines changed: 36 additions & 0 deletions
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+
constCountdown=require('../common/countdown');
351+
352+
functiondoSomething(){
353+
console.log('.');
354+
}
355+
356+
constcountdown=newCountdown(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‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/* eslint-disable required-modules */
2+
'use strict';
3+
4+
constassert=require('assert');
5+
constkLimit=Symbol('limit');
6+
constkCallback=Symbol('callback');
7+
8+
classCountdown{
9+
constructor(limit,cb){
10+
assert.strictEqual(typeoflimit,'number');
11+
assert.strictEqual(typeofcb,'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+
getremaining(){
23+
returnthis[kLimit];
24+
}
25+
}
26+
27+
module.exports=Countdown;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
'use strict';
2+
3+
constcommon=require('../common');
4+
constassert=require('assert');
5+
constCountdown=require('../common/countdown');
6+
7+
letdone='';
8+
9+
constcountdown=newCountdown(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‎

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,42 +24,24 @@ const common = require('../common');
2424
consthttp=require('http');
2525

2626
letserverRes;
27-
constserver=http.Server(function(req,res){
28-
console.log('Server accepted request.');
27+
constserver=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‎

Lines changed: 12 additions & 21 deletions
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+
constcommon=require('../common');
2424
constassert=require('assert');
2525
consthttp=require('http');
2626

2727
letcomplete;
2828

29-
constserver=http.createServer(function(req,res){
29+
constserver=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,9 +40,7 @@ const server = http.createServer(function(req, res){
4040
});
4141

4242

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

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

5755
constreq1=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‎

Lines changed: 12 additions & 13 deletions
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+
constcommon=require('../common');
2424
constassert=require('assert');
2525

2626
consthttp=require('http');
2727

2828
constmaxSize=1024;
2929
letsize=0;
3030

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

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

4141
letaborted=false;
42-
s.listen(0,function(){
43-
constreq=http.get('http://localhost:'+s.address().port,function(res){
44-
res.on('data',function(chunk){
42+
server.listen(0,()=>{
43+
44+
constres=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+
constreq=http.get(`http://localhost:${server.address().port}`,res);
6059
});

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

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -23,61 +23,51 @@
2323
constcommon=require('../common');
2424
constassert=require('assert');
2525
consthttp=require('http');
26+
constCountdown=require('../common/countdown');
2627

27-
letclientResponses=0;
28-
29-
constserver=http.createServer(common.mustCall(function(req,res){
30-
console.error('Server got GET request');
28+
constserver=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+
constcountdown=newCountdown(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
constreq=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
functiondoRequest(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
letdata='';
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)