Source code

Revision control

Copy as Markdown

Other Tools

# 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