summaryrefslogtreecommitdiffstats
path: root/netwerk/test/perf/perftest_http3_lucasquicfetch.js
blob: 49a5b4c8249200ee4bcd4dd0f0133218b6d369ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// 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/.
/* eslint-env node */

/*
Ensure the `--firefox.preference=network.http.http3.enable:true` is
set for this test.
*/

async function getNumLoaded(commands) {
  return commands.js.run(`
    let sum = 0;
    document.querySelectorAll("#imgContainer img").forEach(e => {
      sum += e.complete & e.naturalHeight != 0;
    });
    return sum;
  `);
}

async function waitForImgLoadEnd(
  prevCount,
  maxStableCount,
  timeout,
  commands,
  context
) {
  let starttime = await commands.js.run(`return performance.now();`);
  let endtime = await commands.js.run(`return performance.now();`);
  let changing = true;
  let newCount = -1;
  let stableCount = 0;

  while (
    ((await commands.js.run(`return performance.now();`)) - starttime <
      timeout) &
    changing
  ) {
    // Wait a bit before making another round
    await commands.wait.byTime(100);
    newCount = await getNumLoaded(commands);
    context.log.debug(`${newCount}, ${prevCount}, ${stableCount}`);

    // Check if we are approaching stability
    if (newCount == prevCount) {
      // Gather the end time now
      if (stableCount == 0) {
        endtime = await commands.js.run(`return performance.now();`);
      }
      stableCount++;
    } else {
      prevCount = newCount;
      stableCount = 0;
    }

    if (stableCount >= maxStableCount) {
      // Stability achieved
      changing = false;
    }
  }

  return {
    start: starttime,
    end: endtime,
    numResources: newCount,
  };
}

async function test(context, commands) {
  let rootUrl = "https://lucaspardue.com/quictilesfetch.html";
  let cycles = 5;

  if (
    (typeof context.options.browsertime !== "undefined") &
    (typeof context.options.browsertime.cycles !== "undefined")
  ) {
    cycles = context.options.browsertime.cycles;
  }

  // Make firefox learn of HTTP/3 server
  // XXX: Need to build an HTTP/3-specific conditioned profile
  // to handle these pre-navigations.
  await commands.navigate(rootUrl);

  let combos = [
    [100, 1],
    [100, 100],
    [300, 300],
  ];
  for (let cycle = 0; cycle < cycles; cycle++) {
    for (let combo = 0; combo < combos.length; combo++) {
      await commands.measure.start("pageload");
      await commands.navigate(rootUrl);
      await commands.measure.stop();
      let last = commands.measure.result.length - 1;
      commands.measure.result[
        last
      ].browserScripts.pageinfo.url = `LucasQUIC (r=${combos[combo][0]}, p=${combos[combo][1]})`;

      // Set the input fields
      await commands.js.runAndWait(`
        document.querySelector("#maxReq").setAttribute(
          "value",
          ${combos[combo][0]}
        )
      `);
      await commands.js.runAndWait(`
        document.querySelector("#reqGroup").setAttribute(
          "value",
          ${combos[combo][1]}
        )
      `);

      // Start the test and wait for the images to finish loading
      commands.click.byJs(`document.querySelector("button")`);
      let results = await waitForImgLoadEnd(0, 40, 120000, commands, context);

      commands.measure.result[last].browserScripts.pageinfo.resourceLoadTime =
        results.end - results.start;
      commands.measure.result[last].browserScripts.pageinfo.imagesLoaded =
        results.numResources;
      commands.measure.result[last].browserScripts.pageinfo.imagesMissed =
        combos[combo][0] - results.numResources;
    }
  }
}

module.exports = {
  test,
  owner: "Network Team",
  name: "lq-fetch",
  component: "netwerk",
  description: "Measures the amount of time it takes to load a set of images.",
};