| #!/usr/bin/python2 |
| # pylint: disable=missing-docstring |
| |
| import mock |
| import unittest |
| |
| import common |
| |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.server.cros.servo import servo |
| from autotest_lib.server.hosts import cros_host |
| from autotest_lib.server.hosts import servo_constants |
| from autotest_lib.server.hosts import host_info |
| |
| CROSSYSTEM_RESULT = ''' |
| fwb_tries = 0 # Fake comment |
| fw_vboot2 = 1 # Fake comment |
| fwid = Google_Reef.9933.0.0 # Fake comment |
| fwupdate_tries = 0 # |
| fw_tried = B # |
| fw_try_count = 0 # |
| ''' |
| |
| NON_UNI_LSB_RELEASE_OUTPUT = ''' |
| CHROMEOS_RELEASE_BOARD=reef |
| ''' |
| |
| UNI_LSB_RELEASE_OUTPUT = ''' |
| CHROMEOS_RELEASE_BOARD=coral |
| CHROMEOS_RELEASE_UNIBUILD=1 |
| ''' |
| |
| SERVO_STATE_PREFIX = servo_constants.SERVO_STATE_LABEL_PREFIX |
| |
| |
| class MockCmd(object): |
| """Simple mock command with base command and results""" |
| |
| def __init__(self, cmd, exit_status, stdout): |
| self.cmd = cmd |
| self.stdout = stdout |
| self.exit_status = exit_status |
| |
| |
| class MockHost(cros_host.CrosHost): |
| """Simple host for running mock'd host commands""" |
| |
| def __init__(self, *args): |
| self._mock_cmds = {c.cmd: c for c in args} |
| self.hostname = 'MockHost' |
| |
| def run(self, command, **kwargs): |
| """Finds the matching result by command value""" |
| mock_cmd = self._mock_cmds[command] |
| file_out = kwargs.get('stdout_tee', None) |
| if file_out: |
| file_out.write(mock_cmd.stdout) |
| return mock_cmd |
| |
| |
| class GetPlatformModelTests(unittest.TestCase): |
| """Unit tests for CrosHost.get_platform_model""" |
| |
| def test_cros_config_succeeds(self): |
| host = MockHost( |
| MockCmd('cat /etc/lsb-release', 0, UNI_LSB_RELEASE_OUTPUT), |
| MockCmd('cros_config / name', 0, 'coral')) |
| self.assertEqual(host.get_platform(), 'coral') |
| |
| def test_cros_config_resorts_to_fallback(self): |
| host = MockHost( |
| MockCmd('cat /etc/lsb-release', 0, UNI_LSB_RELEASE_OUTPUT), |
| MockCmd('cros_config / name', 1, ''), |
| MockCmd('mosys platform model', 0, 'coral')) |
| self.assertEqual(host.get_platform(), 'coral') |
| |
| def test_cros_config_fails(self): |
| host = MockHost( |
| MockCmd('cat /etc/lsb-release', 0, UNI_LSB_RELEASE_OUTPUT), |
| MockCmd('cros_config / name', 1, ''), |
| MockCmd('mosys platform model', 1, ''), |
| MockCmd('crossystem', 0, CROSSYSTEM_RESULT)) |
| self.assertEqual(host.get_platform(), 'reef') |
| |
| def test_non_unibuild(self): |
| host = MockHost( |
| MockCmd('cat /etc/lsb-release', 0, NON_UNI_LSB_RELEASE_OUTPUT), |
| MockCmd('crossystem', 0, CROSSYSTEM_RESULT)) |
| self.assertEqual(host.get_platform(), 'reef') |
| |
| def test_cat_lsb_fails(self): |
| host = MockHost( |
| MockCmd('cat /etc/lsb-release', 1, ''), |
| MockCmd('crossystem', 0, CROSSYSTEM_RESULT)) |
| self.assertEqual(host.get_platform(), 'reef') |
| |
| |
| class DictFilteringTestCase(unittest.TestCase): |
| """Tests for dict filtering methods on CrosHost.""" |
| |
| def test_get_chameleon_arguments(self): |
| got = cros_host.CrosHost.get_chameleon_arguments({ |
| 'chameleon_host': 'host', |
| 'spam': 'eggs', |
| }) |
| self.assertEqual(got, {'chameleon_host': 'host'}) |
| |
| def test_get_pdtester_arguments(self): |
| got = cros_host.CrosHost.get_pdtester_arguments({ |
| 'pdtester_host': 'host', |
| 'spam': 'eggs', |
| }) |
| self.assertEqual(got, {'pdtester_host': 'host'}) |
| |
| def test_get_servo_arguments(self): |
| got = cros_host.CrosHost.get_servo_arguments({ |
| servo_constants.SERVO_HOST_ATTR: 'host', |
| 'spam': 'eggs', |
| }) |
| self.assertEqual(got, {servo_constants.SERVO_HOST_ATTR: 'host'}) |
| |
| |
| class DictFilteringTestCase(unittest.TestCase): |
| """Test to verify servo_state was set-up as label in host_info_store""" |
| |
| def create_host(self): |
| host = MockHost() |
| host.servo = None |
| host._servo_host = mock.Mock() |
| servo = mock.Mock() |
| servo.get_servo_type.return_value = None |
| host._servo_host.get_servo.return_value = servo |
| host._servo_host.get_servo_state.return_value = 'SOME_STATE' |
| host.host_info_store = host_info.InMemoryHostInfoStore() |
| return host |
| |
| def test_do_not_update_label_when_servo_host_is_not_inited(self): |
| host = self.create_host() |
| host._servo_host = None |
| |
| host.set_servo_state('some_status') |
| self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'some_status') |
| |
| def test_do_not_update_label_when_servo_state_is_None(self): |
| host = self.create_host() |
| |
| host.set_servo_state(None) |
| host._servo_host.get_servo_state.assert_not_called() |
| self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), '') |
| |
| def test_repair_servo_set_servo_state_after_repair_when_repair_is_fail(self): |
| host = self.create_host() |
| host._servo_host.repair.side_effect = Exception('Something bad') |
| |
| try: |
| host.repair_servo() |
| self.assertEqual("Exception is", 'expecting to raise') |
| except: |
| pass |
| host._servo_host.get_servo_state.assert_called() |
| self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE') |
| |
| def test_repair_servo_set_servo_state_after_repair_when_repair_is_not_fail(self): |
| host = self.create_host() |
| try: |
| host.repair_servo() |
| except: |
| self.assertEqual("Exception is not", 'expected') |
| pass |
| host._servo_host.get_servo_state.assert_called() |
| self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE') |
| |
| def test_set_servo_host_update_servo_state_when_host_exist(self): |
| host = self.create_host() |
| host._servo_host = mock.Mock() |
| servo = mock.Mock() |
| servo.get_servo_type.return_value = None |
| host._servo_host.get_servo.return_value = servo |
| host._servo_host.get_servo_state.return_value = 'SOME_STATE' |
| self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), '') |
| |
| try: |
| host.repair_servo() |
| except: |
| self.assertEqual("Exception is not", 'expected') |
| pass |
| host._servo_host.get_servo_state.assert_called() |
| self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE') |
| |
| def test_set_servo_host_use_passed_servo_state_when_host_is_None(self): |
| host = self.create_host() |
| |
| host.set_servo_host(None, 'passed_State') |
| self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'passed_State') |
| |
| def test_set_servo_host_use_servo_state_from_host_when_host_is_passed(self): |
| host = self.create_host() |
| servo_host = mock.Mock() |
| servo = mock.Mock() |
| servo.get_servo_type.return_value = None |
| servo_host.get_servo.return_value = servo |
| servo_host.get_servo_state.return_value = 'state_of_host' |
| |
| host.set_servo_host(servo_host) |
| self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'state_of_host') |
| |
| servo_host.get_servo_state.return_value = 'state_of_host2' |
| host.set_servo_host(servo_host, 'passed_State') |
| self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'state_of_host2') |
| |
| class CrosHostTestCase(unittest.TestCase): |
| """Tests to verify CrosHost.""" |
| |
| class TestCrosHost(cros_host.CrosHost): |
| def __init__(self, *args, **kwargs): |
| self.hostname = 'hostname' |
| self.servo = mock.create_autospec(servo.Servo) |
| |
| @mock.patch('autotest_lib.server.hosts.cros_host.dev_server') |
| def test_stage_build_to_usb(self, devserver_mock): |
| host = self.TestCrosHost() |
| image_server = mock.MagicMock() |
| devserver_mock.ImageServer.resolve.return_value = image_server |
| image_server.get_test_image_url.return_value = 'image_url' |
| |
| host.stage_build_to_usb('board/version') |
| |
| image_server.stage_artifacts.assert_called_with('board/version', ['test_image']) |
| host.servo.image_to_servo_usb.assert_called_with('image_url') |
| |
| host.servo.get_power_state_controller.return_value.power_on.assert_called() |
| |
| @mock.patch('autotest_lib.server.hosts.cros_host.dev_server') |
| def test_stage_build_to_usb_failure(self, devserver_mock): |
| host = self.TestCrosHost() |
| image_server = mock.MagicMock() |
| devserver_mock.ImageServer.resolve.return_value = image_server |
| image_server.get_test_image_url.return_value = 'image_url' |
| host.servo.image_to_servo_usb.side_effect = error.AutotestError('download') |
| |
| with self.assertRaises(error.AutotestError): |
| host.stage_build_to_usb('board/version') |
| |
| host.servo.get_power_state_controller.return_value.power_on.assert_called() |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |