Index: tools/telemetry/telemetry/web_perf/metrics/fast_metric_unittest.py |
diff --git a/tools/telemetry/telemetry/web_perf/metrics/fast_metric_unittest.py b/tools/telemetry/telemetry/web_perf/metrics/fast_metric_unittest.py |
deleted file mode 100644 |
index 3bd2ca9b46c64d6f802030cce0ef0b646ecce58b..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/telemetry/web_perf/metrics/fast_metric_unittest.py |
+++ /dev/null |
@@ -1,216 +0,0 @@ |
-# 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 logging |
-import StringIO |
-import unittest |
- |
-from telemetry.results import page_test_results |
-from telemetry.timeline import model as model_module |
-from telemetry.timeline import async_slice |
-from telemetry.web_perf import timeline_interaction_record as tir_module |
-from telemetry.web_perf.metrics import fast_metric |
- |
- |
-class RendererThreadHelper(object): |
- def __init__(self, wall_start, wall_duration, thread_start, thread_duration): |
- self._model = model_module.TimelineModel() |
- renderer_process = self._model.GetOrCreateProcess(1) |
- self._renderer_thread = renderer_process.GetOrCreateThread(2) |
- self._renderer_thread.name = 'CrRendererMain' |
- self._renderer_thread.BeginSlice('cat1', 'x.y', wall_start, thread_start) |
- self._renderer_thread.EndSlice(wall_start + wall_duration, |
- thread_start + thread_duration) |
- self._async_slices = [] |
- |
- def AddInteraction(self, logical_name='LogicalName', **kwargs): |
- # Rename kwargs for AsyncSlice. |
- kwargs['timestamp'] = kwargs.pop('wall_start') |
- kwargs['duration'] = kwargs.pop('wall_duration') |
- |
- self._async_slices.append(async_slice.AsyncSlice( |
- 'cat', 'Interaction.%s/is_fast' % logical_name, |
- start_thread=self._renderer_thread, end_thread=self._renderer_thread, |
- **kwargs)) |
- |
- def AddEvent(self, category, name, wall_start, wall_duration, thread_start, |
- thread_duration): |
- self._renderer_thread.BeginSlice(category, name, wall_start, thread_start) |
- self._renderer_thread.EndSlice(wall_start + wall_duration, |
- thread_start + thread_duration) |
- |
- def MeasureFakePage(self, metric): |
- self._renderer_thread.async_slices.extend(self._async_slices) |
- self._model.FinalizeImport() |
- interaction_records = [ |
- tir_module.TimelineInteractionRecord.FromAsyncEvent(s) |
- for s in self._async_slices] |
- results = page_test_results.PageTestResults() |
- fake_page = None |
- results.WillRunPage(fake_page) |
- metric.AddResults(self._model, self._renderer_thread, interaction_records, |
- results) |
- results.DidRunPage(fake_page) |
- return results |
- |
- |
-class FastMetricTests(unittest.TestCase): |
- |
- def setUp(self): |
- self.log_output = StringIO.StringIO() |
- self.stream_handler = logging.StreamHandler(self.log_output) |
- logging.getLogger().addHandler(self.stream_handler) |
- |
- def tearDown(self): |
- logging.getLogger().removeHandler(self.stream_handler) |
- self.log_output.close() |
- |
- def LogOutput(self): |
- return self.log_output.getvalue() |
- |
- def ActualValues(self, results): |
- return sorted( |
- (v.name, v.units, v.value) |
- for v in results.all_page_specific_values |
- ) |
- |
- def testAddResultsWithThreadTime(self): |
- # Wall time diagram: |
- # 1 2 3 4 |
- # 01234567890123456789012345678901234567890123456789 |
- # [ x.y ] |
- # [ Interaction.LogicalName/is_fast ] |
- renderer_thread_helper = RendererThreadHelper( |
- wall_start=5, wall_duration=35, thread_start=0, thread_duration=54) |
- renderer_thread_helper.AddInteraction( |
- wall_start=32, wall_duration=37, thread_start=51, thread_duration=33) |
- |
- metric = fast_metric.FastMetric() |
- results = renderer_thread_helper.MeasureFakePage(metric) |
- |
- expected_values = [ |
- ('fast-cpu_time', 'ms', 3), # 54 - 51; thread overlap |
- ('fast-duration', 'ms', 37), # total interaction wall duration |
- ('fast-idle_time', 'ms', 29), # (32 + 37) - (5 + 35); interaction wall |
- # time outside of renderer wall time. |
- ('fast-incremental_marking', 'ms', 0.0), |
- ('fast-incremental_marking_outside_idle', 'ms', 0.0), |
- ('fast-mark_compactor', 'ms', 0.0), |
- ('fast-mark_compactor_outside_idle', 'ms', 0.0), |
- ('fast-scavenger', 'ms', 0.0), |
- ('fast-scavenger_outside_idle', 'ms', 0.0), |
- ('fast-total_garbage_collection', 'ms', 0.0), |
- ('fast-total_garbage_collection_outside_idle', 'ms', 0.0) |
- ] |
- self.assertEqual(expected_values, self.ActualValues(results)) |
- |
- def testAddResultsWithoutThreadTime(self): |
- # Wall time diagram: |
- # 1 2 3 4 |
- # 01234567890123456789012345678901234567890123456789 |
- # [ x.y ] |
- # [ Interaction.LogicalName/is_fast ] |
- renderer_thread_helper = RendererThreadHelper( |
- wall_start=5, wall_duration=35, thread_start=0, thread_duration=54) |
- renderer_thread_helper.AddInteraction( |
- wall_start=32, wall_duration=37) # no thread_start, no thread_duration |
- |
- metric = fast_metric.FastMetric() |
- results = renderer_thread_helper.MeasureFakePage(metric) |
- |
- expected_values = [ |
- # cpu_time is skipped because there is no thread time. |
- ('fast-duration', 'ms', 37), # total interaction wall duration |
- ('fast-idle_time', 'ms', 29), # (32 + 37) - (5 + 35); interaction wall |
- # time outside of renderer wall time. |
- ('fast-incremental_marking', 'ms', 0.0), |
- ('fast-incremental_marking_outside_idle', 'ms', 0.0), |
- ('fast-mark_compactor', 'ms', 0.0), |
- ('fast-mark_compactor_outside_idle', 'ms', 0.0), |
- ('fast-scavenger', 'ms', 0.0), |
- ('fast-scavenger_outside_idle', 'ms', 0.0), |
- ('fast-total_garbage_collection', 'ms', 0.0), |
- ('fast-total_garbage_collection_outside_idle', 'ms', 0.0) |
- ] |
- self.assertEqual(expected_values, self.ActualValues(results)) |
- self.assertIn('Main thread cpu_time cannot be computed for records', |
- self.LogOutput()) |
- |
- def testAddResultsWithMultipleInteractions(self): |
- # Wall time diagram: |
- # 1 2 3 4 |
- # 01234567890123456789012345678901234567890123456789 |
- # [ x.y ] |
- # [ Interaction.Foo/is_fast ] [ Interaction.Bar/is_fast ] |
- renderer_thread_helper = RendererThreadHelper( |
- wall_start=2, wall_duration=45, thread_start=0, thread_duration=101) |
- renderer_thread_helper.AddInteraction( |
- logical_name='Foo', |
- wall_start=6, wall_duration=27, thread_start=51, thread_duration=33) |
- renderer_thread_helper.AddInteraction( |
- logical_name='Bar', |
- wall_start=38, wall_duration=27, thread_start=90, thread_duration=33) |
- |
- metric = fast_metric.FastMetric() |
- results = renderer_thread_helper.MeasureFakePage(metric) |
- |
- expected_values = [ |
- ('fast-cpu_time', 'ms', 44), # thread overlap |
- ('fast-duration', 'ms', 54), # 27 + 27; total interaction wall duration |
- ('fast-idle_time', 'ms', 18), # (38 + 27) - (2 + 45); interaction wall |
- # time outside of renderer wall time. |
- ('fast-incremental_marking', 'ms', 0.0), |
- ('fast-incremental_marking_outside_idle', 'ms', 0.0), |
- ('fast-mark_compactor', 'ms', 0.0), |
- ('fast-mark_compactor_outside_idle', 'ms', 0.0), |
- ('fast-scavenger', 'ms', 0.0), |
- ('fast-scavenger_outside_idle', 'ms', 0.0), |
- ('fast-total_garbage_collection', 'ms', 0.0), |
- ('fast-total_garbage_collection_outside_idle', 'ms', 0.0) |
- ] |
- self.assertEqual(expected_values, self.ActualValues(results)) |
- |
- def testAddResultsWithGarbeCollectionEvents(self): |
- # Thread time diagram: |
- # 1 2 3 4 5 |
- # 012345678901234567890123456789012345678901234567890123456789 |
- # [ x.y ] |
- # [ Interaction.Foo/is_fast ] |
- # [ Idle ] [Idle] [Idle] |
- # [ S ] [S] [ I ] [I] [MC ] [MC] |
- renderer_thread_helper = RendererThreadHelper( |
- wall_start=1, wall_duration=57, thread_start=1, thread_duration=57) |
- renderer_thread_helper.AddInteraction( |
- logical_name='Foo', |
- wall_start=3, wall_duration=58, thread_start=3, thread_duration=58) |
- renderer_thread_helper.AddEvent('v8', 'V8.GCIdleNotification', 3, 7, 3, 7) |
- renderer_thread_helper.AddEvent('v8', 'V8.GCIdleNotification', 22, 5, 22, 5) |
- renderer_thread_helper.AddEvent('v8', 'V8.GCIdleNotification', 41, 5, 41, 5) |
- renderer_thread_helper.AddEvent('v8', 'V8.GCScavenger', 5, 4, 5, 4) |
- renderer_thread_helper.AddEvent('v8', 'V8.GCScavenger', 15, 2, 15, 2) |
- renderer_thread_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 23, 4, 23, |
- 4) |
- renderer_thread_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 34, 2, 34, |
- 2) |
- renderer_thread_helper.AddEvent('v8', 'V8.GCCompactor', 42, 4, 42, 4) |
- renderer_thread_helper.AddEvent('v8', 'V8.GCCompactor', 52, 3, 52, 3) |
- |
- metric = fast_metric.FastMetric() |
- results = renderer_thread_helper.MeasureFakePage(metric) |
- |
- expected_values = [ |
- ('fast-cpu_time', 'ms', 55), # thread overlap |
- ('fast-duration', 'ms', 58), # total interaction wall duration |
- ('fast-idle_time', 'ms', 3), # (3 + 58) - (1 + 57); interaction wall |
- # time outside of renderer wall time. |
- ('fast-incremental_marking', 'ms', 6.0), |
- ('fast-incremental_marking_outside_idle', 'ms', 2.0), |
- ('fast-mark_compactor', 'ms', 7.0), |
- ('fast-mark_compactor_outside_idle', 'ms', 3.0), |
- ('fast-scavenger', 'ms', 6.0), |
- ('fast-scavenger_outside_idle', 'ms', 2.0), |
- ('fast-total_garbage_collection', 'ms', 19.0), |
- ('fast-total_garbage_collection_outside_idle', 'ms', 7.0) |
- ] |
- self.assertEqual(expected_values, self.ActualValues(results)) |