OLD | NEW |
1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 # Copyright (c) 2010 The Chromium OS 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 | 4 |
5 import os, random, time | 5 import os, random, time |
6 from autotest_lib.client.bin import site_login, test | 6 from autotest_lib.client.bin import site_ui_test, site_utils, test |
7 from autotest_lib.client.common_lib import error | 7 from autotest_lib.client.common_lib import error |
8 | 8 |
9 class desktopui_WindowManagerHotkeys(test.test): | 9 class desktopui_WindowManagerHotkeys(site_ui_test.UITest): |
10 version = 1 | 10 version = 1 |
11 | 11 |
12 def setup(self): | |
13 site_login.setup_autox(self) | |
14 | |
15 # TODO: This would be useful for other tests; put it somewhere else. | |
16 def __poll_for_condition( | |
17 self, condition, desc='', timeout=10, sleep_interval=0.1): | |
18 """Poll until a condition becomes true. | |
19 | |
20 condition: function taking no args and returning bool | |
21 desc: str description of the condition | |
22 timeout: maximum number of seconds to wait | |
23 sleep_interval: time to sleep between polls | |
24 | |
25 Raises: | |
26 error.TestFail: if the condition doesn't become true | |
27 """ | |
28 start_time = time.time() | |
29 while True: | |
30 if condition(): | |
31 return | |
32 if time.time() + sleep_interval - start_time > timeout: | |
33 raise error.TestFail( | |
34 'Timed out waiting for condition: %s' % desc) | |
35 time.sleep(sleep_interval) | |
36 | |
37 def run_once(self): | 12 def run_once(self): |
38 import autox | 13 import autox |
39 | 14 |
40 # TODO: This should be abstracted out. | |
41 if not site_login.logged_in(): | |
42 if not site_login.attempt_login(self, 'autox_script.json'): | |
43 raise error.TestError('Could not log in') | |
44 if not site_login.wait_for_window_manager(): | |
45 raise error.TestError('Window manager didn\'t start') | |
46 # TODO: This is awful. We need someone (Chrome, the WM, etc.) to | |
47 # announce when login is "done" -- that is, the initial Chrome | |
48 # window isn't going to pop onscreen in the middle of the test. | |
49 # For now, we just sleep a really long time. | |
50 time.sleep(20) | |
51 | |
52 # TODO: Set these in a single, standard place for all tests. | 15 # TODO: Set these in a single, standard place for all tests. |
53 os.environ['DISPLAY'] = ':0' | 16 os.environ['DISPLAY'] = ':0' |
54 os.environ['XAUTHORITY'] = '/home/chronos/.Xauthority' | 17 os.environ['XAUTHORITY'] = '/home/chronos/.Xauthority' |
55 ax = autox.AutoX() | 18 ax = autox.AutoX() |
56 | 19 |
57 # Start a terminal and wait for it to get the focus. | 20 # Start a terminal and wait for it to get the focus. |
58 # TODO: This is a bit of a hack. To watch for the terminal getting | 21 # TODO: This is a bit of a hack. To watch for the terminal getting |
59 # the focus, we create a new window, wait for it to get the focus, | 22 # the focus, we create a new window, wait for it to get the focus, |
60 # and then launch the terminal and wait for our window to lose the | 23 # and then launch the terminal and wait for our window to lose the |
61 # focus (AutoX isn't notified about focus events on the terminal | 24 # focus (AutoX isn't notified about focus events on the terminal |
62 # window itself). It's maybe cleaner to add a method to AutoX to | 25 # window itself). It's maybe cleaner to add a method to AutoX to |
63 # get the currently-focused window and then just poll that after | 26 # get the currently-focused window and then just poll that after |
64 # starting the terminal until it changes. | 27 # starting the terminal until it changes. |
65 win = ax.create_and_map_window() | 28 win = ax.create_and_map_window() |
66 info = ax.get_window_info(win.id) | 29 info = ax.get_window_info(win.id) |
67 ax.await_condition( | 30 ax.await_condition( |
68 lambda: info.is_focused, | 31 lambda: info.is_focused, |
69 desc='Waiting for window to get focus') | 32 desc='Waiting for window to get focus') |
70 ax.send_hotkey('Ctrl-Alt-t') | 33 ax.send_hotkey('Ctrl-Alt-t') |
71 ax.await_condition( | 34 ax.await_condition( |
72 lambda: not info.is_focused, | 35 lambda: not info.is_focused, |
73 desc='Waiting for window to lose focus') | 36 desc='Waiting for window to lose focus') |
74 | 37 |
75 # Type in it to create a file in /tmp and exit. | 38 # Type in it to create a file in /tmp and exit. |
76 temp_filename = '/tmp/desktopup_WindowManagerHotkeys_%d' % time.time() | 39 temp_filename = '/tmp/desktopup_WindowManagerHotkeys_%d' % time.time() |
77 ax.send_text('touch %s\n' % temp_filename) | 40 ax.send_text('touch %s\n' % temp_filename) |
78 ax.send_text('exit\n') | 41 ax.send_text('exit\n') |
79 self.__poll_for_condition( | 42 site_utils.poll_for_condition( |
80 lambda: os.access(temp_filename, os.F_OK), | 43 lambda: os.access(temp_filename, os.F_OK), |
81 desc='Waiting for %s to be created from terminal' % temp_filename) | 44 error.TestFail( |
| 45 'Waiting for %s to be created from terminal' % temp_filename)) |
82 os.remove(temp_filename) | 46 os.remove(temp_filename) |
83 | 47 |
84 # Press the Print Screen key and check that a screenshot is written. | 48 # Press the Print Screen key and check that a screenshot is written. |
85 screenshot_filename = '/home/chronos/user/screenshot.png' | 49 screenshot_filename = '/home/chronos/user/screenshot.png' |
86 if os.access(screenshot_filename, os.F_OK): | 50 if os.access(screenshot_filename, os.F_OK): |
87 os.remove(screenshot_filename) | 51 os.remove(screenshot_filename) |
88 ax.send_hotkey('Print') | 52 ax.send_hotkey('Print') |
89 self.__poll_for_condition( | 53 site_utils.poll_for_condition( |
90 lambda: os.access(screenshot_filename, os.F_OK), | 54 lambda: os.access(screenshot_filename, os.F_OK), |
91 desc='Waiting for screenshot at %s' % screenshot_filename) | 55 error.TestFail( |
| 56 'Waiting for screenshot at %s' % screenshot_filename)) |
92 os.remove(screenshot_filename) | 57 os.remove(screenshot_filename) |
OLD | NEW |