| 'use strict'; |
| const common = require('../common'); |
| if (common.isWindows) |
| common.skip('dgram clustering is currently not supported on windows.'); |
| |
| const assert = require('assert'); |
| const cluster = require('cluster'); |
| const dgram = require('dgram'); |
| |
| 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.')); |
| } |