• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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