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