aboutsummaryrefslogtreecommitdiff
path: root/catapult/telemetry/telemetry/web_perf/smooth_gesture_util_unittest.py
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/telemetry/telemetry/web_perf/smooth_gesture_util_unittest.py')
-rw-r--r--catapult/telemetry/telemetry/web_perf/smooth_gesture_util_unittest.py157
1 files changed, 157 insertions, 0 deletions
diff --git a/catapult/telemetry/telemetry/web_perf/smooth_gesture_util_unittest.py b/catapult/telemetry/telemetry/web_perf/smooth_gesture_util_unittest.py
new file mode 100644
index 00000000..07bf4fde
--- /dev/null
+++ b/catapult/telemetry/telemetry/web_perf/smooth_gesture_util_unittest.py
@@ -0,0 +1,157 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import time
+import unittest
+
+from telemetry import decorators
+from telemetry.page import page as page_module
+from telemetry.page import legacy_page_test
+from telemetry.testing import page_test_test_case
+from telemetry.timeline import async_slice
+from telemetry.timeline import model as model_module
+from telemetry.timeline import tracing_config
+from telemetry.web_perf import smooth_gesture_util as sg_util
+from telemetry.web_perf import timeline_interaction_record as tir_module
+
+
+class SmoothGestureUtilTest(unittest.TestCase):
+ def testGetAdjustedInteractionIfContainGesture(self):
+ model = model_module.TimelineModel()
+ renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2)
+ renderer_main.name = 'CrRendererMain'
+
+ # [ X ] [ Y ]
+ # [ sub_async_slice_X ]
+ # [ record_1]
+ # [ record_6]
+ # [ record_2 ] [ record_3 ]
+ # [ record_4 ]
+ # [ record_5 ]
+ #
+ # Note: X and Y are async slice with name
+ # SyntheticGestureController::running
+
+ async_slice_X = async_slice.AsyncSlice(
+ 'X', 'SyntheticGestureController::running', 10, duration=20,
+ start_thread=renderer_main, end_thread=renderer_main)
+
+ sub_async_slice_X = async_slice.AsyncSlice(
+ 'X', 'SyntheticGestureController::running', 10, duration=20,
+ start_thread=renderer_main, end_thread=renderer_main)
+ sub_async_slice_X.parent_slice = async_slice_X
+ async_slice_X.AddSubSlice(sub_async_slice_X)
+
+ async_slice_Y = async_slice.AsyncSlice(
+ 'X', 'SyntheticGestureController::running', 60, duration=20,
+ start_thread=renderer_main, end_thread=renderer_main)
+
+ renderer_main.AddAsyncSlice(async_slice_X)
+ renderer_main.AddAsyncSlice(async_slice_Y)
+
+ model.FinalizeImport(shift_world_to_zero=False)
+
+ record_1 = tir_module.TimelineInteractionRecord('Gesture_included', 15, 25)
+ record_2 = tir_module.TimelineInteractionRecord(
+ 'Gesture_overlapped_left', 5, 25)
+ record_3 = tir_module.TimelineInteractionRecord(
+ 'Gesture_overlapped_right', 25, 35)
+ record_4 = tir_module.TimelineInteractionRecord(
+ 'Gesture_containing', 5, 35)
+ record_5 = tir_module.TimelineInteractionRecord(
+ 'Gesture_non_overlapped', 35, 45)
+ record_6 = tir_module.TimelineInteractionRecord('Action_included', 15, 25)
+
+ adjusted_record_1 = sg_util.GetAdjustedInteractionIfContainGesture(
+ model, record_1)
+ self.assertEquals(adjusted_record_1.start, 10)
+ self.assertEquals(adjusted_record_1.end, 30)
+ self.assertTrue(adjusted_record_1 is not record_1)
+
+ adjusted_record_2 = sg_util.GetAdjustedInteractionIfContainGesture(
+ model, record_2)
+ self.assertEquals(adjusted_record_2.start, 10)
+ self.assertEquals(adjusted_record_2.end, 30)
+
+ adjusted_record_3 = sg_util.GetAdjustedInteractionIfContainGesture(
+ model, record_3)
+ self.assertEquals(adjusted_record_3.start, 10)
+ self.assertEquals(adjusted_record_3.end, 30)
+
+ adjusted_record_4 = sg_util.GetAdjustedInteractionIfContainGesture(
+ model, record_4)
+ self.assertEquals(adjusted_record_4.start, 10)
+ self.assertEquals(adjusted_record_4.end, 30)
+
+ adjusted_record_5 = sg_util.GetAdjustedInteractionIfContainGesture(
+ model, record_5)
+ self.assertEquals(adjusted_record_5.start, 35)
+ self.assertEquals(adjusted_record_5.end, 45)
+ self.assertTrue(adjusted_record_5 is not record_5)
+
+ adjusted_record_6 = sg_util.GetAdjustedInteractionIfContainGesture(
+ model, record_6)
+ self.assertEquals(adjusted_record_6.start, 15)
+ self.assertEquals(adjusted_record_6.end, 25)
+ self.assertTrue(adjusted_record_6 is not record_6)
+
+
+class ScrollingPage(page_module.Page):
+ def __init__(self, url, page_set, base_dir):
+ super(ScrollingPage, self).__init__(url, page_set, base_dir)
+
+ def RunPageInteractions(self, action_runner):
+ with action_runner.CreateGestureInteraction('ScrollAction'):
+ # Add 0.5s gap between when Gesture records are issued to when we actually
+ # scroll the page.
+ time.sleep(0.5)
+ action_runner.ScrollPage()
+ time.sleep(0.5)
+
+
+class SmoothGestureTest(page_test_test_case.PageTestTestCase):
+
+ @decorators.Disabled('chromeos') # crbug.com/483212
+ @decorators.Isolated # Needed because of py_trace_event
+ def testSmoothGestureAdjusted(self):
+ ps = self.CreateEmptyPageSet()
+ ps.AddStory(ScrollingPage(
+ 'file://scrollable_page.html', ps, base_dir=ps.base_dir))
+ models = []
+ tab_ids = []
+ class ScrollingGestureTestMeasurement(legacy_page_test.LegacyPageTest):
+ def __init__(self):
+ # pylint: disable=bad-super-call
+ super(ScrollingGestureTestMeasurement, self).__init__()
+
+ def WillNavigateToPage(self, page, tab):
+ del page # unused
+ config = tracing_config.TracingConfig()
+ config.enable_chrome_trace = True
+ tab.browser.platform.tracing_controller.StartTracing(config)
+
+ def ValidateAndMeasurePage(self, page, tab, results):
+ del page, results # unused
+ models.append(model_module.TimelineModel(
+ tab.browser.platform.tracing_controller.StopTracing()))
+ tab_ids.append(tab.id)
+
+ self.RunMeasurement(ScrollingGestureTestMeasurement(), ps)
+ timeline_model = models[0]
+ renderer_thread = timeline_model.GetRendererThreadFromTabId(
+ tab_ids[0])
+ smooth_record = None
+ for e in renderer_thread.async_slices:
+ if tir_module.IsTimelineInteractionRecord(e.name):
+ smooth_record = tir_module.TimelineInteractionRecord.FromAsyncEvent(e)
+ self.assertIsNotNone(smooth_record)
+ adjusted_smooth_gesture = (
+ sg_util.GetAdjustedInteractionIfContainGesture(
+ timeline_model, smooth_record))
+ # Test that the scroll gesture starts at at least 500ms after the start of
+ # the interaction record and ends at at least 500ms before the end of
+ # interaction record.
+ self.assertLessEqual(
+ 500, adjusted_smooth_gesture.start - smooth_record.start)
+ self.assertLessEqual(
+ 500, smooth_record.end - adjusted_smooth_gesture.end)