| # Copyright (c) 2010 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, string, time, gtk |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.common_lib import error, utils |
| from autotest_lib.client.cros import cros_ui |
| |
| class desktopui_ImeLogin(test.test): |
| version = 1 |
| |
| def setup(self): |
| # Rank in the "others language" selection menu |
| self._japanese_rank = 22 |
| # (X, Y) position from the top right edge (hopefully invariant) |
| self._language_selector_pos = (75, 15) |
| |
| |
| def log_error(self, test_name, message): |
| self.job.record('ERROR', None, test_name, message) |
| self._failed.append(test_name) |
| |
| |
| # TODO(timothe): Share this with desktopui_ImeTest. |
| def get_current_text(self): |
| # Because there can be a slight delay between entering text and the |
| # output from the ime being received, we need to sleep here. |
| time.sleep(1) |
| ax = cros_ui.get_autox() |
| |
| # The DISPLAY environment variable isn't set, so we have to manually get |
| # the proper display. |
| display = gtk.gdk.Display(":0.0") |
| clip = gtk.Clipboard(display, "PRIMARY") |
| |
| # Wait 10 seconds for text to be available in the clipboard, or return |
| # an empty string. |
| start_time = time.time() |
| while time.time() - start_time < 10: |
| # Select all the text so that it can be accessed via the clipboard. |
| ax.send_hotkey('Ctrl-a') |
| |
| if clip.wait_is_text_available(): |
| return str(clip.wait_for_text()) |
| time.sleep(1) |
| return "" |
| |
| |
| def get_current_keyboard_layout(self): |
| # Typical output of the "setxkbmap -print" command: |
| # xkb_keymap { |
| # xkb_keycodes { include "evdev+aliases(qwerty)"}; |
| # xkb_types { include "complete"}; |
| # xkb_compat { include "complete+japan"}; |
| # xkb_symbols { include "pc+jp+inet(evdev)+group(alts_toggle)"}; |
| # xkb_geometry { include "pc(pc105)"}; |
| # }; |
| # This will return the "jp" on the 5th line. |
| cmd = "setxkbmap -print | grep xkb_symbols | awk '{print $4}' | awk\ |
| -F\"+\" '{print $2}'" |
| cmd_result = utils.system_output(cmd, ignore_status=True, |
| retain_output=True) |
| return cmd_result |
| |
| |
| def change_ui_language(self, language): |
| # TODO(timothe): Create a lookup table to track the position of each |
| # language in the list. |
| # That position changes relative to the selected language |
| # so it is difficult. |
| ax = cros_ui.get_autox() |
| # Navigate to the language selection and select Japanese. |
| navigate_to_ui_lang = ["Tab", "Tab", "Tab", "space", "Up", "Right"] |
| go_to_japanese = ["Down"] * self._japanese_rank |
| for key_action in navigate_to_ui_lang + go_to_japanese + ['space']: |
| ax.send_hotkey(key_action) |
| |
| |
| def test_login_screen(self, language, input_text, expected_text): |
| # Setting desired UI language. |
| self.change_ui_language(language) |
| |
| # Change the keyboard layout to the one we want. |
| ax = cros_ui.get_autox() |
| ax.send_hotkey("Ctrl+space") |
| time.sleep(1) |
| |
| current_layout = self.get_current_keyboard_layout() |
| if current_layout != language: |
| # If it is not working the first time we try, that means the |
| # ibus client was not run once before, so we change to a manual |
| # activation via the mouse. |
| width, height = ax.get_screen_size() |
| ax.move_pointer(width - self._language_selector_pos[0], |
| self._language_selector_pos[1]) |
| ax.press_button(1) |
| ax.release_button(1) |
| ax.send_hotkey("Down") |
| ax.send_hotkey("Return") |
| |
| # Wait for 10 seconds max. |
| start_time = time.time() |
| could_not_change_layout = True |
| while(time.time() - start_time < 10): |
| current_layout = self.get_current_keyboard_layout() |
| if current_layout == language: |
| could_not_change_layout = False |
| break |
| time.sleep(1) |
| if could_not_change_layout: |
| self.log_error( |
| 'test_login_screen', |
| 'Could not change the layout to japanese, got : %s' % |
| current_layout) |
| |
| # Enter text in the login box and test. |
| ax.send_text(input_text) |
| text = self.get_current_text() |
| if text != expected_text: |
| self.log_error( |
| 'test_login_screen', |
| 'Test in japanese failed : Got %s, expected %s' % ( |
| text, expected_text)) |
| ax.send_hotkey("BackSpace") |
| |
| # Brings back the english interface. |
| ax.send_hotkey("Tab") |
| ax.send_hotkey("Tab") |
| ax.send_hotkey("Tab") |
| ax.send_hotkey("space") |
| ax.send_hotkey("Down") |
| ax.send_hotkey("space") |
| ax.send_hotkey("Tab") |
| |
| |
| def run_once(self): |
| self._failed = [] |
| |
| self.test_login_screen("jp", "loguin@google.co.jp", |
| "loguin\"google.co.jp") |
| |
| if len(self._failed) != 0: |
| raise error.TestFail('Failed: %s' % ','.join(self._failed)) |