Backed out changeset b71c8c052463 (bug 1943846) for causing mass failures. CLOSED...
[gecko.git] / netwerk / test / unit / test_retry_0rtt.js
blob661d7d2ab47115b2f98c8d6368e73f2a63cd33b9
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 const { HttpServer } = ChromeUtils.importESModule(
8 "resource://testing-common/httpd.sys.mjs"
9 );
10 var httpServer = null;
12 let handlerCallbacks = {};
14 function listenHandler(metadata) {
15 info(metadata.path);
16 handlerCallbacks[metadata.path] = (handlerCallbacks[metadata.path] || 0) + 1;
19 function handlerCount(path) {
20 return handlerCallbacks[path] || 0;
23 ChromeUtils.importESModule("resource://gre/modules/AppConstants.sys.mjs");
25 // Bug 1805371: Tests that require FaultyServer can't currently be built
26 // with system NSS.
27 add_setup(
29 skip_if: () => AppConstants.MOZ_SYSTEM_NSS,
31 async () => {
32 httpServer = new HttpServer();
33 httpServer.registerPrefixHandler("/callback/", listenHandler);
34 httpServer.start(-1);
36 registerCleanupFunction(async () => {
37 await httpServer.stop();
38 });
40 Services.env.set(
41 "FAULTY_SERVER_CALLBACK_PORT",
42 httpServer.identity.primaryPort
44 Services.env.set("MOZ_TLS_SERVER_0RTT", "1");
45 await asyncStartTLSTestServer(
46 "FaultyServer",
47 "../../../security/manager/ssl/tests/unit/test_faulty_server"
49 let nssComponent = Cc["@mozilla.org/psm;1"].getService(Ci.nsINSSComponent);
50 await nssComponent.asyncClearSSLExternalAndInternalSessionCache();
52 // See Bug 1878505
53 Services.prefs.setIntPref("network.http.speculative-parallel-limit", 0);
54 registerCleanupFunction(async () => {
55 Services.prefs.clearUserPref("network.http.speculative-parallel-limit");
56 });
60 async function sleep(time) {
61 return new Promise(resolve => {
62 do_timeout(time * 1000, resolve);
63 });
66 function makeChan(url) {
67 let chan = NetUtil.newChannel({
68 uri: url,
69 loadUsingSystemPrincipal: true,
70 }).QueryInterface(Ci.nsIHttpChannel);
72 chan.loadFlags = Ci.nsIChannel.LOAD_INITIAL_DOCUMENT_URI;
73 return chan;
76 function channelOpenPromise(chan, flags) {
77 return new Promise(resolve => {
78 chan.asyncOpen(
79 new ChannelListener((req, buffer) => resolve([req, buffer]), null, flags)
81 });
84 add_task(
86 skip_if: () => AppConstants.MOZ_SYSTEM_NSS,
88 async function testRetry0Rtt() {
89 var retryDomains = [
90 "0rtt-alert-bad-mac.example.com",
91 "0rtt-alert-protocol-version.example.com",
92 "0rtt-alert-unexpected.example.com",
95 Services.prefs.setCharPref("network.dns.localDomains", retryDomains);
97 Services.prefs.setBoolPref("network.ssl_tokens_cache_enabled", true);
99 for (var i = 0; i < retryDomains.length; i++) {
101 let countOfEarlyData = handlerCount("/callback/1");
102 let chan = makeChan(`https://${retryDomains[i]}:8443`);
103 let [, buf] = await channelOpenPromise(chan, CL_ALLOW_UNKNOWN_CL);
104 ok(buf);
105 equal(
106 handlerCount("/callback/1"),
107 countOfEarlyData,
108 "no early data sent"
112 // The server has an anti-replay mechanism that prohibits it from
113 // accepting 0-RTT connections immediately at startup.
114 await sleep(1);
117 let countOfEarlyData = handlerCount("/callback/1");
118 let chan = makeChan(`https://${retryDomains[i]}:8443`);
119 let [, buf] = await channelOpenPromise(chan, CL_ALLOW_UNKNOWN_CL);
120 ok(buf);
121 equal(
122 handlerCount("/callback/1"),
123 countOfEarlyData + 1,
124 "got early data"