Index: telemetry/telemetry/internal/actions/action_runner_unittest.py |
diff --git a/telemetry/telemetry/internal/actions/action_runner_unittest.py b/telemetry/telemetry/internal/actions/action_runner_unittest.py |
index a6d75651d057da1ed851de30a81738b416b4605b..8e89bce7663a0cd33bf1edd15d7470368460e49b 100644 |
--- a/telemetry/telemetry/internal/actions/action_runner_unittest.py |
+++ b/telemetry/telemetry/internal/actions/action_runner_unittest.py |
@@ -1,6 +1,7 @@ |
# Copyright 2014 The Chromium Authors. All rights reserved. |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
+import mock |
import unittest |
from telemetry.core import exceptions |
@@ -8,7 +9,7 @@ from telemetry import decorators |
from telemetry.internal.actions import action_runner as action_runner_module |
from telemetry.internal.actions import page_action |
from telemetry.testing import tab_test_case |
-import mock |
+from telemetry.timeline import chrome_trace_category_filter |
from telemetry.timeline import model |
from telemetry.timeline import tracing_config |
from telemetry.web_perf import timeline_interaction_record as tir_module |
@@ -55,6 +56,59 @@ class ActionRunnerInteractionTest(tab_test_case.TabTestCase): |
self.VerifyIssuingInteractionRecords(repeatable=True) |
+class ActionRunnerMeasureMemoryTest(tab_test_case.TabTestCase): |
+ def setUp(self): |
+ super(ActionRunnerMeasureMemoryTest, self).setUp() |
+ self.action_runner = action_runner_module.ActionRunner(self._tab, |
+ skip_waits=True) |
+ self.Navigate('blank.html') |
+ |
+ def testWithoutTracing(self): |
+ with mock.patch.object(self._tab.browser, 'DumpMemory') as mock_method: |
+ self.assertIsNone(self.action_runner.MeasureMemory()) |
+ self.assertFalse(mock_method.called) # No-op with no tracing. |
+ |
+ def _testWithTracing(self, deterministic_mode=False): |
+ trace_memory = chrome_trace_category_filter.ChromeTraceCategoryFilter( |
+ filter_string='-*,blink.console,disabled-by-default-memory-infra') |
+ config = tracing_config.TracingConfig() |
+ config.enable_chrome_trace = True |
+ config.chrome_trace_config.SetCategoryFilter(trace_memory) |
+ self._browser.platform.tracing_controller.StartTracing(config) |
+ try: |
+ dump_id = self.action_runner.MeasureMemory(deterministic_mode) |
+ finally: |
+ trace_data = self._browser.platform.tracing_controller.StopTracing() |
+ |
+ # If successful, i.e. we haven't balied out due to an exception, check |
+ # that we can find our dump in the trace. |
+ self.assertIsNotNone(dump_id) |
+ timeline_model = model.TimelineModel(trace_data) |
+ dump_ids = (d.dump_id for d in timeline_model.IterGlobalMemoryDumps()) |
+ self.assertIn(dump_id, dump_ids) |
+ |
+ # TODO(perezju): Enable when reference browser is >= M53 |
+ # https://github.com/catapult-project/catapult/issues/2610 |
+ @decorators.Disabled('reference') |
+ def testDeterministicMode(self): |
+ self._testWithTracing(deterministic_mode=True) |
+ |
+ # TODO(perezju): Enable when reference browser is >= M53 |
+ # https://github.com/catapult-project/catapult/issues/2610 |
+ @decorators.Disabled('reference') |
+ def testRealisticMode(self): |
+ with mock.patch.object( |
+ self.action_runner, 'ForceGarbageCollection') as mock_method: |
+ self._testWithTracing(deterministic_mode=False) |
+ self.assertFalse(mock_method.called) # No forced GC in "realistic" mode. |
+ |
+ def testWithFailedDump(self): |
+ with mock.patch.object(self._tab.browser, 'DumpMemory') as mock_method: |
+ mock_method.return_value = False # Dump fails! |
+ with self.assertRaises(AssertionError): |
+ self._testWithTracing() |
+ |
+ |
class ActionRunnerTest(tab_test_case.TabTestCase): |
def testExecuteJavaScript(self): |
action_runner = action_runner_module.ActionRunner(self._tab, |