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 17 matching lines...) Expand all Loading... |
28 def AssertHasPageSpecificScalarValue(self, name, units, expected_value): | 28 def AssertHasPageSpecificScalarValue(self, name, units, expected_value): |
29 value = self.GetPageSpecificValueNamed(name) | 29 value = self.GetPageSpecificValueNamed(name) |
30 self.test.assertEquals(units, value.units) | 30 self.test.assertEquals(units, value.units) |
31 self.test.assertTrue(isinstance(value, scalar.ScalarValue)) | 31 self.test.assertTrue(isinstance(value, scalar.ScalarValue)) |
32 self.test.assertEquals(expected_value, value.value) | 32 self.test.assertEquals(expected_value, value.value) |
33 | 33 |
34 def __str__(self): | 34 def __str__(self): |
35 return '\n'.join([repr(x) for x in self.all_page_specific_values]) | 35 return '\n'.join([repr(x) for x in self.all_page_specific_values]) |
36 | 36 |
37 class LoadTimesTimelineMetric(unittest.TestCase): | 37 class LoadTimesTimelineMetric(unittest.TestCase): |
38 def GetResultsForModel(self, metric, model): | 38 def GetResults(self, metric): |
39 metric.model = model | |
40 results = TestPageMeasurementResults(self) | 39 results = TestPageMeasurementResults(self) |
41 tab = None | 40 tab = None |
42 metric.AddResults(tab, results) | 41 metric.AddResults(tab, results) |
43 return results | 42 return results |
44 | 43 |
45 def testSanitizing(self): | 44 def testSanitizing(self): |
46 model = model_module.TimelineModel() | 45 model = model_module.TimelineModel() |
47 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) | 46 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) |
48 renderer_main.name = 'CrRendererMain' | 47 renderer_main.name = 'CrRendererMain' |
49 | 48 |
50 # [ X ] | 49 # [ X ] |
51 # [ Y ] | 50 # [ Y ] |
52 renderer_main.BeginSlice('cat1', 'x.y', 10, 0) | 51 renderer_main.BeginSlice('cat1', 'x.y', 10, 0) |
53 renderer_main.EndSlice(20, 20) | 52 renderer_main.EndSlice(20, 20) |
54 model.FinalizeImport() | 53 model.FinalizeImport() |
55 | 54 |
56 metric = timeline.LoadTimesTimelineMetric() | 55 metric = timeline.LoadTimesTimelineMetric(model, renderer_main.parent) |
57 metric.renderer_process = renderer_main.parent | 56 results = self.GetResults(metric) |
58 results = self.GetResultsForModel(metric, model) | |
59 results.AssertHasPageSpecificScalarValue( | 57 results.AssertHasPageSpecificScalarValue( |
60 'CrRendererMain|x_y', 'ms', 10) | 58 'CrRendererMain|x_y', 'ms', 10) |
61 results.AssertHasPageSpecificScalarValue( | 59 results.AssertHasPageSpecificScalarValue( |
62 'CrRendererMain|x_y_max', 'ms', 10) | 60 'CrRendererMain|x_y_max', 'ms', 10) |
63 results.AssertHasPageSpecificScalarValue( | 61 results.AssertHasPageSpecificScalarValue( |
64 'CrRendererMain|x_y_avg', 'ms', 10) | 62 'CrRendererMain|x_y_avg', 'ms', 10) |
65 | 63 |
66 def testCounterSanitizing(self): | 64 def testCounterSanitizing(self): |
67 model = model_module.TimelineModel() | 65 model = model_module.TimelineModel() |
68 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) | 66 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) |
69 renderer_main.name = 'CrRendererMain' | 67 renderer_main.name = 'CrRendererMain' |
70 | 68 |
71 x_counter = renderer_main.parent.GetOrCreateCounter('cat', 'x.y') | 69 x_counter = renderer_main.parent.GetOrCreateCounter('cat', 'x.y') |
72 x_counter.samples += [1, 2] | 70 x_counter.samples += [1, 2] |
73 x_counter.series_names += ['a'] | 71 x_counter.series_names += ['a'] |
74 x_counter.timestamps += [0, 1] | 72 x_counter.timestamps += [0, 1] |
75 model.FinalizeImport() | 73 model.FinalizeImport() |
76 | 74 |
77 metric = timeline.LoadTimesTimelineMetric() | 75 metric = timeline.LoadTimesTimelineMetric(model, renderer_main.parent) |
78 metric.renderer_process = renderer_main.parent | 76 results = self.GetResults(metric) |
79 results = self.GetResultsForModel(metric, model) | |
80 results.AssertHasPageSpecificScalarValue( | 77 results.AssertHasPageSpecificScalarValue( |
81 'cat_x_y', 'count', 3) | 78 'cat_x_y', 'count', 3) |
82 results.AssertHasPageSpecificScalarValue( | 79 results.AssertHasPageSpecificScalarValue( |
83 'cat_x_y_avg', 'count', 1.5) | 80 'cat_x_y_avg', 'count', 1.5) |
84 | 81 |
85 | 82 |
86 class ThreadTimesTimelineMetricUnittest(unittest.TestCase): | 83 class ThreadTimesTimelineMetricUnittest(unittest.TestCase): |
87 def GetResultsForModel(self, metric, model): | 84 def GetResults(self, metric): |
88 metric.model = model | |
89 results = TestPageMeasurementResults(self) | 85 results = TestPageMeasurementResults(self) |
90 tab = None | 86 tab = None |
91 metric.AddResults(tab, results) | 87 metric.AddResults(tab, results) |
92 return results | 88 return results |
93 | 89 |
94 def GetActionRange(self, start, end): | 90 def GetActionRange(self, start, end): |
95 action_range = bounds.Bounds() | 91 action_range = bounds.Bounds() |
96 action_range.AddValue(start) | 92 action_range.AddValue(start) |
97 action_range.AddValue(end) | 93 action_range.AddValue(end) |
98 return action_range | 94 return action_range |
99 | 95 |
100 def testResults(self): | 96 def testResults(self): |
101 model = model_module.TimelineModel() | 97 model = model_module.TimelineModel() |
102 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) | 98 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) |
103 renderer_main.name = 'CrRendererMain' | 99 renderer_main.name = 'CrRendererMain' |
104 | 100 |
105 metric = timeline.ThreadTimesTimelineMetric() | 101 metric = timeline.ThreadTimesTimelineMetric(model, renderer_main.parent, |
106 metric._action_ranges = [self.GetActionRange(1, 2)] | 102 [self.GetActionRange(1, 2)]) |
107 metric.details_to_report = timeline.ReportMainThreadOnly | 103 metric.details_to_report = timeline.ReportMainThreadOnly |
108 results = self.GetResultsForModel(metric, model) | 104 results = self.GetResults(metric) |
109 | 105 |
110 # Test that all result thread categories exist | 106 # Test that all result thread categories exist |
111 for name in timeline.TimelineThreadCategories.values(): | 107 for name in timeline.TimelineThreadCategories.values(): |
112 results.GetPageSpecificValueNamed(timeline.ThreadCpuTimeResultName(name)) | 108 results.GetPageSpecificValueNamed(timeline.ThreadCpuTimeResultName(name)) |
113 | 109 |
114 def testBasic(self): | 110 def testBasic(self): |
115 model = model_module.TimelineModel() | 111 model = model_module.TimelineModel() |
116 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) | 112 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) |
117 renderer_main.name = 'CrRendererMain' | 113 renderer_main.name = 'CrRendererMain' |
118 | 114 |
119 # Create two frame swaps (Results times should be divided by two) | 115 # Create two frame swaps (Results times should be divided by two) |
120 cc_main = model.GetOrCreateProcess(1).GetOrCreateThread(3) | 116 cc_main = model.GetOrCreateProcess(1).GetOrCreateThread(3) |
121 cc_main.name = 'Compositor' | 117 cc_main.name = 'Compositor' |
122 cc_main.BeginSlice('cc_cat', timeline.FrameTraceName, 10, 10) | 118 cc_main.BeginSlice('cc_cat', timeline.FrameTraceName, 10, 10) |
123 cc_main.EndSlice(11, 11) | 119 cc_main.EndSlice(11, 11) |
124 cc_main.BeginSlice('cc_cat', timeline.FrameTraceName, 12, 12) | 120 cc_main.BeginSlice('cc_cat', timeline.FrameTraceName, 12, 12) |
125 cc_main.EndSlice(13, 13) | 121 cc_main.EndSlice(13, 13) |
126 | 122 |
127 # [ X ] [ Z ] | 123 # [ X ] [ Z ] |
128 # [ Y ] | 124 # [ Y ] |
129 renderer_main.BeginSlice('cat1', 'X', 10, 0) | 125 renderer_main.BeginSlice('cat1', 'X', 10, 0) |
130 renderer_main.BeginSlice('cat2', 'Y', 15, 5) | 126 renderer_main.BeginSlice('cat2', 'Y', 15, 5) |
131 renderer_main.EndSlice(16, 5.5) | 127 renderer_main.EndSlice(16, 5.5) |
132 renderer_main.EndSlice(30, 19.5) | 128 renderer_main.EndSlice(30, 19.5) |
133 renderer_main.BeginSlice('cat1', 'Z', 31, 20) | 129 renderer_main.BeginSlice('cat1', 'Z', 31, 20) |
134 renderer_main.BeginSlice('cat1', 'Z', 33, 21) | 130 renderer_main.BeginSlice('cat1', 'Z', 33, 21) |
135 model.FinalizeImport() | 131 model.FinalizeImport() |
136 | 132 |
137 # Exclude 'Z' using an action-range. | 133 # Exclude 'Z' using an action-range. |
138 metric = timeline.ThreadTimesTimelineMetric() | 134 metric = timeline.ThreadTimesTimelineMetric( |
139 metric._action_ranges = [self.GetActionRange(10, 30)] | 135 model, renderer_main.parent, action_ranges=[self.GetActionRange(10, 30)]) |
140 metric.details_to_report = timeline.ReportMainThreadOnly | 136 metric.details_to_report = timeline.ReportMainThreadOnly |
141 results = self.GetResultsForModel(metric, model) | 137 results = self.GetResults(metric) |
142 | 138 |
143 # Test a couple specific results. | 139 # Test a couple specific results. |
144 assert_results = { | 140 assert_results = { |
145 timeline.ThreadCpuTimeResultName('renderer_main') : 9.75, | 141 timeline.ThreadCpuTimeResultName('renderer_main') : 9.75, |
146 timeline.ThreadDetailResultName('renderer_main','cat1') : 9.5, | 142 timeline.ThreadDetailResultName('renderer_main','cat1') : 9.5, |
147 timeline.ThreadDetailResultName('renderer_main','cat2') : 0.5, | 143 timeline.ThreadDetailResultName('renderer_main','cat2') : 0.5, |
148 timeline.ThreadDetailResultName('renderer_main','idle') : 0 | 144 timeline.ThreadDetailResultName('renderer_main','idle') : 0 |
149 } | 145 } |
150 for name, value in assert_results.iteritems(): | 146 for name, value in assert_results.iteritems(): |
151 results.AssertHasPageSpecificScalarValue(name, 'ms', value) | 147 results.AssertHasPageSpecificScalarValue(name, 'ms', value) |
(...skipping 13 matching lines...) Expand all Loading... |
165 # [Overhead] | 161 # [Overhead] |
166 overhead_category = timeline.OverheadTraceCategory | 162 overhead_category = timeline.OverheadTraceCategory |
167 overhead_name = timeline.OverheadTraceName | 163 overhead_name = timeline.OverheadTraceName |
168 renderer_main.BeginSlice('cat1', 'X', 10, 0) | 164 renderer_main.BeginSlice('cat1', 'X', 10, 0) |
169 renderer_main.BeginSlice(overhead_category, overhead_name, 15, 5) | 165 renderer_main.BeginSlice(overhead_category, overhead_name, 15, 5) |
170 renderer_main.EndSlice(16, 6) | 166 renderer_main.EndSlice(16, 6) |
171 renderer_main.EndSlice(30, 10) | 167 renderer_main.EndSlice(30, 10) |
172 model.FinalizeImport() | 168 model.FinalizeImport() |
173 | 169 |
174 # Include everything in an action-range. | 170 # Include everything in an action-range. |
175 metric = timeline.ThreadTimesTimelineMetric() | 171 metric = timeline.ThreadTimesTimelineMetric( |
176 metric._action_ranges = [self.GetActionRange(10, 30)] | 172 model, renderer_main.parent, action_ranges=[self.GetActionRange(10, 30)]) |
177 metric.details_to_report = timeline.ReportMainThreadOnly | 173 metric.details_to_report = timeline.ReportMainThreadOnly |
178 results = self.GetResultsForModel(metric, model) | 174 results = self.GetResults(metric) |
179 | 175 |
180 # Test a couple specific results. | 176 # Test a couple specific results. |
181 assert_results = { | 177 assert_results = { |
182 timeline.ThreadCpuTimeResultName('renderer_main') : 9.0, | 178 timeline.ThreadCpuTimeResultName('renderer_main') : 9.0, |
183 } | 179 } |
184 for name, value in assert_results.iteritems(): | 180 for name, value in assert_results.iteritems(): |
185 results.AssertHasPageSpecificScalarValue(name, 'ms', value) | 181 results.AssertHasPageSpecificScalarValue(name, 'ms', value) |
OLD | NEW |