Home | History | Annotate | Download | only in functional
      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