diff options
Diffstat (limited to 'testing/awsy/awsy/test_base_memory_usage.py')
-rw-r--r-- | testing/awsy/awsy/test_base_memory_usage.py | 135 |
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 |