• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/python2
2# pylint: disable=missing-docstring
3
4import mock
5import unittest
6
7import common
8
9from autotest_lib.server.hosts import cros_host
10from autotest_lib.server.hosts import servo_host
11from autotest_lib.server.hosts import host_info
12
13CROSSYSTEM_RESULT = '''
14fwb_tries              = 0                              # Fake comment
15fw_vboot2              = 1                              # Fake comment
16fwid                   = Google_Reef.9933.0.0           # Fake comment
17fwupdate_tries         = 0                              #
18fw_tried               = B                              #
19fw_try_count           = 0                              #
20'''
21
22NON_UNI_LSB_RELEASE_OUTPUT = '''
23CHROMEOS_RELEASE_BOARD=reef
24'''
25
26UNI_LSB_RELEASE_OUTPUT = '''
27CHROMEOS_RELEASE_BOARD=coral
28CHROMEOS_RELEASE_UNIBUILD=1
29'''
30
31SERVO_STATE_PREFIX = servo_host.SERVO_STATE_LABEL_PREFIX
32
33
34class MockCmd(object):
35    """Simple mock command with base command and results"""
36
37    def __init__(self, cmd, exit_status, stdout):
38        self.cmd = cmd
39        self.stdout = stdout
40        self.exit_status = exit_status
41
42
43class MockHost(cros_host.CrosHost):
44    """Simple host for running mock'd host commands"""
45
46    def __init__(self, *args):
47        self._mock_cmds = {c.cmd: c for c in args}
48
49    def run(self, command, **kwargs):
50        """Finds the matching result by command value"""
51        mock_cmd = self._mock_cmds[command]
52        file_out = kwargs.get('stdout_tee', None)
53        if file_out:
54            file_out.write(mock_cmd.stdout)
55        return mock_cmd
56
57
58class GetPlatformModelTests(unittest.TestCase):
59    """Unit tests for CrosHost.get_platform_model"""
60
61    def test_mosys_succeeds(self):
62        host = MockHost(
63                MockCmd('cat /etc/lsb-release', 0, UNI_LSB_RELEASE_OUTPUT),
64                MockCmd('mosys platform model', 0, 'coral\n'))
65        self.assertEqual(host.get_platform(), 'coral')
66
67    def test_mosys_fails(self):
68        host = MockHost(
69                MockCmd('cat /etc/lsb-release', 0, UNI_LSB_RELEASE_OUTPUT),
70                MockCmd('mosys platform model', 1, ''),
71                MockCmd('crossystem', 0, CROSSYSTEM_RESULT))
72        self.assertEqual(host.get_platform(), 'reef')
73
74    def test_non_unibuild(self):
75        host = MockHost(
76                MockCmd('cat /etc/lsb-release', 0, NON_UNI_LSB_RELEASE_OUTPUT),
77                MockCmd('crossystem', 0, CROSSYSTEM_RESULT))
78        self.assertEqual(host.get_platform(), 'reef')
79
80    def test_cat_lsb_fails(self):
81        host = MockHost(
82                MockCmd('cat /etc/lsb-release', 1, ''),
83                MockCmd('crossystem', 0, CROSSYSTEM_RESULT))
84        self.assertEqual(host.get_platform(), 'reef')
85
86
87class DictFilteringTestCase(unittest.TestCase):
88    """Tests for dict filtering methods on CrosHost."""
89
90    def test_get_chameleon_arguments(self):
91        got = cros_host.CrosHost.get_chameleon_arguments({
92            'chameleon_host': 'host',
93            'spam': 'eggs',
94        })
95        self.assertEqual(got, {'chameleon_host': 'host'})
96
97    def test_get_pdtester_arguments(self):
98        got = cros_host.CrosHost.get_pdtester_arguments({
99            'pdtester_host': 'host',
100            'spam': 'eggs',
101        })
102        self.assertEqual(got, {'pdtester_host': 'host'})
103
104    def test_get_servo_arguments(self):
105        got = cros_host.CrosHost.get_servo_arguments({
106            servo_host.SERVO_HOST_ATTR: 'host',
107            'spam': 'eggs',
108        })
109        self.assertEqual(got, {servo_host.SERVO_HOST_ATTR: 'host'})
110
111
112class DictFilteringTestCase(unittest.TestCase):
113    """Test to verify servo_state was set-up as label in host_info_store"""
114
115    def create_host(self):
116        host = MockHost()
117        host.servo = None
118        host._servo_host = mock.Mock()
119        host._servo_host.get_servo.return_value = 'Not Empty'
120        host._servo_host.get_servo_state.return_value = 'SOME_STATE'
121        host.host_info_store = host_info.InMemoryHostInfoStore()
122        self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), '')
123        return host
124
125    def test_do_not_update_label_when_servo_host_is_not_inited(self):
126        host = self.create_host()
127        host._servo_host = None
128
129        host._update_servo_labels()
130        self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), '')
131
132    def test_do_not_update_label_when_servo_host_is_inited(self):
133        host = self.create_host()
134
135        host._update_servo_labels()
136        host._servo_host.get_servo_state.assert_called()
137        self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE')
138
139    def test_repair_servo__update_servo_labels_after_repair_when_repair_is_fail(self):
140        host = self.create_host()
141        host._servo_host.repair.side_effect = Exception('Something bad')
142
143        try:
144            host.repair_servo()
145            self.assertEqual("Exception is", 'expecting to raise')
146        except:
147            pass
148        host._servo_host.get_servo_state.assert_called()
149        self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE')
150
151    def test_repair_servo__update_servo_labels_after_repair_when_repair_is_not_fail(self):
152        host = self.create_host()
153        try:
154            host.repair_servo()
155        except:
156            self.assertEqual("Exception is not", 'expected')
157            pass
158        host._servo_host.get_servo_state.assert_called()
159        self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE')
160
161    def test_set_servo_host_update_servo_state_when_host_exist(self):
162        host = self.create_host()
163        host._servo_host = mock.Mock()
164        host._servo_host.get_servo.return_value = 'Not Empty'
165        host._servo_host.get_servo_state.return_value = 'SOME_STATE'
166        self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), '')
167
168        try:
169            host.repair_servo()
170        except:
171            self.assertEqual("Exception is not", 'expected')
172            pass
173        host._servo_host.get_servo_state.assert_called()
174        self.assertEqual(host.host_info_store.get().get_label_value(SERVO_STATE_PREFIX), 'SOME_STATE')
175
176
177if __name__ == "__main__":
178    unittest.main()
179
180