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