From de710c8c105ef4121b4f6556abd711e0ef77931a Mon Sep 17 00:00:00 2001 From: cjihrig Date: Fri, 10 Feb 2017 11:41:32 -0500 Subject: [PATCH] test: cover dgram socket close during cluster bind When a non-exclusive dgram socket is bound from a cluster worker, it attempts to get a handle from the cluster module. This commit adds coverage for the case where the socket is closed while querying the cluster module for a handle. PR-URL: https://github.com/nodejs/node/pull/11292 Reviewed-By: James M Snell --- .../test-dgram-cluster-close-during-bind.js | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 test/parallel/test-dgram-cluster-close-during-bind.js diff --git a/test/parallel/test-dgram-cluster-close-during-bind.js b/test/parallel/test-dgram-cluster-close-during-bind.js new file mode 100644 index 00000000000000..ec62693abfb645 --- /dev/null +++ b/test/parallel/test-dgram-cluster-close-during-bind.js @@ -0,0 +1,40 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const cluster = require('cluster'); +const dgram = require('dgram'); + +if (common.isWindows) { + common.skip('dgram clustering is currently not supported on windows.'); + return; +} + +if (cluster.isMaster) { + cluster.fork(); +} else { + // When the socket attempts to bind, it requests a handle from the cluster. + // Close the socket before returning the handle from the cluster. + const socket = dgram.createSocket('udp4'); + const _getServer = cluster._getServer; + + cluster._getServer = common.mustCall(function(self, options, callback) { + socket.close(common.mustCall(() => { + _getServer.call(this, self, options, common.mustCall((err, handle) => { + assert.strictEqual(err, 0); + + // When the socket determines that it was already closed, it will + // close the handle. Use handle.close() to terminate the test. + const close = handle.close; + + handle.close = common.mustCall(function() { + setImmediate(() => cluster.worker.disconnect()); + return close.call(this); + }); + + callback(err, handle); + })); + })); + }); + + socket.bind(common.mustNotCall('Socket should not bind.')); +}