| # Copyright (c) 2014 The Chromium OS 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 os |
| import logging |
| |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.common_lib.cros import chrome |
| from autotest_lib.client.cros import touch_playback_test_base |
| |
| |
| class touch_MouseScroll(touch_playback_test_base.touch_playback_test_base): |
| """Plays back mouse scrolls and checks for correct page movement.""" |
| version = 1 |
| |
| _MOUSE_DESCRIPTION = 'amazon_mouse.prop' |
| _APPLE_MOUSE_DES = 'apple_mouse.prop' |
| _EXPECTED_VALUE_1 = 16 # Expected value of one scroll wheel turn. |
| _EXPECTED_DIRECTION = {'down': 1, 'up': -1, 'right': 1, 'left': -1} |
| _TOLLERANCE = 4 # Fast scroll should go at least X times slow scroll. |
| |
| |
| def _get_scroll_delta(self, name, expected_direction, scroll_vertical=True): |
| """Playback the given test and return the amount the page moved. |
| |
| @param name: name of test filename. |
| @param expected_direction: an integer that is + for down and - for up. |
| @param scroll_vertical: True for vertical scroll, |
| False for horizontal scroll. |
| |
| @raise: TestFail if scrolling did not occur in expected direction. |
| |
| """ |
| self._set_default_scroll_position(scroll_vertical) |
| self._wait_for_default_scroll_position(scroll_vertical) |
| self._playback(self._gest_file_path[name], touch_type='mouse') |
| self._wait_for_scroll_position_to_settle(scroll_vertical) |
| delta = self._get_scroll_position(scroll_vertical) - self._DEFAULT_SCROLL |
| logging.info('Test %s: saw scroll delta of %d. Expected direction %d.', |
| name, delta, expected_direction) |
| |
| if delta * expected_direction < 0: |
| raise error.TestFail('Scroll was in wrong direction! Delta ' |
| 'for %s was %d.' % (name, delta)) |
| return delta |
| |
| |
| def _verify_single_tick(self, direction, scroll_vertical=True): |
| """Verify that using the scroll wheel goes the right distance. |
| |
| Expects a file (playback gesture file) named direction + '_1'. |
| |
| @param direction: string indicating direction up, down, right and left. |
| @param scroll_vertical: scroll_vertical is True for vertical scroll |
| else False |
| |
| """ |
| name = direction + '_1' |
| expected_direction = self._EXPECTED_DIRECTION[direction] |
| expected_value = self._EXPECTED_VALUE_1 * expected_direction |
| delta = self._get_scroll_delta(name, expected_direction, scroll_vertical) |
| |
| if delta != expected_value: |
| raise error.TestFail('One tick scroll was wrong size: actual=%d, ' |
| 'expected=%d.' % (delta, expected_value)) |
| |
| |
| def _verify_fast_vs_slow(self, direction, scroll_vertical=True): |
| """Verify that fast scrolling goes farther than slow scrolling. |
| |
| Expects files (playback gesture file) named direction + '_slow' |
| and direction + '_fast'. |
| |
| @param direction: string indicating direction up, down, right and left. |
| @param scroll_vertical: True for vertical scroll, |
| False for horizontal scroll. |
| |
| """ |
| slow = direction + '_slow' |
| fast = direction + '_fast' |
| expected = self._EXPECTED_DIRECTION[direction] |
| slow_delta = self._get_scroll_delta(slow, expected, scroll_vertical) |
| fast_delta = self._get_scroll_delta(fast, expected, scroll_vertical) |
| |
| if abs(fast_delta) < self._TOLLERANCE * abs(slow_delta): |
| raise error.TestFail('Fast scroll should be much farther than ' |
| 'slow! (%s). %d vs. %d.' % |
| (direction, slow_delta, fast_delta)) |
| |
| |
| def run_once(self): |
| """Entry point of this test.""" |
| |
| # Link path for files to playback on DUT. |
| self._gest_file_path = {} |
| gestures_dir = os.path.join(self.bindir, 'gestures') |
| for filename in os.listdir(gestures_dir): |
| self._gest_file_path[filename] = os.path.join(gestures_dir, filename) |
| |
| with chrome.Chrome() as cr: |
| # Open test page. |
| cr.browser.SetHTTPServerDirectories(self.bindir) |
| self._tab = cr.browser.tabs[0] |
| self._tab.Navigate(cr.browser.http_server.UrlOf( |
| os.path.join(self.bindir, 'long_page.html'))) |
| self._tab.WaitForDocumentReadyStateToBeComplete() |
| |
| # Emulate mouse with vertical scroll feature. |
| mouse_file = os.path.join(self.bindir, self._MOUSE_DESCRIPTION) |
| self._emulate_mouse(property_file=mouse_file) |
| if not self._has_mouse: |
| raise error.TestError('No USB mouse found on this device.') |
| # In test page, position cursor to center. |
| self._blocking_playback(self._gest_file_path['center_cursor'], |
| touch_type='mouse') |
| |
| # Test vertical scrolling. |
| for direction in ['down', 'up']: |
| self._verify_single_tick(direction) |
| self._verify_fast_vs_slow(direction) |
| |
| # Emulate mouse with horizontal scroll feature. |
| apple_mouse_file = os.path.join(self.bindir, self._APPLE_MOUSE_DES) |
| self._emulate_mouse(property_file=apple_mouse_file) |
| if not self._has_mouse: |
| raise error.TestError('No USB mouse found on this device.') |
| |
| # Test horizontal scrolling. |
| for direction in ['right', 'left']: |
| self._verify_single_tick(direction, scroll_vertical=False) |
| self._verify_fast_vs_slow(direction, scroll_vertical=False) |