UNPKG

@leichtgewicht/dns-socket

Version:

Make low-level DNS requests with retry and timeout support.

185 lines (172 loc) 4.53 kB
"use strict"; var _tape = require("tape"); var _dgram = require("dgram"); var _index = require("./index.js"); _tape('query + response', function (t) { const socket = new _index.DNSSocket(); socket.on('query', function (query, port, host) { socket.response(query, { answers: [{ type: 'A', class: 'IN', name: 'test', data: '1.1.1.1' }] }, port, host); }); socket.bind(0, function () { socket.query({ questions: [{ type: 'A', name: 'test' }] }, socket.address().port, socket.address().host, function (err, res) { socket.destroy(); t.error(err); t.same(res.answers.length, 1); t.same(res.answers[0].type, 'A'); t.same(res.answers[0].class, 'IN'); t.same(res.answers[0].name, 'test'); t.same(res.answers[0].data, '1.1.1.1'); t.end(); }); }); }); _tape('pass socket + query + response', function (t) { const udp = _dgram.createSocket('udp4'); udp.bind(0, function () { const socket = new _index.DNSSocket({ socket: udp }); socket.on('query', function (query, port, host) { socket.response(query, { answers: [{ type: 'A', name: 'test', data: '1.1.1.1' }] }, port, host); }); socket.query({ questions: [{ type: 'A', name: 'test' }] }, socket.address().port, socket.address().host, function (err, res) { socket.destroy(); t.error(err); t.same(res.answers.length, 1); t.same(res.answers[0].type, 'A'); t.same(res.answers[0].name, 'test'); t.same(res.answers[0].data, '1.1.1.1'); t.end(); }); }); }); _tape('timeout', function (t) { const dummy = _dgram.createSocket('udp4'); dummy.bind(0, function () { let done = false; const socket = new _index.DNSSocket(); const timeout = setTimeout(function () { done = true; socket.destroy(); dummy.close(); t.fail('should timeout before 10s'); t.end(); }, 10000); const id = socket.query({ questions: [{ type: 'A', name: 'test' }] }, dummy.address().port, dummy.address().host, function (err) { if (done) return; clearTimeout(timeout); socket.destroy(); dummy.close(); t.ok(err, 'should error'); t.end(); }); socket.setRetries(id, 0); }); }); _tape('pass socket + timeout', function (t) { const udp = _dgram.createSocket('udp4'); const dummy = _dgram.createSocket('udp4'); dummy.bind(0, function () { udp.bind(0, function () { let done = false; const socket = new _index.DNSSocket({ socket: udp }); const timeout = setTimeout(function () { done = true; socket.destroy(); dummy.close(); t.fail('should timeout before 10s'); t.end(); }, 10000); const id = socket.query({ questions: [{ type: 'A', name: 'test' }] }, dummy.address().port, socket.address().host, function (err) { if (done) return; clearTimeout(timeout); socket.destroy(); dummy.close(); t.ok(err, 'should error'); t.end(); }); socket.setRetries(id, 0); }); }); }); _tape('two queries + response', function (t) { const socket = new _index.DNSSocket(); let missing = 2; socket.on('query', function (query, port, host) { socket.response(query, { answers: [{ type: 'A', name: query.questions[0].name, data: '1.1.1.1' }] }, port, host); }); socket.bind(0, function () { socket.query({ questions: [{ type: 'A', name: 'test1' }] }, socket.address().port, socket.address().host, function (err, res) { t.error(err); t.same(res.answers.length, 1); t.same(res.answers[0].type, 'A'); t.same(res.answers[0].name, 'test1'); t.same(res.answers[0].data, '1.1.1.1'); done(); }); socket.query({ questions: [{ type: 'A', name: 'test2' }] }, socket.address().port, socket.address().host, function (err, res) { t.error(err); t.same(res.answers.length, 1); t.same(res.answers[0].type, 'A'); t.same(res.answers[0].name, 'test2'); t.same(res.answers[0].data, '1.1.1.1'); done(); }); function done() { if (--missing) return; socket.destroy(); t.end(); } }); });