| OLD | NEW |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 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 from telemetry import decorators | 5 from telemetry import decorators |
| 6 from telemetry.internal.results import page_test_results | |
| 7 from telemetry.page import page as page_module | |
| 8 from telemetry.testing import options_for_unittests | 6 from telemetry.testing import options_for_unittests |
| 9 from telemetry.testing import page_test_test_case | 7 from telemetry.testing import page_test_test_case |
| 10 from telemetry.timeline import model as model_module | |
| 11 from telemetry.util import wpr_modes | 8 from telemetry.util import wpr_modes |
| 12 | 9 |
| 13 from measurements import v8_gc_times | 10 from measurements import v8_gc_times |
| 14 | 11 |
| 15 | 12 |
| 16 class V8GCTimesTestPageHelper(object): | |
| 17 | |
| 18 def __init__(self, page_set): | |
| 19 self._page_set = page_set | |
| 20 self._model = model_module.TimelineModel() | |
| 21 self._renderer_process = self._model.GetOrCreateProcess(1) | |
| 22 self._renderer_thread = self._renderer_process.GetOrCreateThread(2) | |
| 23 self._renderer_thread.name = 'CrRendererMain' | |
| 24 | |
| 25 def AddEvent(self, category, name, thread_start, thread_duration, | |
| 26 args=None, wall_start=None, wall_duration=None): | |
| 27 wall_start = wall_start or thread_start | |
| 28 wall_duration = wall_duration or thread_duration | |
| 29 self._renderer_thread.BeginSlice(category, name, wall_start, thread_start, | |
| 30 args=args) | |
| 31 self._renderer_thread.EndSlice(wall_start + wall_duration, | |
| 32 thread_start + thread_duration) | |
| 33 | |
| 34 class MockV8GCTimesPage(page_module.Page): | |
| 35 | |
| 36 def __init__(self, page_set): | |
| 37 super(V8GCTimesTestPageHelper.MockV8GCTimesPage, self).__init__( | |
| 38 'file://blank.html', page_set, page_set.base_dir) | |
| 39 | |
| 40 def MeasureFakePage(self): | |
| 41 # Create a fake page and add it to the page set. | |
| 42 results = page_test_results.PageTestResults() | |
| 43 page = V8GCTimesTestPageHelper.MockV8GCTimesPage(self._page_set) | |
| 44 self._page_set.AddStory(page) | |
| 45 | |
| 46 # Pretend we're about to run the tests to silence lower level asserts. | |
| 47 results.WillRunPage(page) | |
| 48 | |
| 49 v8_gc_times_metric = v8_gc_times.V8GCTimes() | |
| 50 # pylint: disable=protected-access | |
| 51 v8_gc_times_metric._renderer_process = self._renderer_process | |
| 52 | |
| 53 # Finalize the timeline import. | |
| 54 self._model.FinalizeImport() | |
| 55 | |
| 56 # Measure the V8GCTimes metric and return the results | |
| 57 # pylint: disable=protected-access | |
| 58 v8_gc_times_metric._AddV8MetricsToResults(self._renderer_process, results) | |
| 59 results.DidRunPage(page) | |
| 60 return results | |
| 61 | |
| 62 | |
| 63 class V8GCTimesTests(page_test_test_case.PageTestTestCase): | 13 class V8GCTimesTests(page_test_test_case.PageTestTestCase): |
| 64 | 14 |
| 65 def setUp(self): | 15 def setUp(self): |
| 66 self._options = options_for_unittests.GetCopy() | 16 self._options = options_for_unittests.GetCopy() |
| 67 self._options.browser_options.wpr_mode = wpr_modes.WPR_OFF | 17 self._options.browser_options.wpr_mode = wpr_modes.WPR_OFF |
| 68 | 18 |
| 69 def testWithNoTraceEvents(self): | |
| 70 test_page_helper = V8GCTimesTestPageHelper( | |
| 71 self.CreateEmptyPageSet()) | |
| 72 | |
| 73 results = test_page_helper.MeasureFakePage() | |
| 74 self._AssertResultsEqual(_GetEmptyResults(), _ActualValues(results)) | |
| 75 | |
| 76 def testWithNoGarbageCollectionEvents(self): | |
| 77 test_page_helper = V8GCTimesTestPageHelper( | |
| 78 self.CreateEmptyPageSet()) | |
| 79 | |
| 80 test_page_helper.AddEvent('toplevel', 'PostMessage', | |
| 81 thread_start=0, thread_duration=14, wall_start=5, wall_duration=35) | |
| 82 | |
| 83 results = test_page_helper.MeasureFakePage() | |
| 84 expected = _GetEmptyResults() | |
| 85 expected['duration'] = ('ms', 35) | |
| 86 expected['cpu_time'] = ('ms', 14) | |
| 87 | |
| 88 self._AssertResultsEqual(expected, _ActualValues(results)) | |
| 89 | |
| 90 def testWithGarbageCollectionEvents(self): | |
| 91 test_page_helper = V8GCTimesTestPageHelper( | |
| 92 self.CreateEmptyPageSet()) | |
| 93 | |
| 94 test_page_helper.AddEvent('toplevel', 'PostMessage', | |
| 95 thread_start=0, thread_duration=57, wall_start=5, wall_duration=68) | |
| 96 test_page_helper.AddEvent('v8', 'V8.GCScavenger', 5, 4) | |
| 97 test_page_helper.AddEvent('v8', 'V8.GCScavenger', 15, 3) | |
| 98 test_page_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 23, 4) | |
| 99 test_page_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 34, 2) | |
| 100 test_page_helper.AddEvent('v8', 'V8.GCCompactor', 42, 4) | |
| 101 test_page_helper.AddEvent('v8', 'V8.GCCompactor', 52, 5) | |
| 102 | |
| 103 results = test_page_helper.MeasureFakePage() | |
| 104 expected = _GetEmptyResults() | |
| 105 expected['duration'] = ('ms', 68) | |
| 106 expected['cpu_time'] = ('ms', 57) | |
| 107 expected['v8_gc_incremental_marking'] = ('ms', 6.0) | |
| 108 expected['v8_gc_incremental_marking_average'] = ('ms', 3.0) | |
| 109 expected['v8_gc_incremental_marking_count'] = ('count', 2) | |
| 110 expected['v8_gc_incremental_marking_max'] = ('ms', 4.0) | |
| 111 expected['v8_gc_incremental_marking_outside_idle'] = ('ms', 6.0) | |
| 112 expected['v8_gc_scavenger'] = ('ms', 7.0) | |
| 113 expected['v8_gc_scavenger_average'] = ('ms', 3.5) | |
| 114 expected['v8_gc_scavenger_count'] = ('count', 2) | |
| 115 expected['v8_gc_scavenger_max'] = ('ms', 4.0) | |
| 116 expected['v8_gc_scavenger_outside_idle'] = ('ms', 7.0) | |
| 117 expected['v8_gc_mark_compactor'] = ('ms', 9.0) | |
| 118 expected['v8_gc_mark_compactor_average'] = ('ms', 4.5) | |
| 119 expected['v8_gc_mark_compactor_count'] = ('count', 2) | |
| 120 expected['v8_gc_mark_compactor_max'] = ('ms', 5.0) | |
| 121 expected['v8_gc_mark_compactor_outside_idle'] = ('ms', 9.0) | |
| 122 expected['v8_gc_total'] = ('ms', 22.0) | |
| 123 expected['v8_gc_total_outside_idle'] = ('ms', 22.0) | |
| 124 | |
| 125 self._AssertResultsEqual(expected, _ActualValues(results)) | |
| 126 | |
| 127 def testWithIdleTaskGarbageCollectionEvents(self): | |
| 128 test_page_helper = V8GCTimesTestPageHelper( | |
| 129 self.CreateEmptyPageSet()) | |
| 130 | |
| 131 test_page_helper.AddEvent('toplevel', 'PostMessage', | |
| 132 thread_start=0, thread_duration=57, wall_start=5, wall_duration=68) | |
| 133 | |
| 134 test_page_helper.AddEvent('v8', 'V8.GCScavenger', 5, 4) | |
| 135 test_page_helper.AddEvent('renderer.scheduler', | |
| 136 'SingleThreadIdleTaskRunner::RunTask', 15, 4, {'allotted_time_ms': 12}) | |
| 137 test_page_helper.AddEvent('v8', 'V8.GCScavenger', 15, 3) | |
| 138 | |
| 139 test_page_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 23, 4) | |
| 140 test_page_helper.AddEvent('renderer.scheduler', | |
| 141 'SingleThreadIdleTaskRunner::RunTask', 34, 3, {'allotted_time_ms': 12}) | |
| 142 test_page_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 34, 2) | |
| 143 | |
| 144 test_page_helper.AddEvent('v8', 'V8.GCCompactor', 42, 4) | |
| 145 test_page_helper.AddEvent('renderer.scheduler', | |
| 146 'SingleThreadIdleTaskRunner::RunTask', 52, 6, {'allotted_time_ms': 12}) | |
| 147 test_page_helper.AddEvent('v8', 'V8.GCCompactor', 52, 5) | |
| 148 | |
| 149 results = test_page_helper.MeasureFakePage() | |
| 150 expected = _GetEmptyResults() | |
| 151 expected['duration'] = ('ms', 68) | |
| 152 expected['cpu_time'] = ('ms', 57) | |
| 153 expected['v8_gc_incremental_marking'] = ('ms', 6.0) | |
| 154 expected['v8_gc_incremental_marking_average'] = ('ms', 3.0) | |
| 155 expected['v8_gc_incremental_marking_count'] = ('count', 2) | |
| 156 expected['v8_gc_incremental_marking_max'] = ('ms', 4.0) | |
| 157 expected['v8_gc_incremental_marking_outside_idle'] = ('ms', 4.0) | |
| 158 expected['v8_gc_incremental_marking_percentage_idle'] = \ | |
| 159 ('idle%', 100 * 2 / 6.0) | |
| 160 expected['v8_gc_scavenger'] = ('ms', 7.0) | |
| 161 expected['v8_gc_scavenger_average'] = ('ms', 3.5) | |
| 162 expected['v8_gc_scavenger_count'] = ('count', 2) | |
| 163 expected['v8_gc_scavenger_max'] = ('ms', 4.0) | |
| 164 expected['v8_gc_scavenger_outside_idle'] = ('ms', 4.0) | |
| 165 expected['v8_gc_scavenger_percentage_idle'] = ('idle%', 100 * 3 / 7.0) | |
| 166 expected['v8_gc_mark_compactor'] = ('ms', 9.0) | |
| 167 expected['v8_gc_mark_compactor_average'] = ('ms', 4.5) | |
| 168 expected['v8_gc_mark_compactor_count'] = ('count', 2) | |
| 169 expected['v8_gc_mark_compactor_max'] = ('ms', 5.0) | |
| 170 expected['v8_gc_mark_compactor_outside_idle'] = ('ms', 4.0) | |
| 171 expected['v8_gc_mark_compactor_percentage_idle'] = ('idle%', 100 * 5 / 9.0) | |
| 172 expected['v8_gc_total'] = ('ms', 22.0) | |
| 173 expected['v8_gc_total_outside_idle'] = ('ms', 12.0) | |
| 174 expected['v8_gc_total_percentage_idle'] = ('idle%', 100 * 10 / 22.0) | |
| 175 | |
| 176 self._AssertResultsEqual(expected, _ActualValues(results)) | |
| 177 | |
| 178 def testWithIdleTaskOverruns(self): | |
| 179 test_page_helper = V8GCTimesTestPageHelper( | |
| 180 self.CreateEmptyPageSet()) | |
| 181 | |
| 182 test_page_helper.AddEvent('toplevel', 'PostMessage', | |
| 183 thread_start=0, thread_duration=80, wall_start=5, wall_duration=92) | |
| 184 | |
| 185 test_page_helper.AddEvent('renderer.scheduler', | |
| 186 'SingleThreadIdleTaskRunner::RunTask', 15, 15, {'allotted_time_ms': 8}) | |
| 187 test_page_helper.AddEvent('v8', 'V8.GCScavenger', 15, 14) | |
| 188 | |
| 189 test_page_helper.AddEvent('renderer.scheduler', | |
| 190 'SingleThreadIdleTaskRunner::RunTask', 34, 15, {'allotted_time_ms': 6}) | |
| 191 test_page_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 34, 14) | |
| 192 | |
| 193 test_page_helper.AddEvent('renderer.scheduler', | |
| 194 'SingleThreadIdleTaskRunner::RunTask', 52, 23, {'allotted_time_ms': 9}) | |
| 195 test_page_helper.AddEvent('v8', 'V8.GCCompactor', 52, 22) | |
| 196 | |
| 197 results = test_page_helper.MeasureFakePage() | |
| 198 expected = _GetEmptyResults() | |
| 199 expected['duration'] = ('ms', 92) | |
| 200 expected['cpu_time'] = ('ms', 80) | |
| 201 expected['v8_gc_incremental_marking'] = ('ms', 14.0) | |
| 202 expected['v8_gc_incremental_marking_average'] = ('ms', 14.0) | |
| 203 expected['v8_gc_incremental_marking_count'] = ('count', 1) | |
| 204 expected['v8_gc_incremental_marking_max'] = ('ms', 14.0) | |
| 205 expected['v8_gc_incremental_marking_outside_idle'] = ('ms', 8.0) | |
| 206 expected['v8_gc_incremental_marking_idle_deadline_overrun'] = ('ms', 8.0) | |
| 207 expected['v8_gc_incremental_marking_percentage_idle'] = \ | |
| 208 ('idle%', 100 * 6 / 14.0) | |
| 209 expected['v8_gc_scavenger'] = ('ms', 14.0) | |
| 210 expected['v8_gc_scavenger_average'] = ('ms', 14.0) | |
| 211 expected['v8_gc_scavenger_count'] = ('count', 1) | |
| 212 expected['v8_gc_scavenger_max'] = ('ms', 14.0) | |
| 213 expected['v8_gc_scavenger_outside_idle'] = ('ms', 6.0) | |
| 214 expected['v8_gc_scavenger_idle_deadline_overrun'] = ('ms', 6.0) | |
| 215 expected['v8_gc_scavenger_percentage_idle'] = ('idle%', 100 * 8 / 14.0) | |
| 216 expected['v8_gc_mark_compactor'] = ('ms', 22.0) | |
| 217 expected['v8_gc_mark_compactor_average'] = ('ms', 22.0) | |
| 218 expected['v8_gc_mark_compactor_count'] = ('count', 1) | |
| 219 expected['v8_gc_mark_compactor_max'] = ('ms', 22.0) | |
| 220 expected['v8_gc_mark_compactor_outside_idle'] = ('ms', 13.0) | |
| 221 expected['v8_gc_mark_compactor_idle_deadline_overrun'] = ('ms', 13.0) | |
| 222 expected['v8_gc_mark_compactor_percentage_idle'] = ('idle%', 100 * 9 / 22.0) | |
| 223 expected['v8_gc_total'] = ('ms', 50.0) | |
| 224 expected['v8_gc_total_outside_idle'] = ('ms', 27.0) | |
| 225 expected['v8_gc_total_idle_deadline_overrun'] = ('ms', 27.0) | |
| 226 expected['v8_gc_total_percentage_idle'] = ('idle%', 100 * 23 / 50.0) | |
| 227 | |
| 228 self._AssertResultsEqual(expected, _ActualValues(results)) | |
| 229 | |
| 230 def testWithIdleTaskWallDurationOverruns(self): | |
| 231 test_page_helper = V8GCTimesTestPageHelper( | |
| 232 self.CreateEmptyPageSet()) | |
| 233 | |
| 234 test_page_helper.AddEvent('toplevel', 'PostMessage', | |
| 235 thread_start=0, thread_duration=80, wall_start=5, wall_duration=92) | |
| 236 | |
| 237 test_page_helper.AddEvent('renderer.scheduler', | |
| 238 'SingleThreadIdleTaskRunner::RunTask', 15, 15, {'allotted_time_ms': 8}) | |
| 239 test_page_helper.AddEvent('v8', 'V8.GCScavenger', | |
| 240 thread_start=15, thread_duration=4, wall_start=15, wall_duration=14) | |
| 241 | |
| 242 results = test_page_helper.MeasureFakePage() | |
| 243 expected = _GetEmptyResults() | |
| 244 expected['duration'] = ('ms', 92) | |
| 245 expected['cpu_time'] = ('ms', 80) | |
| 246 expected['v8_gc_scavenger'] = ('ms', 4.0) | |
| 247 expected['v8_gc_scavenger_average'] = ('ms', 4.0) | |
| 248 expected['v8_gc_scavenger_count'] = ('count', 1) | |
| 249 expected['v8_gc_scavenger_max'] = ('ms', 4.0) | |
| 250 expected_outside_idle = 4.0 - (4.0 * 8 / 14) | |
| 251 expected['v8_gc_scavenger_outside_idle'] = ('ms', expected_outside_idle) | |
| 252 expected['v8_gc_scavenger_idle_deadline_overrun'] = ('ms', 6.0) | |
| 253 expected['v8_gc_scavenger_percentage_idle'] = \ | |
| 254 ('idle%', 100 * (4.0 - expected_outside_idle) / 4.0) | |
| 255 expected['v8_gc_total'] = expected['v8_gc_scavenger'] | |
| 256 expected['v8_gc_total_outside_idle'] = \ | |
| 257 expected['v8_gc_scavenger_outside_idle'] | |
| 258 expected['v8_gc_total_idle_deadline_overrun'] = \ | |
| 259 expected['v8_gc_scavenger_idle_deadline_overrun'] | |
| 260 expected['v8_gc_total_percentage_idle'] = \ | |
| 261 expected['v8_gc_scavenger_percentage_idle'] | |
| 262 | |
| 263 self._AssertResultsEqual(expected, _ActualValues(results)) | |
| 264 | |
| 265 def _AssertResultsEqual(self, expected, actual): | |
| 266 for key in expected.iterkeys(): | |
| 267 self.assertIn(key, actual.keys()) | |
| 268 self.assertEqual(expected[key], actual[key], | |
| 269 'Result for [' + key + '] - expected ' + str(expected[key]) + | |
| 270 ' but got ' + str(actual[key])) | |
| 271 | |
| 272 @decorators.Disabled('win') # crbug.com/416502 | 19 @decorators.Disabled('win') # crbug.com/416502 |
| 273 def testCleanUpTrace(self): | 20 def testCleanUpTrace(self): |
| 274 self.TestTracingCleanedUp(v8_gc_times.V8GCTimes, self._options) | 21 self.TestTracingCleanedUp(v8_gc_times.V8GCTimes, self._options) |
| 275 | |
| 276 | |
| 277 def _ActualValues(results): | |
| 278 return dict(list( | |
| 279 (v.name, (v.units, v.value)) | |
| 280 for v in results.all_page_specific_values | |
| 281 )) | |
| 282 | |
| 283 | |
| 284 def _GetEmptyResults(): | |
| 285 return {'cpu_time': ('ms', 0.0), | |
| 286 'duration': ('ms', 0.0), | |
| 287 'v8_gc_incremental_marking': ('ms', 0.0), | |
| 288 'v8_gc_incremental_marking_average': ('ms', 0.0), | |
| 289 'v8_gc_incremental_marking_count': ('count', 0), | |
| 290 'v8_gc_incremental_marking_max': ('ms', 0.0), | |
| 291 'v8_gc_incremental_marking_idle_deadline_overrun': ('ms', 0.0), | |
| 292 'v8_gc_incremental_marking_outside_idle': ('ms', 0.0), | |
| 293 'v8_gc_incremental_marking_percentage_idle': ('idle%', 0.0), | |
| 294 'v8_gc_mark_compactor': ('ms', 0.0), | |
| 295 'v8_gc_mark_compactor_average': ('ms', 0.0), | |
| 296 'v8_gc_mark_compactor_count': ('count', 0), | |
| 297 'v8_gc_mark_compactor_max': ('ms', 0.0), | |
| 298 'v8_gc_mark_compactor_idle_deadline_overrun': ('ms', 0.0), | |
| 299 'v8_gc_mark_compactor_outside_idle': ('ms', 0.0), | |
| 300 'v8_gc_mark_compactor_percentage_idle': ('idle%', 0.0), | |
| 301 'v8_gc_scavenger': ('ms', 0.0), | |
| 302 'v8_gc_scavenger_average': ('ms', 0.0), | |
| 303 'v8_gc_scavenger_count': ('count', 0), | |
| 304 'v8_gc_scavenger_max': ('ms', 0.0), | |
| 305 'v8_gc_scavenger_idle_deadline_overrun': ('ms', 0.0), | |
| 306 'v8_gc_scavenger_outside_idle': ('ms', 0.0), | |
| 307 'v8_gc_scavenger_percentage_idle': ('idle%', 0.0), | |
| 308 'v8_gc_total': ('ms', 0.0), | |
| 309 'v8_gc_total_idle_deadline_overrun': ('ms', 0.0), | |
| 310 'v8_gc_total_outside_idle': ('ms', 0.0)} | |
| OLD | NEW |