Browse Source

test: fix flaky test-dgram-exclusive-implicit-bind

test-dgram-exclusive-implicit-bind is written assuming that dgram
messages are received with 100% reliability. While missing a dgram
message sent to localhost is rare, we do see it as evidenced by CI
failures from time to time.

The test has been rewritten to send dgram messages over and over until
the test requirements have been met.

Additional incidental refactoring includes:

* var -> const
* use of common.mustCall() instead of exit listener + boolean

PR-URL: https://github.com/nodejs/node/pull/10212
Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
Reviewed-By: Italo A. Casas <me@italoacasas.com>
v6
Rich Trott 8 years ago
committed by Italo A. Casas
parent
commit
3ddbea6455
  1. 42
      test/parallel/test-dgram-exclusive-implicit-bind.js

42
test/parallel/test-dgram-exclusive-implicit-bind.js

@ -20,10 +20,10 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE. // USE OR OTHER DEALINGS IN THE SOFTWARE.
var common = require('../common'); const common = require('../common');
var assert = require('assert'); const assert = require('assert');
var cluster = require('cluster'); const cluster = require('cluster');
var dgram = require('dgram'); const dgram = require('dgram');
// Without an explicit bind, send() causes an implicit bind, which always // Without an explicit bind, send() causes an implicit bind, which always
// generate a unique per-socket ephemeral port. An explicit bind to a port // generate a unique per-socket ephemeral port. An explicit bind to a port
@ -40,17 +40,21 @@ var dgram = require('dgram');
// with ENOTSUP. // with ENOTSUP.
if (cluster.isMaster) { if (cluster.isMaster) {
var pass;
var messages = 0; var messages = 0;
var ports = {}; const ports = {};
const pids = [];
process.on('exit', function() {
assert.strictEqual(pass, true);
});
var target = dgram.createSocket('udp4'); var target = dgram.createSocket('udp4');
const done = common.mustCall(function() {
cluster.disconnect();
target.close();
});
target.on('message', function(buf, rinfo) { target.on('message', function(buf, rinfo) {
if (pids.includes(buf.toString()))
return;
pids.push(buf.toString());
messages++; messages++;
ports[rinfo.port] = true; ports[rinfo.port] = true;
@ -63,12 +67,6 @@ if (cluster.isMaster) {
assert.strictEqual(Object.keys(ports).length, 3); assert.strictEqual(Object.keys(ports).length, 3);
done(); done();
} }
function done() {
pass = true;
cluster.disconnect();
target.close();
}
}); });
target.on('listening', function() { target.on('listening', function() {
@ -85,7 +83,12 @@ if (cluster.isMaster) {
return; return;
} }
var source = dgram.createSocket('udp4'); const source = dgram.createSocket('udp4');
var interval;
source.on('close', function() {
clearInterval(interval);
});
if (process.env.BOUND === 'y') { if (process.env.BOUND === 'y') {
source.bind(0); source.bind(0);
@ -96,4 +99,7 @@ if (process.env.BOUND === 'y') {
source.unref(); source.unref();
} }
source.send(Buffer.from('abc'), 0, 3, common.PORT, '127.0.0.1'); const buf = Buffer.from(process.pid.toString());
interval = setInterval(() => {
source.send(buf, common.PORT, '127.0.0.1');
}, 1).unref();

Loading…
Cancel
Save