xref: /aosp_15_r20/external/autotest/server/hosts/servo_host_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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