blob: e382a51b503c886e488b93813f24608c79c3f3c8 [file] [log] [blame]
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# TODO(nduca): Rewrite what some of these tests to use mocks instead of
# actually talking to the device. This would improve our coverage quite
# a bit.
import socket
import tempfile
import unittest
from telemetry import benchmark
from telemetry.core import forwarders
from telemetry.core.backends.chrome import cros_interface
from telemetry.core.forwarders import cros_forwarder
from telemetry.unittest import options_for_unittests
class CrOSInterfaceTest(unittest.TestCase):
@benchmark.Enabled('cros-chrome')
def testPushContents(self):
remote = options_for_unittests.GetCopy().cros_remote
cri = cros_interface.CrOSInterface(
remote,
options_for_unittests.GetCopy().cros_ssh_identity)
cri.RunCmdOnDevice(['rm', '-rf', '/tmp/testPushContents'])
cri.PushContents('hello world', '/tmp/testPushContents')
contents = cri.GetFileContents('/tmp/testPushContents')
self.assertEquals(contents, 'hello world')
@benchmark.Enabled('cros-chrome')
def testExists(self):
remote = options_for_unittests.GetCopy().cros_remote
cri = cros_interface.CrOSInterface(
remote,
options_for_unittests.GetCopy().cros_ssh_identity)
self.assertTrue(cri.FileExistsOnDevice('/proc/cpuinfo'))
self.assertTrue(cri.FileExistsOnDevice('/etc/passwd'))
self.assertFalse(cri.FileExistsOnDevice('/etc/sdlfsdjflskfjsflj'))
@benchmark.Enabled('linux')
def testExistsLocal(self):
cri = cros_interface.CrOSInterface()
self.assertTrue(cri.FileExistsOnDevice('/proc/cpuinfo'))
self.assertTrue(cri.FileExistsOnDevice('/etc/passwd'))
self.assertFalse(cri.FileExistsOnDevice('/etc/sdlfsdjflskfjsflj'))
@benchmark.Enabled('cros-chrome')
def testGetFileContents(self): # pylint: disable=R0201
remote = options_for_unittests.GetCopy().cros_remote
cri = cros_interface.CrOSInterface(
remote,
options_for_unittests.GetCopy().cros_ssh_identity)
hosts = cri.GetFileContents('/etc/lsb-release')
self.assertTrue('CHROMEOS' in hosts)
@benchmark.Enabled('cros-chrome')
def testGetFileContentsNonExistent(self):
remote = options_for_unittests.GetCopy().cros_remote
cri = cros_interface.CrOSInterface(
remote,
options_for_unittests.GetCopy().cros_ssh_identity)
f = tempfile.NamedTemporaryFile()
cri.PushContents('testGetFileNonExistent', f.name)
cri.RmRF(f.name)
self.assertRaises(
OSError,
lambda: cri.GetFileContents(f.name))
@benchmark.Enabled('cros-chrome')
def testGetFile(self): # pylint: disable=R0201
remote = options_for_unittests.GetCopy().cros_remote
cri = cros_interface.CrOSInterface(
remote,
options_for_unittests.GetCopy().cros_ssh_identity)
f = tempfile.NamedTemporaryFile()
cri.GetFile('/etc/lsb-release', f.name)
with open(f.name, 'r') as f2:
res = f2.read()
self.assertTrue('CHROMEOS' in res)
@benchmark.Enabled('cros-chrome')
def testGetFileNonExistent(self):
remote = options_for_unittests.GetCopy().cros_remote
cri = cros_interface.CrOSInterface(
remote,
options_for_unittests.GetCopy().cros_ssh_identity)
f = tempfile.NamedTemporaryFile()
cri.PushContents('testGetFileNonExistent', f.name)
cri.RmRF(f.name)
self.assertRaises(
OSError,
lambda: cri.GetFile(f.name))
@benchmark.Enabled('cros-chrome')
def testIsServiceRunning(self):
remote = options_for_unittests.GetCopy().cros_remote
cri = cros_interface.CrOSInterface(
remote,
options_for_unittests.GetCopy().cros_ssh_identity)
self.assertTrue(cri.IsServiceRunning('openssh-server'))
@benchmark.Enabled('linux')
def testIsServiceRunningLocal(self):
cri = cros_interface.CrOSInterface()
self.assertTrue(cri.IsServiceRunning('dbus'))
@benchmark.Enabled('cros-chrome')
def testGetRemotePortAndIsHTTPServerRunningOnPort(self):
remote = options_for_unittests.GetCopy().cros_remote
cri = cros_interface.CrOSInterface(
remote,
options_for_unittests.GetCopy().cros_ssh_identity)
# Create local server.
sock = socket.socket()
sock.bind(('', 0))
port = sock.getsockname()[1]
sock.listen(0)
# Get remote port and ensure that it was unused.
remote_port = cri.GetRemotePort()
self.assertFalse(cri.IsHTTPServerRunningOnPort(remote_port))
# Forward local server's port to remote device's remote_port.
forwarder = cros_forwarder.CrOsForwarderFactory(cri).Create(
forwarders.PortPairs(http=forwarders.PortPair(port, remote_port),
https=None, dns=None))
# At this point, remote device should be able to connect to local server.
self.assertTrue(cri.IsHTTPServerRunningOnPort(remote_port))
# Next remote port shouldn't be the same as remote_port, since remote_port
# is now in use.
self.assertTrue(cri.GetRemotePort() != remote_port)
# Close forwarder and local server ports.
forwarder.Close()
sock.close()
# Device should no longer be able to connect to remote_port since it is no
# longer in use.
self.assertFalse(cri.IsHTTPServerRunningOnPort(remote_port))
@benchmark.Enabled('cros-chrome')
def testGetRemotePortReservedPorts(self):
remote = options_for_unittests.GetCopy().cros_remote
cri = cros_interface.CrOSInterface(
remote,
options_for_unittests.GetCopy().cros_ssh_identity)
# Should return 2 separate ports even though the first one isn't technically
# being used yet.
remote_port_1 = cri.GetRemotePort()
remote_port_2 = cri.GetRemotePort()
self.assertTrue(remote_port_1 != remote_port_2)
# TODO(tengs): It would be best if we can filter this test and other tests
# that need to be run locally based on the platform of the system browser.
@benchmark.Enabled('linux')
def testEscapeCmdArguments(self):
''' Commands and their arguments that are executed through the cros
interface should follow bash syntax. This test needs to run on remotely
and locally on the device to check for consistency.
'''
cri = cros_interface.CrOSInterface(
options_for_unittests.GetCopy().cros_remote,
options_for_unittests.GetCopy().cros_ssh_identity)
# Check arguments with no special characters
stdout, _ = cri.RunCmdOnDevice(['echo', '--arg1=value1', '--arg2=value2',
'--arg3="value3"'])
assert(stdout.strip() == '--arg1=value1 --arg2=value2 --arg3=value3')
# Check argument with special characters escaped
stdout, _ = cri.RunCmdOnDevice(['echo', '--arg=A\\; echo \\"B\\"'])
assert(stdout.strip() == '--arg=A; echo "B"')
# Check argument with special characters in quotes
stdout, _ = cri.RunCmdOnDevice(['echo', "--arg='$HOME;;$PATH'"])
assert(stdout.strip() == "--arg=$HOME;;$PATH")