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