Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
wants to merge 3 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 24 additions & 18 deletions test/parallel/test-dgram-exclusive-implicit-bind.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var common = require('../common');
var assert = require('assert');
var cluster = require('cluster');
var dgram = require('dgram');
const common = require('../common');
const assert = require('assert');
const cluster = require('cluster');
const dgram = require('dgram');

// Without an explicit bind, send() causes an implicit bind, which always
// generate a unique per-socket ephemeral port. An explicit bind to a port
Expand All @@ -40,17 +40,21 @@ var dgram = require('dgram');
// with ENOTSUP.

if (cluster.isMaster) {
var pass;
var messages = 0;
var ports = {};

process.on('exit', function() {
assert.strictEqual(pass, true);
});
const ports = {};
const pids = [];

var target = dgram.createSocket('udp4');

const done = common.mustCall(function() {
cluster.disconnect();
target.close();
});

target.on('message', function(buf, rinfo) {
if (pids.includes(buf.toString()))
return;
pids.push(buf.toString());
messages++;
ports[rinfo.port] = true;

Expand All @@ -63,12 +67,6 @@ if (cluster.isMaster) {
assert.strictEqual(Object.keys(ports).length, 3);
done();
}

function done() {
pass = true;
cluster.disconnect();
target.close();
}
});

target.on('listening', function() {
Expand All @@ -85,7 +83,12 @@ if (cluster.isMaster) {
return;
}

var source = dgram.createSocket('udp4');
const source = dgram.createSocket('udp4');
var interval;

source.on('close', function() {
clearInterval(interval);
});
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From a previous comment I'm not sure this was a problem but can't you get rid of this as the interval is already unrefed? At least locally it works for me

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I remove that line, the test still passes, but it produces a messy output that looks like it's failing:

$ ./node test/parallel/test-dgram-exclusive-implicit-bind.js
dgram.js:527
    throw new Error('Not running'); // error message from dgram_legacy.js
    ^

Error: Not running
    at Socket._healthCheck (dgram.js:527:11)
    at Socket.send (dgram.js:347:8)
    at Timeout.setInterval [as _onTimeout] (/Users/trott/io.js/test/parallel/test-dgram-exclusive-implicit-bind.js:104:10)
    at ontimeout (timers.js:365:14)
    at Timer.unrefdHandle (timers.js:471:5)
dgram.js:527
    throw new Error('Not running'); // error message from dgram_legacy.js
    ^

Error: Not running
    at Socket._healthCheck (dgram.js:527:11)
    at Socket.send (dgram.js:347:8)
    at Timeout.setInterval [as _onTimeout] (/Users/trott/io.js/test/parallel/test-dgram-exclusive-implicit-bind.js:104:10)
    at ontimeout (timers.js:365:14)
    at Timer.unrefdHandle (timers.js:471:5)
$

I'd prefer the processes clean up after themselves and not generate irrelevant errors like that, even if the errors don't cause the test to fail, so I'd prefer to keep the clearInterval() call.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Understood


if (process.env.BOUND === 'y') {
source.bind(0);
Expand All @@ -96,4 +99,7 @@ if (process.env.BOUND === 'y') {
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();