tor-browser

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

test_loadgroup_glean.js (4178B)


      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 { NodeHTTP2Server } = ChromeUtils.importESModule(
      8  "resource://testing-common/NodeServer.sys.mjs"
      9 );
     10 
     11 const network = Glean.network;
     12 
     13 const page_probes = [
     14  { name: "tlsHandshake", probe: network.tlsHandshake },
     15  { name: "dnsStart", probe: network.dnsStart },
     16  { name: "dnsEnd", probe: network.dnsEnd },
     17  { name: "tcpConnection", probe: network.tcpConnection },
     18  { name: "openToFirstSent", probe: network.openToFirstSent },
     19  { name: "firstSentToLastReceived", probe: network.firstSentToLastReceived },
     20  { name: "openToFirstReceived", probe: network.openToFirstReceived },
     21  { name: "completeLoad", probe: network.completeLoad },
     22  { name: "completeLoadNet", probe: network.completeLoadNet },
     23 ];
     24 
     25 const sub_probes = [
     26  { name: "subTlsHandshake", probe: network.subTlsHandshake },
     27  { name: "subDnsStart", probe: network.subDnsStart },
     28  { name: "subDnsEnd", probe: network.subDnsEnd },
     29  { name: "subTcpConnection", probe: network.subTcpConnection },
     30  { name: "subOpenToFirstSent", probe: network.subOpenToFirstSent },
     31  {
     32    name: "subFirstSentToLastReceived",
     33    probe: network.subFirstSentToLastReceived,
     34  },
     35  { name: "subOpenToFirstReceived", probe: network.subOpenToFirstReceived },
     36  { name: "subCompleteLoad", probe: network.subCompleteLoad },
     37  { name: "subCompleteLoadNet", probe: network.subCompleteLoadNet },
     38 ];
     39 
     40 add_setup(function test_setup() {
     41  Services.fog.initializeFOG();
     42 });
     43 
     44 registerCleanupFunction(() => {
     45  Services.fog.testResetFOG();
     46 });
     47 
     48 async function test_loadgroup_glean_http2(page, probes) {
     49  let loadGroup = Cc["@mozilla.org/network/load-group;1"].createInstance(
     50    Ci.nsILoadGroup
     51  );
     52  let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(
     53    Ci.nsIX509CertDB
     54  );
     55 
     56  addCertFromFile(certdb, "http2-ca.pem", "CTu,u,u");
     57 
     58  Services.fog.testResetFOG();
     59 
     60  let server = new NodeHTTP2Server();
     61  await server.start();
     62  registerCleanupFunction(async () => {
     63    await server.stop();
     64  });
     65 
     66  let loadListener = {
     67    onStartRequest: () => {},
     68    onStopRequest: () => {
     69      for (const { name, probe } of probes) {
     70        info(`testing ${name}`);
     71        const result = probe.testGetValue();
     72        // Ensure there are non-zero count, sum, and first value
     73        Assert.less(0, result.count);
     74        Assert.less(0, result.sum);
     75        Assert.less(0, Object.values(result.values)[0]);
     76      }
     77    },
     78    QueryInterface: ChromeUtils.generateQI([
     79      "nsIRequestObserver",
     80      "nsISupportsWeakReference",
     81    ]),
     82  };
     83  loadGroup.groupObserver = loadListener;
     84 
     85  await server.registerPathHandler("/", (req, resp) => {
     86    resp.writeHead(200);
     87    resp.end("a".repeat(100));
     88  });
     89  let chan = NetUtil.newChannel({
     90    uri: `https://localhost:${server.port()}`,
     91    loadUsingSystemPrincipal: true,
     92  }).QueryInterface(Ci.nsIHttpChannel);
     93 
     94  if (page) {
     95    loadGroup.defaultLoadRequest = chan;
     96  } else {
     97    // Set mDefaultLoadRequest to a dummy channel when testing sub
     98    await server.registerPathHandler("/dummy", (req, resp) => {
     99      resp.writeHead(404);
    100      resp.end();
    101    });
    102    let dummy = NetUtil.newChannel({
    103      uri: `https://localhost:${server.port()}/dummy`,
    104      loadUsingSystemPrincipal: true,
    105    }).QueryInterface(Ci.nsIHttpChannel);
    106    loadGroup.defaultLoadRequest = dummy;
    107  }
    108 
    109  loadGroup.addRequest(chan, null);
    110  await new Promise(resolve => {
    111    chan.asyncOpen(new ChannelListener(resolve, null, CL_ALLOW_UNKNOWN_CL));
    112  });
    113  loadGroup.removeRequest(chan, null, Cr.NS_OK);
    114 
    115  loadGroup = null;
    116 
    117  Cu.forceCC();
    118  Cu.forceGC();
    119 
    120  const result = page
    121    ? network.pageLoadSize.page.testGetValue()
    122    : network.pageLoadSize.subresources.testGetValue();
    123  Assert.greater(result.sum, 100, "size should > 100");
    124 }
    125 
    126 add_task(async function test_loadgroup_glean_http2_page() {
    127  await test_loadgroup_glean_http2(true, page_probes);
    128 });
    129 
    130 add_task(async function test_loadgroup_glean_http2_sub() {
    131  await test_loadgroup_glean_http2(false, sub_probes);
    132 });