xref: /aosp_15_r20/external/autotest/server/hosts/cros_repair_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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