summaryrefslogtreecommitdiffstats
path: root/testing/mochitest/tests/SimpleTest/MemoryStats.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/mochitest/tests/SimpleTest/MemoryStats.js')
-rw-r--r--testing/mochitest/tests/SimpleTest/MemoryStats.js122
1 files changed, 122 insertions, 0 deletions
diff --git a/testing/mochitest/tests/SimpleTest/MemoryStats.js b/testing/mochitest/tests/SimpleTest/MemoryStats.js
new file mode 100644
index 000000000..2af971184
--- /dev/null
+++ b/testing/mochitest/tests/SimpleTest/MemoryStats.js
@@ -0,0 +1,122 @@
+/* -*- js-indent-level: 4; indent-tabs-mode: nil -*- */
+/* vim:set ts=4 sw=4 sts=4 et: */
+/* 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/. */
+
+var MemoryStats = {};
+
+/**
+ * Statistics that we want to retrieve and display after every test is
+ * done. The keys of this table are intended to be identical to the
+ * relevant attributes of nsIMemoryReporterManager. However, since
+ * nsIMemoryReporterManager doesn't necessarily support all these
+ * statistics in all build configurations, we also use this table to
+ * tell us whether statistics are supported or not.
+ */
+var MEM_STAT_UNKNOWN = 0;
+var MEM_STAT_UNSUPPORTED = 1;
+var MEM_STAT_SUPPORTED = 2;
+
+MemoryStats._hasMemoryStatistics = {}
+MemoryStats._hasMemoryStatistics.vsize = MEM_STAT_UNKNOWN;
+MemoryStats._hasMemoryStatistics.vsizeMaxContiguous = MEM_STAT_UNKNOWN;
+MemoryStats._hasMemoryStatistics.residentFast = MEM_STAT_UNKNOWN;
+MemoryStats._hasMemoryStatistics.heapAllocated = MEM_STAT_UNKNOWN;
+
+MemoryStats._getService = function (className, interfaceName) {
+ var service;
+ try {
+ service = Cc[className].getService(Ci[interfaceName]);
+ } catch (e) {
+ service = SpecialPowers.Cc[className]
+ .getService(SpecialPowers.Ci[interfaceName]);
+ }
+ return service;
+}
+
+MemoryStats._nsIFile = function (pathname) {
+ var f;
+ var contractID = "@mozilla.org/file/local;1";
+ try {
+ f = Cc[contractID].createInstance(Ci.nsIFile);
+ } catch(e) {
+ f = SpecialPowers.Cc[contractID].createInstance(SpecialPowers.Ci.nsIFile);
+ }
+ f.initWithPath(pathname);
+ return f;
+}
+
+MemoryStats.constructPathname = function (directory, basename) {
+ var d = MemoryStats._nsIFile(directory);
+ d.append(basename);
+ return d.path;
+}
+
+MemoryStats.dump = function (testNumber,
+ testURL,
+ dumpOutputDirectory,
+ dumpAboutMemory,
+ dumpDMD) {
+ // Use dump because treeherder uses --quiet, which drops 'info'
+ // from the structured logger.
+ var info = function(message) {
+ dump(message + "\n");
+ };
+
+ var mrm = MemoryStats._getService("@mozilla.org/memory-reporter-manager;1",
+ "nsIMemoryReporterManager");
+ var statMessage = "";
+ for (var stat in MemoryStats._hasMemoryStatistics) {
+ var supported = MemoryStats._hasMemoryStatistics[stat];
+ var firstAccess = false;
+ if (supported == MEM_STAT_UNKNOWN) {
+ firstAccess = true;
+ try {
+ var value = mrm[stat];
+ supported = MEM_STAT_SUPPORTED;
+ } catch (e) {
+ supported = MEM_STAT_UNSUPPORTED;
+ }
+ MemoryStats._hasMemoryStatistics[stat] = supported;
+ }
+ if (supported == MEM_STAT_SUPPORTED) {
+ var sizeInMB = Math.round(mrm[stat] / (1024 * 1024));
+ statMessage += " | " + stat + " " + sizeInMB + "MB";
+ } else if (firstAccess) {
+ info("MEMORY STAT " + stat + " not supported in this build configuration.");
+ }
+ }
+ if (statMessage.length > 0) {
+ info("MEMORY STAT" + statMessage);
+ }
+
+ if (dumpAboutMemory) {
+ var basename = "about-memory-" + testNumber + ".json.gz";
+ var dumpfile = MemoryStats.constructPathname(dumpOutputDirectory,
+ basename);
+ info(testURL + " | MEMDUMP-START " + dumpfile);
+ var md = MemoryStats._getService("@mozilla.org/memory-info-dumper;1",
+ "nsIMemoryInfoDumper");
+ md.dumpMemoryReportsToNamedFile(dumpfile, function () {
+ info("TEST-INFO | " + testURL + " | MEMDUMP-END");
+ }, null, /* anonymize = */ false);
+ }
+
+ // This is the old, deprecated function.
+ if (dumpDMD && typeof(DMDReportAndDump) != undefined) {
+ var basename = "dmd-" + testNumber + "-deprecated.txt";
+ var dumpfile = MemoryStats.constructPathname(dumpOutputDirectory,
+ basename);
+ info(testURL + " | DMD-DUMP-deprecated " + dumpfile);
+ DMDReportAndDump(dumpfile);
+ }
+
+ if (dumpDMD && typeof(DMDAnalyzeReports) != undefined) {
+ var basename = "dmd-" + testNumber + ".txt";
+ var dumpfile = MemoryStats.constructPathname(dumpOutputDirectory,
+ basename);
+ info(testURL + " | DMD-DUMP " + dumpfile);
+ DMDAnalyzeReports(dumpfile);
+ }
+};