Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 import time | |
| 4 import unittest | 5 import unittest |
| 5 | 6 |
| 7 from measurements import smooth_gesture_util as sg_util | |
| 8 from telemetry.core.platform import tracing_category_filter | |
| 9 from telemetry.core.platform import tracing_options | |
| 10 from telemetry.page import page as page_module | |
| 11 from telemetry.page import page_test | |
| 12 from telemetry.timeline import async_slice | |
| 6 from telemetry.timeline import model as model_module | 13 from telemetry.timeline import model as model_module |
| 14 from telemetry.unittest import page_test_test_case | |
| 7 from telemetry.web_perf import timeline_interaction_record as tir_module | 15 from telemetry.web_perf import timeline_interaction_record as tir_module |
| 8 from measurements import smooth_gesture_util as sg_util | 16 |
| 9 | 17 |
| 10 class SmoothGestureUtilTest(unittest.TestCase): | 18 class SmoothGestureUtilTest(unittest.TestCase): |
| 11 def testGetAdjustedInteractionIfContainGesture(self): | 19 def testGetAdjustedInteractionIfContainGesture(self): |
| 12 model = model_module.TimelineModel() | 20 model = model_module.TimelineModel() |
| 13 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) | 21 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) |
| 14 renderer_main.name = 'CrRendererMain' | 22 renderer_main.name = 'CrRendererMain' |
| 15 | 23 |
| 16 # [ X ] [ Y ] | 24 # [ X ] [ Y ] |
|
ernstm
2014/08/20 22:13:35
Is the sub_async_slice_X missing here?
nednguyen
2014/08/21 16:35:03
Done.
| |
| 17 # [ record_1] | 25 # [ record_1] |
| 18 # [ record_6] | 26 # [ record_6] |
| 19 # [ record_2 ] [ record_3 ] | 27 # [ record_2 ] [ record_3 ] |
| 20 # [ record_4 ] | 28 # [ record_4 ] |
| 21 # [ record_5 ] | 29 # [ record_5 ] |
| 22 renderer_main.BeginSlice('X', 'SyntheticGestureController::running', 10, 0) | 30 # |
| 23 renderer_main.EndSlice(30, 30) | 31 # Note: X and Y are async slice with name |
| 24 renderer_main.BeginSlice('Y', 'SyntheticGestureController::running', 60, 0) | 32 # SyntheticGestureController::running |
| 25 renderer_main.EndSlice(80, 80) | 33 |
| 34 async_slice_X = async_slice.AsyncSlice( | |
| 35 'X', 'SyntheticGestureController::running', 10, duration=20, | |
| 36 start_thread=renderer_main, end_thread=renderer_main) | |
| 37 | |
| 38 sub_async_slice_X = async_slice.AsyncSlice( | |
| 39 'X', 'SyntheticGestureController::running', 10, duration=20, | |
| 40 start_thread=renderer_main, end_thread=renderer_main) | |
| 41 sub_async_slice_X.parent_slice = async_slice_X | |
| 42 async_slice_X.AddSubSlice(sub_async_slice_X) | |
| 43 | |
| 44 async_slice_Y = async_slice.AsyncSlice( | |
| 45 'X', 'SyntheticGestureController::running', 60, duration=20, | |
| 46 start_thread=renderer_main, end_thread=renderer_main) | |
| 47 | |
| 48 renderer_main.AddAsyncSlice(async_slice_X) | |
| 49 renderer_main.AddAsyncSlice(async_slice_Y) | |
| 26 | 50 |
| 27 model.FinalizeImport(shift_world_to_zero=False) | 51 model.FinalizeImport(shift_world_to_zero=False) |
| 28 | 52 |
| 29 record_1 = tir_module.TimelineInteractionRecord('Gesture_included', 15, 25) | 53 record_1 = tir_module.TimelineInteractionRecord('Gesture_included', 15, 25) |
| 30 record_2 = tir_module.TimelineInteractionRecord( | 54 record_2 = tir_module.TimelineInteractionRecord( |
| 31 'Gesture_overlapped_left', 5, 25) | 55 'Gesture_overlapped_left', 5, 25) |
| 32 record_3 = tir_module.TimelineInteractionRecord( | 56 record_3 = tir_module.TimelineInteractionRecord( |
| 33 'Gesture_overlapped_right', 25, 35) | 57 'Gesture_overlapped_right', 25, 35) |
| 34 record_4 = tir_module.TimelineInteractionRecord( | 58 record_4 = tir_module.TimelineInteractionRecord( |
| 35 'Gesture_containing', 5, 35) | 59 'Gesture_containing', 5, 35) |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 63 self.assertEquals(adjusted_record_5.start, 35) | 87 self.assertEquals(adjusted_record_5.start, 35) |
| 64 self.assertEquals(adjusted_record_5.end, 45) | 88 self.assertEquals(adjusted_record_5.end, 45) |
| 65 self.assertTrue(adjusted_record_5 is not record_5) | 89 self.assertTrue(adjusted_record_5 is not record_5) |
| 66 | 90 |
| 67 adjusted_record_6 = sg_util.GetAdjustedInteractionIfContainGesture( | 91 adjusted_record_6 = sg_util.GetAdjustedInteractionIfContainGesture( |
| 68 model, record_6) | 92 model, record_6) |
| 69 self.assertEquals(adjusted_record_6.start, 15) | 93 self.assertEquals(adjusted_record_6.start, 15) |
| 70 self.assertEquals(adjusted_record_6.end, 25) | 94 self.assertEquals(adjusted_record_6.end, 25) |
| 71 self.assertTrue(adjusted_record_6 is not record_6) | 95 self.assertTrue(adjusted_record_6 is not record_6) |
| 72 | 96 |
| 97 | |
| 98 class ScrollingPage(page_module.Page): | |
| 99 def __init__(self, url, page_set, base_dir): | |
| 100 super(ScrollingPage, self).__init__(url, page_set, base_dir) | |
| 101 | |
| 102 def RunSmoothness(self, action_runner): | |
| 103 interaction = action_runner.BeginGestureInteraction( | |
| 104 'ScrollAction', is_smooth=True) | |
| 105 # Add 0.5s gap between when Gesture records are issued to when we actually | |
| 106 # scroll the page. | |
| 107 time.sleep(0.5) | |
| 108 action_runner.ScrollPage() | |
| 109 time.sleep(0.5) | |
| 110 interaction.End() | |
| 111 | |
| 112 | |
| 113 class SmoothGestureTest(page_test_test_case.PageTestTestCase): | |
|
ernstm
2014/08/20 22:13:35
Should this be part of the smoke tests in tools/pe
nednguyen
2014/08/21 16:35:03
timeline_controller also use this SmoothGesture ut
| |
| 114 def testSmoothGestureAdjusted(self): | |
| 115 ps = self.CreateEmptyPageSet() | |
| 116 ps.AddPage(ScrollingPage( | |
| 117 'file://scrollable_page.html', ps, base_dir=ps.base_dir)) | |
| 118 models = [] | |
| 119 tab_ids = [] | |
| 120 class ScrollingGestureTestMeasurement(page_test.PageTest): | |
| 121 def __init__(self): | |
| 122 super(ScrollingGestureTestMeasurement, self).__init__( | |
| 123 'RunSmoothness', False) | |
| 124 | |
| 125 def WillRunActions(self, _page, tab): | |
| 126 options = tracing_options.TracingOptions() | |
| 127 options.enable_chrome_trace = True | |
| 128 tab.browser.platform.tracing_controller.Start( | |
| 129 options, tracing_category_filter.TracingCategoryFilter()) | |
| 130 | |
| 131 def DidRunActions(self, _page, tab): | |
| 132 models.append(model_module.TimelineModel( | |
| 133 tab.browser.platform.tracing_controller.Stop())) | |
| 134 tab_ids.append(tab.id) | |
| 135 | |
| 136 self.RunMeasurement(ScrollingGestureTestMeasurement(), ps) | |
| 137 timeline_model = models[0] | |
| 138 renderer_thread = timeline_model.GetRendererThreadFromTabId( | |
| 139 tab_ids[0]) | |
| 140 smooth_record = None | |
| 141 for e in renderer_thread.async_slices: | |
| 142 if tir_module.IsTimelineInteractionRecord(e.name): | |
| 143 smooth_record = tir_module.TimelineInteractionRecord.FromAsyncEvent(e) | |
| 144 self.assertIsNotNone(smooth_record) | |
| 145 adjusted_smooth_gesture = ( | |
| 146 sg_util.GetAdjustedInteractionIfContainGesture( | |
| 147 timeline_model, smooth_record)) | |
| 148 # Test that the scroll gesture starts at at least 500ms after the start of | |
| 149 # the interaction record and ends at at least 500ms before the end of | |
| 150 # interaction record. | |
| 151 self.assertLessEqual( | |
| 152 500, adjusted_smooth_gesture.start - smooth_record.start) | |
| 153 self.assertLessEqual( | |
| 154 500, smooth_record.end - adjusted_smooth_gesture.end) | |
| OLD | NEW |