blob: 27c06940ff44ce4870c2461344dbb592952bd583 [file] [log] [blame]
# Copyright (c) 2011 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.
# DESCRIPTION :
#
# This is a hardware test for system fan. The test first sets the fan to max
# speed, turns off the fan, and then sets to 50% speed. The test sleeps for a
# few seconds after setting the fan speed, which allows the fan some time to
# spin up/down and ensures the correctness of the test. The test restores fan
# setting when finished. This test uses mosys to read and control fan settings.
import re
import time
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
class FanControl(object):
MOSYS_OUTPUT_RE = re.compile('(\w+)="(.*?)"')
def __init__(self, fan_name='system'):
self._fan_name = fan_name
def get_values(self):
values = {}
cmd = 'mosys -k sensor print fantach %s' % self._fan_name
for kv in self.MOSYS_OUTPUT_RE.finditer(utils.system_output(cmd)):
key, value = kv.groups()
if key == 'reading':
value = int(value)
values[key] = value
return values
def get_mode(self):
return self.get_values()['mode']
def get_reading(self):
return self.get_values()['reading']
def set_percent(self, percent):
cmd = 'mosys sensor set fantach %s %s' % (self._fan_name, percent)
utils.system_output(cmd)
class hardware_Fan(test.test):
version = 1
DELAY = 3
def run_once(self):
fan = FanControl()
original_values = fan.get_values()
max_reading = 0
try:
fan.set_percent('100')
time.sleep(self.DELAY)
if fan.get_mode() != 'manual':
raise error.TestError('Unable to manually set fan speed')
if fan.get_reading() == 0:
raise error.TestError('Fan cannot be turned on')
max_reading = fan.get_reading()
fan.set_percent('off')
time.sleep(self.DELAY)
if fan.get_reading() != 0:
raise error.TestError('Unable to turn off fan')
fan.set_percent('50')
time.sleep(self.DELAY)
if not 0 < fan.get_reading() < max_reading:
raise error.TestError('Fan speed not in reasonable range')
finally:
if original_values['mode'] == 'manual' and max_reading > 0:
fan.set_percent(100 * original_values['reading'] / max_reading)
else:
fan.set_percent('auto')