Bug 1915045 Ensure decode tasks are scheduled on BufferingState::Enter() r=media...
[gecko.git] / js / xpconnect / tests / browser / browser_parent_process_hang_telemetry.js
blobf9b325c2168b71d3843eb4538894000c207b3505
1 /* Any copyright is dedicated to the Public Domain.
2    http://creativecommons.org/publicdomain/zero/1.0/ */
4 "use strict";
6 /**
7  * Check that we record hangs in the parent process in telemetry events.
8  * This test would be an xpcshell test except xpcshell does not think
9  * it is running e10s (see bug 1568333).
10  */
11 add_task(async function test_browser_hang() {
12   // Trip some testing code to ensure we can test this. Sadly, this is a magic
13   // number corresponding to code in XPCJSContext.cpp
14   await SpecialPowers.pushPrefEnv({
15     set: [["dom.max_chrome_script_run_time", 2]],
16   });
17   await SpecialPowers.promiseTimeout(0);
19   // Hang for 1.2 seconds.
20   let now = Date.now();
21   let i = 0;
22   info("Start loop");
23   while (Date.now() - now < 2500) {
24     // The system clock can go backwards. Don't time out the test:
25     if (Date.now() - now < 0) {
26       info("Yikes, the system clock changed while running this test.");
27       now = Date.now();
28     }
29     i++;
30   }
31   let duration = (Date.now() - now) / 1000;
32   info("Looped " + i + " iterations.");
34   let events;
35   await TestUtils.waitForCondition(() => {
36     events = Services.telemetry.snapshotEvents(
37       Ci.nsITelemetry.DATASET_ALL_CHANNELS,
38       false
39     );
40     return events.parent?.some(e => e[1] == "slow_script_warning");
41   }, "Should find an event after doing this.").catch(e => ok(false, e));
42   events = events.parent || [];
43   let event = events.find(e => e[1] == "slow_script_warning");
44   ok(event, "Should have registered an event.");
45   if (event) {
46     is(event[3], "browser", "Should register as browser hang.");
47     let args = event[5];
48     is(args.uri_type, "browser", "Should register browser uri type.");
49     Assert.greater(
50       duration + 1,
51       parseFloat(args.hang_duration),
52       "hang duration should not exaggerate."
53     );
54     Assert.less(
55       duration - 1,
56       parseFloat(args.hang_duration),
57       "hang duration should not undersell."
58     );
59   }
60 });