Mike Frysinger | d03e6b5 | 2019-08-03 12:49:01 -0400 | [diff] [blame] | 1 | #!/usr/bin/python2 |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 2 | # pylint: disable=missing-docstring |
| 3 | |
Otabek Kasimov | cc9738e | 2020-02-14 16:17:15 -0800 | [diff] [blame] | 4 | import mock |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 5 | import unittest |
C Shapiro | 218e875 | 2017-09-22 11:10:57 -0600 | [diff] [blame] | 6 | |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 7 | import common |
| 8 | |
Andrew Luo | b0355ea | 2020-06-24 16:12:57 -0700 | [diff] [blame] | 9 | from autotest_lib.client.common_lib import error |
Andrew Luo | 3332ab2 | 2020-04-28 16:42:03 -0700 | [diff] [blame] | 10 | from autotest_lib.server.cros.servo import servo |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 11 | from autotest_lib.server.hosts import cros_host |
Garry Wang | 11b5e87 | 2020-03-11 15:14:08 -0700 | [diff] [blame] | 12 | from autotest_lib.server.hosts import servo_constants |
Otabek Kasimov | cc9738e | 2020-02-14 16:17:15 -0800 | [diff] [blame] | 13 | from autotest_lib.server.hosts import host_info |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 14 | |
C Shapiro | 218e875 | 2017-09-22 11:10:57 -0600 | [diff] [blame] | 15 | CROSSYSTEM_RESULT = ''' |
| 16 | fwb_tries = 0 # Fake comment |
| 17 | fw_vboot2 = 1 # Fake comment |
| 18 | fwid = Google_Reef.9933.0.0 # Fake comment |
| 19 | fwupdate_tries = 0 # |
| 20 | fw_tried = B # |
| 21 | fw_try_count = 0 # |
| 22 | ''' |
| 23 | |
C Shapiro | ed87c6f | 2018-04-19 09:13:58 -0600 | [diff] [blame] | 24 | NON_UNI_LSB_RELEASE_OUTPUT = ''' |
| 25 | CHROMEOS_RELEASE_BOARD=reef |
| 26 | ''' |
| 27 | |
| 28 | UNI_LSB_RELEASE_OUTPUT = ''' |
| 29 | CHROMEOS_RELEASE_BOARD=coral |
| 30 | CHROMEOS_RELEASE_UNIBUILD=1 |
| 31 | ''' |
| 32 | |
Garry Wang | 11b5e87 | 2020-03-11 15:14:08 -0700 | [diff] [blame] | 33 | SERVO_STATE_PREFIX = servo_constants.SERVO_STATE_LABEL_PREFIX |
Otabek Kasimov | cc9738e | 2020-02-14 16:17:15 -0800 | [diff] [blame] | 34 | |
| 35 | |
C Shapiro | 218e875 | 2017-09-22 11:10:57 -0600 | [diff] [blame] | 36 | class MockCmd(object): |
| 37 | """Simple mock command with base command and results""" |
| 38 | |
| 39 | def __init__(self, cmd, exit_status, stdout): |
| 40 | self.cmd = cmd |
| 41 | self.stdout = stdout |
| 42 | self.exit_status = exit_status |
| 43 | |
| 44 | |
| 45 | class MockHost(cros_host.CrosHost): |
| 46 | """Simple host for running mock'd host commands""" |
| 47 | |
| 48 | def __init__(self, *args): |
| 49 | self._mock_cmds = {c.cmd: c for c in args} |
Garry Wang | 000c6c0 | 2020-05-11 21:27:23 -0700 | [diff] [blame] | 50 | self.hostname = 'MockHost' |
C Shapiro | 218e875 | 2017-09-22 11:10:57 -0600 | [diff] [blame] | 51 | |
| 52 | def run(self, command, **kwargs): |
| 53 | """Finds the matching result by command value""" |
| 54 | mock_cmd = self._mock_cmds[command] |
| 55 | file_out = kwargs.get('stdout_tee', None) |
| 56 | if file_out: |
| 57 | file_out.write(mock_cmd.stdout) |
| 58 | return mock_cmd |
| 59 | |
| 60 | |
| 61 | class GetPlatformModelTests(unittest.TestCase): |
| 62 | """Unit tests for CrosHost.get_platform_model""" |
| 63 | |
Greg Edelston | a7b05d1 | 2020-04-01 16:00:51 -0600 | [diff] [blame] | 64 | def test_cros_config_succeeds(self): |
C Shapiro | ed87c6f | 2018-04-19 09:13:58 -0600 | [diff] [blame] | 65 | host = MockHost( |
| 66 | MockCmd('cat /etc/lsb-release', 0, UNI_LSB_RELEASE_OUTPUT), |
Greg Edelston | a7b05d1 | 2020-04-01 16:00:51 -0600 | [diff] [blame] | 67 | MockCmd('cros_config / name', 0, 'coral')) |
C Shapiro | 218e875 | 2017-09-22 11:10:57 -0600 | [diff] [blame] | 68 | self.assertEqual(host.get_platform(), 'coral') |
| 69 | |
Greg Edelston | a7b05d1 | 2020-04-01 16:00:51 -0600 | [diff] [blame] | 70 | def test_cros_config_resorts_to_fallback(self): |
C Shapiro | 218e875 | 2017-09-22 11:10:57 -0600 | [diff] [blame] | 71 | host = MockHost( |
C Shapiro | ed87c6f | 2018-04-19 09:13:58 -0600 | [diff] [blame] | 72 | MockCmd('cat /etc/lsb-release', 0, UNI_LSB_RELEASE_OUTPUT), |
Greg Edelston | a7b05d1 | 2020-04-01 16:00:51 -0600 | [diff] [blame] | 73 | MockCmd('cros_config / name', 1, ''), |
| 74 | MockCmd('mosys platform model', 0, 'coral')) |
| 75 | self.assertEqual(host.get_platform(), 'coral') |
| 76 | |
| 77 | def test_cros_config_fails(self): |
| 78 | host = MockHost( |
| 79 | MockCmd('cat /etc/lsb-release', 0, UNI_LSB_RELEASE_OUTPUT), |
| 80 | MockCmd('cros_config / name', 1, ''), |
C Shapiro | ed87c6f | 2018-04-19 09:13:58 -0600 | [diff] [blame] | 81 | MockCmd('mosys platform model', 1, ''), |
| 82 | MockCmd('crossystem', 0, CROSSYSTEM_RESULT)) |
| 83 | self.assertEqual(host.get_platform(), 'reef') |
| 84 | |
| 85 | def test_non_unibuild(self): |
| 86 | host = MockHost( |
| 87 | MockCmd('cat /etc/lsb-release', 0, NON_UNI_LSB_RELEASE_OUTPUT), |
| 88 | MockCmd('crossystem', 0, CROSSYSTEM_RESULT)) |
| 89 | self.assertEqual(host.get_platform(), 'reef') |
| 90 | |
| 91 | def test_cat_lsb_fails(self): |
| 92 | host = MockHost( |
| 93 | MockCmd('cat /etc/lsb-release', 1, ''), |
| 94 | MockCmd('crossystem', 0, CROSSYSTEM_RESULT)) |
C Shapiro | 218e875 | 2017-09-22 11:10:57 -0600 | [diff] [blame] | 95 | self.assertEqual(host.get_platform(), 'reef') |
| 96 | |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 97 | |
| 98 | class DictFilteringTestCase(unittest.TestCase): |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 99 | """Tests for dict filtering methods on CrosHost.""" |
| 100 | |
| 101 | def test_get_chameleon_arguments(self): |
| 102 | got = cros_host.CrosHost.get_chameleon_arguments({ |
| 103 | 'chameleon_host': 'host', |
| 104 | 'spam': 'eggs', |
| 105 | }) |
| 106 | self.assertEqual(got, {'chameleon_host': 'host'}) |
| 107 | |
Wai-Hong Tam | 0ed9fe1 | 2019-05-23 11:00:58 -0700 | [diff] [blame] | 108 | def test_get_pdtester_arguments(self): |
| 109 | got = cros_host.CrosHost.get_pdtester_arguments({ |
| 110 | 'pdtester_host': 'host', |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 111 | 'spam': 'eggs', |
| 112 | }) |
Wai-Hong Tam | 0ed9fe1 | 2019-05-23 11:00:58 -0700 | [diff] [blame] | 113 | self.assertEqual(got, {'pdtester_host': 'host'}) |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 114 | |
| 115 | def test_get_servo_arguments(self): |
| 116 | got = cros_host.CrosHost.get_servo_arguments({ |
Garry Wang | 11b5e87 | 2020-03-11 15:14:08 -0700 | [diff] [blame] | 117 | servo_constants.SERVO_HOST_ATTR: 'host', |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 118 | 'spam': 'eggs', |
| 119 | }) |
Garry Wang | 11b5e87 | 2020-03-11 15:14:08 -0700 | [diff] [blame] | 120 | self.assertEqual(got, {servo_constants.SERVO_HOST_ATTR: 'host'}) |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 121 | |
| 122 | |
Otabek Kasimov | cc9738e | 2020-02-14 16:17:15 -0800 | [diff] [blame] | 123 | class DictFilteringTestCase(unittest.TestCase): |
| 124 | """Test to verify servo_state was set-up as label in host_info_store""" |
| 125 | |
| 126 | def create_host(self): |
| 127 | host = MockHost() |
| 128 | host.servo = None |
| 129 | host._servo_host = mock.Mock() |
Otabek Kasimov | 41301a2 | 2020-05-10 15:28:21 -0700 | [diff] [blame] | 130 | servo = mock.Mock() |
| 131 | servo.get_servo_type.return_value = None |
| 132 | host._servo_host.get_servo.return_value = servo |
Otabek Kasimov | cc9738e | 2020-02-14 16:17:15 -0800 | [diff] [blame] | 133 | host._servo_host.get_servo_state.return_value = 'SOME_STATE' |
| 134 | host.host_info_store = host_info.InMemoryHostInfoStore() |
Otabek Kasimov | cc9738e | 2020-02-14 16:17:15 -0800 | [diff] [blame] | 135 | return host |
| 136 | |
| 137 | def test_do_not_update_label_when_servo_host_is_not_inited(self): |
| 138 | host = self.create_host() |
| 139 | host._servo_host = None |
| 140 | |
Otabek Kasimov | a7ba91a | 2020-03-09 08:31:01 -0700 | [diff] [blame] | 141 | host.set_servo_state('some_status') |
| 142 | self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'some_status') |
Otabek Kasimov | cc9738e | 2020-02-14 16:17:15 -0800 | [diff] [blame] | 143 | |
Otabek Kasimov | a7ba91a | 2020-03-09 08:31:01 -0700 | [diff] [blame] | 144 | def test_do_not_update_label_when_servo_state_is_None(self): |
Shelley Chen | 905f127 | 2020-03-06 20:52:07 +0000 | [diff] [blame] | 145 | host = self.create_host() |
| 146 | |
Otabek Kasimov | a7ba91a | 2020-03-09 08:31:01 -0700 | [diff] [blame] | 147 | host.set_servo_state(None) |
| 148 | host._servo_host.get_servo_state.assert_not_called() |
| 149 | self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), '') |
Shelley Chen | 905f127 | 2020-03-06 20:52:07 +0000 | [diff] [blame] | 150 | |
Otabek Kasimov | a7ba91a | 2020-03-09 08:31:01 -0700 | [diff] [blame] | 151 | def test_repair_servo_set_servo_state_after_repair_when_repair_is_fail(self): |
Otabek Kasimov | cc9738e | 2020-02-14 16:17:15 -0800 | [diff] [blame] | 152 | host = self.create_host() |
| 153 | host._servo_host.repair.side_effect = Exception('Something bad') |
| 154 | |
| 155 | try: |
| 156 | host.repair_servo() |
| 157 | self.assertEqual("Exception is", 'expecting to raise') |
| 158 | except: |
| 159 | pass |
| 160 | host._servo_host.get_servo_state.assert_called() |
| 161 | self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE') |
| 162 | |
Otabek Kasimov | a7ba91a | 2020-03-09 08:31:01 -0700 | [diff] [blame] | 163 | def test_repair_servo_set_servo_state_after_repair_when_repair_is_not_fail(self): |
Otabek Kasimov | cc9738e | 2020-02-14 16:17:15 -0800 | [diff] [blame] | 164 | host = self.create_host() |
| 165 | try: |
| 166 | host.repair_servo() |
| 167 | except: |
| 168 | self.assertEqual("Exception is not", 'expected') |
| 169 | pass |
| 170 | host._servo_host.get_servo_state.assert_called() |
| 171 | self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE') |
| 172 | |
| 173 | def test_set_servo_host_update_servo_state_when_host_exist(self): |
| 174 | host = self.create_host() |
| 175 | host._servo_host = mock.Mock() |
Otabek Kasimov | 41301a2 | 2020-05-10 15:28:21 -0700 | [diff] [blame] | 176 | servo = mock.Mock() |
| 177 | servo.get_servo_type.return_value = None |
| 178 | host._servo_host.get_servo.return_value = servo |
Otabek Kasimov | cc9738e | 2020-02-14 16:17:15 -0800 | [diff] [blame] | 179 | host._servo_host.get_servo_state.return_value = 'SOME_STATE' |
| 180 | self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), '') |
| 181 | |
| 182 | try: |
| 183 | host.repair_servo() |
| 184 | except: |
| 185 | self.assertEqual("Exception is not", 'expected') |
| 186 | pass |
| 187 | host._servo_host.get_servo_state.assert_called() |
| 188 | self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE') |
| 189 | |
Otabek Kasimov | a7ba91a | 2020-03-09 08:31:01 -0700 | [diff] [blame] | 190 | def test_set_servo_host_use_passed_servo_state_when_host_is_None(self): |
| 191 | host = self.create_host() |
| 192 | |
| 193 | host.set_servo_host(None, 'passed_State') |
| 194 | self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'passed_State') |
| 195 | |
| 196 | def test_set_servo_host_use_servo_state_from_host_when_host_is_passed(self): |
| 197 | host = self.create_host() |
| 198 | servo_host = mock.Mock() |
Otabek Kasimov | 41301a2 | 2020-05-10 15:28:21 -0700 | [diff] [blame] | 199 | servo = mock.Mock() |
| 200 | servo.get_servo_type.return_value = None |
| 201 | servo_host.get_servo.return_value = servo |
Otabek Kasimov | a7ba91a | 2020-03-09 08:31:01 -0700 | [diff] [blame] | 202 | servo_host.get_servo_state.return_value = 'state_of_host' |
| 203 | |
| 204 | host.set_servo_host(servo_host) |
| 205 | self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'state_of_host') |
| 206 | |
| 207 | servo_host.get_servo_state.return_value = 'state_of_host2' |
| 208 | host.set_servo_host(servo_host, 'passed_State') |
| 209 | self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'state_of_host2') |
Otabek Kasimov | cc9738e | 2020-02-14 16:17:15 -0800 | [diff] [blame] | 210 | |
Andrew Luo | 3332ab2 | 2020-04-28 16:42:03 -0700 | [diff] [blame] | 211 | class CrosHostTestCase(unittest.TestCase): |
| 212 | """Tests to verify CrosHost.""" |
| 213 | |
| 214 | class TestCrosHost(cros_host.CrosHost): |
| 215 | def __init__(self, *args, **kwargs): |
| 216 | self.hostname = 'hostname' |
| 217 | self.servo = mock.create_autospec(servo.Servo) |
| 218 | |
| 219 | @mock.patch('autotest_lib.server.hosts.cros_host.dev_server') |
| 220 | def test_stage_build_to_usb(self, devserver_mock): |
| 221 | host = self.TestCrosHost() |
| 222 | image_server = mock.MagicMock() |
| 223 | devserver_mock.ImageServer.resolve.return_value = image_server |
| 224 | image_server.get_test_image_url.return_value = 'image_url' |
| 225 | |
| 226 | host.stage_build_to_usb('board/version') |
| 227 | |
| 228 | image_server.stage_artifacts.assert_called_with('board/version', ['test_image']) |
| 229 | host.servo.image_to_servo_usb.assert_called_with('image_url') |
| 230 | |
Andrew Luo | b0355ea | 2020-06-24 16:12:57 -0700 | [diff] [blame] | 231 | host.servo.get_power_state_controller.return_value.power_on.assert_called() |
| 232 | |
| 233 | @mock.patch('autotest_lib.server.hosts.cros_host.dev_server') |
| 234 | def test_stage_build_to_usb_failure(self, devserver_mock): |
| 235 | host = self.TestCrosHost() |
| 236 | image_server = mock.MagicMock() |
| 237 | devserver_mock.ImageServer.resolve.return_value = image_server |
| 238 | image_server.get_test_image_url.return_value = 'image_url' |
| 239 | host.servo.image_to_servo_usb.side_effect = error.AutotestError('download') |
| 240 | |
| 241 | with self.assertRaises(error.AutotestError): |
| 242 | host.stage_build_to_usb('board/version') |
| 243 | |
| 244 | host.servo.get_power_state_controller.return_value.power_on.assert_called() |
| 245 | |
| 246 | |
Allen Li | 083866b | 2016-08-18 10:07:10 -0700 | [diff] [blame] | 247 | if __name__ == "__main__": |
| 248 | unittest.main() |