mirror of
https://github.com/nodejs/node.git
synced 2025-05-10 08:45:09 +00:00

This test setups two event listeners: one on a child process' exit event , another for the same child process' stdandard output's 'data' event. The data even listener writes to a stream, and the exit event listener ends it. Because the exit event can be emitted before the data event, there is a chance that something will be written to the stream after it's ended, and that an error is thrown. This change makes the test end the stream in the listener for the child process' standard output's end event, which is guaranteed to be emitted after the last data event, thus avoiding the race. PR: https://github.com/joyent/node/pull/9301 Reviewed-by: Bert Belder <bertbelder@gmail.com> Reviewed-by: Michael Dawson <michael_dawson@ca.ibm.com> Reviewed-by: Colin Ihrig <cjihrig@gmail.com>
68 lines
1.7 KiB
JavaScript
68 lines
1.7 KiB
JavaScript
if (!process.versions.openssl) {
|
|
console.error('Skipping because node compiled without OpenSSL.');
|
|
process.exit(0);
|
|
}
|
|
|
|
// http://groups.google.com/group/nodejs/browse_thread/thread/f66cd3c960406919
|
|
var common = require('../common');
|
|
var assert = require('assert');
|
|
var http = require('http');
|
|
var cp = require('child_process');
|
|
var fs = require('fs');
|
|
|
|
var filename = require('path').join(common.tmpDir, 'big');
|
|
|
|
var count = 0;
|
|
function maybeMakeRequest() {
|
|
if (++count < 2) return;
|
|
console.log('making curl request');
|
|
var cmd = 'curl http://127.0.0.1:' + common.PORT + '/ | openssl sha1';
|
|
cp.exec(cmd, function(err, stdout, stderr) {
|
|
if (err) throw err;
|
|
var hex = stdout.match(/([A-Fa-f0-9]{40})/)[0];
|
|
assert.equal('8c206a1a87599f532ce68675536f0b1546900d7a', hex);
|
|
console.log('got the correct response');
|
|
fs.unlink(filename);
|
|
server.close();
|
|
});
|
|
}
|
|
|
|
|
|
var ddcmd = common.ddCommand(filename, 10240);
|
|
console.log('dd command: ', ddcmd);
|
|
|
|
cp.exec(ddcmd, function(err, stdout, stderr) {
|
|
if (err) throw err;
|
|
maybeMakeRequest();
|
|
});
|
|
|
|
|
|
var server = http.createServer(function(req, res) {
|
|
res.writeHead(200);
|
|
|
|
// Create the subprocess
|
|
var cat = cp.spawn('cat', [filename]);
|
|
|
|
// Stream the data through to the response as binary chunks
|
|
cat.stdout.on('data', function(data) {
|
|
res.write(data);
|
|
});
|
|
|
|
cat.stdout.on('end', function onStdoutEnd() {
|
|
res.end();
|
|
});
|
|
|
|
// End the response on exit (and log errors)
|
|
cat.on('exit', function(code) {
|
|
if (code !== 0) {
|
|
console.error('subprocess exited with code ' + code);
|
|
process.exit(1);
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
server.listen(common.PORT, maybeMakeRequest);
|
|
|
|
console.log('Server running at http://localhost:8080');
|