node/test/parallel/test-dns-resolver-max-timeout.js
theanarkh c44fa8d0b6
dns: support max timeout
PR-URL: https://github.com/nodejs/node/pull/58440
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
2025-07-10 15:50:43 +00:00

77 lines
2.3 KiB
JavaScript

'use strict';
const common = require('../common');
const dnstools = require('../common/dns');
const dns = require('dns');
const assert = require('assert');
const dgram = require('dgram');
[
-1,
1.1,
NaN,
undefined,
{},
[],
null,
function() {},
Symbol(),
true,
Infinity,
].forEach((maxTimeout) => {
try {
new dns.Resolver({ maxTimeout });
} catch (e) {
assert.ok(/ERR_OUT_OF_RANGE|ERR_INVALID_ARG_TYPE/i.test(e.code));
}
});
const server = dgram.createSocket('udp4');
const nxdomain = 'nxdomain.org';
const domain = 'example.org';
const answers = [{ type: 'A', address: '1.2.3.4', ttl: 123, domain }];
server.on('message', common.mustCallAtLeast((msg, { address, port }) => {
const parsed = dnstools.parseDNSPacket(msg);
if (parsed.questions[0].domain === nxdomain) {
return;
}
assert.strictEqual(parsed.questions[0].domain, domain);
server.send(dnstools.writeDNSPacket({
id: parsed.id,
questions: parsed.questions,
answers: answers,
}), port, address);
}), 1);
server.bind(0, common.mustCall(async () => {
const address = server.address();
// Test if the Resolver works as before.
const resolver = new dns.promises.Resolver({ timeout: 1000, tries: 1, maxTimeout: 1000 });
resolver.setServers([`127.0.0.1:${address.port}`]);
const res = await resolver.resolveAny('example.org');
assert.strictEqual(res.length, 1);
assert.strictEqual(res.length, answers.length);
assert.strictEqual(res[0].address, answers[0].address);
// Test that maxTimeout is effective.
// Without maxTimeout, the timeout will keep increasing when retrying.
const timeout1 = await timeout(address, { timeout: 500, tries: 3 });
// With maxTimeout, the timeout will always be 500 when retrying.
const timeout2 = await timeout(address, { timeout: 500, tries: 3, maxTimeout: 500 });
console.log(`timeout1: ${timeout1}, timeout2: ${timeout2}`);
assert.strictEqual(timeout1 !== undefined && timeout2 !== undefined, true);
assert.strictEqual(timeout1 > timeout2, true);
server.close();
}));
async function timeout(address, options) {
const start = Date.now();
const resolver = new dns.promises.Resolver(options);
resolver.setServers([`127.0.0.1:${address.port}`]);
try {
await resolver.resolveAny(nxdomain);
} catch (e) {
assert.strictEqual(e.code, 'ETIMEOUT');
return Date.now() - start;
}
}