• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2017 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
5import os
6
7from autotest_lib.client.common_lib import error
8from autotest_lib.client.cros.input_playback import input_playback
9
10_KEYBOARD = 'keyboard'
11_KEY_FILENAME = 'keyboard_%s'
12
13class Keyboard(object):
14    """An emulated keyboard device used for UI automation."""
15
16    def __init__(self):
17        """Prepare an emulated keyboard device."""
18        self.dirname = os.path.dirname(__file__)
19        # Create an emulated keyboard device.
20        self.keyboard = input_playback.InputPlayback()
21        self.keyboard.emulate(input_type=_KEYBOARD)
22        self.keyboard.find_connected_inputs()
23
24    def press_key(self, key):
25        """Replay the recorded key events if exists.
26
27        @param key: the target key name, e.g. f1, f2, tab or combination of keys
28                    'alt+shift+i', 'ctrl+f5', etc.
29
30        """
31        event_file = os.path.join(self.dirname, _KEY_FILENAME % key)
32        if not os.path.exists(event_file):
33            raise error.TestError('No such key file keyboard_%s in %s'
34                                  % (key, self.dirname))
35        self.keyboard.blocking_playback(filepath=event_file,
36                                        input_type=_KEYBOARD)
37
38    def playback(self, event_file):
39        """Replay the specified key events file.
40
41        @param event_file: the filename of the key events
42
43        """
44        self.keyboard.blocking_playback(filepath=event_file,
45                                        input_type=_KEYBOARD)
46
47    def close(self):
48        """Clean up the files/handles created in the class."""
49        if self.keyboard:
50            self.keyboard.close()
51            self.keyboard = None
52
53    def __enter__(self):
54        """Allow usage in 'with' statements."""
55        return self
56
57    def __exit__(self, exc_type, exc_val, exc_tb):
58        """Release resources on completion of a 'with' statement."""
59        self.close()
60