summaryrefslogtreecommitdiffstats
path: root/netwerk/test/unit/test_trr_cancel.js
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/test/unit/test_trr_cancel.js')
-rw-r--r--netwerk/test/unit/test_trr_cancel.js180
1 files changed, 180 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_trr_cancel.js b/netwerk/test/unit/test_trr_cancel.js
new file mode 100644
index 0000000000..60b65d7eaf
--- /dev/null
+++ b/netwerk/test/unit/test_trr_cancel.js
@@ -0,0 +1,180 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+trr_test_setup();
+registerCleanupFunction(async () => {
+ trr_clear_prefs();
+});
+
+let trrServer = null;
+add_task(async function start_trr_server() {
+ trrServer = new TRRServer();
+ registerCleanupFunction(async () => {
+ await trrServer.stop();
+ });
+ await trrServer.start();
+ dump(`port = ${trrServer.port()}\n`);
+
+ Services.prefs.setCharPref(
+ "network.trr.uri",
+ `https://foo.example.com:${trrServer.port()}/dns-query`
+ );
+ Services.prefs.setIntPref("network.trr.mode", Ci.nsIDNSService.MODE_TRRFIRST);
+});
+
+add_task(async function sanity_check() {
+ await trrServer.registerDoHAnswers("example.com", "A", {
+ answers: [
+ {
+ name: "example.com",
+ ttl: 55,
+ type: "A",
+ flush: false,
+ data: "1.2.3.4",
+ },
+ ],
+ });
+ // Simple check to see that TRR works.
+ await new TRRDNSListener("example.com", { expectedAnswer: "1.2.3.4" });
+});
+
+// Cancelling the request is not sync when using the socket process, so
+// we skip this test when it's enabled.
+add_task(
+ { skip_if: () => mozinfo.socketprocess_networking },
+ async function cancel_immediately() {
+ await trrServer.registerDoHAnswers("example.org", "A", {
+ answers: [
+ {
+ name: "example.org",
+ ttl: 55,
+ type: "A",
+ flush: false,
+ data: "2.3.4.5",
+ },
+ ],
+ });
+ let r1 = new TRRDNSListener("example.org", { expectedSuccess: false });
+ let r2 = new TRRDNSListener("example.org", { expectedAnswer: "2.3.4.5" });
+ r1.cancel();
+ let { inStatus } = await r1;
+ equal(inStatus, Cr.NS_ERROR_ABORT);
+ await r2;
+ equal(await trrServer.requestCount("example.org", "A"), 1);
+
+ // Now we cancel both of them
+ Services.dns.clearCache(true);
+ r1 = new TRRDNSListener("example.org", { expectedSuccess: false });
+ r2 = new TRRDNSListener("example.org", { expectedSuccess: false });
+ r1.cancel();
+ r2.cancel();
+ ({ inStatus } = await r1);
+ equal(inStatus, Cr.NS_ERROR_ABORT);
+ ({ inStatus } = await r2);
+ equal(inStatus, Cr.NS_ERROR_ABORT);
+ await new Promise(resolve => do_timeout(50, resolve));
+ equal(await trrServer.requestCount("example.org", "A"), 2);
+ }
+);
+
+add_task(async function cancel_delayed() {
+ Services.dns.clearCache(true);
+ await trrServer.registerDoHAnswers("example.com", "A", {
+ answers: [
+ {
+ name: "example.com",
+ ttl: 55,
+ type: "A",
+ flush: false,
+ data: "1.1.1.1",
+ },
+ ],
+ delay: 500,
+ });
+ let r1 = new TRRDNSListener("example.com", { expectedSuccess: false });
+ let r2 = new TRRDNSListener("example.com", { expectedAnswer: "1.1.1.1" });
+ await new Promise(resolve => do_timeout(50, resolve));
+ r1.cancel();
+ let { inStatus } = await r1;
+ equal(inStatus, Cr.NS_ERROR_ABORT);
+ await r2;
+});
+
+add_task(async function cancel_after_completed() {
+ Services.dns.clearCache(true);
+ await trrServer.registerDoHAnswers("example.com", "A", {
+ answers: [
+ {
+ name: "example.com",
+ ttl: 55,
+ type: "A",
+ flush: false,
+ data: "2.2.2.2",
+ },
+ ],
+ });
+ let r1 = new TRRDNSListener("example.com", { expectedAnswer: "2.2.2.2" });
+ await r1;
+ let r2 = new TRRDNSListener("example.com", { expectedAnswer: "2.2.2.2" });
+ // Check that cancelling r1 after it's complete does not affect r2 in any way.
+ r1.cancel();
+ await r2;
+});
+
+add_task(async function clearCacheWhileResolving() {
+ Services.dns.clearCache(true);
+ await trrServer.registerDoHAnswers("example.com", "A", {
+ answers: [
+ {
+ name: "example.com",
+ ttl: 55,
+ type: "A",
+ flush: false,
+ data: "3.3.3.3",
+ },
+ ],
+ delay: 500,
+ });
+ // Check that calling clearCache does not leave the request hanging.
+ let r1 = new TRRDNSListener("example.com", { expectedAnswer: "3.3.3.3" });
+ let r2 = new TRRDNSListener("example.com", { expectedAnswer: "3.3.3.3" });
+ Services.dns.clearCache(true);
+ await r1;
+ await r2;
+
+ // Also check the same for HTTPS records
+ await trrServer.registerDoHAnswers("httpsvc.com", "HTTPS", {
+ answers: [
+ {
+ name: "httpsvc.com",
+ ttl: 55,
+ type: "HTTPS",
+ flush: false,
+ data: {
+ priority: 1,
+ name: "test.p1.com",
+ values: [{ key: "alpn", value: ["h2", "h3"] }],
+ },
+ },
+ ],
+ delay: 500,
+ });
+ let r3 = new TRRDNSListener("httpsvc.com", {
+ type: Ci.nsIDNSService.RESOLVE_TYPE_HTTPSSVC,
+ });
+ let r4 = new TRRDNSListener("httpsvc.com", {
+ type: Ci.nsIDNSService.RESOLVE_TYPE_HTTPSSVC,
+ });
+ Services.dns.clearCache(true);
+ await r3;
+ await r4;
+ equal(await trrServer.requestCount("httpsvc.com", "HTTPS"), 1);
+ Services.dns.clearCache(true);
+ await new TRRDNSListener("httpsvc.com", {
+ type: Ci.nsIDNSService.RESOLVE_TYPE_HTTPSSVC,
+ });
+ equal(await trrServer.requestCount("httpsvc.com", "HTTPS"), 2);
+});