test_dns_service.js (4557B)
1 "use strict"; 2 3 const defaultOriginAttributes = {}; 4 const mainThread = Services.tm.currentThread; 5 6 const overrideService = Cc[ 7 "@mozilla.org/network/native-dns-override;1" 8 ].getService(Ci.nsINativeDNSResolverOverride); 9 10 class Listener { 11 constructor() { 12 this.promise = new Promise(resolve => { 13 this.resolve = resolve; 14 }); 15 } 16 17 onLookupComplete(inRequest, inRecord, inStatus) { 18 this.resolve([inRequest, inRecord, inStatus]); 19 } 20 21 then() { 22 return this.promise.then.apply(this.promise, arguments); 23 } 24 } 25 26 Listener.prototype.QueryInterface = ChromeUtils.generateQI(["nsIDNSListener"]); 27 28 // This domain used to resolve. We fake the response to avoid 29 // depending on the network for automated tests. 30 overrideService.addIPOverride("xn--bcher-kva.org", "127.0.0.1"); 31 32 const DOMAIN_IDN = "bücher.org"; 33 const ACE_IDN = "xn--bcher-kva.org"; 34 35 const ADDR1 = "127.0.0.1"; 36 const ADDR2 = "::1"; 37 38 add_task(async function test_dns_localhost() { 39 let listener = new Listener(); 40 Services.dns.asyncResolve( 41 "localhost", 42 Ci.nsIDNSService.RESOLVE_TYPE_DEFAULT, 43 0, 44 null, // resolverInfo 45 listener, 46 mainThread, 47 defaultOriginAttributes 48 ); 49 let [, inRecord] = await listener; 50 inRecord.QueryInterface(Ci.nsIDNSAddrRecord); 51 let answer = inRecord.getNextAddrAsString(); 52 Assert.ok(answer == ADDR1 || answer == ADDR2); 53 }); 54 55 add_task(async function test_idn_cname() { 56 let listener = new Listener(); 57 Services.dns.asyncResolve( 58 DOMAIN_IDN, 59 Ci.nsIDNSService.RESOLVE_TYPE_DEFAULT, 60 Ci.nsIDNSService.RESOLVE_CANONICAL_NAME, 61 null, // resolverInfo 62 listener, 63 mainThread, 64 defaultOriginAttributes 65 ); 66 let [, inRecord] = await listener; 67 inRecord.QueryInterface(Ci.nsIDNSAddrRecord); 68 Assert.equal(inRecord.canonicalName, ACE_IDN, "IDN is returned as punycode"); 69 }); 70 71 add_task( 72 { 73 skip_if: () => 74 Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT, 75 }, 76 async function test_long_domain() { 77 let listener = new Listener(); 78 let domain = "a".repeat(253); 79 overrideService.addIPOverride(domain, "1.2.3.4"); 80 Services.dns.asyncResolve( 81 domain, 82 Ci.nsIDNSService.RESOLVE_TYPE_DEFAULT, 83 Ci.nsIDNSService.RESOLVE_CANONICAL_NAME, 84 null, // resolverInfo 85 listener, 86 mainThread, 87 defaultOriginAttributes 88 ); 89 let [, , inStatus] = await listener; 90 Assert.equal(inStatus, Cr.NS_OK); 91 92 listener = new Listener(); 93 domain = "a".repeat(254); 94 overrideService.addIPOverride(domain, "1.2.3.4"); 95 96 if (mozinfo.socketprocess_networking) { 97 // When using the socket process, the call fails asynchronously. 98 Services.dns.asyncResolve( 99 domain, 100 Ci.nsIDNSService.RESOLVE_TYPE_DEFAULT, 101 Ci.nsIDNSService.RESOLVE_CANONICAL_NAME, 102 null, // resolverInfo 103 listener, 104 mainThread, 105 defaultOriginAttributes 106 ); 107 let [, , inStatus1] = await listener; 108 Assert.equal(inStatus1, Cr.NS_ERROR_UNKNOWN_HOST); 109 } else { 110 Assert.throws( 111 () => { 112 Services.dns.asyncResolve( 113 domain, 114 Ci.nsIDNSService.RESOLVE_TYPE_DEFAULT, 115 Ci.nsIDNSService.RESOLVE_CANONICAL_NAME, 116 null, // resolverInfo 117 listener, 118 mainThread, 119 defaultOriginAttributes 120 ); 121 }, 122 /NS_ERROR_UNKNOWN_HOST/, 123 "Should throw for large domains" 124 ); 125 } 126 } 127 ); 128 129 add_task( 130 { 131 skip_if: () => 132 Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT, 133 }, 134 async function test_sort_family() { 135 Services.prefs.setBoolPref("network.dns.preferIPv6", true); 136 overrideService.clearOverrides(); 137 overrideService.addIPOverride("example.com", "1.2.3.4"); 138 overrideService.addIPOverride("example.com", "3.4.5.6"); 139 overrideService.addIPOverride("example.com", "::1"); 140 overrideService.addIPOverride("example.com", "::2"); 141 142 let listener = new Listener(); 143 Services.dns.asyncResolve( 144 "example.com", 145 Ci.nsIDNSService.RESOLVE_TYPE_DEFAULT, 146 Ci.nsIDNSService.RESOLVE_CANONICAL_NAME, 147 null, // resolverInfo 148 listener, 149 mainThread, 150 defaultOriginAttributes 151 ); 152 153 let [, inRecord] = await listener; 154 inRecord.QueryInterface(Ci.nsIDNSAddrRecord); 155 Assert.equal(inRecord.getNextAddrAsString(), "::1"); 156 Assert.equal(inRecord.getNextAddrAsString(), "::2"); 157 Assert.equal(inRecord.getNextAddrAsString(), "1.2.3.4"); 158 Assert.equal(inRecord.getNextAddrAsString(), "3.4.5.6"); 159 } 160 );