test: make common.PIPE process unique
* includes a tiny bit of refactoring in adjacent lines. * fixes 1 test and 1 benchmark that depended on PIPE being constant. PR-URL: https://github.com/nodejs/node/pull/14168 Fixes: https://github.com/nodejs/node/issues/14128 Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
b4300536f5
commit
c34ae48083
@ -3,7 +3,6 @@
|
|||||||
// test HTTP throughput in fragmented header case
|
// test HTTP throughput in fragmented header case
|
||||||
var common = require('../common.js');
|
var common = require('../common.js');
|
||||||
var net = require('net');
|
var net = require('net');
|
||||||
var test = require('../../test/common');
|
|
||||||
|
|
||||||
var bench = common.createBenchmark(main, {
|
var bench = common.createBenchmark(main, {
|
||||||
len: [1, 4, 8, 16, 32, 64, 128],
|
len: [1, 4, 8, 16, 32, 64, 128],
|
||||||
@ -56,7 +55,7 @@ function main(conf) {
|
|||||||
var mult = 17;
|
var mult = 17;
|
||||||
var add = 11;
|
var add = 11;
|
||||||
var count = 0;
|
var count = 0;
|
||||||
var PIPE = test.PIPE;
|
var PIPE = process.env.PIPE_NAME;
|
||||||
var socket = net.connect(PIPE, function() {
|
var socket = net.connect(PIPE, function() {
|
||||||
bench.start();
|
bench.start();
|
||||||
WriteHTTPHeaders(socket, 1, len);
|
WriteHTTPHeaders(socket, 1, len);
|
||||||
|
@ -1,24 +1,22 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
var path = require('path');
|
|
||||||
var http = require('http');
|
var http = require('http');
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var fork = require('child_process').fork;
|
var { fork } = require('child_process');
|
||||||
var common = require('../common.js');
|
var common = require('../common.js');
|
||||||
var test = require('../../test/common');
|
const { PIPE, tmpDir } = require('../../test/common');
|
||||||
var pep = `${path.dirname(process.argv[1])}/_chunky_http_client.js`;
|
process.env.PIPE_NAME = PIPE;
|
||||||
var PIPE = test.PIPE;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
fs.accessSync(test.tmpDir, fs.F_OK);
|
fs.accessSync(tmpDir, fs.F_OK);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
fs.mkdirSync(test.tmpDir);
|
fs.mkdirSync(tmpDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
var server;
|
var server;
|
||||||
try {
|
try {
|
||||||
fs.unlinkSync(PIPE);
|
fs.unlinkSync(process.env.PIPE_NAME);
|
||||||
} catch (e) { /* ignore */ }
|
} catch (e) { /* ignore */ }
|
||||||
|
|
||||||
server = http.createServer(function(req, res) {
|
server = http.createServer(function(req, res) {
|
||||||
@ -33,10 +31,12 @@ server = http.createServer(function(req, res) {
|
|||||||
server.on('error', function(err) {
|
server.on('error', function(err) {
|
||||||
throw new Error(`server error: ${err}`);
|
throw new Error(`server error: ${err}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
server.listen(PIPE);
|
server.listen(PIPE);
|
||||||
|
|
||||||
var child = fork(pep, process.argv.slice(2));
|
const child = fork(
|
||||||
|
`${__dirname}/_chunky_http_client.js`,
|
||||||
|
process.argv.slice(2)
|
||||||
|
);
|
||||||
child.on('message', common.sendResult);
|
child.on('message', common.sendResult);
|
||||||
child.on('close', function(code) {
|
child.on('close', function(code) {
|
||||||
server.close();
|
server.close();
|
||||||
|
@ -243,7 +243,7 @@ Object.defineProperty(exports, 'opensslCli', {get: function() {
|
|||||||
|
|
||||||
Object.defineProperty(exports, 'hasCrypto', {
|
Object.defineProperty(exports, 'hasCrypto', {
|
||||||
get: function() {
|
get: function() {
|
||||||
return process.versions.openssl ? true : false;
|
return Boolean(process.versions.openssl);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -253,22 +253,21 @@ Object.defineProperty(exports, 'hasFipsCrypto', {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (exports.isWindows) {
|
{
|
||||||
exports.PIPE = '\\\\.\\pipe\\libuv-test';
|
const pipePrefix = exports.isWindows ? '\\\\.\\pipe\\' : `${exports.tmpDir}/`;
|
||||||
if (process.env.TEST_THREAD_ID) {
|
const pipeName = `node-test.${process.pid}.sock`;
|
||||||
exports.PIPE += `.${process.env.TEST_THREAD_ID}`;
|
exports.PIPE = pipePrefix + pipeName;
|
||||||
}
|
|
||||||
} else {
|
|
||||||
exports.PIPE = `${exports.tmpDir}/test.sock`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const ifaces = os.networkInterfaces();
|
{
|
||||||
const re = /lo/;
|
const iFaces = os.networkInterfaces();
|
||||||
exports.hasIPv6 = Object.keys(ifaces).some(function(name) {
|
const re = /lo/;
|
||||||
return re.test(name) && ifaces[name].some(function(info) {
|
exports.hasIPv6 = Object.keys(iFaces).some(function(name) {
|
||||||
return info.family === 'IPv6';
|
return re.test(name) && iFaces[name].some(function(info) {
|
||||||
|
return info.family === 'IPv6';
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check that when running a test with
|
* Check that when running a test with
|
||||||
|
39
test/fixtures/listen-on-socket-and-exit.js
vendored
39
test/fixtures/listen-on-socket-and-exit.js
vendored
@ -1,39 +0,0 @@
|
|||||||
// Copyright Joyent, Inc. and other Node contributors.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
// copy of this software and associated documentation files (the
|
|
||||||
// "Software"), to deal in the Software without restriction, including
|
|
||||||
// without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
||||||
// persons to whom the Software is furnished to do so, subject to the
|
|
||||||
// following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included
|
|
||||||
// in all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
||||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
||||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
||||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
// child process that listens on a socket, allows testing of an EADDRINUSE condition
|
|
||||||
|
|
||||||
const common = require('../common');
|
|
||||||
const net = require('net');
|
|
||||||
|
|
||||||
common.refreshTmpDir();
|
|
||||||
|
|
||||||
var server = net.createServer().listen(common.PIPE, function() {
|
|
||||||
console.log('child listening');
|
|
||||||
process.send('listening');
|
|
||||||
});
|
|
||||||
|
|
||||||
function onmessage() {
|
|
||||||
console.log('child exiting');
|
|
||||||
server.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
process.once('message', onmessage);
|
|
@ -20,19 +20,22 @@
|
|||||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
const common = require('../common');
|
||||||
|
|
||||||
// Test that errors propagated from cluster workers are properly
|
// Test that errors propagated from cluster workers are properly
|
||||||
// received in their master. Creates an EADDRINUSE condition by forking
|
// received in their master. Creates an EADDRINUSE condition by forking
|
||||||
// a process in child cluster and propagates the error to the master.
|
// a process in child cluster and propagates the error to the master.
|
||||||
|
|
||||||
const common = require('../common');
|
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const cluster = require('cluster');
|
const cluster = require('cluster');
|
||||||
const fork = require('child_process').fork;
|
const fork = require('child_process').fork;
|
||||||
const fs = require('fs');
|
|
||||||
const net = require('net');
|
const net = require('net');
|
||||||
|
|
||||||
if (cluster.isMaster) {
|
if (cluster.isMaster && process.argv.length !== 3) {
|
||||||
const worker = cluster.fork();
|
// cluster.isMaster
|
||||||
|
common.refreshTmpDir();
|
||||||
|
const PIPE_NAME = common.PIPE;
|
||||||
|
const worker = cluster.fork({PIPE_NAME});
|
||||||
|
|
||||||
// makes sure master is able to fork the worker
|
// makes sure master is able to fork the worker
|
||||||
cluster.on('fork', common.mustCall());
|
cluster.on('fork', common.mustCall());
|
||||||
@ -43,27 +46,16 @@ if (cluster.isMaster) {
|
|||||||
worker.on('message', common.mustCall(function(err) {
|
worker.on('message', common.mustCall(function(err) {
|
||||||
// disconnect first, so that we will not leave zombies
|
// disconnect first, so that we will not leave zombies
|
||||||
worker.disconnect();
|
worker.disconnect();
|
||||||
|
|
||||||
console.log(err);
|
|
||||||
assert.strictEqual('EADDRINUSE', err.code);
|
assert.strictEqual('EADDRINUSE', err.code);
|
||||||
}));
|
}));
|
||||||
|
} else if (process.argv.length !== 3) {
|
||||||
process.on('exit', function() {
|
// cluster.worker
|
||||||
console.log('master exited');
|
const PIPE_NAME = process.env.PIPE_NAME;
|
||||||
try {
|
const cp = fork(__filename, [PIPE_NAME], { stdio: 'inherit' });
|
||||||
fs.unlinkSync(common.PIPE);
|
|
||||||
} catch (e) {
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
|
||||||
common.refreshTmpDir();
|
|
||||||
const cp = fork(`${common.fixturesDir}/listen-on-socket-and-exit.js`,
|
|
||||||
{ stdio: 'inherit' });
|
|
||||||
|
|
||||||
// message from the child indicates it's ready and listening
|
// message from the child indicates it's ready and listening
|
||||||
cp.on('message', common.mustCall(function() {
|
cp.on('message', common.mustCall(function() {
|
||||||
const server = net.createServer().listen(common.PIPE, function() {
|
const server = net.createServer().listen(PIPE_NAME, function() {
|
||||||
// message child process so that it can exit
|
// message child process so that it can exit
|
||||||
cp.send('end');
|
cp.send('end');
|
||||||
// inform master about the unexpected situation
|
// inform master about the unexpected situation
|
||||||
@ -71,12 +63,20 @@ if (cluster.isMaster) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
server.on('error', function(err) {
|
server.on('error', function(err) {
|
||||||
console.log('parent error, ending');
|
|
||||||
// message to child process tells it to exit
|
// message to child process tells it to exit
|
||||||
cp.send('end');
|
cp.send('end');
|
||||||
// propagate error to parent
|
// propagate error to parent
|
||||||
process.send(err);
|
process.send(err);
|
||||||
});
|
});
|
||||||
|
|
||||||
}));
|
}));
|
||||||
|
} else if (process.argv.length === 3) {
|
||||||
|
// child process (of cluster.worker)
|
||||||
|
const PIPE_NAME = process.argv[2];
|
||||||
|
|
||||||
|
const server = net.createServer().listen(PIPE_NAME, common.mustCall(() => {
|
||||||
|
process.send('listening');
|
||||||
|
}));
|
||||||
|
process.once('message', common.mustCall(() => server.close()));
|
||||||
|
} else {
|
||||||
|
assert.fail('Impossible state');
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user