| 'use strict'; |
| const common = require('../common'); |
| const dnstools = require('../common/dns'); |
| const { Resolver } = require('dns'); |
| const assert = require('assert'); |
| const dgram = require('dgram'); |
| |
| const servers = [ |
| { |
| socket: dgram.createSocket('udp4'), |
| reply: { type: 'A', address: '1.2.3.4', ttl: 123, domain: 'example.org' } |
| }, |
| { |
| socket: dgram.createSocket('udp4'), |
| reply: { type: 'A', address: '5.6.7.8', ttl: 123, domain: 'example.org' } |
| } |
| ]; |
| |
| let waiting = servers.length; |
| for (const { socket, reply } of servers) { |
| socket.on('message', common.mustCall((msg, { address, port }) => { |
| const parsed = dnstools.parseDNSPacket(msg); |
| const domain = parsed.questions[0].domain; |
| assert.strictEqual(domain, 'example.org'); |
| |
| socket.send(dnstools.writeDNSPacket({ |
| id: parsed.id, |
| questions: parsed.questions, |
| answers: [reply], |
| }), port, address); |
| })); |
| |
| socket.bind(0, common.mustCall(() => { |
| if (--waiting === 0) ready(); |
| })); |
| } |
| |
| |
| function ready() { |
| const resolvers = servers.map((server) => ({ |
| server, |
| resolver: new Resolver() |
| })); |
| |
| for (const { server: { socket, reply }, resolver } of resolvers) { |
| resolver.setServers([`127.0.0.1:${socket.address().port}`]); |
| resolver.resolve4('example.org', common.mustCall((err, res) => { |
| assert.ifError(err); |
| assert.deepStrictEqual(res, [reply.address]); |
| socket.close(); |
| })); |
| } |
| } |