1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 registerCleanupFunction(async () => {
12 function makeChan(url
) {
13 let chan
= NetUtil
.newChannel({
15 loadUsingSystemPrincipal
: true,
16 }).QueryInterface(Ci
.nsIHttpChannel
);
20 function channelOpenPromise(chan
) {
21 return new Promise(resolve
=> {
22 function finish(req
, buffer
) {
23 resolve([req
, buffer
]);
25 chan
.asyncOpen(new ChannelListener(finish
));
29 let trrServer
= new TRRServer();
30 registerCleanupFunction(async () => {
31 await trrServer
.stop();
33 add_task(async
function setup_server() {
34 await trrServer
.start();
35 dump(`port = ${trrServer.port()}\n`);
36 let chan
= makeChan(`https://localhost:${trrServer.port()}/test?bla=some`);
37 let [, resp
] = await
channelOpenPromise(chan
);
38 equal(resp
, "<h1> 404 Path not found: /test</h1>");
41 add_task(async
function test_parse_additional_section() {
42 Services
.dns
.clearCache(true);
43 Services
.prefs
.setIntPref("network.trr.mode", 3);
44 Services
.prefs
.setCharPref(
46 `https://foo.example.com:${trrServer.port()}/dns-query`
49 await trrServer
.registerDoHAnswers("something.foo", "A", {
52 name
: "something.foo",
70 await
new TRRDNSListener("something.foo", { expectedAnswer
: "1.2.3.4" });
71 await
new TRRDNSListener("else.foo", { expectedAnswer
: "2.3.4.5" });
73 await trrServer
.registerDoHAnswers("a.foo", "A", {
93 await trrServer
.registerDoHAnswers("b.foo", "A", {
105 let req1
= new TRRDNSListener("a.foo", { expectedAnswer
: "1.2.3.4" });
107 // A request for b.foo will be in progress by the time we parse the additional
108 // record. To keep things simple we don't end up saving the record, instead
109 // we wait for the in-progress request to complete.
110 // This check is also racy - if the response for a.foo completes before we make
111 // this request, we'll put the other IP in the cache. But that is very unlikely.
112 let req2
= new TRRDNSListener("b.foo", { expectedAnswer
: "3.4.5.6" });
114 await Promise
.all([req1
, req2
]);
117 await trrServer
.registerDoHAnswers("xyz.foo", "A", {
138 await
new TRRDNSListener("xyz.foo", { expectedAnswer
: "1.2.3.4" });
139 await
new TRRDNSListener("abc.foo", { expectedAnswer
: "::1:2:3:4" });
142 await trrServer
.registerDoHAnswers("ipv6.foo", "AAAA", {
149 data
: "2001::a:b:c:d",
163 await
new TRRDNSListener("ipv6.foo", { expectedAnswer
: "2001::a:b:c:d" });
164 await
new TRRDNSListener("def.foo", { expectedAnswer
: "::a:b:c:d" });
167 await trrServer
.registerDoHAnswers("ipv6b.foo", "AAAA", {
174 data
: "2001::a:b:c:d",
188 await
new TRRDNSListener("ipv6b.foo", { expectedAnswer
: "2001::a:b:c:d" });
189 await
new TRRDNSListener("qqqq.foo", { expectedAnswer
: "9.8.7.6" });
191 // Multiple IPs and multiple additional records
192 await trrServer
.registerDoHAnswers("multiple.foo", "A", {
195 name
: "multiple.foo",
204 // Should be ignored, because it should be in the answer section
205 name
: "multiple.foo",
212 // Is ignored, because it should be in the answer section
213 name
: "multiple.foo",
217 data
: "2001::a:b:c:d",
224 data
: "2001::a:b:c:d",
236 let { inRecord
} = await
new TRRDNSListener("multiple.foo", {
237 expectedAnswer
: "9.9.9.9",
240 inRecord
.QueryInterface(Ci
.nsIDNSAddrRecord
);
242 while (inRecord
.hasMore()) {
243 IPs
.push(inRecord
.getNextAddrAsString());
245 equal(IPs
.length
, 1);
246 equal(IPs
[0], "9.9.9.9");
248 ({ inRecord
} = await
new TRRDNSListener("yuiop.foo", {
249 expectedSuccess
: false,
251 inRecord
.QueryInterface(Ci
.nsIDNSAddrRecord
);
253 while (inRecord
.hasMore()) {
254 IPs
.push(inRecord
.getNextAddrAsString());
256 equal(IPs
.length
, 2);
257 equal(IPs
[0], "2001::a:b:c:d");
258 equal(IPs
[1], "1.2.3.4");
261 add_task(async
function test_additional_after_resolve() {
262 await trrServer
.registerDoHAnswers("first.foo", "A", {
273 await
new TRRDNSListener("first.foo", { expectedAnswer
: "3.4.5.6" });
275 await trrServer
.registerDoHAnswers("second.foo", "A", {
296 await
new TRRDNSListener("second.foo", { expectedAnswer
: "1.2.3.4" });
297 await
new TRRDNSListener("first.foo", { expectedAnswer
: "2.3.4.5" });
300 // test for Bug - 1790075
301 // Crash was observed when a DNS (using TRR) reply contains an additional
302 // record field and this addditional record was previously unsuccessfully
304 add_task(async
function test_additional_cached_record_override() {
305 Services
.dns
.clearCache(true);
306 Services
.prefs
.setIntPref("network.trr.mode", 2);
307 Services
.prefs
.setCharPref(
309 `https://foo.example.com:${trrServer.port()}/dns-query`
312 await
new TRRDNSListener("else.foo", { expectedAnswer
: "127.0.0.1" });
314 await trrServer
.registerDoHAnswers("something.foo", "A", {
317 name
: "something.foo",
335 await
new TRRDNSListener("something.foo", { expectedAnswer
: "1.2.3.4" });
336 await
new TRRDNSListener("else.foo", { expectedAnswer
: "2.3.4.5" });
339 add_task(async
function test_ipv6_disabled() {
340 Services
.prefs
.setBoolPref("network.dns.disableIPv6", true);
341 await trrServer
.registerDoHAnswers("ipv6.foo", "A", {
353 name
: "sub.ipv6.foo",
362 await
new TRRDNSListener("ipv6.foo", { expectedAnswer
: "1.2.3.4" });
363 await
new TRRDNSListener("sub.ipv6.foo", { expectedSuccess
: false });
365 await trrServer
.registerDoHAnswers("direct.ipv6.foo", "AAAA", {
368 name
: "direct.ipv6.foo",
372 data
: "2001::a:b:c:d",
377 await
new TRRDNSListener("direct.ipv6.foo", { expectedSuccess
: false });
379 Services
.prefs
.setBoolPref("network.dns.disableIPv6", false);