• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2const common = require('../common');
3const dnstools = require('../common/dns');
4const dns = require('dns');
5const assert = require('assert');
6const dgram = require('dgram');
7const dnsPromises = dns.promises;
8
9const answers = [
10  { type: 'A', address: '1.2.3.4', ttl: 123 },
11  { type: 'AAAA', address: '::42', ttl: 123 },
12  { type: 'MX', priority: 42, exchange: 'foobar.com', ttl: 124 },
13  { type: 'NS', value: 'foobar.org', ttl: 457 },
14  { type: 'TXT', entries: [ 'v=spf1 ~all', 'xyz\0foo' ] },
15  { type: 'PTR', value: 'baz.org', ttl: 987 },
16  {
17    type: 'SOA',
18    nsname: 'ns1.example.com',
19    hostmaster: 'admin.example.com',
20    serial: 156696742,
21    refresh: 900,
22    retry: 900,
23    expire: 1800,
24    minttl: 60
25  },
26];
27
28const server = dgram.createSocket('udp4');
29
30server.on('message', common.mustCall((msg, { address, port }) => {
31  const parsed = dnstools.parseDNSPacket(msg);
32  const domain = parsed.questions[0].domain;
33  assert.strictEqual(domain, 'example.org');
34
35  server.send(dnstools.writeDNSPacket({
36    id: parsed.id,
37    questions: parsed.questions,
38    answers: answers.map((answer) => Object.assign({ domain }, answer)),
39  }), port, address);
40}, 2));
41
42server.bind(0, common.mustCall(async () => {
43  const address = server.address();
44  dns.setServers([`127.0.0.1:${address.port}`]);
45
46  validateResults(await dnsPromises.resolveAny('example.org'));
47
48  dns.resolveAny('example.org', common.mustCall((err, res) => {
49    assert.ifError(err);
50    validateResults(res);
51    server.close();
52  }));
53}));
54
55function validateResults(res) {
56  // TTL values are only provided for A and AAAA entries.
57  assert.deepStrictEqual(res.map(maybeRedactTTL), answers.map(maybeRedactTTL));
58}
59
60function maybeRedactTTL(r) {
61  const ret = { ...r };
62  if (!['A', 'AAAA'].includes(r.type))
63    delete ret.ttl;
64  return ret;
65}
66