1'use strict'; 2const common = require('../common'); 3const dnstools = require('../common/dns'); 4const { Resolver } = require('dns'); 5const assert = require('assert'); 6const dgram = require('dgram'); 7 8const servers = [ 9 { 10 socket: dgram.createSocket('udp4'), 11 reply: { type: 'A', address: '1.2.3.4', ttl: 123, domain: 'example.org' } 12 }, 13 { 14 socket: dgram.createSocket('udp4'), 15 reply: { type: 'A', address: '5.6.7.8', ttl: 123, domain: 'example.org' } 16 }, 17]; 18 19let waiting = servers.length; 20for (const { socket, reply } of servers) { 21 socket.on('message', common.mustCall((msg, { address, port }) => { 22 const parsed = dnstools.parseDNSPacket(msg); 23 const domain = parsed.questions[0].domain; 24 assert.strictEqual(domain, 'example.org'); 25 26 socket.send(dnstools.writeDNSPacket({ 27 id: parsed.id, 28 questions: parsed.questions, 29 answers: [reply], 30 }), port, address); 31 })); 32 33 socket.bind(0, common.mustCall(() => { 34 if (--waiting === 0) ready(); 35 })); 36} 37 38 39function ready() { 40 const resolvers = servers.map((server) => ({ 41 server, 42 resolver: new Resolver() 43 })); 44 45 for (const { server: { socket, reply }, resolver } of resolvers) { 46 resolver.setServers([`127.0.0.1:${socket.address().port}`]); 47 resolver.resolve4('example.org', common.mustSucceed((res) => { 48 assert.deepStrictEqual(res, [reply.address]); 49 socket.close(); 50 })); 51 } 52} 53