1 #!/usr/bin/env python 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 6 import glob 7 import logging 8 import os 9 import time 10 11 import pyauto_functional # must be imported before pyauto 12 import pyauto 13 14 15 class SecureShellTest(pyauto.PyUITest): 16 """Tests for Secure Shell app. 17 18 Uses app from chrome/test/data/extensions/secure_shell/. 19 The test uses stable app by default. 20 Set the env var SECURE_SHELL_USE_DEV=1 to make it use the dev one. 21 """ 22 23 assert pyauto.PyUITest.IsChromeOS(), 'Works on ChromeOS only' 24 25 def setUp(self): 26 """Install secure shell app at startup.""" 27 pyauto.PyUITest.setUp(self) 28 29 # Pick app from data dir. 30 app_dir = os.path.join(os.path.abspath( 31 self.DataDir()), 'extensions', 'secure_shell') 32 channel = 'dev' if os.getenv('SECURE_SHELL_USE_DEV') else 'stable' 33 files = glob.glob(os.path.join(app_dir, 'SecureShell-%s-*.crx' % channel)) 34 assert files, 'Secure Shell %s app missing in %s' % (channel, app_dir) 35 app_path = files[0] 36 37 # Install app. 38 logging.debug('Using Secure shell app %s' % app_path) 39 self._app_id = self.InstallExtension(app_path, from_webstore=True) 40 41 def testInstall(self): 42 """Install Secure Shell.""" 43 # Installation already done in setUp. Just verify. 44 self.assertTrue(self._app_id) 45 ssh_info = [x for x in self.GetExtensionsInfo() 46 if x['id'] == self._app_id][0] 47 self.assertTrue(ssh_info) 48 # Uninstall. 49 self.UninstallExtensionById(id=self._app_id) 50 self.assertFalse([x for x in self.GetExtensionsInfo() 51 if x['id'] == self._app_id], 52 msg='Could not uninstall.') 53 54 def testLaunch(self): 55 """Launch Secure Shell and verify basic connect/exit flow. 56 57 This basic flow also verifies that NaCl works since secure shell is based 58 on it. 59 """ 60 self.assertEqual(1, self.GetTabCount()) 61 then = time.time() 62 self.LaunchApp(self._app_id) 63 login_ui_frame = ( 64 '/descendant::iframe[contains(@src, "nassh_connect_dialog.html")]') 65 # Wait for connection dialog iframe to load. 66 self.WaitForDomNode(login_ui_frame, tab_index=1, 67 msg='Secure shell login dialog did not show up') 68 self.WaitForDomNode('id("field-description")', tab_index=1, 69 attribute='placeholder', 70 expected_value='username@hostname', # partial match 71 frame_xpath=login_ui_frame, 72 msg='Did not find secure shell username dialog') 73 now = time.time() 74 self.assertEqual(2, self.GetTabCount(), msg='Did not launch') 75 logging.info('Launched Secure Shell in %.2f secs' % (now - then)) 76 77 # Fill in chronos@localhost using webdriver. 78 driver = self.NewWebDriver() 79 driver.switch_to_window(driver.window_handles[-1]) # last tab 80 driver.switch_to_frame(1) 81 user = 'chronos@localhost' 82 driver.find_element_by_id('field-description').send_keys(user + '\n') 83 84 # Verify yes/no prompt 85 self.WaitForHtermText('continue connecting \(yes/no\)\?', tab_index=1, 86 msg='Did not get the yes/no prompt') 87 welcome_text = self.GetHtermRowsText(0, 8, tab_index=1) 88 self.assertTrue('Welcome to Secure Shell' in welcome_text, 89 msg='Did not get correct welcome message') 90 91 # Type 'yes' and enter password 92 self.SendKeysToHterm('yes\\n', tab_index=1) 93 self.WaitForHtermText('Password:', tab_index=1, 94 msg='Did not get password prompt') 95 self.SendKeysToHterm('test0000\\n', tab_index=1) 96 self.WaitForHtermText('chronos@localhost $', tab_index=1, 97 msg='Did not get shell login prompt') 98 99 # Type 'exit' and close the tab 100 self.SendKeysToHterm('exit\\n', tab_index=1) 101 # Check for only 'code 0' since that is what indicates that we exited 102 # successfully. Checking for more stringage causes flakes since the exit 103 # string does change at times. 104 self.WaitForHtermText('code 0', tab_index=1, 105 msg='Did not get correct exit message') 106 107 108 if __name__ == '__main__': 109 pyauto_functional.Main() 110