1import re 2import unittest 3from unittest import mock 4 5import common 6 7from autotest_lib.server.hosts import servo_host 8from autotest_lib.server.hosts import servo_constants 9 10 11class MockCmd(object): 12 """Simple mock command with base command and results""" 13 14 def __init__(self, cmd, exit_status, stdout): 15 self.cmd = cmd 16 self.stdout = stdout 17 self.exit_status = exit_status 18 19 20class MockHost(servo_host.ServoHost): 21 """Simple host for running mock'd host commands""" 22 23 def __init__(self, *args): 24 self._mock_cmds = {c.cmd: c for c in args} 25 self._init_attributes() 26 self.hostname = "chromeos1-row1-rack1-host1" 27 self._dut_hostname = 'dut-' + self.hostname 28 self.servo_port = '9991' 29 self._is_localhost = False 30 self._use_icmp = True 31 self._is_containerized_servod = False 32 33 def run(self, command, **kwargs): 34 """Finds the matching result by command value""" 35 mock_cmd = self._mock_cmds[command] 36 file_out = kwargs.get('stdout_tee', None) 37 if file_out: 38 file_out.write(mock_cmd.stdout) 39 return mock_cmd 40 41 42class ServoHostServoStateTestCase(unittest.TestCase): 43 """Tests to verify changing the servo_state""" 44 def test_return_none_if_state_not_defined(self): 45 host = MockHost() 46 self.assertIsNotNone(host) 47 self.assertIsNone(host._servo_state) 48 self.assertIsNone(host.get_servo_state()) 49 self.assertEqual(host._servo_state, None) 50 51 def test_verify_set_state_broken_if_raised_error(self): 52 host = MockHost() 53 host._is_localhost = False 54 host._repair_strategy = mock.Mock() 55 host._repair_strategy.verify.side_effect = Exception('something_ex') 56 try: 57 host.verify(silent=True) 58 self.assertEqual("Should not be reached", 'expecting error') 59 except: 60 pass 61 self.assertEqual(host.get_servo_state(), 62 servo_constants.SERVO_STATE_BROKEN) 63 64 def test_verify_set_state_working_if_no_raised_error(self): 65 host = MockHost() 66 host._repair_strategy = mock.Mock() 67 host.verify(silent=True) 68 self.assertEqual(host.get_servo_state(), 69 servo_constants.SERVO_STATE_WORKING) 70 71 def test_repair_set_state_broken_if_raised_error(self): 72 host = MockHost() 73 host._is_localhost = False 74 host._repair_strategy = mock.Mock() 75 host._repair_strategy.repair.side_effect = Exception('something_ex') 76 try: 77 host.repair(silent=True) 78 self.assertEqual("Should not be reached", 'expecting error') 79 except: 80 pass 81 self.assertEqual(host.get_servo_state(), 82 servo_constants.SERVO_STATE_BROKEN) 83 84 def test_repair_set_state_working_if_no_raised_error(self): 85 host = MockHost() 86 host._is_labstation = False 87 host._repair_strategy = mock.Mock() 88 host.repair(silent=True) 89 self.assertEqual(host.get_servo_state(), 90 servo_constants.SERVO_STATE_WORKING) 91 92 93class ServoHostInformationValidator(unittest.TestCase): 94 """Tests to verify logic in servo host data""" 95 def test_true_when_host_and_port_is_correct(self): 96 port = 9999 97 hostname = 'chromeos1-rack1-row1-host1-servo' 98 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, port)) 99 hostname = 'CHROMEOS1-RACK1-ROW1-host1-SERVO' 100 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, port)) 101 hostname = '96.120.0.567' 102 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, port)) 103 hostname = 'locathost' 104 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, port)) 105 hostname = 'my.dut-1' 106 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, port)) 107 hostname = '192.168.0.1:8022' 108 self.assertTrue( 109 servo_host.is_servo_host_information_valid(hostname, port)) 110 # diff ports 111 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, 7000)) 112 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, 1234)) 113 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, 1)) 114 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, 15000)) 115 # port as string in case of local testing 116 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, '7000')) 117 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, '1234')) 118 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, '1')) 119 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, ' 15000')) 120 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, ' 07000')) 121 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, ' 01234 ')) 122 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, ' 01 ')) 123 self.assertTrue(servo_host.is_servo_host_information_valid(hostname, '015000')) 124 125 def test_false_when_host_is_incorrect_and_port_is_correct(self): 126 port = '9991' 127 self.assertFalse( 128 servo_host.is_servo_host_information_valid('ch1%ra1$r1.h1.servo', port)) 129 self.assertFalse( 130 servo_host.is_servo_host_information_valid('[undefined]', port)) 131 self.assertFalse( 132 servo_host.is_servo_host_information_valid('None', port)) 133 self.assertFalse( 134 servo_host.is_servo_host_information_valid('', port)) 135 self.assertFalse( 136 servo_host.is_servo_host_information_valid(None, port)) 137 138 def test_false_when_port_is_incorrect_and_host_is_correct(self): 139 hostname = 'Some_host-my' 140 self.assertFalse(servo_host.is_servo_host_information_valid(hostname, None)) 141 self.assertFalse(servo_host.is_servo_host_information_valid(hostname, -1)) 142 self.assertFalse(servo_host.is_servo_host_information_valid(hostname, 0)) 143 self.assertFalse(servo_host.is_servo_host_information_valid(hostname, None)) 144 self.assertFalse(servo_host.is_servo_host_information_valid(hostname, 'a1234')) 145 self.assertFalse(servo_host.is_servo_host_information_valid(hostname, 'o1234')) 146 self.assertFalse(servo_host.is_servo_host_information_valid(hostname, '71234')) 147 self.assertFalse(servo_host.is_servo_host_information_valid(hostname, '71.24')) 148 self.assertFalse(servo_host.is_servo_host_information_valid(hostname, '71-24')) 149 self.assertFalse(servo_host.is_servo_host_information_valid(hostname, '-234')) 150 self.assertFalse(servo_host.is_servo_host_information_valid(hostname, '-234.9')) 151 152 153class ServoHostInformationExistor(unittest.TestCase): 154 """Tests to verify logic in servo host present""" 155 def test_true_when_host_is_correct(self): 156 port = 9999 157 hostname = 'chromeos1-rack1-row1-host1-servo' 158 self.assertTrue(servo_host._is_servo_host_information_exist(hostname, port)) 159 hostname = 'CHROMEOS1' 160 self.assertTrue(servo_host._is_servo_host_information_exist(hostname, port)) 161 hostname = '!@#$%^&*()' 162 self.assertTrue(servo_host._is_servo_host_information_exist(hostname, port)) 163 164 def test_true_when_port_is_correct(self): 165 hostname = 'chromeos1-rack1-row1-host1-servo' 166 port = 9999 167 self.assertTrue(servo_host._is_servo_host_information_exist(hostname, 9999)) 168 self.assertTrue(servo_host._is_servo_host_information_exist(hostname, '9999')) 169 self.assertTrue(servo_host._is_servo_host_information_exist(hostname, 1234)) 170 self.assertTrue(servo_host._is_servo_host_information_exist(hostname, '1234')) 171 self.assertTrue(servo_host._is_servo_host_information_exist(hostname, ' 1234 ')) 172 self.assertTrue(servo_host._is_servo_host_information_exist(hostname, '01234')) 173 self.assertTrue(servo_host._is_servo_host_information_exist(hostname, '01234')) 174 175 def test_false_when_port_was_not_set_up(self): 176 hostname = 'chromeos1%rack1$row1.host1.servo' 177 self.assertFalse(servo_host._is_servo_host_information_exist(hostname, '')) 178 self.assertFalse(servo_host._is_servo_host_information_exist(hostname, None)) 179 self.assertFalse(servo_host._is_servo_host_information_exist(hostname, "")) 180 181 def test_false_when_host_was_not_set_up(self): 182 port = 1234 183 self.assertFalse(servo_host._is_servo_host_information_exist('', port)) 184 self.assertFalse(servo_host._is_servo_host_information_exist(None, port)) 185 self.assertFalse(servo_host._is_servo_host_information_exist(' ', port)) 186 187 188class ValidateUSBCPigtailRegex(unittest.TestCase): 189 """Tests to verify logic in servo host present""" 190 def test_good_cases(self): 191 host = MockHost() 192 message = "[475635.476044 PD TMOUT RX 1/1]" 193 self.assertTrue(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) 194 message = "[475635.476044654 PD TMOUT RX 1/1]" 195 self.assertTrue(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) 196 message = "475635.476044654 PD TMOUT RX 1/1" 197 self.assertFalse(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) 198 199 def test_bad_cases(self): 200 host = MockHost() 201 message = "PD TMOUT RX 1/1" 202 self.assertFalse(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) 203 message = "[PD TMOUT RX 1/1]" 204 self.assertFalse(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) 205 message = "PD TMOUT RX" 206 self.assertFalse(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) 207 message = "something other" 208 self.assertFalse(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) 209 210 211if __name__ == '__main__': 212 unittest.main() 213