summaryrefslogtreecommitdiffstats
path: root/testing/awsy/awsy/test_base_memory_usage.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/awsy/awsy/test_base_memory_usage.py')
-rw-r--r--testing/awsy/awsy/test_base_memory_usage.py135
1 files changed, 135 insertions, 0 deletions
diff --git a/testing/awsy/awsy/test_base_memory_usage.py b/testing/awsy/awsy/test_base_memory_usage.py
new file mode 100644
index 0000000000..07d65f218f
--- /dev/null
+++ b/testing/awsy/awsy/test_base_memory_usage.py
@@ -0,0 +1,135 @@
+# 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/.
+
+import os
+import sys
+
+AWSY_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+if AWSY_PATH not in sys.path:
+ sys.path.append(AWSY_PATH)
+
+from awsy.awsy_test_case import AwsyTestCase
+
+# A description of each checkpoint and the root path to it.
+CHECKPOINTS = [
+ {
+ "name": "After tabs open [+30s, forced GC]",
+ "path": "memory-report-TabsOpenForceGC-4.json.gz",
+ "name_filter": ["web ", "Web Content"], # We only want the content process
+ "median": True, # We want the median from all content processes
+ },
+]
+
+# A description of each perfherder suite and the path to its values.
+PERF_SUITES = [
+ {"name": "Base Content Resident Unique Memory", "node": "resident-unique"},
+ {"name": "Base Content Heap Unclassified", "node": "explicit/heap-unclassified"},
+ {"name": "Base Content JS", "node": "js-main-runtime/", "alertThreshold": 0.25},
+ {"name": "Base Content Explicit", "node": "explicit/"},
+]
+
+
+class TestMemoryUsage(AwsyTestCase):
+ """
+ Provides a base case test that just loads about:memory and reports the
+ memory usage of a single content process.
+ """
+
+ def urls(self):
+ return self._urls
+
+ def perf_suites(self):
+ return PERF_SUITES
+
+ def perf_checkpoints(self):
+ return CHECKPOINTS
+
+ def perf_extra_opts(self):
+ return self._extra_opts
+
+ def setUp(self):
+ AwsyTestCase.setUp(self)
+ self.logger.info("setting up!")
+
+ # Override AwsyTestCase value, this is always going to be 1 iteration.
+ self._iterations = 1
+
+ # Override "entities" from our configuration.
+ #
+ # We aim to load a number of about:blank pages exactly matching the
+ # number of content processes we can have. After this we should no
+ # longer have a preallocated content process (although to be sure we
+ # explicitly drop it at the end of the test).
+ process_count = self.marionette.get_pref("dom.ipc.processCount")
+ self._pages_to_load = process_count
+ self._urls = ["about:blank"] * process_count
+
+ if self.marionette.get_pref("fission.autostart"):
+ self._extra_opts = ["fission"]
+ else:
+ self._extra_opts = None
+
+ self.logger.info(
+ "areweslimyet run by %d pages, "
+ "%d iterations, %d perTabPause, %d settleWaitTime, "
+ "%d content processes"
+ % (
+ self._pages_to_load,
+ self._iterations,
+ self._perTabPause,
+ self._settleWaitTime,
+ process_count,
+ )
+ )
+ self.logger.info("done setting up!")
+
+ def tearDown(self):
+ self.logger.info("tearing down!")
+ AwsyTestCase.tearDown(self)
+ self.logger.info("done tearing down!")
+
+ def set_preallocated_process_enabled_state(self, enabled):
+ """Sets the pref that controls whether we have a preallocated content
+ process to the given value.
+
+ This will cause the preallocated process to be destroyed or created
+ as appropriate.
+ """
+ if enabled:
+ self.logger.info("re-enabling preallocated process")
+ else:
+ self.logger.info("disabling preallocated process")
+ self.marionette.set_pref("dom.ipc.processPrelaunch.enabled", enabled)
+
+ def test_open_tabs(self):
+ """Marionette test entry that returns an array of checkpoint arrays.
+
+ This will generate a set of checkpoints for each iteration requested.
+ Upon successful completion the results will be stored in
+ |self.testvars["results"]| and accessible to the test runner via the
+ |testvars| object it passed in.
+ """
+ # setup the results array
+ results = [[] for _ in range(self.iterations())]
+
+ def create_checkpoint(name, iteration, minimize=False):
+ checkpoint = self.do_memory_report(name, iteration, minimize)
+ self.assertIsNotNone(checkpoint, "Checkpoint was recorded")
+ results[iteration].append(checkpoint)
+
+ # As long as we force the number of iterations to 1 in setUp() above,
+ # we don't need to loop over this work.
+ assert self._iterations == 1
+ self.open_pages()
+ self.set_preallocated_process_enabled_state(False)
+ self.settle()
+ self.settle()
+ create_checkpoint("TabsOpenForceGC", 0, minimize=True)
+ self.set_preallocated_process_enabled_state(True)
+ # (If we wanted to do something after the preallocated process has been
+ # recreated, we should call self.settle() again to wait for it.)
+
+ # TODO(ER): Temporary hack until bug 1121139 lands
+ self.logger.info("setting results")
+ self.testvars["results"] = results