1*9c5db199SXin Li#!/usr/bin/python3 2*9c5db199SXin Li# Copyright 2021 The Chromium OS Authors. All rights reserved. 3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 4*9c5db199SXin Li# found in the LICENSE file. 5*9c5db199SXin Li 6*9c5db199SXin Li# pylint: disable=missing-docstring 7*9c5db199SXin Li 8*9c5db199SXin Liimport unittest 9*9c5db199SXin Lifrom unittest import mock 10*9c5db199SXin Li 11*9c5db199SXin Liimport common 12*9c5db199SXin Lifrom autotest_lib.server.hosts import servo_repair 13*9c5db199SXin Lifrom autotest_lib.server.hosts import repair_utils 14*9c5db199SXin Li 15*9c5db199SXin LiSERVO_VERIFY_DAG = ( 16*9c5db199SXin Li (servo_repair._ConnectionVerifier, 'connection', []), 17*9c5db199SXin Li (servo_repair._RootServoPresentVerifier, 'servo_root_present', 18*9c5db199SXin Li ['connection']), 19*9c5db199SXin Li (servo_repair._RootServoV3PresentVerifier, 'servo_v3_root_present', 20*9c5db199SXin Li ['connection']), 21*9c5db199SXin Li (servo_repair._ServoFwVerifier, 'servo_fw', ['servo_root_present']), 22*9c5db199SXin Li (servo_repair._StartServodVerifier, 'start_servod', 23*9c5db199SXin Li ['servo_fw', 'servo_v3_root_present']), 24*9c5db199SXin Li (servo_repair._DiskSpaceVerifier, 'servo_disk_space', ['connection']), 25*9c5db199SXin Li (servo_repair._UpdateVerifier, 'servo_update', 26*9c5db199SXin Li ['servo_v3_root_present']), 27*9c5db199SXin Li (servo_repair._BoardConfigVerifier, 'servo_config_board', 28*9c5db199SXin Li ['connection']), 29*9c5db199SXin Li (servo_repair._SerialConfigVerifier, 'servo_config_serial', 30*9c5db199SXin Li ['connection']), 31*9c5db199SXin Li (servo_repair._ServodJobVerifier, 'servod_started', [ 32*9c5db199SXin Li 'start_servod', 'servo_config_board', 'servo_config_serial', 33*9c5db199SXin Li 'servo_disk_space' 34*9c5db199SXin Li ]), 35*9c5db199SXin Li (servo_repair._ServodEchoVerifier, 'servod_echo', ['servod_started']), 36*9c5db199SXin Li (servo_repair._TopologyVerifier, 'servo_topology', ['servod_echo']), 37*9c5db199SXin Li (servo_repair._ServodConnectionVerifier, 'servod_connection', 38*9c5db199SXin Li ['servod_echo']), 39*9c5db199SXin Li (servo_repair._Cr50LowSBUVerifier, 'servo_cr50_low_sbu', 40*9c5db199SXin Li ['servod_connection']), 41*9c5db199SXin Li (servo_repair.ServodDutControllerMissingVerifier, 42*9c5db199SXin Li 'servod_dut_controller_missing', ['servod_connection']), 43*9c5db199SXin Li (servo_repair._Cr50OffVerifier, 'servo_cr50_off', 44*9c5db199SXin Li ['servod_connection']), 45*9c5db199SXin Li (servo_repair._ServodControlVerifier, 'servod_control', 46*9c5db199SXin Li ['servod_connection']), 47*9c5db199SXin Li (servo_repair._DUTConnectionVerifier, 'servo_dut_connected', 48*9c5db199SXin Li ['servod_connection']), 49*9c5db199SXin Li (servo_repair._ServoHubConnectionVerifier, 'servo_hub_connected', 50*9c5db199SXin Li ['servo_dut_connected']), 51*9c5db199SXin Li (servo_repair._PowerButtonVerifier, 'servo_pwr_button', 52*9c5db199SXin Li ['servo_hub_connected']), 53*9c5db199SXin Li (servo_repair._BatteryVerifier, 'servo_battery', 54*9c5db199SXin Li ['servo_hub_connected']), 55*9c5db199SXin Li (servo_repair._LidVerifier, 'servo_lid_open', ['servo_hub_connected']), 56*9c5db199SXin Li (servo_repair.ECConsoleVerifier, 'servo_ec_console', 57*9c5db199SXin Li ['servo_dut_connected']), 58*9c5db199SXin Li (servo_repair._Cr50ConsoleVerifier, 'servo_cr50_console', 59*9c5db199SXin Li ['servo_dut_connected']), 60*9c5db199SXin Li (servo_repair._CCDTestlabVerifier, 'servo_ccd_testlab', 61*9c5db199SXin Li ['servo_cr50_console']), 62*9c5db199SXin Li (servo_repair._CCDPowerDeliveryVerifier, 'servo_power_delivery', 63*9c5db199SXin Li ['servod_connection']), 64*9c5db199SXin Li) 65*9c5db199SXin Li 66*9c5db199SXin LiSERVO_REPAIR_ACTIONS = ( 67*9c5db199SXin Li (servo_repair._ServoFwUpdateRepair, 'servo_fw_update', ['connection'], 68*9c5db199SXin Li ['servo_fw']), 69*9c5db199SXin Li (servo_repair._DiskCleanupRepair, 'servo_disk_cleanup', ['connection'], 70*9c5db199SXin Li ['servo_disk_space']), 71*9c5db199SXin Li (servo_repair._ServoMicroFlashRepair, 'servo_micro_flash', 72*9c5db199SXin Li ['connection', 'servo_topology'], ['servo_dut_connected']), 73*9c5db199SXin Li (servo_repair._RestartServod, 'servod_restart', 74*9c5db199SXin Li ['connection', 'servo_fw'], [ 75*9c5db199SXin Li 'servo_config_board', 'servo_config_serial', 'start_servod', 76*9c5db199SXin Li 'servod_started', 'servo_topology', 'servod_connection', 77*9c5db199SXin Li 'servod_echo', 'servod_control', 'servo_dut_connected', 78*9c5db199SXin Li 'servo_hub_connected', 'servo_pwr_button', 79*9c5db199SXin Li 'servo_cr50_console', 'servo_cr50_low_sbu', 'servo_cr50_off', 80*9c5db199SXin Li 'servo_power_delivery', 'servod_dut_controller_missing' 81*9c5db199SXin Li ]), 82*9c5db199SXin Li (servo_repair._ServoRebootRepair, 'servo_reboot', ['connection'], [ 83*9c5db199SXin Li 'servo_topology', 'servo_root_present', 'servo_disk_space', 84*9c5db199SXin Li 'servo_power_delivery' 85*9c5db199SXin Li ]), 86*9c5db199SXin Li (servo_repair._PowerDeliveryRepair, 'servo_pd_recover', 87*9c5db199SXin Li ['servod_connection'], [ 88*9c5db199SXin Li 'servod_started', 'servo_topology', 'servod_connection', 89*9c5db199SXin Li 'servod_echo', 'servod_control', 'servo_dut_connected', 90*9c5db199SXin Li 'servo_hub_connected', 'servo_pwr_button', 91*9c5db199SXin Li 'servo_cr50_console', 'servo_cr50_low_sbu', 'servo_cr50_off', 92*9c5db199SXin Li 'servo_power_delivery', 'servod_dut_controller_missing' 93*9c5db199SXin Li ]), 94*9c5db199SXin Li (servo_repair._FakedisconnectRepair, 'servo_fakedisconnect', 95*9c5db199SXin Li ['servod_connection'], [ 96*9c5db199SXin Li 'servod_started', 'servo_topology', 'servod_connection', 97*9c5db199SXin Li 'servod_echo', 'servod_control', 'servo_dut_connected', 98*9c5db199SXin Li 'servo_hub_connected', 'servo_pwr_button', 99*9c5db199SXin Li 'servo_cr50_console', 'servo_cr50_low_sbu', 'servo_cr50_off', 100*9c5db199SXin Li 'servo_power_delivery', 'servod_dut_controller_missing' 101*9c5db199SXin Li ]), 102*9c5db199SXin Li (servo_repair._ToggleCCLineRepair, 'servo_cc', ['servod_connection'], [ 103*9c5db199SXin Li 'servod_started', 'servo_topology', 'servod_connection', 104*9c5db199SXin Li 'servod_echo', 'servod_control', 'servo_dut_connected', 105*9c5db199SXin Li 'servo_hub_connected', 'servo_pwr_button', 106*9c5db199SXin Li 'servo_cr50_console', 'servo_cr50_low_sbu', 'servo_cr50_off', 107*9c5db199SXin Li 'servo_power_delivery', 'servod_dut_controller_missing' 108*9c5db199SXin Li ]), 109*9c5db199SXin Li (servo_repair._DutRebootRepair, 'servo_dut_reboot', 110*9c5db199SXin Li ['servod_connection'], [ 111*9c5db199SXin Li 'servod_control', 'servo_lid_open', 'servo_ec_console', 112*9c5db199SXin Li 'servo_topology', 'servo_dut_connected', 113*9c5db199SXin Li 'servo_hub_connected', 'servo_cr50_low_sbu', 'servo_cr50_off', 114*9c5db199SXin Li 'servo_cr50_console', 'servo_power_delivery', 115*9c5db199SXin Li 'servod_dut_controller_missing' 116*9c5db199SXin Li ]), 117*9c5db199SXin Li (servo_repair._ECRebootRepair, 'servo_ec_reboot', 118*9c5db199SXin Li ['servod_connection'], [ 119*9c5db199SXin Li 'servod_control', 'servo_lid_open', 'servo_ec_console', 120*9c5db199SXin Li 'servo_topology', 'servo_dut_connected', 121*9c5db199SXin Li 'servo_hub_connected', 'servo_cr50_low_sbu', 'servo_cr50_off', 122*9c5db199SXin Li 'servo_cr50_console', 'servo_power_delivery', 123*9c5db199SXin Li 'servod_dut_controller_missing' 124*9c5db199SXin Li ]), 125*9c5db199SXin Li) 126*9c5db199SXin Li 127*9c5db199SXin Li 128*9c5db199SXin Liclass ServoRepairUnittests(unittest.TestCase): 129*9c5db199SXin Li 130*9c5db199SXin Li # Allow to show all diff when compare tuple. 131*9c5db199SXin Li maxDiff = None 132*9c5db199SXin Li 133*9c5db199SXin Li def test_servo_repair_components(self): 134*9c5db199SXin Li verify_dag = servo_repair._servo_verifier_actions() 135*9c5db199SXin Li self.assertTupleEqual(verify_dag, SERVO_VERIFY_DAG) 136*9c5db199SXin Li self.check_verify_dag(verify_dag) 137*9c5db199SXin Li repair_actions = servo_repair._servo_repair_actions() 138*9c5db199SXin Li self.assertTupleEqual(repair_actions, SERVO_REPAIR_ACTIONS) 139*9c5db199SXin Li self.check_repair_actions(verify_dag, repair_actions) 140*9c5db199SXin Li 141*9c5db199SXin Li def test_servo_repair_strategy(self): 142*9c5db199SXin Li servo_repair.create_servo_repair_strategy() 143*9c5db199SXin Li 144*9c5db199SXin Li def check_verify_dag(self, verify_dag): 145*9c5db199SXin Li """Checks that dependency labels are defined.""" 146*9c5db199SXin Li labels = [n[1] for n in verify_dag] 147*9c5db199SXin Li for node in verify_dag: 148*9c5db199SXin Li for dep in node[2]: 149*9c5db199SXin Li self.assertIn(dep, labels) 150*9c5db199SXin Li 151*9c5db199SXin Li def check_repair_actions(self, verify_dag, repair_actions): 152*9c5db199SXin Li """Checks that dependency and trigger labels are defined.""" 153*9c5db199SXin Li verify_labels = [n[1] for n in verify_dag] 154*9c5db199SXin Li for action in repair_actions: 155*9c5db199SXin Li deps = action[2] 156*9c5db199SXin Li triggers = action[3] 157*9c5db199SXin Li for label in deps + triggers: 158*9c5db199SXin Li self.assertIn(label, verify_labels) 159*9c5db199SXin Li 160*9c5db199SXin Li 161*9c5db199SXin Liif __name__ == '__main__': 162*9c5db199SXin Li unittest.main() 163