test_trr_cancel.js (5149B)
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/. */ 4 5 "use strict"; 6 7 trr_test_setup(); 8 registerCleanupFunction(async () => { 9 trr_clear_prefs(); 10 }); 11 12 let trrServer = null; 13 add_task(async function start_trr_server() { 14 trrServer = new TRRServer(); 15 registerCleanupFunction(async () => { 16 await trrServer.stop(); 17 }); 18 await trrServer.start(); 19 dump(`port = ${trrServer.port()}\n`); 20 21 Services.prefs.setCharPref( 22 "network.trr.uri", 23 `https://foo.example.com:${trrServer.port()}/dns-query` 24 ); 25 Services.prefs.setIntPref("network.trr.mode", Ci.nsIDNSService.MODE_TRRFIRST); 26 }); 27 28 add_task(async function sanity_check() { 29 await trrServer.registerDoHAnswers("example.com", "A", { 30 answers: [ 31 { 32 name: "example.com", 33 ttl: 55, 34 type: "A", 35 flush: false, 36 data: "1.2.3.4", 37 }, 38 ], 39 }); 40 // Simple check to see that TRR works. 41 await new TRRDNSListener("example.com", { expectedAnswer: "1.2.3.4" }); 42 }); 43 44 // Cancelling the request is not sync when using the socket process, so 45 // we skip this test when it's enabled. 46 add_task( 47 { skip_if: () => mozinfo.socketprocess_networking }, 48 async function cancel_immediately() { 49 await trrServer.registerDoHAnswers("example.org", "A", { 50 answers: [ 51 { 52 name: "example.org", 53 ttl: 55, 54 type: "A", 55 flush: false, 56 data: "2.3.4.5", 57 }, 58 ], 59 }); 60 let r1 = new TRRDNSListener("example.org", { expectedSuccess: false }); 61 let r2 = new TRRDNSListener("example.org", { expectedAnswer: "2.3.4.5" }); 62 r1.cancel(); 63 let { inStatus } = await r1; 64 equal(inStatus, Cr.NS_ERROR_ABORT); 65 await r2; 66 equal(await trrServer.requestCount("example.org", "A"), 1); 67 68 // Now we cancel both of them 69 Services.dns.clearCache(true); 70 r1 = new TRRDNSListener("example.org", { expectedSuccess: false }); 71 r2 = new TRRDNSListener("example.org", { expectedSuccess: false }); 72 r1.cancel(); 73 r2.cancel(); 74 ({ inStatus } = await r1); 75 equal(inStatus, Cr.NS_ERROR_ABORT); 76 ({ inStatus } = await r2); 77 equal(inStatus, Cr.NS_ERROR_ABORT); 78 await new Promise(resolve => do_timeout(50, resolve)); 79 equal(await trrServer.requestCount("example.org", "A"), 2); 80 } 81 ); 82 83 add_task(async function cancel_delayed() { 84 Services.dns.clearCache(true); 85 await trrServer.registerDoHAnswers("example.com", "A", { 86 answers: [ 87 { 88 name: "example.com", 89 ttl: 55, 90 type: "A", 91 flush: false, 92 data: "1.1.1.1", 93 }, 94 ], 95 delay: 500, 96 }); 97 let r1 = new TRRDNSListener("example.com", { expectedSuccess: false }); 98 let r2 = new TRRDNSListener("example.com", { expectedAnswer: "1.1.1.1" }); 99 await new Promise(resolve => do_timeout(50, resolve)); 100 r1.cancel(); 101 let { inStatus } = await r1; 102 equal(inStatus, Cr.NS_ERROR_ABORT); 103 await r2; 104 }); 105 106 add_task(async function cancel_after_completed() { 107 Services.dns.clearCache(true); 108 await trrServer.registerDoHAnswers("example.com", "A", { 109 answers: [ 110 { 111 name: "example.com", 112 ttl: 55, 113 type: "A", 114 flush: false, 115 data: "2.2.2.2", 116 }, 117 ], 118 }); 119 let r1 = new TRRDNSListener("example.com", { expectedAnswer: "2.2.2.2" }); 120 await r1; 121 let r2 = new TRRDNSListener("example.com", { expectedAnswer: "2.2.2.2" }); 122 // Check that cancelling r1 after it's complete does not affect r2 in any way. 123 r1.cancel(); 124 await r2; 125 }); 126 127 add_task(async function clearCacheWhileResolving() { 128 Services.dns.clearCache(true); 129 await trrServer.registerDoHAnswers("example.com", "A", { 130 answers: [ 131 { 132 name: "example.com", 133 ttl: 55, 134 type: "A", 135 flush: false, 136 data: "3.3.3.3", 137 }, 138 ], 139 delay: 500, 140 }); 141 // Check that calling clearCache does not leave the request hanging. 142 let r1 = new TRRDNSListener("example.com", { expectedAnswer: "3.3.3.3" }); 143 let r2 = new TRRDNSListener("example.com", { expectedAnswer: "3.3.3.3" }); 144 Services.dns.clearCache(true); 145 await r1; 146 await r2; 147 148 // Also check the same for HTTPS records 149 await trrServer.registerDoHAnswers("httpsvc.com", "HTTPS", { 150 answers: [ 151 { 152 name: "httpsvc.com", 153 ttl: 55, 154 type: "HTTPS", 155 flush: false, 156 data: { 157 priority: 1, 158 name: "test.p1.com", 159 values: [{ key: "alpn", value: ["h2", "h3"] }], 160 }, 161 }, 162 ], 163 delay: 500, 164 }); 165 let r3 = new TRRDNSListener("httpsvc.com", { 166 type: Ci.nsIDNSService.RESOLVE_TYPE_HTTPSSVC, 167 }); 168 let r4 = new TRRDNSListener("httpsvc.com", { 169 type: Ci.nsIDNSService.RESOLVE_TYPE_HTTPSSVC, 170 }); 171 Services.dns.clearCache(true); 172 await r3; 173 await r4; 174 equal(await trrServer.requestCount("httpsvc.com", "HTTPS"), 1); 175 Services.dns.clearCache(true); 176 await new TRRDNSListener("httpsvc.com", { 177 type: Ci.nsIDNSService.RESOLVE_TYPE_HTTPSSVC, 178 }); 179 equal(await trrServer.requestCount("httpsvc.com", "HTTPS"), 2); 180 });