blob: 1e3308d8b61fb92dd3a30df05c10ca471926df7e [file] [log] [blame]
# Copyright 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
import common
from autotest_lib.client.common_lib import error
from autotest_lib.server import test
from autotest_lib.server.cros import debugd_dev_tools
class debugd_DevTools(test.test):
"""
Debugd dev tools test. See control file for details.
"""
version = 1
def create_tools(self, host):
"""
Creates and initializes the tools needed for the test.
Saves a RootfsVerificationTool to self.rootfs_tool and the rest
to self.tools. The RootfsVerificationTool is handled separately
because it can't be disabled and is required first for the
other tools to function properly.
@param host: Host device.
@throw error.TestNAError: Dev tools are unavailable.
"""
if not debugd_dev_tools.are_dev_tools_available(host):
raise error.TestNAError('Cannot access dev tools. Make sure the '
'device is in dev mode with no owner and '
'the boot lockbox is not finalized.')
logging.debug('Creating dev tools.')
self.rootfs_tool = debugd_dev_tools.RootfsVerificationTool()
self.tools = (debugd_dev_tools.BootFromUsbTool(),
debugd_dev_tools.SshServerTool(),
debugd_dev_tools.SystemPasswordTool())
logging.debug('Initializing dev tools.')
self.rootfs_tool.initialize(host)
for tool in self.tools:
tool.initialize(host, save_initial_state=True)
def cleanup_tools(self, host):
"""
Performs cleanup to return the device to its initial state.
Any tools that fail to clean up will print a warning but will
not register a test failure.
@param host: Host device.
"""
logging.debug('Cleaning up tools.')
for tool in self.tools:
try:
tool.restore_state()
except debugd_dev_tools.FeatureUnavailableError as e:
logging.warning('Could not restore %s - device state may be '
'altered by test (%s).', tool, e)
debugd_dev_tools.remove_temp_files(host)
def test_tool(self, tool):
"""
Tests an individual tool by disabling, enabling, then disabling again.
@param tool: Tool object to test.
@throw debugd_dev_tools.AccessError: Dev tool access failed.
@throw error.TestFail: A tool failed to affect device state.
"""
# Start by disabling the tool. If disable fails we may still be
# able to test enabling the tool.
logging.debug('Disabling %s.', tool)
tool.disable()
if tool.is_enabled():
raise error.TestFail('%s did not disable correctly.' % tool)
# Now enable the tool and make sure it worked.
logging.debug('Enabling %s.', tool)
tool.enable()
if not tool.is_enabled():
raise error.TestFail('%s did not enable correctly.' % tool)
# Disable one more time to confirm our disable routine works.
logging.debug('Disabling %s.', tool)
tool.disable()
if tool.is_enabled():
raise error.TestFail('%s did not disable correctly.' % tool)
def run_once(self, host=None):
"""Main test function."""
self.create_tools(host)
try:
# First remove rootfs verification if it's not already.
if not self.rootfs_tool.is_enabled():
logging.debug('Removing rootfs verification.')
self.rootfs_tool.enable()
for tool in self.tools:
self.test_tool(tool)
finally:
self.cleanup_tools(host)