1 # Copyright 2014 The Chromium 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.
9 from telemetry import test
10 from telemetry.core import browser_finder
11 from telemetry.core import exceptions
12 from telemetry.core import extension_to_load
13 from telemetry.core import util
14 from telemetry.core.backends.chrome import cros_interface
15 from telemetry.unittest import options_for_unittests
17 class CrOSTest(unittest.TestCase):
19 options = options_for_unittests.GetCopy()
20 self._cri = cros_interface.CrOSInterface(options.cros_remote,
21 options.cros_ssh_identity)
22 self._is_guest = options.browser_type == 'cros-chrome-guest'
23 self._username = options.browser_options.username
24 self._password = options.browser_options.password
25 self._load_extension = None
27 def _CreateBrowser(self, autotest_ext=False, auto_login=True):
28 """Finds and creates a browser for tests. if autotest_ext is True,
29 also loads the autotest extension"""
30 options = options_for_unittests.GetCopy()
33 extension_path = os.path.join(util.GetUnittestDataDir(), 'autotest_ext')
34 assert os.path.isdir(extension_path)
35 self._load_extension = extension_to_load.ExtensionToLoad(
37 browser_type=options.browser_type,
39 options.extensions_to_load = [self._load_extension]
41 browser_to_create = browser_finder.FindBrowser(options)
42 self.assertTrue(browser_to_create)
43 options.browser_options.create_browser_with_oobe = True
44 options.browser_options.auto_login = auto_login
45 return browser_to_create.Create()
47 def _GetAutotestExtension(self, browser):
48 """Returns the autotest extension instance"""
49 extension = browser.extensions[self._load_extension]
50 self.assertTrue(extension)
53 def _IsCryptohomeMounted(self):
54 """Returns True if cryptohome is mounted. as determined by the cmd
55 cryptohome --action=is_mounted"""
56 return self._cri.RunCmdOnDevice(
57 ['/usr/sbin/cryptohome', '--action=is_mounted'])[0].strip() == 'true'
59 @test.Enabled('chromeos')
60 def testCryptohome(self):
61 """Verifies cryptohome mount status for regular and guest user and when
63 with self._CreateBrowser() as b:
64 self.assertEquals(1, len(b.tabs))
65 self.assertTrue(b.tabs[0].url)
66 self.assertTrue(self._IsCryptohomeMounted())
68 # TODO(achuith): Remove dependency on /home/chronos/user.
69 chronos_fs = self._cri.FilesystemMountedAt('/home/chronos/user')
70 self.assertTrue(chronos_fs)
72 self.assertEquals(chronos_fs, 'guestfs')
74 crypto_fs = self._cri.FilesystemMountedAt(
75 self._cri.CryptohomePath(self._username))
76 self.assertEquals(crypto_fs, chronos_fs)
78 self.assertFalse(self._IsCryptohomeMounted())
79 self.assertEquals(self._cri.FilesystemMountedAt('/home/chronos/user'),
80 '/dev/mapper/encstateful')
82 def _GetLoginStatus(self, browser):
83 extension = self._GetAutotestExtension(browser)
84 self.assertTrue(extension.EvaluateJavaScript(
85 "typeof('chrome.autotestPrivate') != 'undefined'"))
86 extension.ExecuteJavaScript('''
87 window.__login_status = null;
88 chrome.autotestPrivate.loginStatus(function(s) {
89 window.__login_status = s;
93 lambda: extension.EvaluateJavaScript('window.__login_status'), 10)
95 @test.Enabled('chromeos')
96 def testLoginStatus(self):
97 """Tests autotestPrivate.loginStatus"""
100 with self._CreateBrowser(autotest_ext=True) as b:
101 login_status = self._GetLoginStatus(b)
102 self.assertEquals(type(login_status), dict)
104 self.assertEquals(not self._is_guest, login_status['isRegularUser'])
105 self.assertEquals(self._is_guest, login_status['isGuest'])
106 self.assertEquals(login_status['email'], self._username)
107 self.assertFalse(login_status['isScreenLocked'])
109 def _IsScreenLocked(self, browser):
110 return self._GetLoginStatus(browser)['isScreenLocked']
112 def _LockScreen(self, browser):
113 self.assertFalse(self._IsScreenLocked(browser))
115 extension = self._GetAutotestExtension(browser)
116 self.assertTrue(extension.EvaluateJavaScript(
117 "typeof chrome.autotestPrivate.lockScreen == 'function'"))
118 logging.info('Locking screen')
119 extension.ExecuteJavaScript('chrome.autotestPrivate.lockScreen();')
121 logging.info('Waiting for the lock screen')
123 return (browser.oobe_exists and
124 browser.oobe.EvaluateJavaScript("typeof Oobe == 'function'") and
125 browser.oobe.EvaluateJavaScript(
126 "typeof Oobe.authenticateForTesting == 'function'"))
127 util.WaitFor(ScreenLocked, 10)
128 self.assertTrue(self._IsScreenLocked(browser))
130 def _AttemptUnlockBadPassword(self, browser):
131 logging.info('Trying a bad password')
132 def ErrorBubbleVisible():
133 return not browser.oobe.EvaluateJavaScript('''
134 document.getElementById('bubble').hidden
136 self.assertFalse(ErrorBubbleVisible())
137 browser.oobe.ExecuteJavaScript('''
138 Oobe.authenticateForTesting('%s', 'bad');
139 ''' % self._username)
140 util.WaitFor(ErrorBubbleVisible, 10)
141 self.assertTrue(self._IsScreenLocked(browser))
143 def _UnlockScreen(self, browser):
144 logging.info('Unlocking')
145 browser.oobe.ExecuteJavaScript('''
146 Oobe.authenticateForTesting('%s', '%s');
147 ''' % (self._username, self._password))
148 util.WaitFor(lambda: not browser.oobe, 10)
149 self.assertFalse(self._IsScreenLocked(browser))
151 @test.Enabled('chromeos')
152 def testScreenLock(self):
153 """Tests autotestPrivate.screenLock"""
156 with self._CreateBrowser(autotest_ext=True) as browser:
157 self._LockScreen(browser)
158 self._AttemptUnlockBadPassword(browser)
159 self._UnlockScreen(browser)
161 @test.Enabled('chromeos')
162 def testLogout(self):
163 """Tests autotestPrivate.logout"""
166 with self._CreateBrowser(autotest_ext=True) as b:
167 extension = self._GetAutotestExtension(b)
169 extension.ExecuteJavaScript('chrome.autotestPrivate.logout();')
170 except (exceptions.BrowserConnectionGoneException,
171 exceptions.BrowserGoneException):
173 util.WaitFor(lambda: not self._IsCryptohomeMounted(), 20)