1#!/usr/bin/python2 2# pylint: disable=missing-docstring 3 4import mock 5import unittest 6 7import common 8 9from autotest_lib.server.hosts import cros_host 10from autotest_lib.server.hosts import servo_host 11from autotest_lib.server.hosts import host_info 12 13CROSSYSTEM_RESULT = ''' 14fwb_tries = 0 # Fake comment 15fw_vboot2 = 1 # Fake comment 16fwid = Google_Reef.9933.0.0 # Fake comment 17fwupdate_tries = 0 # 18fw_tried = B # 19fw_try_count = 0 # 20''' 21 22NON_UNI_LSB_RELEASE_OUTPUT = ''' 23CHROMEOS_RELEASE_BOARD=reef 24''' 25 26UNI_LSB_RELEASE_OUTPUT = ''' 27CHROMEOS_RELEASE_BOARD=coral 28CHROMEOS_RELEASE_UNIBUILD=1 29''' 30 31SERVO_STATE_PREFIX = servo_host.SERVO_STATE_LABEL_PREFIX 32 33 34class MockCmd(object): 35 """Simple mock command with base command and results""" 36 37 def __init__(self, cmd, exit_status, stdout): 38 self.cmd = cmd 39 self.stdout = stdout 40 self.exit_status = exit_status 41 42 43class MockHost(cros_host.CrosHost): 44 """Simple host for running mock'd host commands""" 45 46 def __init__(self, *args): 47 self._mock_cmds = {c.cmd: c for c in args} 48 49 def run(self, command, **kwargs): 50 """Finds the matching result by command value""" 51 mock_cmd = self._mock_cmds[command] 52 file_out = kwargs.get('stdout_tee', None) 53 if file_out: 54 file_out.write(mock_cmd.stdout) 55 return mock_cmd 56 57 58class GetPlatformModelTests(unittest.TestCase): 59 """Unit tests for CrosHost.get_platform_model""" 60 61 def test_mosys_succeeds(self): 62 host = MockHost( 63 MockCmd('cat /etc/lsb-release', 0, UNI_LSB_RELEASE_OUTPUT), 64 MockCmd('mosys platform model', 0, 'coral\n')) 65 self.assertEqual(host.get_platform(), 'coral') 66 67 def test_mosys_fails(self): 68 host = MockHost( 69 MockCmd('cat /etc/lsb-release', 0, UNI_LSB_RELEASE_OUTPUT), 70 MockCmd('mosys platform model', 1, ''), 71 MockCmd('crossystem', 0, CROSSYSTEM_RESULT)) 72 self.assertEqual(host.get_platform(), 'reef') 73 74 def test_non_unibuild(self): 75 host = MockHost( 76 MockCmd('cat /etc/lsb-release', 0, NON_UNI_LSB_RELEASE_OUTPUT), 77 MockCmd('crossystem', 0, CROSSYSTEM_RESULT)) 78 self.assertEqual(host.get_platform(), 'reef') 79 80 def test_cat_lsb_fails(self): 81 host = MockHost( 82 MockCmd('cat /etc/lsb-release', 1, ''), 83 MockCmd('crossystem', 0, CROSSYSTEM_RESULT)) 84 self.assertEqual(host.get_platform(), 'reef') 85 86 87class DictFilteringTestCase(unittest.TestCase): 88 """Tests for dict filtering methods on CrosHost.""" 89 90 def test_get_chameleon_arguments(self): 91 got = cros_host.CrosHost.get_chameleon_arguments({ 92 'chameleon_host': 'host', 93 'spam': 'eggs', 94 }) 95 self.assertEqual(got, {'chameleon_host': 'host'}) 96 97 def test_get_pdtester_arguments(self): 98 got = cros_host.CrosHost.get_pdtester_arguments({ 99 'pdtester_host': 'host', 100 'spam': 'eggs', 101 }) 102 self.assertEqual(got, {'pdtester_host': 'host'}) 103 104 def test_get_servo_arguments(self): 105 got = cros_host.CrosHost.get_servo_arguments({ 106 servo_host.SERVO_HOST_ATTR: 'host', 107 'spam': 'eggs', 108 }) 109 self.assertEqual(got, {servo_host.SERVO_HOST_ATTR: 'host'}) 110 111 112class DictFilteringTestCase(unittest.TestCase): 113 """Test to verify servo_state was set-up as label in host_info_store""" 114 115 def create_host(self): 116 host = MockHost() 117 host.servo = None 118 host._servo_host = mock.Mock() 119 host._servo_host.get_servo.return_value = 'Not Empty' 120 host._servo_host.get_servo_state.return_value = 'SOME_STATE' 121 host.host_info_store = host_info.InMemoryHostInfoStore() 122 self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), '') 123 return host 124 125 def test_do_not_update_label_when_servo_host_is_not_inited(self): 126 host = self.create_host() 127 host._servo_host = None 128 129 host._update_servo_labels() 130 self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), '') 131 132 def test_do_not_update_label_when_servo_host_is_inited(self): 133 host = self.create_host() 134 135 host._update_servo_labels() 136 host._servo_host.get_servo_state.assert_called() 137 self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE') 138 139 def test_repair_servo__update_servo_labels_after_repair_when_repair_is_fail(self): 140 host = self.create_host() 141 host._servo_host.repair.side_effect = Exception('Something bad') 142 143 try: 144 host.repair_servo() 145 self.assertEqual("Exception is", 'expecting to raise') 146 except: 147 pass 148 host._servo_host.get_servo_state.assert_called() 149 self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE') 150 151 def test_repair_servo__update_servo_labels_after_repair_when_repair_is_not_fail(self): 152 host = self.create_host() 153 try: 154 host.repair_servo() 155 except: 156 self.assertEqual("Exception is not", 'expected') 157 pass 158 host._servo_host.get_servo_state.assert_called() 159 self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE') 160 161 def test_set_servo_host_update_servo_state_when_host_exist(self): 162 host = self.create_host() 163 host._servo_host = mock.Mock() 164 host._servo_host.get_servo.return_value = 'Not Empty' 165 host._servo_host.get_servo_state.return_value = 'SOME_STATE' 166 self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), '') 167 168 try: 169 host.repair_servo() 170 except: 171 self.assertEqual("Exception is not", 'expected') 172 pass 173 host._servo_host.get_servo_state.assert_called() 174 self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE') 175 176 177if __name__ == "__main__": 178 unittest.main() 179 180