1*9c5db199SXin Li#!/usr/bin/python3 2*9c5db199SXin Li# Copyright 2017 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 Liimport itertools 7*9c5db199SXin Liimport unittest 8*9c5db199SXin Lifrom unittest import mock 9*9c5db199SXin Li 10*9c5db199SXin Liimport common 11*9c5db199SXin Lifrom autotest_lib.client.common_lib import error 12*9c5db199SXin Lifrom autotest_lib.client.common_lib import hosts 13*9c5db199SXin Lifrom autotest_lib.client.common_lib.cros import retry 14*9c5db199SXin Lifrom autotest_lib.server.hosts import cros_firmware 15*9c5db199SXin Lifrom autotest_lib.server.hosts import cros_repair 16*9c5db199SXin Lifrom autotest_lib.server.hosts import repair_utils 17*9c5db199SXin Li 18*9c5db199SXin Li 19*9c5db199SXin LiCROS_VERIFY_DAG = ( 20*9c5db199SXin Li (repair_utils.PingVerifier, 'ping', ()), 21*9c5db199SXin Li (repair_utils.SshVerifier, 'ssh', ('ping', )), 22*9c5db199SXin Li (cros_repair.ServoUSBDriveVerifier, 'usb_drive', ()), 23*9c5db199SXin Li (cros_repair.DevDefaultBootVerifier, 'dev_default_boot', ('ssh', )), 24*9c5db199SXin Li (cros_repair.DevModeVerifier, 'devmode', ('ssh', )), 25*9c5db199SXin Li (cros_repair.EnrollmentStateVerifier, 'enrollment_state', ('ssh', )), 26*9c5db199SXin Li (cros_repair.HWIDVerifier, 'hwid', ('ssh', )), 27*9c5db199SXin Li (cros_repair.ACPowerVerifier, 'power', ('ssh', )), 28*9c5db199SXin Li (cros_repair.EXT4fsErrorVerifier, 'ext4', ('ssh', )), 29*9c5db199SXin Li (cros_repair.WritableVerifier, 'writable', ('ssh', )), 30*9c5db199SXin Li (cros_repair.TPMStatusVerifier, 'tpm', ('ssh', )), 31*9c5db199SXin Li (cros_repair.UpdateSuccessVerifier, 'good_provision', ('ssh', )), 32*9c5db199SXin Li (cros_repair.FirmwareTpmVerifier, 'faft_tpm', ('ssh', )), 33*9c5db199SXin Li (cros_firmware.FirmwareStatusVerifier, 'fwstatus', ('ssh', )), 34*9c5db199SXin Li (cros_firmware.FirmwareVersionVerifier, 'rwfw', ('ssh', )), 35*9c5db199SXin Li (cros_repair.PythonVerifier, 'python', ('ssh', )), 36*9c5db199SXin Li (repair_utils.LegacyHostVerifier, 'cros', ('ssh', )), 37*9c5db199SXin Li (cros_repair.ProvisioningLabelsVerifier, 'provisioning_labels', 38*9c5db199SXin Li ('ssh', )), 39*9c5db199SXin Li (cros_repair.StopStartUIVerifier, 'stop_start_ui', ('ssh', )), 40*9c5db199SXin Li (cros_repair.DUTStorageVerifier, 'storage', ('ssh', )), 41*9c5db199SXin Li (cros_repair.AuditBattery, 'audit_battery', ()), 42*9c5db199SXin Li (cros_repair.GscToolPresentVerifier, 'dut_gsctool', ('ssh', )), 43*9c5db199SXin Li (cros_repair.ServoKeyboardMapVerifier, 'dut_servo_keyboard', 44*9c5db199SXin Li ('ssh', )), 45*9c5db199SXin Li (cros_repair.ServoMacAddressVerifier, 'dut_servo_macaddr', ('ssh', )), 46*9c5db199SXin Li) 47*9c5db199SXin Li 48*9c5db199SXin LiCROS_REPAIR_ACTIONS = ( 49*9c5db199SXin Li (repair_utils.RPMCycleRepair, 'rpm', (), ( 50*9c5db199SXin Li 'ping', 51*9c5db199SXin Li 'ssh', 52*9c5db199SXin Li 'power', 53*9c5db199SXin Li )), 54*9c5db199SXin Li (cros_repair.ServoResetRepair, 'servoreset', (), ( 55*9c5db199SXin Li 'ping', 56*9c5db199SXin Li 'ssh', 57*9c5db199SXin Li 'stop_start_ui', 58*9c5db199SXin Li 'power', 59*9c5db199SXin Li )), 60*9c5db199SXin Li (cros_repair.ServoCr50RebootRepair, 'cr50_reset', (), 61*9c5db199SXin Li ('ping', 'ssh', 'stop_start_ui', 'power')), 62*9c5db199SXin Li (cros_repair.ServoSysRqRepair, 'sysrq', (), ( 63*9c5db199SXin Li 'ping', 64*9c5db199SXin Li 'ssh', 65*9c5db199SXin Li )), 66*9c5db199SXin Li (cros_repair.ProvisioningLabelsRepair, 'provisioning_labels_repair', 67*9c5db199SXin Li ('ssh', ), ('provisioning_labels', )), 68*9c5db199SXin Li (cros_firmware.FaftFirmwareRepair, 'faft_firmware_repair', (), 69*9c5db199SXin Li ('ping', 'ssh', 'fwstatus', 'good_provision')), 70*9c5db199SXin Li (cros_repair.DevDefaultBootRepair, 'set_default_boot', ('ssh', ), 71*9c5db199SXin Li ('dev_default_boot', )), 72*9c5db199SXin Li (cros_repair.CrosRebootRepair, 'reboot', ('ssh', ), ( 73*9c5db199SXin Li 'devmode', 74*9c5db199SXin Li 'writable', 75*9c5db199SXin Li )), 76*9c5db199SXin Li (cros_repair.EnrollmentCleanupRepair, 'cleanup_enrollment', ('ssh', ), 77*9c5db199SXin Li ('enrollment_state', )), 78*9c5db199SXin Li (cros_firmware.GeneralFirmwareRepair, 'general_firmware', 79*9c5db199SXin Li ('usb_drive', ), ( 80*9c5db199SXin Li 'ping', 81*9c5db199SXin Li 'ssh', 82*9c5db199SXin Li )), 83*9c5db199SXin Li (cros_repair.RecoverACPowerRepair, 'ac_recover', (), ('ping', 84*9c5db199SXin Li 'power')), 85*9c5db199SXin Li (cros_repair.ProvisionRepair, 'provision', 86*9c5db199SXin Li ('ping', 'ssh', 'writable', 'tpm', 'good_provision', 87*9c5db199SXin Li 'ext4'), ('power', 'rwfw', 'fwstatus', 'python', 'hwid', 'cros', 88*9c5db199SXin Li 'dev_default_boot', 'stop_start_ui', 'dut_gsctool')), 89*9c5db199SXin Li (cros_repair.PowerWashRepair, 'powerwash', ('ping', 'ssh', 'writable'), 90*9c5db199SXin Li ('tpm', 'good_provision', 'ext4', 'power', 'rwfw', 'fwstatus', 91*9c5db199SXin Li 'python', 'hwid', 'cros', 'dev_default_boot', 'stop_start_ui', 92*9c5db199SXin Li 'dut_gsctool')), 93*9c5db199SXin Li (cros_repair.ServoInstallRepair, 'usb', ('usb_drive', ), 94*9c5db199SXin Li ('ping', 'ssh', 'writable', 'tpm', 'good_provision', 'ext4', 'power', 95*9c5db199SXin Li 'rwfw', 'fwstatus', 'python', 'hwid', 'cros', 'dev_default_boot', 96*9c5db199SXin Li 'stop_start_ui', 'dut_gsctool', 'faft_tpm')), 97*9c5db199SXin Li (cros_repair.ServoResetAfterUSBRepair, 'servo_reset_after_usb', 98*9c5db199SXin Li ('usb_drive', ), ('ping', 'ssh')), 99*9c5db199SXin Li (cros_repair.RecoverFwAfterUSBRepair, 'recover_fw_after_usb', 100*9c5db199SXin Li ('usb_drive', ), ('ping', 'ssh')), 101*9c5db199SXin Li) 102*9c5db199SXin Li 103*9c5db199SXin LiMOBLAB_VERIFY_DAG = ( 104*9c5db199SXin Li (repair_utils.SshVerifier, 'ssh', ()), 105*9c5db199SXin Li (cros_repair.ACPowerVerifier, 'power', ('ssh',)), 106*9c5db199SXin Li (cros_repair.PythonVerifier, 'python', ('ssh',)), 107*9c5db199SXin Li (repair_utils.LegacyHostVerifier, 'cros', ('ssh',)), 108*9c5db199SXin Li) 109*9c5db199SXin Li 110*9c5db199SXin LiMOBLAB_REPAIR_ACTIONS = ( 111*9c5db199SXin Li (repair_utils.RPMCycleRepair, 'rpm', (), ('ssh', 'power',)), 112*9c5db199SXin Li (cros_repair.ProvisionRepair, 113*9c5db199SXin Li 'provision', ('ssh',), ('power', 'python', 'cros',)), 114*9c5db199SXin Li) 115*9c5db199SXin Li 116*9c5db199SXin LiJETSTREAM_VERIFY_DAG = ( 117*9c5db199SXin Li (repair_utils.PingVerifier, 'ping', ()), 118*9c5db199SXin Li (repair_utils.SshVerifier, 'ssh', ('ping', )), 119*9c5db199SXin Li (cros_repair.ServoUSBDriveVerifier, 'usb_drive', ()), 120*9c5db199SXin Li (cros_repair.DevDefaultBootVerifier, 'dev_default_boot', ('ssh', )), 121*9c5db199SXin Li (cros_repair.DevModeVerifier, 'devmode', ('ssh', )), 122*9c5db199SXin Li (cros_repair.EnrollmentStateVerifier, 'enrollment_state', ('ssh', )), 123*9c5db199SXin Li (cros_repair.HWIDVerifier, 'hwid', ('ssh', )), 124*9c5db199SXin Li (cros_repair.ACPowerVerifier, 'power', ('ssh', )), 125*9c5db199SXin Li (cros_repair.EXT4fsErrorVerifier, 'ext4', ('ssh', )), 126*9c5db199SXin Li (cros_repair.WritableVerifier, 'writable', ('ssh', )), 127*9c5db199SXin Li (cros_repair.TPMStatusVerifier, 'tpm', ('ssh', )), 128*9c5db199SXin Li (cros_repair.UpdateSuccessVerifier, 'good_provision', ('ssh', )), 129*9c5db199SXin Li (cros_repair.FirmwareTpmVerifier, 'faft_tpm', ('ssh', )), 130*9c5db199SXin Li (cros_firmware.FirmwareStatusVerifier, 'fwstatus', ('ssh', )), 131*9c5db199SXin Li (cros_firmware.FirmwareVersionVerifier, 'rwfw', ('ssh', )), 132*9c5db199SXin Li (cros_repair.PythonVerifier, 'python', ('ssh', )), 133*9c5db199SXin Li (repair_utils.LegacyHostVerifier, 'cros', ('ssh', )), 134*9c5db199SXin Li (cros_repair.ProvisioningLabelsVerifier, 'provisioning_labels', 135*9c5db199SXin Li ('ssh', )), 136*9c5db199SXin Li (cros_repair.JetstreamTpmVerifier, 'jetstream_tpm', ('ssh', )), 137*9c5db199SXin Li (cros_repair.JetstreamAttestationVerifier, 'jetstream_attestation', 138*9c5db199SXin Li ('ssh', )), 139*9c5db199SXin Li (cros_repair.JetstreamServicesVerifier, 'jetstream_services', 140*9c5db199SXin Li ('ssh', )), 141*9c5db199SXin Li) 142*9c5db199SXin Li 143*9c5db199SXin LiJETSTREAM_REPAIR_ACTIONS = ( 144*9c5db199SXin Li (repair_utils.RPMCycleRepair, 'rpm', (), ( 145*9c5db199SXin Li 'ping', 146*9c5db199SXin Li 'ssh', 147*9c5db199SXin Li 'power', 148*9c5db199SXin Li )), 149*9c5db199SXin Li (cros_repair.ServoResetRepair, 'servoreset', (), ( 150*9c5db199SXin Li 'ping', 151*9c5db199SXin Li 'ssh', 152*9c5db199SXin Li )), 153*9c5db199SXin Li (cros_repair.ServoCr50RebootRepair, 'cr50_reset', (), ( 154*9c5db199SXin Li 'ping', 155*9c5db199SXin Li 'ssh', 156*9c5db199SXin Li )), 157*9c5db199SXin Li (cros_repair.ServoSysRqRepair, 'sysrq', (), ( 158*9c5db199SXin Li 'ping', 159*9c5db199SXin Li 'ssh', 160*9c5db199SXin Li )), 161*9c5db199SXin Li (cros_repair.ProvisioningLabelsRepair, 'provisioning_labels_repair', 162*9c5db199SXin Li ('ssh', ), ('provisioning_labels', )), 163*9c5db199SXin Li (cros_firmware.FaftFirmwareRepair, 'faft_firmware_repair', (), 164*9c5db199SXin Li ('ping', 'ssh', 'fwstatus', 'good_provision')), 165*9c5db199SXin Li (cros_repair.DevDefaultBootRepair, 'set_default_boot', ('ssh', ), 166*9c5db199SXin Li ('dev_default_boot', )), 167*9c5db199SXin Li (cros_repair.CrosRebootRepair, 'reboot', ('ssh', ), ( 168*9c5db199SXin Li 'devmode', 169*9c5db199SXin Li 'writable', 170*9c5db199SXin Li )), 171*9c5db199SXin Li (cros_repair.EnrollmentCleanupRepair, 'cleanup_enrollment', ('ssh', ), 172*9c5db199SXin Li ('enrollment_state', )), 173*9c5db199SXin Li (cros_repair.JetstreamTpmRepair, 'jetstream_tpm_repair', 174*9c5db199SXin Li ('ping', 'ssh', 'writable', 'tpm', 'good_provision', 'ext4'), 175*9c5db199SXin Li ('power', 'rwfw', 'fwstatus', 'python', 'hwid', 'cros', 176*9c5db199SXin Li 'dev_default_boot', 'jetstream_tpm', 'jetstream_attestation')), 177*9c5db199SXin Li (cros_repair.JetstreamServiceRepair, 'jetstream_service_repair', 178*9c5db199SXin Li ('ping', 'ssh', 'writable', 'tpm', 'good_provision', 'ext4', 179*9c5db199SXin Li 'jetstream_tpm', 'jetstream_attestation'), 180*9c5db199SXin Li ('power', 'rwfw', 'fwstatus', 'python', 'hwid', 'cros', 181*9c5db199SXin Li 'dev_default_boot', 'jetstream_tpm', 'jetstream_attestation', 182*9c5db199SXin Li 'jetstream_services')), 183*9c5db199SXin Li (cros_repair.ProvisionRepair, 'provision', 184*9c5db199SXin Li ('ping', 'ssh', 'writable', 'tpm', 'good_provision', 185*9c5db199SXin Li 'ext4'), ('power', 'rwfw', 'fwstatus', 'python', 'hwid', 'cros', 186*9c5db199SXin Li 'dev_default_boot', 'jetstream_tpm', 187*9c5db199SXin Li 'jetstream_attestation', 'jetstream_services')), 188*9c5db199SXin Li (cros_repair.PowerWashRepair, 'powerwash', ('ping', 'ssh', 'writable'), 189*9c5db199SXin Li ('tpm', 'good_provision', 'ext4', 'power', 'rwfw', 'fwstatus', 190*9c5db199SXin Li 'python', 'hwid', 'cros', 'dev_default_boot', 'jetstream_tpm', 191*9c5db199SXin Li 'jetstream_attestation', 'jetstream_services')), 192*9c5db199SXin Li (cros_repair.ServoInstallRepair, 'usb', ('usb_drive', ), ( 193*9c5db199SXin Li 'ping', 194*9c5db199SXin Li 'ssh', 195*9c5db199SXin Li 'writable', 196*9c5db199SXin Li 'tpm', 197*9c5db199SXin Li 'good_provision', 198*9c5db199SXin Li 'ext4', 199*9c5db199SXin Li 'power', 200*9c5db199SXin Li 'rwfw', 201*9c5db199SXin Li 'fwstatus', 202*9c5db199SXin Li 'python', 203*9c5db199SXin Li 'hwid', 204*9c5db199SXin Li 'cros', 205*9c5db199SXin Li 'dev_default_boot', 206*9c5db199SXin Li 'jetstream_tpm', 207*9c5db199SXin Li 'jetstream_attestation', 208*9c5db199SXin Li 'jetstream_services', 209*9c5db199SXin Li 'faft_tpm', 210*9c5db199SXin Li )), 211*9c5db199SXin Li) 212*9c5db199SXin Li 213*9c5db199SXin LiTPM_STATUS_OWNED = """ 214*9c5db199SXin LiMessage Reply: [tpm_manager.GetTpmNonsensitiveStatusReply] { 215*9c5db199SXin Li status: STATUS_SUCCESS 216*9c5db199SXin Li is_enabled: true 217*9c5db199SXin Li is_owned: true 218*9c5db199SXin Li is_owner_password_present: true 219*9c5db199SXin Li has_reset_lock_permissions: true 220*9c5db199SXin Li is_srk_default_auth: true 221*9c5db199SXin Li} 222*9c5db199SXin Li""" 223*9c5db199SXin Li 224*9c5db199SXin LiTPM_STATUS_NOT_OWNED = """ 225*9c5db199SXin LiMessage Reply: [tpm_manager.GetTpmNonsensitiveStatusReply] { 226*9c5db199SXin Li status: STATUS_SUCCESS 227*9c5db199SXin Li is_enabled: true 228*9c5db199SXin Li is_owned: false 229*9c5db199SXin Li is_owner_password_present: false 230*9c5db199SXin Li has_reset_lock_permissions: false 231*9c5db199SXin Li is_srk_default_auth: true 232*9c5db199SXin Li} 233*9c5db199SXin Li""" 234*9c5db199SXin Li 235*9c5db199SXin LiTPM_STATUS_CANNOT_LOAD_SRK = """ 236*9c5db199SXin LiMessage Reply: [tpm_manager.GetTpmNonsensitiveStatusReply] { 237*9c5db199SXin Li status: STATUS_SUCCESS 238*9c5db199SXin Li is_enabled: true 239*9c5db199SXin Li is_owned: true 240*9c5db199SXin Li is_owner_password_present: false 241*9c5db199SXin Li has_reset_lock_permissions: false 242*9c5db199SXin Li is_srk_default_auth: false 243*9c5db199SXin Li} 244*9c5db199SXin Li""" 245*9c5db199SXin Li 246*9c5db199SXin LiTPM_STATUS_READY = """ 247*9c5db199SXin LiTPM Enabled: true 248*9c5db199SXin LiTPM Owned: true 249*9c5db199SXin LiTPM Being Owned: false 250*9c5db199SXin LiTPM Ready: true 251*9c5db199SXin LiTPM Password: 9eaee4da8b4c 252*9c5db199SXin Li""" 253*9c5db199SXin Li 254*9c5db199SXin LiTPM_STATUS_NOT_READY = """ 255*9c5db199SXin LiTPM Enabled: true 256*9c5db199SXin LiTPM Owned: false 257*9c5db199SXin LiTPM Being Owned: true 258*9c5db199SXin LiTPM Ready: false 259*9c5db199SXin LiTPM Password: 260*9c5db199SXin Li""" 261*9c5db199SXin Li 262*9c5db199SXin Li 263*9c5db199SXin Liclass CrosRepairUnittests(unittest.TestCase): 264*9c5db199SXin Li # pylint: disable=missing-docstring 265*9c5db199SXin Li 266*9c5db199SXin Li maxDiff = None 267*9c5db199SXin Li 268*9c5db199SXin Li def test_cros_repair(self): 269*9c5db199SXin Li verify_dag = cros_repair._cros_verify_dag() 270*9c5db199SXin Li self.assertTupleEqual(verify_dag, CROS_VERIFY_DAG) 271*9c5db199SXin Li self.check_verify_dag(verify_dag) 272*9c5db199SXin Li repair_actions = cros_repair._cros_repair_actions() 273*9c5db199SXin Li self.assertTupleEqual(repair_actions, CROS_REPAIR_ACTIONS) 274*9c5db199SXin Li self.check_repair_actions(verify_dag, repair_actions) 275*9c5db199SXin Li 276*9c5db199SXin Li def test_moblab_repair(self): 277*9c5db199SXin Li verify_dag = cros_repair._moblab_verify_dag() 278*9c5db199SXin Li self.assertTupleEqual(verify_dag, MOBLAB_VERIFY_DAG) 279*9c5db199SXin Li self.check_verify_dag(verify_dag) 280*9c5db199SXin Li repair_actions = cros_repair._moblab_repair_actions() 281*9c5db199SXin Li self.assertTupleEqual(repair_actions, MOBLAB_REPAIR_ACTIONS) 282*9c5db199SXin Li self.check_repair_actions(verify_dag, repair_actions) 283*9c5db199SXin Li 284*9c5db199SXin Li def test_jetstream_repair(self): 285*9c5db199SXin Li verify_dag = cros_repair._jetstream_verify_dag() 286*9c5db199SXin Li self.assertTupleEqual(verify_dag, JETSTREAM_VERIFY_DAG) 287*9c5db199SXin Li self.check_verify_dag(verify_dag) 288*9c5db199SXin Li repair_actions = cros_repair._jetstream_repair_actions() 289*9c5db199SXin Li self.assertTupleEqual(repair_actions, JETSTREAM_REPAIR_ACTIONS) 290*9c5db199SXin Li self.check_repair_actions(verify_dag, repair_actions) 291*9c5db199SXin Li 292*9c5db199SXin Li def check_verify_dag(self, verify_dag): 293*9c5db199SXin Li """Checks that dependency labels are defined.""" 294*9c5db199SXin Li labels = [n[1] for n in verify_dag] 295*9c5db199SXin Li for node in verify_dag: 296*9c5db199SXin Li for dep in node[2]: 297*9c5db199SXin Li self.assertIn(dep, labels) 298*9c5db199SXin Li 299*9c5db199SXin Li def check_repair_actions(self, verify_dag, repair_actions): 300*9c5db199SXin Li """Checks that dependency and trigger labels are defined.""" 301*9c5db199SXin Li verify_labels = [n[1] for n in verify_dag] 302*9c5db199SXin Li for action in repair_actions: 303*9c5db199SXin Li deps = action[2] 304*9c5db199SXin Li triggers = action[3] 305*9c5db199SXin Li for label in deps + triggers: 306*9c5db199SXin Li self.assertIn(label, verify_labels) 307*9c5db199SXin Li 308*9c5db199SXin Li def test_get_tpm_status_owned(self): 309*9c5db199SXin Li mock_host = mock.Mock() 310*9c5db199SXin Li mock_host.run.return_value.stdout = TPM_STATUS_OWNED 311*9c5db199SXin Li status = cros_repair.TpmStatus(mock_host) 312*9c5db199SXin Li self.assertTrue(status.tpm_enabled) 313*9c5db199SXin Li self.assertTrue(status.tpm_owned) 314*9c5db199SXin Li self.assertTrue(status.tpm_can_load_srk) 315*9c5db199SXin Li self.assertTrue(status.tpm_can_load_srk_pubkey) 316*9c5db199SXin Li 317*9c5db199SXin Li def test_get_tpm_status_not_owned(self): 318*9c5db199SXin Li mock_host = mock.Mock() 319*9c5db199SXin Li mock_host.run.return_value.stdout = TPM_STATUS_NOT_OWNED 320*9c5db199SXin Li status = cros_repair.TpmStatus(mock_host) 321*9c5db199SXin Li self.assertTrue(status.tpm_enabled) 322*9c5db199SXin Li self.assertFalse(status.tpm_owned) 323*9c5db199SXin Li self.assertFalse(status.tpm_can_load_srk) 324*9c5db199SXin Li self.assertFalse(status.tpm_can_load_srk_pubkey) 325*9c5db199SXin Li 326*9c5db199SXin Li @mock.patch.object(cros_repair, '_is_virtual_machine') 327*9c5db199SXin Li def test_tpm_status_verifier_owned(self, mock_is_virt): 328*9c5db199SXin Li mock_is_virt.return_value = False 329*9c5db199SXin Li mock_host = mock.Mock() 330*9c5db199SXin Li mock_host.run.return_value.stdout = TPM_STATUS_OWNED 331*9c5db199SXin Li tpm_verifier = cros_repair.TPMStatusVerifier('test', []) 332*9c5db199SXin Li tpm_verifier.verify(mock_host) 333*9c5db199SXin Li 334*9c5db199SXin Li @mock.patch.object(cros_repair, '_is_virtual_machine') 335*9c5db199SXin Li def test_tpm_status_verifier_not_owned(self, mock_is_virt): 336*9c5db199SXin Li mock_is_virt.return_value = False 337*9c5db199SXin Li mock_host = mock.Mock() 338*9c5db199SXin Li mock_host.run.return_value.stdout = TPM_STATUS_NOT_OWNED 339*9c5db199SXin Li tpm_verifier = cros_repair.TPMStatusVerifier('test', []) 340*9c5db199SXin Li tpm_verifier.verify(mock_host) 341*9c5db199SXin Li 342*9c5db199SXin Li @mock.patch.object(cros_repair, '_is_virtual_machine') 343*9c5db199SXin Li def test_tpm_status_verifier_cannot_load_srk_pubkey(self, mock_is_virt): 344*9c5db199SXin Li mock_is_virt.return_value = False 345*9c5db199SXin Li mock_host = mock.Mock() 346*9c5db199SXin Li mock_host.run.return_value.stdout = TPM_STATUS_CANNOT_LOAD_SRK 347*9c5db199SXin Li tpm_verifier = cros_repair.TPMStatusVerifier('test', []) 348*9c5db199SXin Li with self.assertRaises(hosts.AutoservVerifyError) as ctx: 349*9c5db199SXin Li tpm_verifier.verify(mock_host) 350*9c5db199SXin Li self.assertEqual('Cannot load the TPM SRK', str(ctx.exception)) 351*9c5db199SXin Li 352*9c5db199SXin Li def test_jetstream_tpm_owned(self): 353*9c5db199SXin Li mock_host = mock.Mock() 354*9c5db199SXin Li mock_host.run.side_effect = [ 355*9c5db199SXin Li mock.Mock(stdout=TPM_STATUS_OWNED), 356*9c5db199SXin Li mock.Mock(stdout=TPM_STATUS_READY), 357*9c5db199SXin Li ] 358*9c5db199SXin Li tpm_verifier = cros_repair.JetstreamTpmVerifier('test', []) 359*9c5db199SXin Li tpm_verifier.verify(mock_host) 360*9c5db199SXin Li 361*9c5db199SXin Li @mock.patch.object(retry.logging, 'warning') 362*9c5db199SXin Li @mock.patch.object(retry.time, 'time') 363*9c5db199SXin Li @mock.patch.object(retry.time, 'sleep') 364*9c5db199SXin Li def test_jetstream_tpm_not_owned(self, mock_sleep, mock_time, mock_logging): 365*9c5db199SXin Li mock_time.side_effect = itertools.count(0, 20) 366*9c5db199SXin Li mock_host = mock.Mock() 367*9c5db199SXin Li mock_host.run.return_value.stdout = TPM_STATUS_NOT_OWNED 368*9c5db199SXin Li tpm_verifier = cros_repair.JetstreamTpmVerifier('test', []) 369*9c5db199SXin Li with self.assertRaises(hosts.AutoservVerifyError) as ctx: 370*9c5db199SXin Li tpm_verifier.verify(mock_host) 371*9c5db199SXin Li self.assertEqual('TPM is not owned', str(ctx.exception)) 372*9c5db199SXin Li 373*9c5db199SXin Li @mock.patch.object(retry.logging, 'warning') 374*9c5db199SXin Li @mock.patch.object(retry.time, 'time') 375*9c5db199SXin Li @mock.patch.object(retry.time, 'sleep') 376*9c5db199SXin Li def test_jetstream_tpm_not_ready(self, mock_sleep, mock_time, mock_logging): 377*9c5db199SXin Li mock_time.side_effect = itertools.count(0, 20) 378*9c5db199SXin Li mock_host = mock.Mock() 379*9c5db199SXin Li mock_host.run.side_effect = itertools.cycle([ 380*9c5db199SXin Li mock.Mock(stdout=TPM_STATUS_OWNED), 381*9c5db199SXin Li mock.Mock(stdout=TPM_STATUS_NOT_READY), 382*9c5db199SXin Li ]) 383*9c5db199SXin Li tpm_verifier = cros_repair.JetstreamTpmVerifier('test', []) 384*9c5db199SXin Li with self.assertRaises(hosts.AutoservVerifyError) as ctx: 385*9c5db199SXin Li tpm_verifier.verify(mock_host) 386*9c5db199SXin Li self.assertEqual('TPM is not ready', str(ctx.exception)) 387*9c5db199SXin Li 388*9c5db199SXin Li @mock.patch.object(retry.logging, 'warning') 389*9c5db199SXin Li @mock.patch.object(retry.time, 'time') 390*9c5db199SXin Li @mock.patch.object(retry.time, 'sleep') 391*9c5db199SXin Li def test_jetstream_tpm_missing(self, mock_sleep, mock_time, mock_logging): 392*9c5db199SXin Li mock_time.side_effect = itertools.count(0, 20) 393*9c5db199SXin Li mock_host = mock.Mock() 394*9c5db199SXin Li mock_host.run.side_effect = error.AutoservRunError('test', None) 395*9c5db199SXin Li tpm_verifier = cros_repair.JetstreamTpmVerifier('test', []) 396*9c5db199SXin Li with self.assertRaises(hosts.AutoservVerifyError) as ctx: 397*9c5db199SXin Li tpm_verifier.verify(mock_host) 398*9c5db199SXin Li self.assertEqual('Could not determine TPM status', str(ctx.exception)) 399*9c5db199SXin Li 400*9c5db199SXin Li 401*9c5db199SXin Liif __name__ == '__main__': 402*9c5db199SXin Li unittest.main() 403