1 # Copyright (c) 2012 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.core import browser_finder
10 from telemetry.core import exceptions
11 from telemetry.core import extension_to_load
12 from telemetry.core import util
13 from telemetry.core.backends.chrome import cros_interface
14 from telemetry.unittest import options_for_unittests
16 class CrOSAutoTest(unittest.TestCase):
18 options = options_for_unittests.GetCopy()
19 self._cri = cros_interface.CrOSInterface(options.cros_remote,
20 options.cros_ssh_identity)
21 self._is_guest = options.browser_type == 'cros-chrome-guest'
22 self._email = '' if self._is_guest else 'test@test.test'
24 def _IsCryptohomeMounted(self):
25 """Returns True if cryptohome is mounted"""
26 cryptohomeJSON, _ = self._cri.RunCmdOnDevice(['/usr/sbin/cryptohome',
28 cryptohomeStatus = json.loads(cryptohomeJSON)
29 return (cryptohomeStatus['mounts'] and
30 cryptohomeStatus['mounts'][0]['mounted'])
32 def _CreateBrowser(self, with_autotest_ext):
33 """Finds and creates a browser for tests. if with_autotest_ext is True,
34 also loads the autotest extension"""
35 options = options_for_unittests.GetCopy()
38 extension_path = os.path.join(os.path.dirname(__file__), 'autotest_ext')
39 self._load_extension = extension_to_load.ExtensionToLoad(
41 browser_type=options.browser_type,
43 options.extensions_to_load = [self._load_extension]
44 options.browser_options.create_browser_with_oobe = True
46 browser_to_create = browser_finder.FindBrowser(options)
47 self.assertTrue(browser_to_create)
48 b = browser_to_create.Create()
52 def _GetAutotestExtension(self, browser):
53 """Returns the autotest extension instance"""
54 extension = browser.extensions[self._load_extension]
55 self.assertTrue(extension)
58 def _GetLoginStatus(self, browser):
59 extension = self._GetAutotestExtension(browser)
60 self.assertTrue(extension.EvaluateJavaScript(
61 "typeof('chrome.autotestPrivate') != 'undefined'"))
62 extension.ExecuteJavaScript('''
63 window.__login_status = null;
64 chrome.autotestPrivate.loginStatus(function(s) {
65 window.__login_status = s;
69 lambda: extension.EvaluateJavaScript('window.__login_status'), 10)
71 def testCryptohomeMounted(self):
72 """Verifies cryptohome mount status for regular and guest user and when
74 with self._CreateBrowser(False) as b:
75 self.assertEquals(1, len(b.tabs))
76 self.assertTrue(b.tabs[0].url)
77 self.assertTrue(self._IsCryptohomeMounted())
79 chronos_fs = self._cri.FilesystemMountedAt('/home/chronos/user')
80 self.assertTrue(chronos_fs)
82 self.assertEquals(chronos_fs, 'guestfs')
84 home, _ = self._cri.RunCmdOnDevice(['/usr/sbin/cryptohome-path',
86 self.assertEquals(self._cri.FilesystemMountedAt(home.rstrip()),
89 self.assertFalse(self._IsCryptohomeMounted())
90 self.assertEquals(self._cri.FilesystemMountedAt('/home/chronos/user'),
91 '/dev/mapper/encstateful')
93 def testLoginStatus(self):
94 """Tests autotestPrivate.loginStatus"""
95 with self._CreateBrowser(True) as b:
96 login_status = self._GetLoginStatus(b)
97 self.assertEquals(type(login_status), dict)
99 self.assertEquals(not self._is_guest, login_status['isRegularUser'])
100 self.assertEquals(self._is_guest, login_status['isGuest'])
101 self.assertEquals(login_status['email'], self._email)
102 self.assertFalse(login_status['isScreenLocked'])
104 def _IsScreenLocked(self, browser):
105 return self._GetLoginStatus(browser)['isScreenLocked']
107 def _LockScreen(self, browser):
108 self.assertFalse(self._IsScreenLocked(browser))
110 extension = self._GetAutotestExtension(browser)
111 self.assertTrue(extension.EvaluateJavaScript(
112 "typeof chrome.autotestPrivate.lockScreen == 'function'"))
113 logging.info('Locking screen')
114 extension.ExecuteJavaScript('chrome.autotestPrivate.lockScreen();')
116 logging.info('Waiting for the lock screen')
118 return (browser.oobe and
119 browser.oobe.EvaluateJavaScript("typeof Oobe == 'function'") and
120 browser.oobe.EvaluateJavaScript(
121 "typeof Oobe.authenticateForTesting == 'function'"))
122 util.WaitFor(ScreenLocked, 10)
123 self.assertTrue(self._IsScreenLocked(browser))
125 def _AttemptUnlockBadPassword(self, browser):
126 logging.info('Trying a bad password')
127 def ErrorBubbleVisible():
128 return not browser.oobe.EvaluateJavaScript('''
129 document.getElementById('bubble').hidden
131 self.assertFalse(ErrorBubbleVisible())
132 browser.oobe.ExecuteJavaScript('''
133 Oobe.authenticateForTesting('test@test.test', 'bad');
135 util.WaitFor(ErrorBubbleVisible, 10)
136 self.assertTrue(self._IsScreenLocked(browser))
138 def _UnlockScreen(self, browser):
139 logging.info('Unlocking')
140 browser.oobe.ExecuteJavaScript('''
141 Oobe.authenticateForTesting('test@test.test', '');
143 util.WaitFor(lambda: not browser.oobe, 10)
144 self.assertFalse(self._IsScreenLocked(browser))
146 def testScreenLock(self):
147 """Tests autotestPrivate.screenLock"""
148 with self._CreateBrowser(True) as browser:
149 self._LockScreen(browser)
150 self._AttemptUnlockBadPassword(browser)
151 self._UnlockScreen(browser)
154 def testLogout(self):
155 """Tests autotestPrivate.logout"""
156 with self._CreateBrowser(True) as b:
157 extension = self._GetAutotestExtension(b)
159 extension.ExecuteJavaScript('chrome.autotestPrivate.logout();')
160 except (exceptions.BrowserConnectionGoneException,
161 exceptions.BrowserGoneException):
163 util.WaitFor(lambda: not self._IsCryptohomeMounted(), 20)