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