blob: 183e7bedb517b5ce829f109fa880d18109361986 [file] [log] [blame]
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unittests for device.py"""
import subprocess
from unittest import mock
from chromite.lib import cros_build_lib
from chromite.lib import cros_test_lib
from chromite.lib import device
from chromite.lib import remote_access
from chromite.lib import vm
# pylint: disable=protected-access
class DeviceTester(cros_test_lib.RunCommandTestCase):
"""Test device.Device."""
def setUp(self):
"""Common set up method for all tests."""
opts = device.Device.GetParser().parse_args(["--device", "190.0.2.130"])
self._device = device.Device(opts)
def CreateDevice(self, device_name, should_start_vm):
"""Creates a device.
Args:
device_name: Name of the device.
should_start_vm: If True, then created device should be a VM.
"""
created_device = device.Device.Create(
vm.VM.GetParser().parse_args(
["--device", device_name] if device_name else []
)
)
self.assertEqual(isinstance(created_device, vm.VM), should_start_vm)
def testWaitForBoot(self):
self._device.WaitForBoot()
# Verify that ssh command is called with all the right configurations.
self.assertCommandContains(["ssh", "root@190.0.2.130", "--", "true"])
@mock.patch(
"chromite.lib.cros_build_lib.run",
side_effect=remote_access.SSHConnectionError(),
)
def testWaitForBootTimeOut(self, boot_mock):
"""Verify exception is raised when the device takes to0 long to boot."""
self.assertRaises(device.DeviceError, self._device.WaitForBoot, sleep=0)
boot_mock.assert_called()
@mock.patch(
"chromite.lib.device.Device.run",
return_value=cros_build_lib.CompletedProcess(returncode=1),
)
def testWaitForBootReturnCode(self, boot_mock):
"""Verify an exception is raised when the returncode is not 0."""
self.assertRaises(device.DeviceError, self._device.WaitForBoot)
boot_mock.assert_called()
def testRemoteCmd(self):
"""Verify remote command runs correctly with default arguments."""
self._device.run(["/usr/local/autotest/bin/vm_sanity"])
self.assertCommandContains(["/usr/local/autotest/bin/vm_sanity"])
self.assertCommandContains(
stdout=True, stderr=subprocess.STDOUT, log_output=True
)
def testRemoteCmdStream(self):
"""Verify remote command for streaming output."""
self._device.run(
["/usr/local/autotest/bin/vm_sanity"], stream_output=True
)
self.assertCommandContains(capture_output=False)
self.assertCommandContains(
stderr=subprocess.STDOUT, log_output=True, expected=False
)
def testCreate(self):
"""Verify Device/VM creation."""
# Verify a VM is created when no IP is specified.
self.CreateDevice(None, True)
# Verify a VM isn't created, even if IP address is localhost. This can
# happen when SSH tunneling to a remote DUT.
self.CreateDevice("localhost:12345", False)
# Verify a Device is created when an IP is specified.
self.CreateDevice("190.0.2.130", False)