Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: telemetry/telemetry/core/cros_interface_unittest.py

Issue 2162963002: [polymer] Merge of master into polymer10-migration (Closed) Base URL: git@github.com:catapult-project/catapult.git@polymer10-migration
Patch Set: Merge polymer10-migration int polymer10-merge Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « telemetry/telemetry/core/cros_interface.py ('k') | telemetry/telemetry/core/discover.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2013 The Chromium Authors. All rights reserved. 1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 # TODO(nduca): Rewrite what some of these tests to use mocks instead of 5 # TODO(nduca): Rewrite what some of these tests to use mocks instead of
6 # actually talking to the device. This would improve our coverage quite 6 # actually talking to the device. This would improve our coverage quite
7 # a bit. 7 # a bit.
8 8
9 import socket 9 import socket
10 import tempfile 10 import tempfile
11 import unittest 11 import unittest
12 import mock 12 import mock
13 13
14 from telemetry.core import cros_interface 14 from telemetry.core import cros_interface
15 from telemetry import decorators 15 from telemetry import decorators
16 from telemetry.internal import forwarders 16 from telemetry.internal import forwarders
17 from telemetry.internal.forwarders import cros_forwarder 17 from telemetry.internal.forwarders import cros_forwarder
18 from telemetry.testing import options_for_unittests 18 from telemetry.testing import options_for_unittests
19 19
20 20
21 class CrOSInterfaceTest(unittest.TestCase): 21 class CrOSInterfaceTest(unittest.TestCase):
22 22
23 def _GetCRI(self): 23 def _GetCRI(self):
24 remote = options_for_unittests.GetCopy().cros_remote 24 remote = options_for_unittests.GetCopy().cros_remote
25 remote_ssh_port = options_for_unittests.GetCopy().cros_remote_ssh_port 25 remote_ssh_port = options_for_unittests.GetCopy().cros_remote_ssh_port
26 return cros_interface.CrOSInterface( 26 return cros_interface.CrOSInterface(
27 remote, remote_ssh_port, 27 remote, remote_ssh_port,
28 options_for_unittests.GetCopy().cros_ssh_identity) 28 options_for_unittests.GetCopy().cros_ssh_identity)
29 29
30 @decorators.Enabled('cros-chrome') 30 @decorators.Enabled('chromeos')
31 def testPushContents(self): 31 def testPushContents(self):
32 with self._GetCRI() as cri: 32 with self._GetCRI() as cri:
33 cri.RunCmdOnDevice(['rm', '-rf', '/tmp/testPushContents']) 33 tmp_file = '/tmp/testPushContents'
34 cri.PushContents('hello world', '/tmp/testPushContents') 34 test_contents = 'hello world'
35 contents = cri.GetFileContents('/tmp/testPushContents') 35 cri.RmRF(tmp_file)
36 self.assertEquals(contents, 'hello world') 36 cri.PushContents(test_contents, tmp_file)
37 contents = cri.GetFileContents(tmp_file)
38 self.assertEquals(contents, test_contents)
37 39
38 @decorators.Enabled('cros-chrome') 40 @decorators.Enabled('chromeos')
39 def testExists(self): 41 def testExists(self):
40 with self._GetCRI() as cri: 42 with self._GetCRI() as cri:
41 self.assertTrue(cri.FileExistsOnDevice('/proc/cpuinfo')) 43 self.assertTrue(cri.FileExistsOnDevice('/proc/cpuinfo'))
42 self.assertTrue(cri.FileExistsOnDevice('/etc/passwd')) 44 self.assertTrue(cri.FileExistsOnDevice('/etc/passwd'))
43 self.assertFalse(cri.FileExistsOnDevice('/etc/sdlfsdjflskfjsflj')) 45 self.assertFalse(cri.FileExistsOnDevice('/etc/sdlfsdjflskfjsflj'))
44 46
45 @decorators.Enabled('linux') 47 @decorators.Enabled('chromeos')
46 def testExistsLocal(self): 48 def testGetFileContents(self):
47 with cros_interface.CrOSInterface() as cri:
48 self.assertTrue(cri.FileExistsOnDevice('/proc/cpuinfo'))
49 self.assertTrue(cri.FileExistsOnDevice('/etc/passwd'))
50 self.assertFalse(cri.FileExistsOnDevice('/etc/sdlfsdjflskfjsflj'))
51
52 @decorators.Enabled('cros-chrome')
53 def testGetFileContents(self): # pylint: disable=no-self-use
54 with self._GetCRI() as cri: 49 with self._GetCRI() as cri:
55 hosts = cri.GetFileContents('/etc/lsb-release') 50 hosts = cri.GetFileContents('/etc/lsb-release')
56 self.assertTrue('CHROMEOS' in hosts) 51 self.assertTrue('CHROMEOS' in hosts)
57 52
58 @decorators.Enabled('cros-chrome') 53 @decorators.Enabled('chromeos')
59 def testGetFileContentsNonExistent(self):
60 with self._GetCRI() as cri:
61 f = tempfile.NamedTemporaryFile()
62 cri.PushContents('testGetFileNonExistent', f.name)
63 cri.RmRF(f.name)
64 self.assertRaises(OSError, lambda: cri.GetFileContents(f.name))
65
66 @decorators.Enabled('cros-chrome')
67 def testGetFile(self): # pylint: disable=no-self-use 54 def testGetFile(self): # pylint: disable=no-self-use
68 with self._GetCRI() as cri: 55 with self._GetCRI() as cri:
69 f = tempfile.NamedTemporaryFile() 56 f = tempfile.NamedTemporaryFile()
70 cri.GetFile('/etc/lsb-release', f.name) 57 cri.GetFile('/etc/lsb-release', f.name)
71 with open(f.name, 'r') as f2: 58 with open(f.name, 'r') as f2:
72 res = f2.read() 59 res = f2.read()
73 self.assertTrue('CHROMEOS' in res) 60 self.assertTrue('CHROMEOS' in res)
74 61
75 @decorators.Enabled('cros-chrome') 62 @decorators.Enabled('chromeos')
76 def testGetFileNonExistent(self): 63 def testGetFileNonExistent(self):
77 with self._GetCRI() as cri: 64 with self._GetCRI() as cri:
78 f = tempfile.NamedTemporaryFile() 65 f = tempfile.NamedTemporaryFile()
79 cri.PushContents('testGetFileNonExistent', f.name) 66 cri.PushContents('testGetFileNonExistent', f.name)
80 cri.RmRF(f.name) 67 cri.RmRF(f.name)
81 self.assertRaises(OSError, lambda: cri.GetFile(f.name)) 68 self.assertRaises(OSError, lambda: cri.GetFile(f.name))
82 69
83 @decorators.Enabled('cros-chrome') 70 @decorators.Enabled('chromeos')
84 def testIsServiceRunning(self): 71 def testIsServiceRunning(self):
85 with self._GetCRI() as cri: 72 with self._GetCRI() as cri:
86 self.assertTrue(cri.IsServiceRunning('openssh-server')) 73 self.assertTrue(cri.IsServiceRunning('openssh-server'))
87 74
88 @decorators.Enabled('linux') 75 # TODO(achuith): Fix this test. crbug.com/619767.
89 def testIsServiceRunningLocal(self): 76 @decorators.Disabled('all')
90 with cros_interface.CrOSInterface() as cri:
91 self.assertTrue(cri.IsServiceRunning('dbus'))
92
93 @decorators.Enabled('cros-chrome')
94 def testGetRemotePortAndIsHTTPServerRunningOnPort(self): 77 def testGetRemotePortAndIsHTTPServerRunningOnPort(self):
95 with self._GetCRI() as cri: 78 with self._GetCRI() as cri:
96 # Create local server. 79 # Create local server.
97 sock = socket.socket() 80 sock = socket.socket()
98 sock.bind(('', 0)) 81 sock.bind(('', 0))
99 port = sock.getsockname()[1] 82 port = sock.getsockname()[1]
100 sock.listen(0) 83 sock.listen(0)
101 84
102 # Get remote port and ensure that it was unused. 85 # Get remote port and ensure that it was unused.
103 remote_port = cri.GetRemotePort() 86 remote_port = cri.GetRemotePort()
(...skipping 13 matching lines...) Expand all
117 self.assertTrue(cri.GetRemotePort() != remote_port) 100 self.assertTrue(cri.GetRemotePort() != remote_port)
118 101
119 # Close forwarder and local server ports. 102 # Close forwarder and local server ports.
120 forwarder.Close() 103 forwarder.Close()
121 sock.close() 104 sock.close()
122 105
123 # Device should no longer be able to connect to remote_port since it is no 106 # Device should no longer be able to connect to remote_port since it is no
124 # longer in use. 107 # longer in use.
125 self.assertFalse(cri.IsHTTPServerRunningOnPort(remote_port)) 108 self.assertFalse(cri.IsHTTPServerRunningOnPort(remote_port))
126 109
127 @decorators.Enabled('cros-chrome') 110 @decorators.Enabled('chromeos')
128 def testGetRemotePortReservedPorts(self): 111 def testGetRemotePortReservedPorts(self):
129 with self._GetCRI() as cri: 112 with self._GetCRI() as cri:
130 # Should return 2 separate ports even though the first one isn't 113 # Should return 2 separate ports even though the first one isn't
131 # technically being used yet. 114 # technically being used yet.
132 remote_port_1 = cri.GetRemotePort() 115 remote_port_1 = cri.GetRemotePort()
133 remote_port_2 = cri.GetRemotePort() 116 remote_port_2 = cri.GetRemotePort()
134 117
135 self.assertTrue(remote_port_1 != remote_port_2) 118 self.assertTrue(remote_port_1 != remote_port_2)
136 119
137 @decorators.Enabled('cros-chrome') 120 # TODO(achuith): Doesn't work in VMs.
121 @decorators.Disabled('all')
138 def testTakeScreenshotWithPrefix(self): 122 def testTakeScreenshotWithPrefix(self):
139 with self._GetCRI() as cri: 123 with self._GetCRI() as cri:
140
141 def _Cleanup(): 124 def _Cleanup():
142 cri.RmRF('/var/log/screenshots/test-prefix*') 125 cri.RmRF('/var/log/screenshots/test-prefix*')
143 126
144 _Cleanup() 127 _Cleanup()
145 self.assertTrue(cri.TakeScreenshotWithPrefix('test-prefix')) 128 self.assertTrue(cri.TakeScreenshotWithPrefix('test-prefix'))
146 self.assertTrue(cri.FileExistsOnDevice( 129 self.assertTrue(cri.FileExistsOnDevice(
147 '/var/log/screenshots/test-prefix-0.png')) 130 '/var/log/screenshots/test-prefix-0.png'))
148 _Cleanup() 131 _Cleanup()
149 132
150 @decorators.Enabled('chromeos') 133 @decorators.Enabled('chromeos')
151 def testLsbReleaseValue(self): 134 def testLsbReleaseValue(self):
152 with self._GetCRI() as cri: 135 with self._GetCRI() as cri:
153 build_num = cri.LsbReleaseValue('CHROMEOS_RELEASE_BUILD_NUMBER', None) 136 build_num = cri.LsbReleaseValue('CHROMEOS_RELEASE_BUILD_NUMBER', None)
154 self.assertTrue(build_num.isdigit()) 137 self.assertTrue(build_num.isdigit())
155 device_type = cri.GetDeviceTypeName() 138 device_type = cri.GetDeviceTypeName()
156 self.assertTrue(device_type.isalpha()) 139 self.assertTrue(device_type.isalpha())
157 140
158 # TODO(tengs): It would be best if we can filter this test and other tests 141 @decorators.Enabled('chromeos')
159 # that need to be run locally based on the platform of the system browser.
160 @decorators.Enabled('linux')
161 def testEscapeCmdArguments(self): 142 def testEscapeCmdArguments(self):
162 """Commands and their arguments that are executed through the cros 143 """Commands and their arguments that are executed through the cros
163 interface should follow bash syntax. This test needs to run on remotely 144 interface should follow bash syntax. This test needs to run on remotely
164 and locally on the device to check for consistency. 145 and locally on the device to check for consistency.
165 """ 146 """
166 options = options_for_unittests.GetCopy() 147 options = options_for_unittests.GetCopy()
167 with cros_interface.CrOSInterface(options.cros_remote, 148 with cros_interface.CrOSInterface(options.cros_remote,
168 options.cros_remote_ssh_port, 149 options.cros_remote_ssh_port,
169 options.cros_ssh_identity) as cri: 150 options.cros_ssh_identity) as cri:
170 151
171 # Check arguments with no special characters 152 # Check arguments with no special characters
172 stdout, _ = cri.RunCmdOnDevice(['echo', '--arg1=value1', '--arg2=value2', 153 stdout, _ = cri.RunCmdOnDevice(['echo', '--arg1=value1', '--arg2=value2',
173 '--arg3="value3"']) 154 '--arg3="value3"'])
174 assert stdout.strip() == '--arg1=value1 --arg2=value2 --arg3=value3' 155 assert stdout.strip() == '--arg1=value1 --arg2=value2 --arg3=value3'
175 156
176 # Check argument with special characters escaped 157 # Check argument with special characters escaped
177 stdout, _ = cri.RunCmdOnDevice(['echo', '--arg=A\\; echo \\"B\\"']) 158 stdout, _ = cri.RunCmdOnDevice(['echo', '--arg=A\\; echo \\"B\\"'])
178 assert stdout.strip() == '--arg=A; echo "B"' 159 assert stdout.strip() == '--arg=A; echo "B"'
179 160
180 # Check argument with special characters in quotes 161 # Check argument with special characters in quotes
181 stdout, _ = cri.RunCmdOnDevice(['echo', "--arg='$HOME;;$PATH'"]) 162 stdout, _ = cri.RunCmdOnDevice(['echo', "--arg='$HOME;;$PATH'"])
182 assert stdout.strip() == "--arg=$HOME;;$PATH" 163 assert stdout.strip() == "--arg=$HOME;;$PATH"
183 164
184 @decorators.Enabled('cros-chrome', 'linux') 165 @decorators.Enabled('chromeos')
185 @mock.patch.object(cros_interface.CrOSInterface, 'RunCmdOnDevice') 166 @mock.patch.object(cros_interface.CrOSInterface, 'RunCmdOnDevice')
186 def testTryLoginSuccess(self, mock_run_cmd): 167 def testTryLoginSuccess(self, mock_run_cmd):
187 mock_run_cmd.return_value = ('root\n', '') 168 mock_run_cmd.return_value = ('root\n', '')
188 cri = cros_interface.CrOSInterface( 169 cri = cros_interface.CrOSInterface(
189 "testhostname", 22, options_for_unittests.GetCopy().cros_ssh_identity) 170 "testhostname", 22, options_for_unittests.GetCopy().cros_ssh_identity)
190 cri.TryLogin() 171 cri.TryLogin()
191 mock_run_cmd.assert_called_once_with(['echo', '$USER'], quiet=True) 172 mock_run_cmd.assert_called_once_with(['echo', '$USER'], quiet=True)
192 173
193 @decorators.Enabled('cros-chrome', 'linux') 174 @decorators.Enabled('chromeos')
194 @mock.patch.object(cros_interface.CrOSInterface, 'RunCmdOnDevice') 175 @mock.patch.object(cros_interface.CrOSInterface, 'RunCmdOnDevice')
195 def testTryLoginStderr(self, mock_run_cmd): 176 def testTryLoginStderr(self, mock_run_cmd):
196 cri = cros_interface.CrOSInterface( 177 cri = cros_interface.CrOSInterface(
197 "testhostname", 22, options_for_unittests.GetCopy().cros_ssh_identity) 178 "testhostname", 22, options_for_unittests.GetCopy().cros_ssh_identity)
198 179
199 mock_run_cmd.return_value = ('', 'Host key verification failed') 180 mock_run_cmd.return_value = ('', 'Host key verification failed')
200 self.assertRaises(cros_interface.LoginException, cri.TryLogin) 181 self.assertRaises(cros_interface.LoginException, cri.TryLogin)
201 self.assertRaisesRegexp(cros_interface.LoginException, 182 self.assertRaisesRegexp(cros_interface.LoginException,
202 r'.*host key verification failed..*', cri.TryLogin) 183 r'.*host key verification failed..*', cri.TryLogin)
203 184
(...skipping 13 matching lines...) Expand all
217 198
218 mock_run_cmd.return_value = ('', 'Fallback error case') 199 mock_run_cmd.return_value = ('', 'Fallback error case')
219 self.assertRaisesRegexp(cros_interface.LoginException, 200 self.assertRaisesRegexp(cros_interface.LoginException,
220 r'While logging into .*, got .*', cri.TryLogin) 201 r'While logging into .*, got .*', cri.TryLogin)
221 202
222 mock_run_cmd.return_value = ('', 'Could not resolve hostname') 203 mock_run_cmd.return_value = ('', 'Could not resolve hostname')
223 self.assertRaisesRegexp(cros_interface.DNSFailureException, 204 self.assertRaisesRegexp(cros_interface.DNSFailureException,
224 r'Unable to resolve the hostname for:.*', 205 r'Unable to resolve the hostname for:.*',
225 cri.TryLogin) 206 cri.TryLogin)
226 207
227 @decorators.Enabled('cros-chrome', 'linux') 208 @decorators.Enabled('chromeos')
228 @mock.patch.object(cros_interface.CrOSInterface, 'RunCmdOnDevice') 209 @mock.patch.object(cros_interface.CrOSInterface, 'RunCmdOnDevice')
229 def testTryLoginStdout(self, mock_run_cmd): 210 def testTryLoginStdout(self, mock_run_cmd):
230 mock_run_cmd.return_value = ('notrooot', '') 211 mock_run_cmd.return_value = ('notrooot', '')
231 cri = cros_interface.CrOSInterface( 212 cri = cros_interface.CrOSInterface(
232 "testhostname", 22, options_for_unittests.GetCopy().cros_ssh_identity) 213 "testhostname", 22, options_for_unittests.GetCopy().cros_ssh_identity)
233 self.assertRaisesRegexp(cros_interface.LoginException, 214 self.assertRaisesRegexp(cros_interface.LoginException,
234 r'Logged into .*, expected \$USER=root, but got .*', 215 r'Logged into .*, expected \$USER=root, but got .*',
235 cri.TryLogin) 216 cri.TryLogin)
OLDNEW
« no previous file with comments | « telemetry/telemetry/core/cros_interface.py ('k') | telemetry/telemetry/core/discover.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698