1// Flags: --dns-result-order=ipv4first 2 3'use strict'; 4const common = require('../common'); 5const { addresses } = require('../common/internet'); 6const assert = require('assert'); 7const dns = require('dns'); 8const net = require('net'); 9const util = require('util'); 10const isIPv4 = net.isIPv4; 11 12const dnsPromises = dns.promises; 13let running = false; 14const queue = []; 15 16function TEST(f) { 17 function next() { 18 const f = queue.shift(); 19 if (f) { 20 running = true; 21 console.log(f.name); 22 f(done); 23 } 24 } 25 26 function done() { 27 running = false; 28 process.nextTick(next); 29 } 30 31 queue.push(f); 32 33 if (!running) { 34 next(); 35 } 36} 37 38function checkWrap(req) { 39 assert.ok(typeof req === 'object'); 40} 41 42TEST(async function test_resolve4(done) { 43 function validateResult(res) { 44 assert.ok(res.length > 0); 45 46 for (let i = 0; i < res.length; i++) { 47 assert.ok(isIPv4(res[i])); 48 } 49 } 50 51 validateResult(await dnsPromises.resolve4(addresses.INET4_HOST)); 52 53 const req = dns.resolve4( 54 addresses.INET4_HOST, 55 common.mustSucceed((ips) => { 56 validateResult(ips); 57 done(); 58 })); 59 60 checkWrap(req); 61}); 62 63TEST(async function test_reverse_ipv4(done) { 64 function validateResult(res) { 65 assert.ok(res.length > 0); 66 67 for (let i = 0; i < res.length; i++) { 68 assert.ok(res[i]); 69 assert.ok(typeof res[i] === 'string'); 70 } 71 } 72 73 validateResult(await dnsPromises.reverse(addresses.INET4_IP)); 74 75 const req = dns.reverse( 76 addresses.INET4_IP, 77 common.mustSucceed((domains) => { 78 validateResult(domains); 79 done(); 80 })); 81 82 checkWrap(req); 83}); 84 85TEST(async function test_lookup_ipv4_explicit(done) { 86 function validateResult(res) { 87 assert.ok(net.isIPv4(res.address)); 88 assert.strictEqual(res.family, 4); 89 } 90 91 validateResult(await dnsPromises.lookup(addresses.INET4_HOST, 4)); 92 93 const req = dns.lookup( 94 addresses.INET4_HOST, 4, 95 common.mustSucceed((ip, family) => { 96 validateResult({ address: ip, family }); 97 done(); 98 })); 99 100 checkWrap(req); 101}); 102 103TEST(async function test_lookup_ipv4_implicit(done) { 104 function validateResult(res) { 105 assert.ok(net.isIPv4(res.address)); 106 assert.strictEqual(res.family, 4); 107 } 108 109 validateResult(await dnsPromises.lookup(addresses.INET4_HOST)); 110 111 const req = dns.lookup( 112 addresses.INET4_HOST, 113 common.mustSucceed((ip, family) => { 114 validateResult({ address: ip, family }); 115 done(); 116 })); 117 118 checkWrap(req); 119}); 120 121TEST(async function test_lookup_ipv4_explicit_object(done) { 122 function validateResult(res) { 123 assert.ok(net.isIPv4(res.address)); 124 assert.strictEqual(res.family, 4); 125 } 126 127 validateResult(await dnsPromises.lookup(addresses.INET4_HOST, { family: 4 })); 128 129 const req = dns.lookup(addresses.INET4_HOST, { 130 family: 4, 131 }, common.mustSucceed((ip, family) => { 132 validateResult({ address: ip, family }); 133 done(); 134 })); 135 136 checkWrap(req); 137}); 138 139TEST(async function test_lookup_ipv4_hint_addrconfig(done) { 140 function validateResult(res) { 141 assert.ok(net.isIPv4(res.address)); 142 assert.strictEqual(res.family, 4); 143 } 144 145 validateResult(await dnsPromises.lookup(addresses.INET4_HOST, { 146 hints: dns.ADDRCONFIG, 147 })); 148 149 const req = dns.lookup(addresses.INET4_HOST, { 150 hints: dns.ADDRCONFIG, 151 }, common.mustSucceed((ip, family) => { 152 validateResult({ address: ip, family }); 153 done(); 154 })); 155 156 checkWrap(req); 157}); 158 159TEST(async function test_lookup_ip_ipv4(done) { 160 function validateResult(res) { 161 assert.strictEqual(res.address, '127.0.0.1'); 162 assert.strictEqual(res.family, 4); 163 } 164 165 validateResult(await dnsPromises.lookup('127.0.0.1')); 166 167 const req = dns.lookup('127.0.0.1', 168 common.mustSucceed((ip, family) => { 169 validateResult({ address: ip, family }); 170 done(); 171 })); 172 173 checkWrap(req); 174}); 175 176TEST(async function test_lookup_localhost_ipv4(done) { 177 function validateResult(res) { 178 assert.strictEqual(res.address, '127.0.0.1'); 179 assert.strictEqual(res.family, 4); 180 } 181 182 validateResult(await dnsPromises.lookup('localhost', 4)); 183 184 const req = dns.lookup('localhost', 4, 185 common.mustSucceed((ip, family) => { 186 validateResult({ address: ip, family }); 187 done(); 188 })); 189 190 checkWrap(req); 191}); 192 193TEST(async function test_lookup_all_ipv4(done) { 194 function validateResult(res) { 195 assert.ok(Array.isArray(res)); 196 assert.ok(res.length > 0); 197 198 res.forEach((ip) => { 199 assert.ok(isIPv4(ip.address)); 200 assert.strictEqual(ip.family, 4); 201 }); 202 } 203 204 validateResult(await dnsPromises.lookup(addresses.INET4_HOST, { 205 all: true, 206 family: 4, 207 })); 208 209 const req = dns.lookup( 210 addresses.INET4_HOST, 211 { all: true, family: 4 }, 212 common.mustSucceed((ips) => { 213 validateResult(ips); 214 done(); 215 }), 216 ); 217 218 checkWrap(req); 219}); 220 221TEST(async function test_lookupservice_ip_ipv4(done) { 222 function validateResult(res) { 223 assert.strictEqual(typeof res.hostname, 'string'); 224 assert(res.hostname); 225 assert(['http', 'www', '80'].includes(res.service)); 226 } 227 228 validateResult(await dnsPromises.lookupService('127.0.0.1', 80)); 229 230 const req = dns.lookupService( 231 '127.0.0.1', 80, 232 common.mustSucceed((hostname, service) => { 233 validateResult({ hostname, service }); 234 done(); 235 }), 236 ); 237 238 checkWrap(req); 239}); 240 241TEST(function test_lookupservice_ip_ipv4_promise(done) { 242 util.promisify(dns.lookupService)('127.0.0.1', 80) 243 .then(common.mustCall(({ hostname, service }) => { 244 assert.strictEqual(typeof hostname, 'string'); 245 assert(hostname.length > 0); 246 assert(['http', 'www', '80'].includes(service)); 247 done(); 248 })); 249}); 250