test_http3_0rtt.js (2625B)
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 var { setTimeout } = ChromeUtils.importESModule( 6 "resource://gre/modules/Timer.sys.mjs" 7 ); 8 9 registerCleanupFunction(async () => { 10 http3_clear_prefs(); 11 }); 12 13 add_task(async function setup() { 14 await http3_setup_tests("h3"); 15 }); 16 17 let Http3Listener = function () {}; 18 19 Http3Listener.prototype = { 20 resumed: false, 21 22 onStartRequest: function testOnStartRequest(request) { 23 Assert.equal(request.status, Cr.NS_OK); 24 Assert.equal(request.responseStatus, 200); 25 26 let secinfo = request.securityInfo; 27 Assert.equal(secinfo.resumed, this.resumed); 28 Assert.notEqual(secinfo.serverCert, null); 29 }, 30 31 onDataAvailable: function testOnDataAvailable(request, stream, off, cnt) { 32 read_stream(stream, cnt); 33 }, 34 35 onStopRequest: function testOnStopRequest(request) { 36 let httpVersion = ""; 37 try { 38 httpVersion = request.protocolVersion; 39 } catch (e) {} 40 Assert.equal(httpVersion, "h3"); 41 42 this.finish(); 43 }, 44 }; 45 46 function chanPromise(chan, listener) { 47 return new Promise(resolve => { 48 function finish(result) { 49 resolve(result); 50 } 51 listener.finish = finish; 52 chan.asyncOpen(listener); 53 }); 54 } 55 56 function makeChan(uri) { 57 let chan = NetUtil.newChannel({ 58 uri, 59 loadUsingSystemPrincipal: true, 60 }).QueryInterface(Ci.nsIHttpChannel); 61 chan.loadFlags = Ci.nsIChannel.LOAD_INITIAL_DOCUMENT_URI; 62 return chan; 63 } 64 65 async function test_first_conn_no_resumed() { 66 let listener = new Http3Listener(); 67 listener.resumed = false; 68 let chan = makeChan("https://foo.example.com/30"); 69 await chanPromise(chan, listener); 70 } 71 72 async function test_0RTT(enable_0rtt, resumed) { 73 info(`enable_0rtt=${enable_0rtt} resumed=${resumed}`); 74 Services.prefs.setBoolPref("network.http.http3.enable_0rtt", enable_0rtt); 75 76 // Make sure the h3 connection created by the previous test is cleared. 77 Services.obs.notifyObservers(null, "net:cancel-all-connections"); 78 // eslint-disable-next-line mozilla/no-arbitrary-setTimeout 79 await new Promise(resolve => setTimeout(resolve, 1000)); 80 81 // This connecion should be resumed. 82 let listener = new Http3Listener(); 83 listener.resumed = resumed; 84 let chan = makeChan("https://foo.example.com/30"); 85 await chanPromise(chan, listener); 86 } 87 88 add_task(async function test_0RTT_setups() { 89 await test_first_conn_no_resumed(); 90 91 // http3.0RTT enabled 92 await test_0RTT(true, true); 93 94 // http3.0RTT disabled 95 await test_0RTT(false, false); 96 });