diff options
Diffstat (limited to 'toolkit/components/aboutmemory/tests/test_memoryReporters2.xul')
-rw-r--r-- | toolkit/components/aboutmemory/tests/test_memoryReporters2.xul | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/toolkit/components/aboutmemory/tests/test_memoryReporters2.xul b/toolkit/components/aboutmemory/tests/test_memoryReporters2.xul new file mode 100644 index 000000000..0e8ba2e81 --- /dev/null +++ b/toolkit/components/aboutmemory/tests/test_memoryReporters2.xul @@ -0,0 +1,108 @@ +<?xml version="1.0"?> +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> +<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" + type="text/css"?> +<window title="Memory reporters with child processes" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + <script type="application/javascript" + src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> + + <!-- This file tests (in a rough fashion) whether the memory reporters are + producing sensible results in the presence of child processes. --> + + <!-- test results are displayed in the html:body --> + <body xmlns="http://www.w3.org/1999/xhtml"> + </body> + + <!-- test code goes here --> + <script type="application/javascript"><![CDATA[ + + const Cc = Components.classes; + const Ci = Components.interfaces; + + SimpleTest.waitForExplicitFinish(); + + let numRemotes = 3; + let numReady = 0; + + // Create some remote processes, and set up message-passing so that + // we know when each child is fully initialized. + let remotes = []; + SpecialPowers.pushPrefEnv({"set": [["dom.ipc.processCount", 3]]}, function() { + for (let i = 0; i < numRemotes; i++) { + let w = remotes[i] = window.open("remote.xul", "", "chrome"); + + w.addEventListener("load", function loadHandler() { + w.removeEventListener("load", loadHandler); + let remoteBrowser = w.document.getElementById("remote"); + let mm = remoteBrowser.messageManager; + mm.addMessageListener("test:ready", function readyHandler() { + mm.removeMessageListener("test:ready", readyHandler); + numReady++; + if (numReady == numRemotes) { + // All the remote processes are ready. Do memory reporting. + doReports(); + } + }); + mm.loadFrameScript("data:," + encodeURI("sendAsyncMessage('test:ready');"), true); + }); + } + }); + + let mgr = Cc["@mozilla.org/memory-reporter-manager;1"]. + getService(Ci.nsIMemoryReporterManager); + + function doReports() + { + let residents = {}; + + let handleReport = function(aProcess, aPath, aKind, aUnits, aAmount, aDesc) { + if (aPath === "resident") { + ok(100 * 1000 <= aAmount && aAmount <= 10 * 1000 * 1000 * 1000, + "resident is reasonable"); + residents[aProcess] = aAmount; + } + } + + let processReports = function() { + // First, test a failure case: calling getReports() before the previous + // getReports() has finished should silently abort. (And the arguments + // won't be used.) + mgr.getReports( + () => ok(false, "handleReport called for nested getReports() call"), + null, null, null, /* anonymize = */ false + ); + + // Close the remote processes. + for (let i = 0; i < numRemotes; i++) { + remotes[i].close(); + } + + // Check the results. + + let processes = Object.keys(residents); + ok(processes.length == numRemotes + 1, "correct resident count"); + + let numEmptyProcesses = 0, numNonEmptyProcesses = 0; + for (let i = 0; i < processes.length; i++) { + if (processes[i] == "") { + numEmptyProcesses++; + } else { + ok(processes[i].startsWith("Browser (") || processes[i].startsWith("Web Content ("), + "correct non-empty process name prefix: " + processes[i]); + numNonEmptyProcesses++; + } + } + ok(numEmptyProcesses == 1, "correct empty process name count"); + ok(numNonEmptyProcesses == numRemotes, + "correct non-empty process name count"); + + SimpleTest.finish(); + } + + mgr.getReports(handleReport, null, processReports, null, + /* anonymize = */ false); + } + + ]]></script> +</window> |