| OLD | NEW |
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import unittest | 5 import unittest |
| 6 | 6 |
| 7 from metrics import timeline | 7 from metrics import timeline |
| 8 from telemetry.core.timeline import bounds | 8 from telemetry.core.timeline import bounds |
| 9 from telemetry.core.timeline import model as model_module | 9 from telemetry.core.timeline import model as model_module |
| 10 from telemetry.page import page as page_module | 10 from telemetry.page import page as page_module |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 | 84 |
| 85 | 85 |
| 86 class ThreadTimesTimelineMetricUnittest(unittest.TestCase): | 86 class ThreadTimesTimelineMetricUnittest(unittest.TestCase): |
| 87 def GetResultsForModel(self, metric, model): | 87 def GetResultsForModel(self, metric, model): |
| 88 metric.model = model | 88 metric.model = model |
| 89 results = TestPageMeasurementResults(self) | 89 results = TestPageMeasurementResults(self) |
| 90 tab = None | 90 tab = None |
| 91 metric.AddResults(tab, results) | 91 metric.AddResults(tab, results) |
| 92 return results | 92 return results |
| 93 | 93 |
| 94 def GetActionRange(self, start, end): |
| 95 action_range = bounds.Bounds() |
| 96 action_range.AddValue(start) |
| 97 action_range.AddValue(end) |
| 98 return action_range |
| 99 |
| 100 def testResults(self): |
| 101 model = model_module.TimelineModel() |
| 102 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) |
| 103 renderer_main.name = 'CrRendererMain' |
| 104 |
| 105 metric = timeline.ThreadTimesTimelineMetric() |
| 106 metric._action_ranges = [self.GetActionRange(1, 2)] |
| 107 metric.details_to_report = timeline.ReportMainThreadOnly |
| 108 results = self.GetResultsForModel(metric, model) |
| 109 |
| 110 # Test that all result thread categories exist |
| 111 for name in timeline.TimelineThreadCategories.values(): |
| 112 results.GetPageSpecificValueNamed(timeline.ThreadTimeResultName(name)) |
| 113 results.GetPageSpecificValueNamed(timeline.ThreadCpuTimeResultName(name)) |
| 114 |
| 94 def testBasic(self): | 115 def testBasic(self): |
| 95 model = model_module.TimelineModel() | 116 model = model_module.TimelineModel() |
| 96 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) | 117 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) |
| 97 renderer_main.name = 'CrRendererMain' | 118 renderer_main.name = 'CrRendererMain' |
| 98 | 119 |
| 99 # Create two frame swaps (Results times should be divided by two) | 120 # Create two frame swaps (Results times should be divided by two) |
| 100 cc_main = model.GetOrCreateProcess(1).GetOrCreateThread(3) | 121 cc_main = model.GetOrCreateProcess(1).GetOrCreateThread(3) |
| 101 cc_main.name = 'Compositor' | 122 cc_main.name = 'Compositor' |
| 102 cc_main.BeginSlice('cc_cat', timeline.CompositorFrameTraceName, 10, 10) | 123 cc_main.BeginSlice('cc_cat', timeline.FrameTraceName, 10, 10) |
| 103 cc_main.EndSlice(11, 11) | 124 cc_main.EndSlice(11, 11) |
| 104 cc_main.BeginSlice('cc_cat', timeline.CompositorFrameTraceName, 12, 12) | 125 cc_main.BeginSlice('cc_cat', timeline.FrameTraceName, 12, 12) |
| 105 cc_main.EndSlice(13, 13) | 126 cc_main.EndSlice(13, 13) |
| 106 | 127 |
| 107 # [ X ] [ Z ] | 128 # [ X ] [ Z ] |
| 108 # [ Y ] | 129 # [ Y ] |
| 109 renderer_main.BeginSlice('cat1', 'X', 10, 0) | 130 renderer_main.BeginSlice('cat1', 'X', 10, 0) |
| 110 renderer_main.BeginSlice('cat2', 'Y', 15, 5) | 131 renderer_main.BeginSlice('cat2', 'Y', 15, 5) |
| 111 renderer_main.EndSlice(16, 5.5) | 132 renderer_main.EndSlice(16, 5.5) |
| 112 renderer_main.EndSlice(30, 19.5) | 133 renderer_main.EndSlice(30, 19.5) |
| 113 renderer_main.BeginSlice('cat1', 'Z', 31, 20) | 134 renderer_main.BeginSlice('cat1', 'Z', 31, 20) |
| 114 renderer_main.BeginSlice('cat1', 'Z', 33, 21) | 135 renderer_main.BeginSlice('cat1', 'Z', 33, 21) |
| 115 model.FinalizeImport() | 136 model.FinalizeImport() |
| 116 | 137 |
| 117 # Exclude Z using an action-range. | 138 # Exclude 'Z' using an action-range. |
| 118 action_range = bounds.Bounds() | |
| 119 action_range.AddValue(10) | |
| 120 action_range.AddValue(30) | |
| 121 | |
| 122 metric = timeline.ThreadTimesTimelineMetric() | 139 metric = timeline.ThreadTimesTimelineMetric() |
| 123 metric._action_ranges = [action_range] | 140 metric._action_ranges = [self.GetActionRange(10, 30)] |
| 124 metric.details_to_report = timeline.MainThread | 141 metric.details_to_report = timeline.ReportMainThreadOnly |
| 125 results = self.GetResultsForModel(metric, model) | 142 results = self.GetResultsForModel(metric, model) |
| 126 | 143 |
| 127 # Test that all categories exist | |
| 128 for name in timeline.TimelineThreadCategories.values(): | |
| 129 results.GetPageSpecificValueNamed(timeline.ThreadTimeResultName(name)) | |
| 130 results.GetPageSpecificValueNamed(timeline.ThreadCpuTimeResultName(name)) | |
| 131 | |
| 132 # Test a couple specific results. | 144 # Test a couple specific results. |
| 133 assert_results = { | 145 assert_results = { |
| 134 timeline.ThreadTimeResultName('renderer_main') : 10, | 146 timeline.ThreadTimeResultName('renderer_main') : 10, |
| 135 timeline.ThreadDetailResultName('renderer_main','cat1') : 9.5, | 147 timeline.ThreadDetailResultName('renderer_main','cat1') : 9.5, |
| 136 timeline.ThreadDetailResultName('renderer_main','cat2') : 0.5, | 148 timeline.ThreadDetailResultName('renderer_main','cat2') : 0.5, |
| 137 timeline.ThreadDetailResultName('renderer_main','idle') : 0 | 149 timeline.ThreadDetailResultName('renderer_main','idle') : 0 |
| 138 } | 150 } |
| 139 for name, value in assert_results.iteritems(): | 151 for name, value in assert_results.iteritems(): |
| 140 results.AssertHasPageSpecificScalarValue(name, 'ms', value) | 152 results.AssertHasPageSpecificScalarValue(name, 'ms', value) |
| 153 |
| 154 def testOverheadIsRemoved(self): |
| 155 model = model_module.TimelineModel() |
| 156 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) |
| 157 renderer_main.name = 'CrRendererMain' |
| 158 |
| 159 # Create one frame swap. |
| 160 cc_main = model.GetOrCreateProcess(1).GetOrCreateThread(3) |
| 161 cc_main.name = 'Compositor' |
| 162 cc_main.BeginSlice('cc_cat', timeline.FrameTraceName, 10, 10) |
| 163 cc_main.EndSlice(11, 11) |
| 164 |
| 165 # [ X ] |
| 166 # [Overhead] |
| 167 overhead_category = timeline.OverheadTraceCategory |
| 168 overhead_name = timeline.OverheadTraceName |
| 169 renderer_main.BeginSlice('cat1', 'X', 10, 0) |
| 170 renderer_main.BeginSlice(overhead_category, overhead_name, 15, 5) |
| 171 renderer_main.EndSlice(16, 6) |
| 172 renderer_main.EndSlice(30, 10) |
| 173 model.FinalizeImport() |
| 174 |
| 175 # Include everything in an action-range. |
| 176 metric = timeline.ThreadTimesTimelineMetric() |
| 177 metric._action_ranges = [self.GetActionRange(10, 30)] |
| 178 metric.details_to_report = timeline.ReportMainThreadOnly |
| 179 results = self.GetResultsForModel(metric, model) |
| 180 |
| 181 # Test a couple specific results. |
| 182 assert_results = { |
| 183 timeline.ThreadTimeResultName('renderer_main') : 19, |
| 184 timeline.ThreadCpuTimeResultName('renderer_main') : 9.0, |
| 185 } |
| 186 for name, value in assert_results.iteritems(): |
| 187 results.AssertHasPageSpecificScalarValue(name, 'ms', value) |
| OLD | NEW |