Home | History | Annotate | Download | only in hardware_Fan
      1 # Copyright (c) 2011 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 
      5 
      6 # DESCRIPTION :
      7 #
      8 # This is a hardware test for system fan.  The test first sets the fan to max
      9 # speed, turns off the fan, and then sets to 50% speed.  The test sleeps for a
     10 # few seconds after setting the fan speed, which allows the fan some time to
     11 # spin up/down and ensures the correctness of the test.  The test restores fan
     12 # setting when finished.  This test uses mosys to read and control fan settings.
     13 
     14 
     15 import re
     16 import time
     17 
     18 from autotest_lib.client.bin import test, utils
     19 from autotest_lib.client.common_lib import error
     20 
     21 
     22 class FanControl(object):
     23     MOSYS_OUTPUT_RE = re.compile('(\w+)="(.*?)"')
     24 
     25     def __init__(self, fan_name='system'):
     26         self._fan_name = fan_name
     27 
     28     def get_values(self):
     29         values = {}
     30         cmd = 'mosys -k sensor print fantach %s' % self._fan_name
     31         for kv in self.MOSYS_OUTPUT_RE.finditer(utils.system_output(cmd)):
     32             key, value = kv.groups()
     33             if key == 'reading':
     34                 value = int(value)
     35             values[key] = value
     36         return values
     37 
     38     def get_mode(self):
     39         return self.get_values()['mode']
     40 
     41     def get_reading(self):
     42         return self.get_values()['reading']
     43 
     44     def set_percent(self, percent):
     45         cmd = 'mosys sensor set fantach %s %s' % (self._fan_name, percent)
     46         utils.system_output(cmd)
     47 
     48 
     49 class hardware_Fan(test.test):
     50     version = 1
     51     DELAY = 3
     52 
     53     def run_once(self):
     54         fan = FanControl()
     55         original_values = fan.get_values()
     56         max_reading = 0
     57 
     58         try:
     59             fan.set_percent('100')
     60             time.sleep(self.DELAY)
     61             if fan.get_mode() != 'manual':
     62                 raise error.TestError('Unable to manually set fan speed')
     63             if fan.get_reading() == 0:
     64                 raise error.TestError('Fan cannot be turned on')
     65             max_reading = fan.get_reading()
     66 
     67             fan.set_percent('off')
     68             time.sleep(self.DELAY)
     69             if fan.get_reading() != 0:
     70                 raise error.TestError('Unable to turn off fan')
     71 
     72             fan.set_percent('50')
     73             time.sleep(self.DELAY)
     74             if not 0 < fan.get_reading() < max_reading:
     75                 raise error.TestError('Fan speed not in reasonable range')
     76         finally:
     77             if original_values['mode'] == 'manual' and max_reading > 0:
     78                 fan.set_percent(100 * original_values['reading'] / max_reading)
     79             else:
     80                 fan.set_percent('auto')
     81