Browse Source

test: remove race condition in http flood test

Timer race results in some flakiness on slower devices in CI. Remove
unneeded setTimeout() and replace booleans with common.mustCall().

PR-URL: https://github.com/nodejs/node/pull/4793
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
process-exit-stdio-flushing
Rich Trott 9 years ago
parent
commit
cee14f52a3
  1. 26
      test/parallel/test-http-pipeline-flood.js

26
test/parallel/test-http-pipeline-flood.js

@ -12,6 +12,9 @@ const assert = require('assert');
// Normally when the writable stream emits a 'drain' event, the server then // Normally when the writable stream emits a 'drain' event, the server then
// uncorks the readable stream, although we arent testing that part here. // uncorks the readable stream, although we arent testing that part here.
// The issue being tested exists in Node.js 0.10.20 and is resolved in 0.10.21
// and newer.
switch (process.argv[2]) { switch (process.argv[2]) {
case undefined: case undefined:
return parent(); return parent();
@ -24,8 +27,6 @@ switch (process.argv[2]) {
function parent() { function parent() {
const http = require('http'); const http = require('http');
const bigResponse = new Buffer(10240).fill('x'); const bigResponse = new Buffer(10240).fill('x');
var gotTimeout = false;
var childClosed = false;
var requests = 0; var requests = 0;
var connections = 0; var connections = 0;
var backloggedReqs = 0; var backloggedReqs = 0;
@ -57,20 +58,16 @@ function parent() {
const spawn = require('child_process').spawn; const spawn = require('child_process').spawn;
const args = [__filename, 'child']; const args = [__filename, 'child'];
const child = spawn(process.execPath, args, { stdio: 'inherit' }); const child = spawn(process.execPath, args, { stdio: 'inherit' });
child.on('close', function() { child.on('close', common.mustCall(function() {
childClosed = true;
server.close(); server.close();
}); }));
server.setTimeout(common.platformTimeout(200), function(conn) { server.setTimeout(200, common.mustCall(function() {
gotTimeout = true;
child.kill(); child.kill();
}); }));
}); });
process.on('exit', function() { process.on('exit', function() {
assert(gotTimeout);
assert(childClosed);
assert.equal(connections, 1); assert.equal(connections, 1);
}); });
} }
@ -85,13 +82,10 @@ function child() {
req = new Array(10241).join(req); req = new Array(10241).join(req);
conn.on('connect', function() { conn.on('connect', write);
// Terminate child after flooding.
setTimeout(function() { conn.destroy(); }, common.platformTimeout(1000));
write();
});
conn.on('drain', write); // `drain` should fire once and only once
conn.on('drain', common.mustCall(write));
function write() { function write() {
while (false !== conn.write(req, 'ascii')); while (false !== conn.write(req, 'ascii'));

Loading…
Cancel
Save