// Flags: --expose-internals 'use strict'; const common = require('../common'); const assert = require('assert'); const EventEmitter = require('events'); const dgram = require('dgram'); const dns = require('dns'); const { kStateSymbol } = require('internal/dgram'); const mockError = new Error('fake DNS'); // Monkey patch dns.lookup() so that it always fails. dns.lookup = function(address, family, callback) { process.nextTick(() => { callback(mockError); }); }; const socket = dgram.createSocket('udp4'); socket.on(EventEmitter.errorMonitor, common.mustCall((err) => { // The DNS lookup should fail since it is monkey patched. At that point in // time, the send queue should be populated with the send() operation. assert.strictEqual(err, mockError); assert(Array.isArray(socket[kStateSymbol].queue)); assert.strictEqual(socket[kStateSymbol].queue.length, 1); }, 3)); socket.on('error', common.mustCall((err) => { assert.strictEqual(err, mockError); assert.strictEqual(socket[kStateSymbol].queue, undefined); }, 3)); // Initiate a few send() operations, which will fail. socket.send('foobar', common.PORT, 'localhost'); process.nextTick(() => { socket.send('foobar', common.PORT, 'localhost'); }); setImmediate(() => { socket.send('foobar', common.PORT, 'localhost'); });