Home | History | Annotate | Download | only in touch_TapSettings
      1 # Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import itertools
      6 import logging
      7 import time
      8 
      9 from autotest_lib.client.common_lib import error
     10 from autotest_lib.client.common_lib.cros import chrome
     11 from autotest_lib.client.cros import touch_playback_test_base
     12 
     13 
     14 class touch_TapSettings(touch_playback_test_base.touch_playback_test_base):
     15     """Toggles tap-to-click and tap dragging settings to ensure correctness."""
     16     version = 1
     17 
     18     _TEST_TIMEOUT = 1  # Number of seconds the test will wait for a click.
     19     _MOUSE_DESCRIPTION = 'apple_mouse.prop'
     20     _CLICK_NAME = 'tap-click'
     21     _DRAG_NAME = 'tap-drag-right'
     22 
     23 
     24     def _check_for_click(self, expected):
     25         """Playback and check whether tap-to-click occurred.  Fail if needed.
     26 
     27         @param expected: True if clicking should happen, else False.
     28         @raises: TestFail if actual value does not match expected.
     29 
     30         """
     31         expected_count = 1 if expected else 0
     32         self._reload_page()
     33         self._playback(self._filepaths[self._CLICK_NAME])
     34         time.sleep(self._TEST_TIMEOUT)
     35         actual_count = int(self._tab.EvaluateJavaScript('clickCount'))
     36         if actual_count is not expected_count:
     37             raise error.TestFail('Expected clicks=%s, actual=%s.'
     38                                  % (expected_count, actual_count))
     39 
     40 
     41     def _check_for_drag(self, expected):
     42         """Playback and check whether tap dragging occurred.  Fail if needed.
     43 
     44         @param expected: True if dragging should happen, else False.
     45         @raises: TestFail if actual value does not match expected.
     46 
     47         """
     48         self._reload_page()
     49         self._wait_for_page_ready()
     50         self._blocking_playback(self._filepaths[self._DRAG_NAME])
     51         actual = self._tab.EvaluateJavaScript('movementOccurred')
     52         if actual is not expected:
     53             raise error.TestFail('Tap dragging movement was %s; expected %s.'
     54                                  % (actual, expected))
     55 
     56 
     57     def _is_testable(self):
     58         """Return True if test can run on this device, else False.
     59 
     60         @raises: TestError if host has no touchpad when it should.
     61 
     62         """
     63         # Raise error if no touchpad detected.
     64         if not self._has_touchpad:
     65             raise error.TestError('No touchpad found on this device!')
     66 
     67         # Check if playback files are available on DUT to run test.
     68         self._filepaths = self._find_test_files(
     69                 'touchpad', [self._CLICK_NAME, self._DRAG_NAME])
     70         if not self._filepaths:
     71             logging.info('Missing gesture files, Aborting test.')
     72             return False
     73 
     74         return True
     75 
     76 
     77     def run_once(self):
     78         """Entry point of this test."""
     79         if not self._is_testable():
     80             return
     81 
     82         # Log in and start test.
     83         with chrome.Chrome(autotest_ext=True) as cr:
     84             # Setup.
     85             self._set_autotest_ext(cr.autotest_ext)
     86             self._open_test_page(cr)
     87             self._emulate_mouse()
     88             self._center_cursor()
     89 
     90             # Check default setting values.
     91             logging.info('Checking for default setting values.')
     92             self._check_for_click(True)
     93             self._check_for_drag(False)
     94 
     95             # Toggle settings in all combinations and check.
     96             options = [True, False]
     97             option_pairs = itertools.product(options, options)
     98             for (click_value, drag_value) in option_pairs:
     99                 self._center_cursor()
    100                 self._set_tap_to_click(click_value)
    101                 self._set_tap_dragging(drag_value)
    102                 self._check_for_click(click_value)
    103                 self._check_for_drag(click_value and drag_value)
    104