process.mixin(require("../common")); var dns = require("dns"), sys = require("sys"); var hosts = ['example.com', 'example.org', 'ietf.org', // AAAA 'google.com', // MX, multiple A records '_xmpp-client._tcp.google.com', // SRV 'oakalynhall.co.uk']; // Multiple PTR replies var records = ['A', 'AAAA', 'MX', 'TXT', 'SRV']; var i = hosts.length; while (i--) { var j = records.length; while (j--) { var hostCmd = "dig -t " + records[j] + " " + hosts[i] + "| grep '^" + hosts[i] + "\\.\\W.*IN.*" + records[j] + "'" + "| sed -E 's/[[:space:]]+/ /g' | cut -d ' ' -f 5- " + "| sed -e 's/\\.$//'"; sys.exec(hostCmd).addCallback(checkDnsRecord(hosts[i], records[j])); } } function checkDnsRecord(host, record) { var myHost = host, myRecord = record; return function(stdout) { var expected = stdout.substr(0, stdout.length - 1).split("\n"); var resolution = dns.resolve(myHost, myRecord); switch (myRecord) { case "A": case "AAAA": resolution.addCallback(function (result, ttl, cname) { cmpResults(expected, result, ttl, cname); // do reverse lookup check var ll = result.length; while (ll--) { var ip = result[ll]; var reverseCmd = "host " + ip + "| cut -d \" \" -f 5-" + "| sed -e 's/\\.$//'"; sys.exec(reverseCmd).addCallback(checkReverse(ip)); } }); break; case "MX": resolution.addCallback(function (result, ttl, cname) { var strResult = []; var ll = result.length; while (ll--) { strResult.push(result[ll].priority + " " + result[ll].exchange); } cmpResults(expected, strResult, ttl, cname); }); break; case "TXT": resolution.addCallback(function (result, ttl, cname) { var strResult = []; var ll = result.length; while (ll--) { strResult.push('"' + result[ll] + '"'); } cmpResults(expected, strResult, ttl, cname); }); break; case "SRV": resolution.addCallback(function (result, ttl, cname) { var strResult = []; var ll = result.length; while (ll--) { strResult.push(result[ll].priority + " " + result[ll].weight + " " + result[ll].port + " " + result[ll].name); } cmpResults(expected, strResult, ttl, cname); }); break; } } } function checkReverse(ip) { var myIp = ip; return function (stdout) { var expected = stdout.substr(0, stdout.length - 1).split("\n"); var reversing = dns.reverse(myIp); reversing.addCallback( function (domains, ttl, cname) { cmpResults(expected, domains, ttl, cname); }); } } function cmpResults(expected, result, ttl, cname) { assert.equal(expected.length, result.length); expected.sort(); result.sort(); ll = expected.length; while (ll--) { assert.equal(result[ll], expected[ll]); // puts("Result " + result[ll] + " was equal to expected " + expected[ll]); } }