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 |