@leichtgewicht/dns-socket
Version:
Make low-level DNS requests with retry and timeout support.
185 lines (172 loc) • 4.53 kB
JavaScript
;
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();
}
});
});