1# Copyright 2014 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 7import common 8from autotest_lib.client.common_lib import error 9from autotest_lib.server import test 10from autotest_lib.server.cros import debugd_dev_tools 11 12 13class debugd_DevTools(test.test): 14 """ 15 Debugd dev tools test. See control file for details. 16 """ 17 version = 1 18 19 20 def create_tools(self, host): 21 """ 22 Creates and initializes the tools needed for the test. 23 24 Saves a RootfsVerificationTool to self.rootfs_tool and the rest 25 to self.tools. The RootfsVerificationTool is handled separately 26 because it can't be disabled and is required first for the 27 other tools to function properly. 28 29 @param host: Host device. 30 31 @throw error.TestNAError: Dev tools are unavailable. 32 """ 33 if not debugd_dev_tools.are_dev_tools_available(host): 34 raise error.TestNAError('Cannot access dev tools. Make sure the ' 35 'device is in dev mode with no owner and ' 36 'the boot lockbox is not finalized.') 37 38 logging.debug('Creating dev tools.') 39 self.rootfs_tool = debugd_dev_tools.RootfsVerificationTool() 40 self.tools = (debugd_dev_tools.BootFromUsbTool(), 41 debugd_dev_tools.SshServerTool(), 42 debugd_dev_tools.SystemPasswordTool()) 43 44 logging.debug('Initializing dev tools.') 45 self.rootfs_tool.initialize(host) 46 for tool in self.tools: 47 tool.initialize(host, save_initial_state=True) 48 49 50 def cleanup_tools(self, host): 51 """ 52 Performs cleanup to return the device to its initial state. 53 54 Any tools that fail to clean up will print a warning but will 55 not register a test failure. 56 57 @param host: Host device. 58 """ 59 logging.debug('Cleaning up tools.') 60 for tool in self.tools: 61 try: 62 tool.restore_state() 63 except debugd_dev_tools.FeatureUnavailableError as e: 64 logging.warning('Could not restore %s - device state may be ' 65 'altered by test (%s).', tool, e) 66 debugd_dev_tools.remove_temp_files(host) 67 68 69 def test_tool(self, tool): 70 """ 71 Tests an individual tool. 72 73 Functionality is tested by disabling, enabling, then disabling 74 again. Certain tools may be unavailable on a board (e.g. USB 75 boot on Mario), which will log a warning but not register a 76 test failure. 77 78 @param tool: Tool object to test. 79 80 @throw debugd_dev_tools.AccessError: Dev tool access failed. 81 @throw error.TestFail: A tool failed to affect device state. 82 """ 83 # Start by disabling the tool. If disable fails we may still be 84 # able to test enabling the tool. 85 logging.debug('Disabling %s.', tool) 86 try: 87 tool.disable() 88 except debugd_dev_tools.FeatureUnavailableError as e: 89 # If the tool can't be disabled and is already enabled there's no 90 # way to test if our enable function is working or not. 91 if tool.is_enabled(): 92 logging.warning('Skipping %s - cannot disable (%s).', tool, e) 93 return 94 if tool.is_enabled(): 95 raise error.TestFail('%s did not disable correctly.' % tool) 96 97 # Now enable the tool and make sure it worked. 98 logging.debug('Enabling %s.', tool) 99 try: 100 tool.enable() 101 except debugd_dev_tools.FeatureUnavailableError as e: 102 logging.warning('Skipping %s - cannot enable (%s).', tool, e) 103 return 104 if not tool.is_enabled(): 105 raise error.TestFail('%s did not enable correctly.' % tool) 106 107 # Disable one more time to confirm our disable routine works. 108 logging.debug('Disabling %s.', tool) 109 try: 110 tool.disable() 111 except debugd_dev_tools.FeatureUnavailableError: 112 return 113 if tool.is_enabled(): 114 raise error.TestFail('%s did not disable correctly.' % tool) 115 116 117 def run_once(self, host=None): 118 self.create_tools(host) 119 try: 120 # First remove rootfs verification if it's not already. 121 if not self.rootfs_tool.is_enabled(): 122 logging.debug('Removing rootfs verification.') 123 self.rootfs_tool.enable() 124 125 for tool in self.tools: 126 self.test_tool(tool) 127 finally: 128 self.cleanup_tools(host) 129