81 lines
3.1 KiB
Python
81 lines
3.1 KiB
Python
# Copyright 2017 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
|
|
|
|
from autotest_lib.client.bin import test
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.client.common_lib import utils
|
|
|
|
|
|
class detachablebase_TriggerHammerd(test.test):
|
|
"""Hammerd smoke test.
|
|
|
|
Hammerd upstart job should be invoked on boot. The job should exit normally.
|
|
|
|
Also, checks that hammerd enables USB autosuspend on the hammer device.
|
|
"""
|
|
version = 1
|
|
|
|
# The upstart job's name.
|
|
PROCESS_NAME = 'hammerd'
|
|
|
|
# Path of the system log.
|
|
MESSAGE_PATH = '/var/log/messages'
|
|
|
|
# Message to find the start line of each boot. The boot timing is usually
|
|
# [ 0.000000], but in case the boot process has delay, we accept any
|
|
# timing within 1 second.
|
|
BOOT_START_LINE_MSG = 'kernel: \[ 0\.[0-9]\{6\}\] Linux version'
|
|
|
|
# Message that is printed when hammerd is triggered on boot.
|
|
# It is defined at `src/platform2/hammerd/init/hammerd-at-boot.sh`.
|
|
TRIGGER_ON_BOOT_MSG = 'Force trigger hammerd at boot.'
|
|
|
|
# Message that is printed when the hammerd job failed to terminated
|
|
# normally.
|
|
PROCESS_FAILED_MSG = '%s main process ([0-9]\+) terminated' % PROCESS_NAME
|
|
|
|
# Hammerd writes path to USB device in that file.
|
|
WRITE_SYSFS_PATH = '/run/metrics/external/hammer/hammer_sysfs_path'
|
|
|
|
# Autosuspend control sysfs PATH (rooted at USB device sysfs path)
|
|
SYSFS_POWER_CONTROL_PATH = 'power/control'
|
|
|
|
def run_once(self):
|
|
# Get the start line of message belonging to this current boot.
|
|
start_line = utils.run(
|
|
'grep -ni "%s" "%s" | tail -n 1 | cut -d ":" -f 1' %
|
|
(self.BOOT_START_LINE_MSG, self.MESSAGE_PATH),
|
|
ignore_status=True).stdout.strip()
|
|
logging.info('Start line: %s', start_line)
|
|
if not start_line:
|
|
raise error.TestFail('Start line of boot is not found.')
|
|
|
|
def _grep_messages(pattern):
|
|
return utils.run('tail -n +%s %s | grep "%s"' %
|
|
(start_line, self.MESSAGE_PATH, pattern),
|
|
ignore_status=True).stdout
|
|
|
|
# Check hammerd is triggered on boot.
|
|
if not _grep_messages(self.TRIGGER_ON_BOOT_MSG):
|
|
raise error.TestFail('hammerd is not triggered on boot.')
|
|
# Check hammerd is terminated normally.
|
|
if _grep_messages(self.PROCESS_FAILED_MSG):
|
|
hammerd_log = _grep_messages(self.PROCESS_NAME)
|
|
logging.error('Hammerd log: %s', hammerd_log)
|
|
raise error.TestFail('hammerd terminated with non-zero value')
|
|
|
|
# Check that hammerd wrote to WRITE_SYSFS_PATH
|
|
sysfspath = utils.read_one_line(self.WRITE_SYSFS_PATH)
|
|
|
|
if not sysfspath:
|
|
raise error.TestFail('%s is empty' % (self.WRITE_SYSFS_PATH))
|
|
|
|
# Check that autosuspend is enabled
|
|
power = utils.read_one_line(sysfspath + '/' +
|
|
self.SYSFS_POWER_CONTROL_PATH)
|
|
if power != 'auto':
|
|
raise error.TestFail('Autosuspend not enabled on hammer port')
|