UNPKG

over-the-wire

Version:

Network inspection library for Node

79 lines (67 loc) 2.8 kB
const { strict: assert } = require('node:assert'); const test = require('node:test'); const { DNS } = require('#lib/layers/DNS'); const { DNSRecordType, DNSRecordClass } = require('#lib/layers/DNSEnums'); // Sample DNS query packet for google.com const queryBuf = Buffer.from('00000100000100000000000006676f6f676c6503636f6d0000010001', 'hex'); // Sample DNS response packet for google.com const responseBuf = Buffer.from('00008180000100010000000006676f6f676c6503636f6d0000010001c00c000100010000012c0004d83ad6e7', 'hex'); function roundtrip(buf, Cls = DNS) { const parsed = new Cls(buf); const obj = parsed.toObject(); const reparsed = new Cls(obj); if (Buffer.compare(parsed.buffer.slice(0, reparsed.buffer.length), reparsed.buffer)) { console.log('roundtrip', obj, parsed.buffer.slice(0, reparsed.buffer.length), reparsed.buffer, reparsed.toObject()); } assert.equal(Buffer.compare(parsed.buffer.slice(0, reparsed.buffer.length), reparsed.buffer), 0, 'buffer -> parse -> object -> buffer roundtrip'); assert.deepEqual(reparsed.toObject(), obj, 'object roundtrip'); } test('DNS Query', async () => { const dns = new DNS(queryBuf); assert.equal(dns.id, 0); assert.equal(dns.flags, 0x0100); assert.equal(dns.qdcount, 1); assert.equal(dns.ancount, 0); assert.equal(dns.nscount, 0); assert.equal(dns.arcount, 0); assert.ok(dns.isQuery); assert.equal(dns.opcode, 0); assert.equal(dns.recursionDesired, true); assert.equal(dns.recursionAvailable, false); assert.equal(dns.responseCode, 0); const query = dns.getFirstQuery(); assert.ok(query); assert.equal(query.name, 'google.com'); assert.equal(query.type, DNSRecordType.A); assert.equal(query.class, DNSRecordClass.IN); roundtrip(queryBuf); }); test('DNS Response', async () => { const dns = new DNS(responseBuf); assert.equal(dns.id, 0); assert.equal(dns.flags, 0x8180); assert.equal(dns.qdcount, 1); assert.equal(dns.ancount, 1); assert.equal(dns.nscount, 0); assert.equal(dns.arcount, 0); assert.ok(dns.isResponse); assert.equal(dns.opcode, 0); assert.equal(dns.authoritativeAnswer, false); assert.equal(dns.truncation, false); assert.equal(dns.recursionDesired, true); assert.equal(dns.recursionAvailable, true); assert.equal(dns.responseCode, 0); const query = dns.getFirstQuery(); assert.ok(query); assert.equal(query.name, 'google.com'); assert.equal(query.type, DNSRecordType.A); assert.equal(query.class, DNSRecordClass.IN); const answer = dns.getFirstAnswer(); assert.ok(answer); assert.equal(answer.name, 'google.com'); assert.equal(answer.type, DNSRecordType.A); assert.equal(answer.class, DNSRecordClass.IN); assert.equal(answer.ttl, 300); assert.equal(answer.data.toString('hex'), 'd83ad6e7'); roundtrip(responseBuf); });