| // Copyright Joyent, Inc. and other Node contributors. |
| // |
| // Permission is hereby granted, free of charge, to any person obtaining a |
| // copy of this software and associated documentation files (the |
| // "Software"), to deal in the Software without restriction, including |
| // without limitation the rights to use, copy, modify, merge, publish, |
| // distribute, sublicense, and/or sell copies of the Software, and to permit |
| // persons to whom the Software is furnished to do so, subject to the |
| // following conditions: |
| // |
| // The above copyright notice and this permission notice shall be included |
| // in all copies or substantial portions of the Software. |
| // |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
| // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
| // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
| // USE OR OTHER DEALINGS IN THE SOFTWARE. |
| |
| |
| |
| |
| var common = require('../common'); |
| var assert = require('assert'); |
| |
| var dns = require('dns'), |
| child_process = require('child_process'); |
| |
| |
| // Try resolution without callback |
| |
| assert.throws(function() { |
| dns.resolve('google.com', 'A'); |
| }); |
| assert.throws(function() { |
| dns.resolve('127.0.0.1', 'PTR'); |
| }); |
| |
| |
| 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/\\.$//"'; |
| child_process.exec(hostCmd, checkDnsRecord(hosts[i], records[j])); |
| } |
| } |
| |
| // CNAME should resolve |
| var resolveCNAME = 'before'; |
| dns.resolve('labs.nrcmedia.nl', 'CNAME', function(err, result) { |
| assert.deepEqual(result, ['nrcmedia.nl']); |
| assert.equal(resolveCNAME, 'beforeafter'); |
| }); |
| resolveCNAME += 'after'; |
| |
| // CNAME should not resolve |
| dns.resolve('nrcmedia.nl', 'CNAME', function(err, result) { |
| assert.ok(err.errno, dns.NODATA); |
| }); |
| |
| function checkDnsRecord(host, record) { |
| var myHost = host, |
| myRecord = record; |
| return function(err, stdout) { |
| var expected = []; |
| var footprints = 'before'; |
| if (stdout.length) |
| expected = stdout.substr(0, stdout.length - 1).split('\n'); |
| |
| switch (myRecord) { |
| case 'A': |
| case 'AAAA': |
| dns.resolve(myHost, myRecord, function(error, result, ttl, cname) { |
| if (error) result = []; |
| 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/\\.$//"'; |
| |
| child_process.exec(reverseCmd, checkReverse(ip)); |
| } |
| assert.equal(footprints, 'beforeafter'); |
| }); |
| break; |
| case 'MX': |
| dns.resolve(myHost, myRecord, function(error, result, ttl, cname) { |
| if (error) result = []; |
| |
| var strResult = []; |
| var ll = result.length; |
| while (ll--) { |
| strResult.push(result[ll].priority + ' ' + result[ll].exchange); |
| } |
| cmpResults(expected, strResult, ttl, cname); |
| assert.equal(footprints, 'beforeafter'); |
| }); |
| break; |
| case 'TXT': |
| dns.resolve(myHost, myRecord, function(error, result, ttl, cname) { |
| if (error) result = []; |
| |
| var strResult = []; |
| var ll = result.length; |
| while (ll--) { |
| strResult.push('"' + result[ll] + '"'); |
| } |
| cmpResults(expected, strResult, ttl, cname); |
| assert.equal(footprints, 'beforeafter'); |
| }); |
| break; |
| case 'SRV': |
| dns.resolve(myHost, myRecord, function(error, result, ttl, cname) { |
| if (error) result = []; |
| |
| 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); |
| assert.equal(footprints, 'beforeafter'); |
| }); |
| break; |
| } |
| footprints += 'after'; |
| } |
| } |
| |
| function checkReverse(ip) { |
| var myIp = ip; |
| |
| return function(errr, stdout) { |
| var expected = stdout.substr(0, stdout.length - 1).split('\n'); |
| |
| var reversing = dns.reverse(myIp, function(error, domains, ttl, cname) { |
| if (error) domains = []; |
| cmpResults(expected, domains, ttl, cname); |
| }); |
| } |
| } |
| |
| function cmpResults(expected, result, ttl, cname) { |
| if (expected.length != result.length) { |
| if (expected.length == 1 && |
| expected[0] == '3(NXDOMAIN)' && |
| result.length == 0) { |
| // it's ok, dig returns NXDOMAIN, while dns module returns nothing |
| } else { |
| console.log('---WARNING---\nexpected ' + expected + |
| '\nresult ' + result + '\n-------------'); |
| } |
| return; |
| } |
| expected.sort(); |
| result.sort(); |
| |
| var ll = expected.length; |
| while (ll--) { |
| assert.equal(result[ll], expected[ll]); |
| console.log('Result ' + result[ll] + |
| ' was equal to expected ' + expected[ll]); |
| } |
| } |
| |
| // #1164 |
| var getHostByName = 'before'; |
| dns.getHostByName('localhost', function() { |
| assert.equal(getHostByName, 'beforeafter'); |
| }); |
| getHostByName += 'after'; |
| |
| var getHostByAddr = 'before'; |
| dns.getHostByAddr('127.0.0.1', function() { |
| assert.equal(getHostByAddr, 'beforeafter'); |
| }); |
| getHostByAddr += 'after'; |
| |
| var lookupEmpty = 'before'; |
| dns.lookup('', function() { |
| assert.equal(lookupEmpty, 'beforeafter'); |
| }); |
| lookupEmpty += 'after'; |
| |
| var lookupIp = 'before'; |
| dns.lookup('127.0.0.1', function() { |
| assert.equal(lookupIp, 'beforeafter'); |
| }); |
| lookupIp += 'after'; |
| |
| var lookupIp4 = 'before'; |
| dns.lookup('127.0.0.1', 4, function() { |
| assert.equal(lookupIp4, 'beforeafter'); |
| }); |
| lookupIp4 += 'after'; |
| |
| var lookupIp6 = 'before'; |
| dns.lookup('ietf.org', 6, function() { |
| assert.equal(lookupIp6, 'beforeafter'); |
| }); |
| lookupIp6 += 'after'; |
| |
| var lookupLocal = 'before'; |
| dns.lookup('localhost', function() { |
| assert.equal(lookupLocal, 'beforeafter'); |
| }); |
| lookupLocal += 'after'; |