gecko-dev/toolkit/components/processtools/tests/browser/browser_test_procinfo.js
Tarek Ziadé 37386bc892 Bug 1529510 - Move ProcInfo to processtoolsservice;r=aklotz,mstange
With this change, we expose ProcInfo to Android.

Differential Revision: https://phabricator.services.mozilla.com/D94810
2020-11-12 17:42:54 +00:00

173 lines
5.9 KiB
JavaScript

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
const DUMMY_URL =
getRootDirectory(gTestPath).replace(
"chrome://mochitests/content",
"http://example.com"
) + "/dummy.html";
const { AppConstants } = ChromeUtils.import(
"resource://gre/modules/AppConstants.jsm"
);
const MAC = AppConstants.platform == "macosx";
const HAS_THREAD_NAMES =
AppConstants.platform != "win" ||
AppConstants.isPlatformAndVersionAtLeast("win", 10);
const isFissionEnabled = SpecialPowers.useRemoteSubframes;
const SAMPLE_SIZE = 10;
add_task(async function test_proc_info() {
console.log("YORIC", "Test starts");
// Open a few `about:home` tabs, they'll end up in `privilegedabout`.
let tabsAboutHome = [];
for (let i = 0; i < 5; ++i) {
let tab = BrowserTestUtils.addTab(gBrowser, "about:home");
tabsAboutHome.push(tab);
gBrowser.selectedTab = tab;
await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
}
await BrowserTestUtils.withNewTab(
{ gBrowser, url: DUMMY_URL },
async function(browser) {
let cpuThreads = 0;
let cpuUser = 0;
// We test `SAMPLE_SIZE` times to increase a tad the chance of encountering race conditions.
for (let z = 0; z < SAMPLE_SIZE; z++) {
let parentProc = await ChromeUtils.requestProcInfo();
cpuUser += parentProc.cpuUser;
Assert.equal(
parentProc.type,
"browser",
"Parent proc type should be browser"
);
for (var x = 0; x < parentProc.threads.length; x++) {
cpuThreads += parentProc.threads[x].cpuUser;
}
// Under Windows, thread names appeared with Windows 10.
if (HAS_THREAD_NAMES) {
Assert.ok(
parentProc.threads.some(thread => thread.name),
"At least one of the threads of the parent process is named"
);
}
Assert.ok(
parentProc.residentUniqueSize > 0,
"Resident-unique-size was set"
);
Assert.ok(
parentProc.residentUniqueSize <= parentProc.residentSetSize,
`Resident-unique-size should be bounded by resident-set-size ${parentProc.residentUniqueSize} <= ${parentProc.residentSetSize}`
);
// While it's very unlikely that the parent will disappear while we're running
// tests, some children can easily vanish. So we go twice through the list of
// children. Once to test stuff that all process data respects the invariants
// that don't care whether we have a race condition and once to test that at
// least one well-known process that should not be able to vanish during
// the test respects all the invariants.
for (var i = 0; i < parentProc.children.length; i++) {
let childProc = parentProc.children[i];
Assert.notEqual(
childProc.type,
"browser",
"Child proc type should not be browser"
);
// We set the `childID` for child processes that have a `ContentParent`/`ContentChild`
// actor hierarchy.
if (childProc.type.startsWith("web")) {
Assert.notEqual(
childProc.childID,
0,
"Child proc should have been set"
);
}
Assert.notEqual(
childProc.type,
"unknown",
"Child proc type should be known"
);
if (childProc.type == "webIsolated") {
Assert.notEqual(
childProc.origin || "",
"",
"Child process should have an origin"
);
}
for (var y = 0; y < childProc.threads.length; y++) {
cpuThreads += childProc.threads[y].cpuUser;
}
cpuUser += childProc.cpuUser;
}
// We only check other properties on the `privilegedabout` subprocess, which
// as of this writing is always active and available.
var hasPrivilegedAbout = false;
var numberOfAboutTabs = 0;
for (i = 0; i < parentProc.children.length; i++) {
let childProc = parentProc.children[i];
if (childProc.type != "privilegedabout") {
continue;
}
hasPrivilegedAbout = true;
Assert.ok(
childProc.residentUniqueSize > 0,
"Resident-unique-size was set"
);
Assert.ok(
childProc.residentUniqueSize <= childProc.residentSetSize,
`Resident-unique-size should be bounded by resident-set-size ${childProc.residentUniqueSize} <= ${childProc.residentSetSize}`
);
for (var win of childProc.windows) {
if (win.documentURI.spec != "about:home") {
// We're only interested in about:home for this test.
continue;
}
numberOfAboutTabs++;
Assert.ok(
win.outerWindowId > 0,
`ContentParentID should be > 0 ${win.outerWindowId}`
);
if (win.documentTitle) {
// Unfortunately, we sometimes reach this point before the document is fully loaded, so
// `win.documentTitle` may still be empty.
Assert.equal(win.documentTitle, "New Tab");
}
}
Assert.ok(
numberOfAboutTabs >= tabsAboutHome.length,
"We have found at least as many about:home tabs as we opened"
);
// Once we have verified the privileged about process, bailout.
break;
}
Assert.ok(
hasPrivilegedAbout,
"We have found the privileged about process"
);
}
// see https://bugzilla.mozilla.org/show_bug.cgi?id=1529023
if (!MAC) {
Assert.greater(cpuThreads, 0, "Got some cpu time in the threads");
}
Assert.greater(cpuUser, 0, "Got some cpu time");
for (let tab of tabsAboutHome) {
BrowserTestUtils.removeTab(tab);
}
}
);
});