test-dns so that NXDOMAIN does not rise errors
[platform/upstream/nodejs.git] / test / disabled / test-dns.js
1 require("../common");
2
3 var dns = require("dns"),
4     child_process = require("child_process"),
5     sys = require("sys");
6
7
8 // Try resolution without callback
9
10 assert.throws(function () {
11   dns.resolve('google.com', 'A');
12 });
13 assert.throws(function () {
14   dns.resolve('127.0.0.1', 'PTR');
15 });
16
17
18 var hosts = ['example.com',
19              'example.org',
20              'ietf.org', // AAAA
21              'google.com', // MX, multiple A records
22              '_xmpp-client._tcp.google.com', // SRV
23              'oakalynhall.co.uk' // Multiple PTR replies
24             ]; 
25
26 var records = ['A', 'AAAA', 'MX', 'TXT', 'SRV'];
27
28 var i = hosts.length;
29 while (i--) {
30
31   var j = records.length;
32   while (j--) {
33     var hostCmd = "dig -t " + records[j] + " " + hosts[i] +
34                   "| grep '^" + hosts[i] + "\\.\\W.*IN.*" + records[j] + "'" +
35                   "| sed -E 's/[[:space:]]+/ /g' | cut -d ' ' -f 5- " +
36                   "| sed -e 's/\\.$//'";
37     child_process.exec(hostCmd, checkDnsRecord(hosts[i], records[j]));
38   }
39 }
40
41 function checkDnsRecord(host, record) {
42   var myHost = host,
43       myRecord = record;
44   return function(err, stdout) {
45     var expected = [];
46     if(stdout.length)
47       expected = stdout.substr(0, stdout.length - 1).split("\n");
48
49     switch (myRecord) {
50       case "A":
51       case "AAAA":
52         dns.resolve(myHost, myRecord, function (error, result, ttl, cname) {
53             if(error) result = [];
54             cmpResults(expected, result, ttl, cname);
55
56             // do reverse lookup check
57             var ll = result.length;
58             while (ll--) {
59               var ip = result[ll];
60               var reverseCmd = "host " + ip +
61                                "| cut -d \" \" -f 5-" + 
62                                "| sed -e 's/\\.$//'";
63
64               child_process.exec(reverseCmd, checkReverse(ip));
65             }
66           }); 
67         break;
68       case "MX":
69         dns.resolve(myHost, myRecord, function (error, result, ttl, cname) {
70             if(error) result = [];
71
72             var strResult = [];
73             var ll = result.length;
74             while (ll--) {
75               strResult.push(result[ll].priority + " " + result[ll].exchange);
76             }
77             cmpResults(expected, strResult, ttl, cname);
78         });
79         break;
80       case "TXT":
81         dns.resolve(myHost, myRecord, function (error, result, ttl, cname) {
82             if(error) result = [];
83
84             var strResult = [];
85             var ll = result.length;
86             while (ll--) {
87               strResult.push('"' + result[ll] + '"');
88             }
89             cmpResults(expected, strResult, ttl, cname);
90         });
91         break;
92       case "SRV":
93         dns.resolve(myHost, myRecord, function (error, result, ttl, cname) {
94             if(error) result = [];
95
96             var strResult = [];
97             var ll = result.length;
98             while (ll--) {
99               strResult.push(result[ll].priority + " " +
100                              result[ll].weight + " " +
101                              result[ll].port + " " +
102                              result[ll].name);
103             }
104             cmpResults(expected, strResult, ttl, cname);
105         });
106         break;
107     }
108   }
109 }
110
111 function checkReverse(ip) {
112   var myIp = ip;
113
114   return function (errr, stdout) {
115     var expected = stdout.substr(0, stdout.length - 1).split("\n");
116
117     reversing = dns.reverse(myIp, function (error, domains, ttl, cname) {
118       if(error) domains = [];
119       cmpResults(expected, domains, ttl, cname);
120     });
121   }
122 }
123
124 function cmpResults(expected, result, ttl, cname) {
125   if (expected.length != result.length) {
126     if (expected.length == 1 && expected[0] == '3(NXDOMAIN)' && result.length == 0) {
127       // it's ok, dig returns NXDOMAIN, while dns module returns nothing
128     } else {
129       puts('---WARNING---\nexpected ' + expected + '\nresult ' + result + '\n-------------');
130     }
131     return;
132   }
133   expected.sort();
134   result.sort();
135
136   ll = expected.length;
137   while (ll--) {
138     assert.equal(result[ll], expected[ll]);
139     puts("Result " + result[ll] + " was equal to expected " + expected[ll]);
140   }
141 }