aboutsummaryrefslogtreecommitdiff
path: root/catapult/telemetry/telemetry/core/tracing_controller_unittest.py
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/telemetry/telemetry/core/tracing_controller_unittest.py')
-rw-r--r--catapult/telemetry/telemetry/core/tracing_controller_unittest.py189
1 files changed, 189 insertions, 0 deletions
diff --git a/catapult/telemetry/telemetry/core/tracing_controller_unittest.py b/catapult/telemetry/telemetry/core/tracing_controller_unittest.py
new file mode 100644
index 00000000..ec91aafe
--- /dev/null
+++ b/catapult/telemetry/telemetry/core/tracing_controller_unittest.py
@@ -0,0 +1,189 @@
+# Copyright 2015 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 time
+
+from battor import battor_wrapper
+from telemetry import decorators
+from telemetry.core import platform as platform_module
+from telemetry.testing import browser_test_case
+from telemetry.testing import tab_test_case
+from telemetry.timeline import model as model_module
+from telemetry.timeline import tracing_config
+from telemetry.timeline import trace_data as trace_data_module
+
+
+class TracingControllerTest(tab_test_case.TabTestCase):
+
+ @decorators.Isolated
+ def testExceptionRaisedInStopTracing(self):
+ tracing_controller = self._tab.browser.platform.tracing_controller
+ config = tracing_config.TracingConfig()
+ config.enable_chrome_trace = True
+ tracing_controller.StartTracing(config)
+
+ self.Navigate('blank.html')
+
+ def _FakeStopChromeTracing(*args):
+ del args # Unused
+ raise Exception('Intentional Tracing Exception')
+
+ self._tab._inspector_backend._devtools_client.StopChromeTracing = (
+ _FakeStopChromeTracing)
+ with self.assertRaisesRegexp(Exception, 'Intentional Tracing Exception'):
+ tracing_controller.StopTracing()
+
+ # Tracing is stopped even if there is exception.
+ self.assertFalse(tracing_controller.is_tracing_running)
+
+
+ @decorators.Isolated
+ def testGotTrace(self):
+ tracing_controller = self._browser.platform.tracing_controller
+ config = tracing_config.TracingConfig()
+ config.enable_chrome_trace = True
+ tracing_controller.StartTracing(config)
+
+ trace_data = tracing_controller.StopTracing()
+ # Test that trace data is parsable
+ model = model_module.TimelineModel(trace_data)
+ assert len(model.processes) > 0
+
+ @decorators.Isolated
+ def testStartAndStopTraceMultipleTimes(self):
+ tracing_controller = self._browser.platform.tracing_controller
+ config = tracing_config.TracingConfig()
+ config.enable_chrome_trace = True
+ tracing_controller.StartTracing(config)
+ self.assertFalse(tracing_controller.StartTracing(config))
+
+ trace_data = tracing_controller.StopTracing()
+ # Test that trace data is parsable
+ model_module.TimelineModel(trace_data)
+ self.assertFalse(tracing_controller.is_tracing_running)
+ # Calling stop again will raise exception
+ self.assertRaises(Exception, tracing_controller.StopTracing)
+
+ @decorators.Isolated
+ def testFlushTracing(self):
+ SUBTRACE_COUNT = 5
+
+ tab = self._browser.tabs[0]
+ def InjectMarker(index):
+ marker = 'test-marker-%d' % index
+ # TODO(catapult:#3028): Fix interpolation of JavaScript values.
+ tab.EvaluateJavaScript('console.time("%s");' % marker)
+ # TODO(catapult:#3028): Fix interpolation of JavaScript values.
+ tab.EvaluateJavaScript('console.timeEnd("%s");' % marker)
+
+ # Set up the tracing config.
+ tracing_controller = self._browser.platform.tracing_controller
+ config = tracing_config.TracingConfig()
+ config.enable_chrome_trace = True
+
+ # Start tracing and inject a unique marker into the sub-trace.
+ tracing_controller.StartTracing(config)
+ self.assertTrue(tracing_controller.is_tracing_running)
+ InjectMarker(0)
+
+ # Flush tracing |SUBTRACE_COUNT - 1| times and inject a unique marker into
+ # the sub-trace each time.
+ for i in xrange(1, SUBTRACE_COUNT):
+ tracing_controller.FlushTracing()
+ self.assertTrue(tracing_controller.is_tracing_running)
+ InjectMarker(i)
+
+ # Stop tracing.
+ trace_data = tracing_controller.StopTracing()
+ self.assertFalse(tracing_controller.is_tracing_running)
+
+ # Test that trace data is parsable
+ model = model_module.TimelineModel(trace_data)
+
+ # Check that the markers 'test-marker-0', 'flush-tracing', 'test-marker-1',
+ # ..., 'flush-tracing', 'test-marker-|SUBTRACE_COUNT - 1|' are monotonic.
+ custom_markers = [marker for i in xrange(SUBTRACE_COUNT)
+ for marker in model.FindTimelineMarkers(
+ 'test-marker-%d' % i)]
+ flush_markers = model.FindTimelineMarkers(
+ ['flush-tracing'] * (SUBTRACE_COUNT - 1))
+ markers = [marker for group in zip(custom_markers, flush_markers)
+ for marker in group] + custom_markers[-1:]
+
+ self.assertEquals(len(custom_markers), SUBTRACE_COUNT)
+ self.assertEquals(len(flush_markers), SUBTRACE_COUNT - 1)
+ self.assertEquals(len(markers), 2 * SUBTRACE_COUNT - 1)
+
+ for i in xrange(1, len(markers)):
+ self.assertLess(markers[i - 1].end, markers[i].start)
+
+ def _StartupTracing(self, platform):
+ # Stop browser
+ browser_test_case.teardown_browser()
+
+ # Start tracing
+ self.assertFalse(platform.tracing_controller.is_tracing_running)
+ config = tracing_config.TracingConfig()
+ config.enable_chrome_trace = True
+ platform.tracing_controller.StartTracing(config)
+ self.assertTrue(platform.tracing_controller.is_tracing_running)
+
+ try:
+ # Start browser
+ self.setUpClass()
+ self._browser.tabs[0].Navigate('about:blank')
+ self._browser.tabs[0].WaitForDocumentReadyStateToBeInteractiveOrBetter()
+ self.assertEquals(platform, self._browser.platform)
+
+ # Calling start tracing again will return False
+ self.assertFalse(platform.tracing_controller.StartTracing(config))
+
+ trace_data = platform.tracing_controller.StopTracing()
+ # Test that trace data is parsable
+ model_module.TimelineModel(trace_data)
+ self.assertFalse(platform.tracing_controller.is_tracing_running)
+ # Calling stop tracing again will raise exception
+ self.assertRaises(Exception, platform.tracing_controller.StopTracing)
+ finally:
+ if platform.tracing_controller.is_tracing_running:
+ platform.tracing_controller.StopTracing()
+ if self._browser:
+ self._browser.Close()
+ self._browser = None
+
+ # https://github.com/catapult-project/catapult/issues/3099 (Android)
+ @decorators.Disabled('all')
+ @decorators.Isolated
+ def testStartupTracingOnAndroid(self):
+ self._StartupTracing(self._browser.platform)
+
+ @decorators.Enabled('chromeos')
+ @decorators.Isolated
+ def testStartupTracingOnCrOS(self):
+ self._StartupTracing(self._browser.platform)
+
+ @decorators.Enabled('linux', 'mac', 'win')
+ @decorators.Isolated
+ def testStartupTracingOnDesktop(self):
+ self._StartupTracing(platform_module.GetHostPlatform())
+
+ @decorators.Disabled('linux') # crbug.com/673761
+ def testBattOrTracing(self):
+ test_platform = self._browser.platform.GetOSName()
+ device = (self._browser.platform._platform_backend.device
+ if test_platform == 'android' else None)
+ if (not battor_wrapper.IsBattOrConnected(test_platform,
+ android_device=device)):
+ return # Do not run the test if no BattOr is connected.
+
+ tracing_controller = self._browser.platform.tracing_controller
+ config = tracing_config.TracingConfig()
+ config.enable_battor_trace = True
+ tracing_controller.StartTracing(config)
+ # We wait 1s before starting and stopping tracing to avoid crbug.com/602266,
+ # which would cause a crash otherwise.
+ time.sleep(1)
+ trace_data = tracing_controller.StopTracing()
+ self.assertTrue(
+ trace_data.HasTracesFor(trace_data_module.BATTOR_TRACE_PART))