You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
8.4 KiB
224 lines
8.4 KiB
# Copyright (c) 2020 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import mock
|
|
import re
|
|
import unittest
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.server.cros.faft import firmware_test
|
|
|
|
|
|
class TestRunOnce(unittest.TestCase):
|
|
"""Tests that run_once works as expected."""
|
|
class GoodFirmwareTest(firmware_test.FirmwareTest):
|
|
"""A FirmwareTest stub providing the parts that should be tested."""
|
|
def __init__(self, *_args, **_dargs):
|
|
# pylint: disable=super-init-not-called
|
|
"""Init logic in FirmwareTest is not relevant to this test."""
|
|
self.test = mock.MagicMock()
|
|
self.test_good = mock.MagicMock()
|
|
self.test_good_better = mock.MagicMock()
|
|
self.test_host_mock = mock.MagicMock()
|
|
self.test_arg2_mock = mock.MagicMock()
|
|
|
|
def test_host(self, host, **kwargs):
|
|
"""Get at the 'host' mock"""
|
|
self.test_host_mock(host, **kwargs)
|
|
|
|
def test_arg2(self, arg2):
|
|
"""Get at the 'arg2' mock"""
|
|
self.test_arg2_mock(arg2)
|
|
|
|
def test_keyword_test_name(self):
|
|
"""Test that keyworded test names work"""
|
|
ft = self.GoodFirmwareTest()
|
|
|
|
ft.run_once(test_name='GoodFirmwareTest.good')
|
|
ft.test_good.assert_called_with()
|
|
|
|
ft.run_once('arg1', test_name='GoodFirmwareTest.good', arg2='arg2')
|
|
ft.test_good.assert_called_with('arg1', arg2='arg2')
|
|
|
|
def test_positional_test_name(self):
|
|
"""Test that positional test names work"""
|
|
ft = self.GoodFirmwareTest()
|
|
|
|
ft.run_once('GoodFirmwareTest.good')
|
|
ft.test_good.assert_called_with()
|
|
|
|
ft.run_once('GoodFirmwareTest.good', 'arg1', arg2='arg2')
|
|
ft.test_good.assert_called_with('arg1', arg2='arg2')
|
|
|
|
def test_no_test_name(self):
|
|
"""Test that running a whole test class works"""
|
|
ft = self.GoodFirmwareTest()
|
|
|
|
ft.run_once('GoodFirmwareTest')
|
|
ft.test.assert_called_with()
|
|
|
|
ft.run_once('GoodFirmwareTest', 'arg1', arg2='arg2')
|
|
ft.test.assert_called_with('arg1', arg2='arg2')
|
|
|
|
def test_sub_test_name(self):
|
|
"""Test that sub tests can be executed"""
|
|
ft = self.GoodFirmwareTest()
|
|
|
|
ft.run_once('GoodFirmwareTest.good.better')
|
|
ft.test_good_better.assert_called_with()
|
|
|
|
ft.run_once('GoodFirmwareTest.good.better', 'arg1', arg2='arg2')
|
|
ft.test_good_better.assert_called_with('arg1', arg2='arg2')
|
|
|
|
def test_missing_test_name(self):
|
|
"""Test that a test name must be passed"""
|
|
ft = self.GoodFirmwareTest()
|
|
|
|
with self.assertRaises(error.TestError):
|
|
ft.run_once()
|
|
|
|
def test_bad_class_name(self):
|
|
"""Test that the class name must be valid"""
|
|
ft = self.GoodFirmwareTest()
|
|
|
|
with self.assertRaises(error.TestError):
|
|
ft.run_once(test_name='BadFirmwareTest')
|
|
|
|
def test_bad_method_name(self):
|
|
"""Test that the method must be valid"""
|
|
ft = self.GoodFirmwareTest()
|
|
|
|
with self.assertRaises(error.TestError):
|
|
ft.run_once(test_name='GoodFirmwareTest.bad')
|
|
|
|
def test_host_arg(self):
|
|
"""Test operation with host arg used"""
|
|
ft = self.GoodFirmwareTest()
|
|
|
|
ft.run_once('GoodFirmwareTest.host', host='host', arg2='arg2')
|
|
ft.test_host_mock.assert_called_with('host', arg2='arg2')
|
|
|
|
def test_arg2(self):
|
|
"""Test operation with arg2 used"""
|
|
ft = self.GoodFirmwareTest()
|
|
|
|
ft.run_once('GoodFirmwareTest.arg2', host='host', arg2='arg2')
|
|
ft.test_arg2_mock.assert_called_with('arg2')
|
|
|
|
|
|
class TestCheckPowerState(unittest.TestCase):
|
|
"""Test that power_state matching is precise"""
|
|
# Mock out EC behavior to return definable power states
|
|
class MockedECFirmwareTest(firmware_test.FirmwareTest):
|
|
"""A stubbed out FirmwareTest to check the precision behavior"""
|
|
class FakeEC:
|
|
"""A stub EC class providing what's needed for this test"""
|
|
def __init__(self):
|
|
self.test = None
|
|
self.match = None
|
|
|
|
def set_test_string(self, s):
|
|
"""Sets the string to test again"""
|
|
self.test = s
|
|
|
|
def send_command_get_output(self, _cmd, regex_list):
|
|
"""Stub to simulate matching EC output against regex_list"""
|
|
self.match = None
|
|
|
|
for r in regex_list:
|
|
result = re.search(r, self.test)
|
|
if result is not None:
|
|
self.match = result.group(0)
|
|
break
|
|
|
|
def __init__(self, *_args, **_dargs):
|
|
# pylint: disable=super-init-not-called
|
|
self.ec = self.FakeEC()
|
|
|
|
# power_state is supposed to be a string, but lists seem somewhat common,
|
|
# so guard against them.
|
|
def test_fails_on_list(self):
|
|
ft = self.MockedECFirmwareTest()
|
|
|
|
with self.assertRaises(error.TestError):
|
|
ft._check_power_state([])
|
|
|
|
def test_s0ix_isnt_s0(self):
|
|
ft = self.MockedECFirmwareTest()
|
|
|
|
ft.ec.set_test_string("S0ix")
|
|
ft._check_power_state("S0")
|
|
self.assertIsNone(ft.ec.match)
|
|
|
|
def test_s0_in_parens_is_found(self):
|
|
ft = self.MockedECFirmwareTest()
|
|
|
|
ft.ec.set_test_string("(S0)")
|
|
ft._check_power_state("S0")
|
|
self.assertEqual(ft.ec.match, "S0")
|
|
|
|
|
|
class Test_stage_build_to_usbkey(unittest.TestCase):
|
|
class MockFirmwareTest(firmware_test.FirmwareTest):
|
|
def __init__(self):
|
|
self._client = mock.MagicMock()
|
|
|
|
def setUp(self):
|
|
self.test = self.MockFirmwareTest()
|
|
|
|
def test_stage_build_to_usbkey(self):
|
|
self.test._client.host_info_store.get.return_value.build = "dummy_build"
|
|
self.test._client._servo_host.validate_image_usbkey.return_value = (
|
|
"another_build")
|
|
self.assertTrue(self.test.stage_build_to_usbkey())
|
|
self.test._client.stage_build_to_usb.assert_called_with("dummy_build")
|
|
|
|
def test_stage_build_to_usbkey_same_build(self):
|
|
self.test._client.host_info_store.get.return_value.build = "dummy_build"
|
|
self.test._client._servo_host.validate_image_usbkey.return_value = (
|
|
"dummy_build")
|
|
self.assertTrue(self.test.stage_build_to_usbkey())
|
|
self.test._client.stage_build_to_usb.assert_not_called()
|
|
|
|
def test_stage_build_to_usbkey_no_build(self):
|
|
self.test._client.host_info_store.get.return_value.build = None
|
|
self.assertFalse(self.test.stage_build_to_usbkey())
|
|
self.test._client.stage_build_to_usb.assert_not_called()
|
|
|
|
def test_stage_build_to_usbkey_download_error(self):
|
|
self.test._client.host_info_store.get.return_value.build = "dummy_build"
|
|
self.test._client._servo_host.validate_image_usbkey.return_value = (
|
|
"another_build")
|
|
self.test._client.stage_build_to_usb = (
|
|
mock.MagicMock(side_effect=error.AutotestError("download")))
|
|
self.assertFalse(self.test.stage_build_to_usbkey())
|
|
self.test._client.stage_build_to_usb.assert_called_with("dummy_build")
|
|
|
|
def test_setup_usbkey(self):
|
|
self.test._client.host_info_store.get.return_value.build = "dummy_build"
|
|
self.test._client._servo_host.validate_image_usbkey.return_value = (
|
|
"another_build")
|
|
self.test.assert_test_image_in_usb_disk = mock.MagicMock()
|
|
self.test.set_servo_v4_role_to_snk = mock.MagicMock()
|
|
self.test.setup_usbkey(usbkey=True)
|
|
self.test._client.stage_build_to_usb.assert_called_with("dummy_build")
|
|
self.test.assert_test_image_in_usb_disk.assert_called()
|
|
self.test.set_servo_v4_role_to_snk.assert_called()
|
|
|
|
def test_setup_usbkey_no_stage(self):
|
|
self.test._client.host_info_store.get.return_value.build = "dummy_build"
|
|
self.test._client._servo_host.validate_image_usbkey.return_value = (
|
|
"another_build")
|
|
self.test.assert_test_image_in_usb_disk = mock.MagicMock()
|
|
self.test.set_servo_v4_role_to_snk = mock.MagicMock()
|
|
self.test.servo = mock.MagicMock()
|
|
self.test.setup_usbkey(usbkey=False)
|
|
self.test._client.stage_build_to_usb.assert_not_called()
|
|
self.test.assert_test_image_in_usb_disk.assert_not_called()
|
|
self.test.servo.switch_usbkey.assert_called_with('host')
|
|
self.test.set_servo_v4_role_to_snk.assert_not_called()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|