'use strict'; const common = require('../common'); const assert = require('assert'); const dgram = require('dgram'); const multicastAddress = '224.0.0.114'; const setup = dgram.createSocket.bind(dgram, { type: 'udp4', reuseAddr: true }); // addMembership() on closed socket should throw { const socket = setup(); socket.close(common.mustCall(() => { assert.throws(() => { socket.addMembership(multicastAddress); }, { code: 'ERR_SOCKET_DGRAM_NOT_RUNNING', name: 'Error', message: /^Not running$/ }); })); } // dropMembership() on closed socket should throw { const socket = setup(); socket.close(common.mustCall(() => { assert.throws(() => { socket.dropMembership(multicastAddress); }, { code: 'ERR_SOCKET_DGRAM_NOT_RUNNING', name: 'Error', message: /^Not running$/ }); })); } // addMembership() with no argument should throw { const socket = setup(); assert.throws(() => { socket.addMembership(); }, { code: 'ERR_MISSING_ARGS', name: 'TypeError', message: /^The "multicastAddress" argument must be specified$/ }); socket.close(); } // dropMembership() with no argument should throw { const socket = setup(); assert.throws(() => { socket.dropMembership(); }, { code: 'ERR_MISSING_ARGS', name: 'TypeError', message: /^The "multicastAddress" argument must be specified$/ }); socket.close(); } // addMembership() with invalid multicast address should throw { const socket = setup(); assert.throws(() => { socket.addMembership('256.256.256.256'); }, /^Error: addMembership EINVAL$/); socket.close(); } // dropMembership() with invalid multicast address should throw { const socket = setup(); assert.throws(() => { socket.dropMembership('256.256.256.256'); }, /^Error: dropMembership EINVAL$/); socket.close(); } // addSourceSpecificMembership with invalid sourceAddress should throw { const socket = setup(); assert.throws(() => { socket.addSourceSpecificMembership(0, multicastAddress); }, { code: 'ERR_INVALID_ARG_TYPE', message: 'The "sourceAddress" argument must be of type string. ' + 'Received type number (0)' }); socket.close(); } // addSourceSpecificMembership with invalid sourceAddress should throw { const socket = setup(); assert.throws(() => { socket.addSourceSpecificMembership(multicastAddress, 0); }, { code: 'ERR_INVALID_ARG_TYPE', message: 'The "groupAddress" argument must be of type string. ' + 'Received type number (0)' }); socket.close(); } // addSourceSpecificMembership with invalid groupAddress should throw { const socket = setup(); assert.throws(() => { socket.addSourceSpecificMembership(multicastAddress, '0'); }, { code: 'EINVAL', message: 'addSourceSpecificMembership EINVAL' }); socket.close(); } // dropSourceSpecificMembership with invalid sourceAddress should throw { const socket = setup(); assert.throws(() => { socket.dropSourceSpecificMembership(0, multicastAddress); }, { code: 'ERR_INVALID_ARG_TYPE', message: 'The "sourceAddress" argument must be of type string. ' + 'Received type number (0)' }); socket.close(); } // dropSourceSpecificMembership with invalid groupAddress should throw { const socket = setup(); assert.throws(() => { socket.dropSourceSpecificMembership(multicastAddress, 0); }, { code: 'ERR_INVALID_ARG_TYPE', message: 'The "groupAddress" argument must be of type string. ' + 'Received type number (0)' }); socket.close(); } // dropSourceSpecificMembership with invalid UDP should throw { const socket = setup(); assert.throws(() => { socket.dropSourceSpecificMembership(multicastAddress, '0'); }, { code: 'EINVAL', message: 'dropSourceSpecificMembership EINVAL' }); socket.close(); }