import mock import unittest import re import common from autotest_lib.server.hosts import servo_host from autotest_lib.server.hosts import servo_constants 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(servo_host.ServoHost): """Simple host for running mock'd host commands""" def __init__(self, *args): self._mock_cmds = {c.cmd: c for c in args} self._init_attributes() self.hostname = "chromeos1-row1-rack1-host1" self._dut_hostname = 'dut-' + self.hostname self.servo_port = '9991' 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 ServoHostServoStateTestCase(unittest.TestCase): """Tests to verify changing the servo_state""" def test_return_none_if_state_not_defined(self): host = MockHost() self.assertIsNotNone(host) self.assertIsNone(host._servo_state) self.assertIsNone(host.get_servo_state()) self.assertEqual(host._servo_state, None) def test_verify_set_state_broken_if_raised_error(self): host = MockHost() host._is_localhost = False host._repair_strategy = mock.Mock() host._repair_strategy.verify.side_effect = Exception('something_ex') try: host.verify(silent=True) self.assertEqual("Should not be reached", 'expecting error') except: pass self.assertEqual(host.get_servo_state(), servo_constants.SERVO_STATE_BROKEN) def test_verify_set_state_working_if_no_raised_error(self): host = MockHost() host._repair_strategy = mock.Mock() host.verify(silent=True) self.assertEqual(host.get_servo_state(), servo_constants.SERVO_STATE_WORKING) def test_repair_set_state_broken_if_raised_error(self): host = MockHost() host._is_localhost = False host._repair_strategy = mock.Mock() host._repair_strategy.repair.side_effect = Exception('something_ex') try: host.repair(silent=True) self.assertEqual("Should not be reached", 'expecting error') except: pass self.assertEqual(host.get_servo_state(), servo_constants.SERVO_STATE_BROKEN) def test_repair_set_state_working_if_no_raised_error(self): host = MockHost() host._is_labstation = False host._repair_strategy = mock.Mock() host.repair(silent=True) self.assertEqual(host.get_servo_state(), servo_constants.SERVO_STATE_WORKING) class ServoHostInformationValidator(unittest.TestCase): """Tests to verify logic in servo host data""" def test_true_when_host_and_port_is_correct(self): port = 9999 hostname = 'chromeos1-rack1-row1-host1-servo' self.assertTrue(servo_host.is_servo_host_information_valid(hostname, port)) hostname = 'CHROMEOS1-RACK1-ROW1-host1-SERVO' self.assertTrue(servo_host.is_servo_host_information_valid(hostname, port)) hostname = '96.120.0.567' self.assertTrue(servo_host.is_servo_host_information_valid(hostname, port)) hostname = 'locathost' self.assertTrue(servo_host.is_servo_host_information_valid(hostname, port)) hostname = 'my.dut-1' self.assertTrue(servo_host.is_servo_host_information_valid(hostname, port)) # diff ports self.assertTrue(servo_host.is_servo_host_information_valid(hostname, 7000)) self.assertTrue(servo_host.is_servo_host_information_valid(hostname, 1234)) self.assertTrue(servo_host.is_servo_host_information_valid(hostname, 1)) self.assertTrue(servo_host.is_servo_host_information_valid(hostname, 15000)) # port as string in case of local testing self.assertTrue(servo_host.is_servo_host_information_valid(hostname, '7000')) self.assertTrue(servo_host.is_servo_host_information_valid(hostname, '1234')) self.assertTrue(servo_host.is_servo_host_information_valid(hostname, '1')) self.assertTrue(servo_host.is_servo_host_information_valid(hostname, ' 15000')) self.assertTrue(servo_host.is_servo_host_information_valid(hostname, ' 07000')) self.assertTrue(servo_host.is_servo_host_information_valid(hostname, ' 01234 ')) self.assertTrue(servo_host.is_servo_host_information_valid(hostname, ' 01 ')) self.assertTrue(servo_host.is_servo_host_information_valid(hostname, '015000')) def test_false_when_host_is_incorrect_and_port_is_correct(self): port = '9991' self.assertFalse( servo_host.is_servo_host_information_valid('ch1%ra1$r1.h1.servo', port)) self.assertFalse( servo_host.is_servo_host_information_valid('[undefined]', port)) self.assertFalse( servo_host.is_servo_host_information_valid('None', port)) self.assertFalse( servo_host.is_servo_host_information_valid('', port)) self.assertFalse( servo_host.is_servo_host_information_valid(None, port)) def test_false_when_port_is_incorrect_and_host_is_correct(self): hostname = 'Some_host-my' self.assertFalse(servo_host.is_servo_host_information_valid(hostname, None)) self.assertFalse(servo_host.is_servo_host_information_valid(hostname, -1)) self.assertFalse(servo_host.is_servo_host_information_valid(hostname, 0)) self.assertFalse(servo_host.is_servo_host_information_valid(hostname, None)) self.assertFalse(servo_host.is_servo_host_information_valid(hostname, 'a1234')) self.assertFalse(servo_host.is_servo_host_information_valid(hostname, 'o1234')) self.assertFalse(servo_host.is_servo_host_information_valid(hostname, '71234')) self.assertFalse(servo_host.is_servo_host_information_valid(hostname, '71_24')) self.assertFalse(servo_host.is_servo_host_information_valid(hostname, '71.24')) self.assertFalse(servo_host.is_servo_host_information_valid(hostname, '71-24')) self.assertFalse(servo_host.is_servo_host_information_valid(hostname, '-234')) self.assertFalse(servo_host.is_servo_host_information_valid(hostname, '-234.9')) class ServoHostInformationExistor(unittest.TestCase): """Tests to verify logic in servo host present""" def test_true_when_host_is_correct(self): port = 9999 hostname = 'chromeos1-rack1-row1-host1-servo' self.assertTrue(servo_host._is_servo_host_information_exist(hostname, port)) hostname = 'CHROMEOS1' self.assertTrue(servo_host._is_servo_host_information_exist(hostname, port)) hostname = '!@#$%^&*()' self.assertTrue(servo_host._is_servo_host_information_exist(hostname, port)) def test_true_when_port_is_correct(self): hostname = 'chromeos1-rack1-row1-host1-servo' port = 9999 self.assertTrue(servo_host._is_servo_host_information_exist(hostname, 9999)) self.assertTrue(servo_host._is_servo_host_information_exist(hostname, '9999')) self.assertTrue(servo_host._is_servo_host_information_exist(hostname, 1234)) self.assertTrue(servo_host._is_servo_host_information_exist(hostname, '1234')) self.assertTrue(servo_host._is_servo_host_information_exist(hostname, ' 1234 ')) self.assertTrue(servo_host._is_servo_host_information_exist(hostname, '01234')) self.assertTrue(servo_host._is_servo_host_information_exist(hostname, '01234')) def test_false_when_port_was_not_set_up(self): hostname = 'chromeos1%rack1$row1.host1.servo' self.assertFalse(servo_host._is_servo_host_information_exist(hostname, '')) self.assertFalse(servo_host._is_servo_host_information_exist(hostname, None)) self.assertFalse(servo_host._is_servo_host_information_exist(hostname, "")) def test_false_when_host_was_not_set_up(self): port = 1234 self.assertFalse(servo_host._is_servo_host_information_exist('', port)) self.assertFalse(servo_host._is_servo_host_information_exist(None, port)) self.assertFalse(servo_host._is_servo_host_information_exist(' ', port)) class ValidateUSBCPigtailRegex(unittest.TestCase): """Tests to verify logic in servo host present""" def test_good_cases(self): host = MockHost() message = "[475635.476044 PD TMOUT RX 1/1]" self.assertTrue(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) message = "[475635.476044654 PD TMOUT RX 1/1]" self.assertTrue(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) message = "475635.476044654 PD TMOUT RX 1/1" self.assertFalse(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) def test_bad_cases(self): host = MockHost() message = "PD TMOUT RX 1/1" self.assertFalse(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) message = "[PD TMOUT RX 1/1]" self.assertFalse(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) message = "PD TMOUT RX" self.assertFalse(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) message = "something other" self.assertFalse(bool(re.match(host.USBC_PIGTAIL_TIMEOUT_RE, message))) if __name__ == '__main__': unittest.main()