# 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')