diff options
Diffstat (limited to 'netwerk/test/unit/test_http3_0rtt.js')
-rw-r--r-- | netwerk/test/unit/test_http3_0rtt.js | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_http3_0rtt.js b/netwerk/test/unit/test_http3_0rtt.js new file mode 100644 index 0000000000..1002263ed5 --- /dev/null +++ b/netwerk/test/unit/test_http3_0rtt.js @@ -0,0 +1,96 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var { setTimeout } = ChromeUtils.importESModule( + "resource://gre/modules/Timer.sys.mjs" +); + +registerCleanupFunction(async () => { + http3_clear_prefs(); +}); + +add_task(async function setup() { + await http3_setup_tests("h3-29"); +}); + +let Http3Listener = function () {}; + +Http3Listener.prototype = { + resumed: false, + + onStartRequest: function testOnStartRequest(request) { + Assert.equal(request.status, Cr.NS_OK); + Assert.equal(request.responseStatus, 200); + + let secinfo = request.securityInfo; + Assert.equal(secinfo.resumed, this.resumed); + Assert.ok(secinfo.serverCert != null); + }, + + onDataAvailable: function testOnDataAvailable(request, stream, off, cnt) { + read_stream(stream, cnt); + }, + + onStopRequest: function testOnStopRequest(request, status) { + let httpVersion = ""; + try { + httpVersion = request.protocolVersion; + } catch (e) {} + Assert.equal(httpVersion, "h3-29"); + + this.finish(); + }, +}; + +function chanPromise(chan, listener) { + return new Promise(resolve => { + function finish(result) { + resolve(result); + } + listener.finish = finish; + chan.asyncOpen(listener); + }); +} + +function makeChan(uri) { + let chan = NetUtil.newChannel({ + uri, + loadUsingSystemPrincipal: true, + }).QueryInterface(Ci.nsIHttpChannel); + chan.loadFlags = Ci.nsIChannel.LOAD_INITIAL_DOCUMENT_URI; + return chan; +} + +async function test_first_conn_no_resumed() { + let listener = new Http3Listener(); + listener.resumed = false; + let chan = makeChan("https://foo.example.com/30"); + await chanPromise(chan, listener); +} + +async function test_0RTT(enable_0rtt, resumed) { + info(`enable_0rtt=${enable_0rtt} resumed=${resumed}`); + Services.prefs.setBoolPref("network.http.http3.enable_0rtt", enable_0rtt); + + // Make sure the h3 connection created by the previous test is cleared. + Services.obs.notifyObservers(null, "net:cancel-all-connections"); + // eslint-disable-next-line mozilla/no-arbitrary-setTimeout + await new Promise(resolve => setTimeout(resolve, 1000)); + + // This connecion should be resumed. + let listener = new Http3Listener(); + listener.resumed = resumed; + let chan = makeChan("https://foo.example.com/30"); + await chanPromise(chan, listener); +} + +add_task(async function test_0RTT_setups() { + await test_first_conn_no_resumed(); + + // http3.0RTT enabled + await test_0RTT(true, true); + + // http3.0RTT disabled + await test_0RTT(false, false); +}); |