Bug 1857386 [wpt PR 42383] - Update wpt metadata, a=testonly
[gecko.git] / netwerk / test / unit / test_https_rr_sorted_alpn.js
blob95284de0c3d412d6b0c1047b1750eda53e48b54f
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/. */
5 "use strict";
7 let trrServer;
9 const { TestUtils } = ChromeUtils.importESModule(
10   "resource://testing-common/TestUtils.sys.mjs"
13 add_setup(async function setup() {
14   trr_test_setup();
15   registerCleanupFunction(async () => {
16     trr_clear_prefs();
17     Services.prefs.clearUserPref("network.http.http3.support_version1");
18     Services.prefs.clearUserPref("security.tls.version.max");
19     if (trrServer) {
20       await trrServer.stop();
21     }
22   });
24   if (mozinfo.socketprocess_networking) {
25     Services.dns; // Needed to trigger socket process.
26     await TestUtils.waitForCondition(() => Services.io.socketProcessLaunched);
27   }
28 });
30 function checkResult(inRecord, noHttp2, noHttp3, result) {
31   if (!result) {
32     Assert.throws(
33       () => {
34         inRecord
35           .QueryInterface(Ci.nsIDNSHTTPSSVCRecord)
36           .GetServiceModeRecord(noHttp2, noHttp3);
37       },
38       /NS_ERROR_NOT_AVAILABLE/,
39       "Should get an error"
40     );
41     return;
42   }
44   let record = inRecord
45     .QueryInterface(Ci.nsIDNSHTTPSSVCRecord)
46     .GetServiceModeRecord(noHttp2, noHttp3);
47   Assert.equal(record.priority, result.expectedPriority);
48   Assert.equal(record.name, result.expectedName);
49   Assert.equal(record.selectedAlpn, result.expectedAlpn);
52 add_task(async function testSortedAlpnH3() {
53   Services.dns.clearCache(true);
55   trrServer = new TRRServer();
56   await trrServer.start();
58   Services.prefs.setIntPref("network.trr.mode", 3);
59   Services.prefs.setCharPref(
60     "network.trr.uri",
61     `https://foo.example.com:${trrServer.port()}/dns-query`
62   );
63   Services.prefs.setBoolPref("network.http.http3.support_version1", true);
64   await trrServer.registerDoHAnswers("test.alpn.com", "HTTPS", {
65     answers: [
66       {
67         name: "test.alpn.com",
68         ttl: 55,
69         type: "HTTPS",
70         flush: false,
71         data: {
72           priority: 1,
73           name: "test.alpn.com",
74           values: [{ key: "alpn", value: ["h2", "http/1.1", "h3-30", "h3"] }],
75         },
76       },
77     ],
78   });
80   let { inRecord } = await new TRRDNSListener("test.alpn.com", {
81     type: Ci.nsIDNSService.RESOLVE_TYPE_HTTPSSVC,
82   });
84   checkResult(inRecord, false, false, {
85     expectedPriority: 1,
86     expectedName: "test.alpn.com",
87     expectedAlpn: "h3",
88   });
89   checkResult(inRecord, false, true, {
90     expectedPriority: 1,
91     expectedName: "test.alpn.com",
92     expectedAlpn: "h2",
93   });
94   checkResult(inRecord, true, false, {
95     expectedPriority: 1,
96     expectedName: "test.alpn.com",
97     expectedAlpn: "h3",
98   });
99   checkResult(inRecord, true, true, {
100     expectedPriority: 1,
101     expectedName: "test.alpn.com",
102     expectedAlpn: "http/1.1",
103   });
105   Services.prefs.setBoolPref("network.http.http3.support_version1", false);
106   checkResult(inRecord, false, false, {
107     expectedPriority: 1,
108     expectedName: "test.alpn.com",
109     expectedAlpn: "h3-30",
110   });
111   checkResult(inRecord, false, true, {
112     expectedPriority: 1,
113     expectedName: "test.alpn.com",
114     expectedAlpn: "h2",
115   });
116   checkResult(inRecord, true, false, {
117     expectedPriority: 1,
118     expectedName: "test.alpn.com",
119     expectedAlpn: "h3-30",
120   });
121   checkResult(inRecord, true, true, {
122     expectedPriority: 1,
123     expectedName: "test.alpn.com",
124     expectedAlpn: "http/1.1",
125   });
126   Services.prefs.setBoolPref("network.http.http3.support_version1", true);
128   // Disable TLS1.3
129   Services.prefs.setIntPref("security.tls.version.max", 3);
130   checkResult(inRecord, false, false, {
131     expectedPriority: 1,
132     expectedName: "test.alpn.com",
133     expectedAlpn: "h2",
134   });
135   checkResult(inRecord, false, true, {
136     expectedPriority: 1,
137     expectedName: "test.alpn.com",
138     expectedAlpn: "h2",
139   });
140   checkResult(inRecord, true, false, {
141     expectedPriority: 1,
142     expectedName: "test.alpn.com",
143     expectedAlpn: "http/1.1",
144   });
145   checkResult(inRecord, true, true, {
146     expectedPriority: 1,
147     expectedName: "test.alpn.com",
148     expectedAlpn: "http/1.1",
149   });
151   // Enable TLS1.3
152   Services.prefs.setIntPref("security.tls.version.max", 4);
153   checkResult(inRecord, false, false, {
154     expectedPriority: 1,
155     expectedName: "test.alpn.com",
156     expectedAlpn: "h3",
157   });
158   checkResult(inRecord, false, true, {
159     expectedPriority: 1,
160     expectedName: "test.alpn.com",
161     expectedAlpn: "h2",
162   });
163   checkResult(inRecord, true, false, {
164     expectedPriority: 1,
165     expectedName: "test.alpn.com",
166     expectedAlpn: "h3",
167   });
168   checkResult(inRecord, true, true, {
169     expectedPriority: 1,
170     expectedName: "test.alpn.com",
171     expectedAlpn: "http/1.1",
172   });
175 add_task(async function testSortedAlpnH2() {
176   Services.dns.clearCache(true);
178   Services.prefs.setIntPref("network.trr.mode", 3);
179   Services.prefs.setCharPref(
180     "network.trr.uri",
181     `https://foo.example.com:${trrServer.port()}/dns-query`
182   );
183   await trrServer.registerDoHAnswers("test.alpn_2.com", "HTTPS", {
184     answers: [
185       {
186         name: "test.alpn_2.com",
187         ttl: 55,
188         type: "HTTPS",
189         flush: false,
190         data: {
191           priority: 1,
192           name: "test.alpn_2.com",
193           values: [{ key: "alpn", value: ["http/1.1", "h2"] }],
194         },
195       },
196     ],
197   });
199   let { inRecord } = await new TRRDNSListener("test.alpn_2.com", {
200     type: Ci.nsIDNSService.RESOLVE_TYPE_HTTPSSVC,
201   });
203   checkResult(inRecord, false, false, {
204     expectedPriority: 1,
205     expectedName: "test.alpn_2.com",
206     expectedAlpn: "h2",
207   });
208   checkResult(inRecord, false, true, {
209     expectedPriority: 1,
210     expectedName: "test.alpn_2.com",
211     expectedAlpn: "h2",
212   });
213   checkResult(inRecord, true, false, {
214     expectedPriority: 1,
215     expectedName: "test.alpn_2.com",
216     expectedAlpn: "http/1.1",
217   });
218   checkResult(inRecord, true, true, {
219     expectedPriority: 1,
220     expectedName: "test.alpn_2.com",
221     expectedAlpn: "http/1.1",
222   });
224   await trrServer.stop();
225   trrServer = null;