xref: /aosp_15_r20/external/autotest/server/site_tests/firmware_Cr50Testlab/firmware_Cr50Testlab.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1# Copyright 2017 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import logging
6
7from autotest_lib.client.common_lib import error
8from autotest_lib.server.cros.faft.cr50_test import Cr50Test
9from autotest_lib.server.cros.servo import chrome_ti50
10
11
12class firmware_Cr50Testlab(Cr50Test):
13    """Verify cr50 testlab enable/disable."""
14    version = 1
15    ACCESS_DENIED = 'Access Denied'
16    INVALID_PARAM = 'Parameter 1 invalid'
17    BASIC_ERROR = 'Usage: ccd '
18
19    def initialize(self, host, cmdline_args, full_args):
20        """Initialize servo. Check that it can access cr50"""
21        super(firmware_Cr50Testlab, self).initialize(host, cmdline_args,
22                full_args)
23
24        if not hasattr(self, 'cr50'):
25            raise error.TestNAError('Test can only be run on devices with '
26                                    'access to the Cr50 console')
27        if self.servo.main_device_is_ccd():
28            raise error.TestNAError('Use a flex cable instead of CCD cable.')
29        if self.servo.main_device_uses_gsc_drv():
30            raise error.TestNAError('Cannot run with c2d2 until cold_reset '
31                                    'issue is resolved')
32
33        if isinstance(self.cr50, chrome_ti50.ChromeTi50):
34            self.BASIC_ERROR = 'Command \'ccd\' failed'
35            self.INVALID_PARAM = 'Param2'
36
37        # Get the current reset count, so we can check that there haven't been
38        # any cr50 resets at any point during the test.
39        self.start_reset_count = self.cr50.get_reset_count()
40
41    def cleanup(self):
42        """Reenable testlab mode."""
43        try:
44            self.fast_ccd_open(enable_testlab=True)
45        finally:
46            super(firmware_Cr50Testlab, self).cleanup()
47
48    def try_testlab(self, mode, err=''):
49        """Try to modify ccd testlab mode.
50
51        Args:
52            mode: The testlab command: 'on', 'off', or 'open'
53            err: An empty string if the command should succeed or the error
54                 message.
55
56        Raises:
57            TestFail if setting the ccd testlab mode doesn't match err
58        """
59        logging.info('Setting ccd testlab %s', mode)
60        rv = self.cr50.send_command_get_output('ccd testlab %s' % mode,
61                ['ccd.*>'])[0]
62        logging.info(rv)
63        if err not in rv or (not err and self.BASIC_ERROR in rv):
64            raise error.TestFail('Unexpected result setting "%s": %r' % (mode,
65                    rv))
66        if err:
67            return
68
69        if mode == 'open':
70            if mode != self.cr50.get_ccd_level():
71                raise error.TestFail('ccd testlab open did not open the device')
72        else:
73            self.cr50.run_pp(self.cr50.PP_SHORT)
74            if (mode == 'on') != self.cr50.testlab_is_on():
75                raise error.TestFail('Testlab mode could not be turned %s' %
76                        mode)
77            logging.info('Set ccd testlab %s', mode)
78
79
80    def check_reset_count(self):
81        """Verify there haven't been any cr50 reboots"""
82        reset_count = self.cr50.get_reset_count()
83        if self.start_reset_count != reset_count:
84            raise error.TestFail('Unexpected cr50 reboot')
85
86
87    def reset_ccd(self):
88        """Enable ccd testlab mode and set the privilege level to open"""
89        logging.info('Resetting CCD state')
90        self.fast_ccd_open(enable_testlab=True, reset_ccd=True)
91        self.check_reset_count()
92
93
94    def run_once(self):
95        """Try to set testlab mode from different privilege levels."""
96        # Dummy isn't a valid mode. Make sure it fails
97        self.reset_ccd()
98        self.try_testlab('dummy', err=self.INVALID_PARAM)
99
100        # If ccd is locked, ccd testlab dummy should fail with access denied not
101        # invalid param.
102        self.reset_ccd()
103        self.cr50.set_ccd_level('lock')
104        self.try_testlab('dummy', err=self.ACCESS_DENIED)
105
106        # CCD can be opened without physical presence if testlab mode is enabled
107        self.reset_ccd()
108        self.try_testlab('on')
109        self.try_testlab('open')
110        self.check_reset_count()
111
112        # You shouldn't be able to use testlab open if it is disabled
113        self.reset_ccd()
114        self.try_testlab('off')
115        self.try_testlab('open', err=self.ACCESS_DENIED)
116        self.check_reset_count()
117
118        # You can't turn on testlab mode while ccd is locked
119        self.reset_ccd()
120        self.cr50.set_ccd_level('lock')
121        self.try_testlab('on', err=self.ACCESS_DENIED)
122        self.check_reset_count()
123
124        # You can't turn off testlab mode while ccd is locked
125        self.reset_ccd()
126        self.cr50.set_ccd_level('lock')
127        self.try_testlab('off', err=self.ACCESS_DENIED)
128        self.check_reset_count()
129
130        # If testlab mode is enabled, you can open the device without physical
131        # presence by using 'ccd testlab open'.
132        self.reset_ccd()
133        self.try_testlab('on')
134        self.cr50.set_ccd_level('lock')
135        self.try_testlab('open')
136        self.check_reset_count()
137
138        # If testlab mode is disabled, testlab open should fail with access
139        # denied.
140        self.reset_ccd()
141        self.try_testlab('off')
142        self.cr50.set_ccd_level('lock')
143        self.try_testlab('open', err=self.ACCESS_DENIED)
144        self.check_reset_count()
145        logging.info('ccd testlab is accessbile')
146