1#!/usr/bin/python
2# Copyright 2017 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import unittest
7
8import common
9from autotest_lib.server.hosts import cros_firmware
10from autotest_lib.server.hosts import cros_repair
11from autotest_lib.server.hosts import repair
12
13
14CROS_VERIFY_DAG = (
15    (repair.SshVerifier, 'ssh', ()),
16    (cros_repair.DevModeVerifier, 'devmode', ('ssh',)),
17    (cros_repair.ACPowerVerifier, 'power', ('ssh',)),
18    (cros_repair.EXT4fsErrorVerifier, 'ext4', ('ssh',)),
19    (cros_repair.WritableVerifier, 'writable', ('ssh',)),
20    (cros_repair.TPMStatusVerifier, 'tpm', ('ssh',)),
21    (cros_repair.UpdateSuccessVerifier, 'good_au', ('ssh',)),
22    (cros_firmware.FirmwareStatusVerifier, 'fwstatus', ('ssh',)),
23    (cros_firmware.FirmwareVersionVerifier, 'rwfw', ('ssh',)),
24    (cros_repair.PythonVerifier, 'python', ('ssh',)),
25    (repair.LegacyHostVerifier, 'cros', ('ssh',)),
26)
27
28CROS_REPAIR_ACTIONS = (
29    (repair.RPMCycleRepair, 'rpm', (), ('ssh', 'power',)),
30    (cros_repair.ServoSysRqRepair, 'sysrq', (), ('ssh',)),
31    (cros_repair.ServoResetRepair, 'servoreset', (), ('ssh',)),
32    (cros_firmware.FirmwareRepair,
33     'firmware', (), ('ssh', 'fwstatus', 'good_au')),
34    (cros_repair.CrosRebootRepair,
35     'reboot', ('ssh',), ('devmode', 'writable',)),
36    (cros_repair.AutoUpdateRepair,
37     'au',
38     ('ssh', 'writable', 'tpm', 'good_au', 'ext4'),
39     ('power', 'rwfw', 'python', 'cros')),
40    (cros_repair.PowerWashRepair,
41     'powerwash',
42     ('ssh', 'writable'),
43     ('tpm', 'good_au', 'ext4', 'power', 'rwfw', 'python', 'cros')),
44    (cros_repair.ServoInstallRepair,
45     'usb',
46     (),
47     ('ssh', 'writable', 'tpm', 'good_au', 'ext4', 'power', 'rwfw',
48      'python', 'cros')),
49)
50
51MOBLAB_VERIFY_DAG = (
52    (repair.SshVerifier, 'ssh', ()),
53    (cros_repair.ACPowerVerifier, 'power', ('ssh',)),
54    (cros_firmware.FirmwareVersionVerifier, 'rwfw', ('ssh',)),
55    (cros_repair.PythonVerifier, 'python', ('ssh',)),
56    (repair.LegacyHostVerifier, 'cros', ('ssh',)),
57)
58
59MOBLAB_REPAIR_ACTIONS = (
60    (repair.RPMCycleRepair, 'rpm', (), ('ssh', 'power',)),
61    (cros_repair.AutoUpdateRepair,
62     'au', ('ssh',), ('power', 'rwfw', 'python', 'cros',)),
63)
64
65JETSTREAM_VERIFY_DAG = (
66    (repair.SshVerifier, 'ssh', ()),
67    (cros_repair.DevModeVerifier, 'devmode', ('ssh',)),
68    (cros_repair.ACPowerVerifier, 'power', ('ssh',)),
69    (cros_repair.EXT4fsErrorVerifier, 'ext4', ('ssh',)),
70    (cros_repair.WritableVerifier, 'writable', ('ssh',)),
71    (cros_repair.TPMStatusVerifier, 'tpm', ('ssh',)),
72    (cros_repair.UpdateSuccessVerifier, 'good_au', ('ssh',)),
73    (cros_firmware.FirmwareStatusVerifier, 'fwstatus', ('ssh',)),
74    (cros_firmware.FirmwareVersionVerifier, 'rwfw', ('ssh',)),
75    (cros_repair.PythonVerifier, 'python', ('ssh',)),
76    (repair.LegacyHostVerifier, 'cros', ('ssh',)),
77    (cros_repair.JetstreamServicesVerifier, 'jetstream_services', ('ssh',)),
78)
79
80JETSTREAM_REPAIR_ACTIONS = (
81    (repair.RPMCycleRepair, 'rpm', (), ('ssh', 'power',)),
82    (cros_repair.ServoSysRqRepair, 'sysrq', (), ('ssh',)),
83    (cros_repair.ServoResetRepair, 'servoreset', (), ('ssh',)),
84    (cros_firmware.FirmwareRepair,
85     'firmware', (), ('ssh', 'fwstatus', 'good_au')),
86    (cros_repair.CrosRebootRepair,
87     'reboot', ('ssh',), ('devmode', 'writable',)),
88    (cros_repair.JetstreamRepair,
89     'jetstream_repair',
90     ('ssh', 'writable', 'tpm', 'good_au', 'ext4'),
91     ('power', 'rwfw', 'python', 'cros', 'jetstream_services')),
92    (cros_repair.AutoUpdateRepair,
93     'au',
94     ('ssh', 'writable', 'tpm', 'good_au', 'ext4'),
95     ('power', 'rwfw', 'python', 'cros', 'jetstream_services')),
96    (cros_repair.PowerWashRepair,
97     'powerwash',
98     ('ssh', 'writable'),
99     ('tpm', 'good_au', 'ext4', 'power', 'rwfw', 'python', 'cros',
100      'jetstream_services')),
101    (cros_repair.ServoInstallRepair,
102     'usb',
103     (),
104     ('ssh', 'writable', 'tpm', 'good_au', 'ext4', 'power', 'rwfw', 'python',
105      'cros', 'jetstream_services')),
106)
107
108class CrosRepairUnittests(unittest.TestCase):
109
110    maxDiff = None
111
112    def test_cros_repair(self):
113        verify_dag = cros_repair._cros_verify_dag()
114        self.assertTupleEqual(verify_dag, CROS_VERIFY_DAG)
115        self.check_verify_dag(verify_dag)
116        repair_actions = cros_repair._cros_repair_actions()
117        self.assertTupleEqual(repair_actions, CROS_REPAIR_ACTIONS)
118        self.check_repair_actions(verify_dag, repair_actions)
119
120    def test_moblab_repair(self):
121        verify_dag = cros_repair._moblab_verify_dag()
122        self.assertTupleEqual(verify_dag, MOBLAB_VERIFY_DAG)
123        self.check_verify_dag(verify_dag)
124        repair_actions = cros_repair._moblab_repair_actions()
125        self.assertTupleEqual(repair_actions, MOBLAB_REPAIR_ACTIONS)
126        self.check_repair_actions(verify_dag, repair_actions)
127
128    def test_jetstream_repair(self):
129        verify_dag = cros_repair._jetstream_verify_dag()
130        self.assertTupleEqual(verify_dag, JETSTREAM_VERIFY_DAG)
131        self.check_verify_dag(verify_dag)
132        repair_actions = cros_repair._jetstream_repair_actions()
133        self.assertTupleEqual(repair_actions, JETSTREAM_REPAIR_ACTIONS)
134        self.check_repair_actions(verify_dag, repair_actions)
135
136    def check_verify_dag(self, verify_dag):
137        """Checks that dependency labels are defined."""
138        labels = [n[1] for n in verify_dag]
139        for node in verify_dag:
140            for dep in node[2]:
141                self.assertIn(dep, labels)
142
143    def check_repair_actions(self, verify_dag, repair_actions):
144        """Checks that dependency and trigger labels are defined."""
145        verify_labels = [n[1] for n in verify_dag]
146        for action in repair_actions:
147            deps = action[2]
148            triggers = action[3]
149            for label in deps + triggers:
150                self.assertIn(label, verify_labels)
151
152
153if __name__ == '__main__':
154    unittest.main()
155