summaryrefslogtreecommitdiff
path: root/test/sequential/test-dgram-bind-shared-ports.js
diff options
context:
space:
mode:
authorRefael Ackermann <refack@gmail.com>2017-05-18 18:58:00 -0400
committerRefael Ackermann <refack@gmail.com>2017-06-09 17:14:44 -0400
commitc9d45c4505a35e974c1c4b56f2ed699f2694aa14 (patch)
treeb6f078f4240c76b1a5099b167836094f9e318adc /test/sequential/test-dgram-bind-shared-ports.js
parent52f358b5316a40b481a8298239ae1727e1d2bdaa (diff)
downloadandroid-node-v8-c9d45c4505a35e974c1c4b56f2ed699f2694aa14.tar.gz
android-node-v8-c9d45c4505a35e974c1c4b56f2ed699f2694aa14.tar.bz2
android-node-v8-c9d45c4505a35e974c1c4b56f2ed699f2694aa14.zip
test: harden test-dgram-bind-shared-ports
* add `mustCall` and `mustNotCall` to all callbacks * added `known_issue` for port binding PR-URL: https://github.com/nodejs/node/pull/13100 Refs: https://github.com/nodejs/node/issues/13055 Refs: https://github.com/nodejs/node/pull/12999 Refs: https://github.com/nodejs/node/issues/13526 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Diffstat (limited to 'test/sequential/test-dgram-bind-shared-ports.js')
-rw-r--r--test/sequential/test-dgram-bind-shared-ports.js100
1 files changed, 69 insertions, 31 deletions
diff --git a/test/sequential/test-dgram-bind-shared-ports.js b/test/sequential/test-dgram-bind-shared-ports.js
index 4eaf9a14d6..699a82e5eb 100644
--- a/test/sequential/test-dgram-bind-shared-ports.js
+++ b/test/sequential/test-dgram-bind-shared-ports.js
@@ -21,55 +21,93 @@
'use strict';
const common = require('../common');
+
+// This test asserts the semantics of dgram::socket.bind({ exclusive })
+// when called from a cluster.Worker
+
const assert = require('assert');
const cluster = require('cluster');
const dgram = require('dgram');
+const BYE = 'bye';
+const WORKER2_NAME = 'wrker2';
if (cluster.isMaster) {
const worker1 = cluster.fork();
if (common.isWindows) {
- const checkErrType = (er) => {
- assert.strictEqual(er.code, 'ENOTSUP');
+ worker1.on('error', common.mustCall((err) => {
+ console.log(err);
+ assert.strictEqual(err.code, 'ENOTSUP');
worker1.kill();
- };
-
- worker1.on('error', common.mustCall(checkErrType, 1));
+ }));
return;
}
- worker1.on('message', (msg) => {
+ worker1.on('message', common.mustCall((msg) => {
+ console.log(msg);
assert.strictEqual(msg, 'success');
- const worker2 = cluster.fork();
- worker2.on('message', (msg) => {
- assert.strictEqual(msg, 'socket2:EADDRINUSE');
- worker1.kill();
- worker2.kill();
- });
- });
+ const worker2 = cluster.fork({ WORKER2_NAME });
+ worker2.on('message', common.mustCall((msg) => {
+ console.log(msg);
+ assert.strictEqual(msg, 'socket3:EADDRINUSE');
+
+ // finish test
+ worker1.send(BYE);
+ worker2.send(BYE);
+ }));
+ worker2.on('exit', common.mustCall((code, signal) => {
+ assert.strictEqual(signal, null);
+ assert.strictEqual(code, 0);
+ }));
+ }));
+ worker1.on('exit', common.mustCall((code, signal) => {
+ assert.strictEqual(signal, null);
+ assert.strictEqual(code, 0);
+ }));
+ // end master code
} else {
- const socket1 = dgram.createSocket('udp4', common.noop);
- const socket2 = dgram.createSocket('udp4', common.noop);
+ // worker code
+ process.on('message', common.mustCallAtLeast((msg) => {
+ if (msg === BYE) process.exit(0);
+ }), 1);
- socket1.on('error', (err) => {
- // no errors expected
- process.send(`socket1:${err.code}`);
- });
+ const isSecondWorker = process.env.WORKER2_NAME === WORKER2_NAME;
+ const socket1 = dgram.createSocket('udp4', common.mustNotCall());
+ const socket2 = dgram.createSocket('udp4', common.mustNotCall());
+ const socket3 = dgram.createSocket('udp4', common.mustNotCall());
- socket2.on('error', (err) => {
- // an error is expected on the second worker
- process.send(`socket2:${err.code}`);
- });
+ socket1.on('error', (err) => assert.fail(err));
+ socket2.on('error', (err) => assert.fail(err));
- socket1.bind({
- address: 'localhost',
- port: common.PORT,
- exclusive: false
- }, () => {
- socket2.bind({ port: common.PORT + 1, exclusive: true }, () => {
- // the first worker should succeed
+ // First worker should bind, second should err
+ const socket3OnBind =
+ isSecondWorker ?
+ common.mustNotCall() :
+ common.mustCall(() => {
+ const port3 = socket3.address().port;
+ assert.strictEqual(typeof port3, 'number');
process.send('success');
});
- });
+ // an error is expected only in the second worker
+ const socket3OnError =
+ !isSecondWorker ?
+ common.mustNotCall() :
+ common.mustCall((err) => {
+ process.send(`socket3:${err.code}`);
+ });
+ const address = common.localhostIPv4;
+ const opt1 = { address, port: 0, exclusive: false };
+ const opt2 = { address, port: common.PORT, exclusive: false };
+ const opt3 = { address, port: common.PORT + 1, exclusive: true };
+ socket1.bind(opt1, common.mustCall(() => {
+ const port1 = socket1.address().port;
+ assert.strictEqual(typeof port1, 'number');
+ socket2.bind(opt2, common.mustCall(() => {
+ const port2 = socket2.address().port;
+ assert.strictEqual(typeof port2, 'number');
+ socket3.on('error', socket3OnError);
+ socket3.bind(opt3, socket3OnBind);
+ }));
+ }));
}