diff --git a/doc/api/dgram.md b/doc/api/dgram.md index 53eeb818986fec..953d4bf8c9c0b3 100644 --- a/doc/api/dgram.md +++ b/doc/api/dgram.md @@ -283,6 +283,9 @@ not work because the packet will get silently dropped without informing the source that the data did not reach its intended recipient. ### socket.setBroadcast(flag) + * `flag` {Boolean} diff --git a/test/internet/test-dgram-broadcast-multi-process.js b/test/internet/test-dgram-broadcast-multi-process.js index 21133f2956da16..0925432571f639 100644 --- a/test/internet/test-dgram-broadcast-multi-process.js +++ b/test/internet/test-dgram-broadcast-multi-process.js @@ -20,7 +20,9 @@ if (common.inFreeBSDJail) { return; } -// take the first non-internal interface as the address for binding +// Take the first non-internal interface as the address for binding. +// Ideally, this should check for whether or not an interface is set up for +// BROADCAST and favor internal/private interfaces. get_bindAddress: for (var name in networkInterfaces) { var interfaces = networkInterfaces[name]; for (var i = 0; i < interfaces.length; i++) { @@ -209,7 +211,7 @@ if (process.argv[2] === 'child') { receivedMessages.push(buf); - process.send({ message: buf.toString() }); + process.send({message: buf.toString()}); if (receivedMessages.length == messages.length) { process.nextTick(function() { @@ -228,7 +230,7 @@ if (process.argv[2] === 'child') { }); listenSocket.on('listening', function() { - process.send({ listening: true }); + process.send({listening: true}); }); listenSocket.bind(common.PORT); diff --git a/test/parallel/test-dgram-setBroadcast.js b/test/parallel/test-dgram-setBroadcast.js new file mode 100644 index 00000000000000..2d78a133ad3f17 --- /dev/null +++ b/test/parallel/test-dgram-setBroadcast.js @@ -0,0 +1,39 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const dgram = require('dgram'); + +const setup = () => { + return dgram.createSocket({type: 'udp4', reuseAddr: true}); +}; + +const teardown = (socket) => { + if (socket.close) + socket.close(); +}; + +const runTest = (testCode, expectError) => { + const socket = setup(); + const assertion = expectError ? assert.throws : assert.doesNotThrow; + const wrapped = () => { testCode(socket); }; + assertion(wrapped, expectError); + teardown(socket); +}; + +// Should throw EBADF if socket is never bound. +runTest((socket) => { socket.setBroadcast(true); }, /EBADF/); + +// Should not throw if broadcast set to false after binding. +runTest((socket) => { + socket.bind(common.PORT, common.localhostIPv4, () => { + socket.setBroadcast(false); + }); +}); + +// Should not throw if broadcast set to true after binding. +runTest((socket) => { + socket.bind(common.PORT, common.localhostIPv4, () => { + socket.setBroadcast(true); + }); +});