tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });