Home | History | Annotate | Download | only in power_Backlight
      1 # Copyright (c) 2010 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 import time
      6 from autotest_lib.client.bin import test, utils
      7 from autotest_lib.client.common_lib import error
      8 from autotest_lib.client.cros import service_stopper
      9 from autotest_lib.client.cros.graphics import graphics_utils
     10 from autotest_lib.client.cros.power import power_status, power_utils
     11 
     12 
     13 class power_Backlight(test.test):
     14     version = 1
     15 
     16 
     17     def initialize(self):
     18         """Perform necessary initialization prior to test run.
     19 
     20         Private Attributes:
     21           _backlight: power_utils.Backlight object
     22           _services: service_stopper.ServiceStopper object
     23         """
     24         super(power_Backlight, self).initialize()
     25         self._backlight = None
     26         self._services = service_stopper.ServiceStopper(
     27             service_stopper.ServiceStopper.POWER_DRAW_SERVICES)
     28         self._services.stop_services()
     29 
     30 
     31     def run_once(self, delay=60, seconds=10, tries=20):
     32         self._backlight = power_utils.Backlight()
     33 
     34 
     35         # disable screen blanking. Stopping screen-locker isn't
     36         # synchronous :(. Add a sleep for now, till powerd comes around
     37         # and fixes all this for us.
     38         # TODO(davidjames): Power manager should support this feature directly
     39         time.sleep(5)
     40         graphics_utils.screen_disable_blanking()
     41 
     42         status = power_status.get_status()
     43         status.assert_battery_state(5)
     44 
     45         max_brightness = self._backlight.get_max_level()
     46         if max_brightness < 4:
     47             raise error.TestFail('Must have at least 5 backlight levels')
     48         sysfs_max = self._get_highest_sysfs_max_brightness()
     49         if max_brightness != sysfs_max:
     50             raise error.TestFail(('Max brightness %d is not the highest ' +
     51                                   'possible |max_brightness|, which is %d') %
     52                                  (max_brightness, sysfs_max))
     53         keyvals = {}
     54         rates = []
     55 
     56         levels = [0, 50, 100]
     57         for i in levels:
     58             self._backlight.set_percent(i)
     59             time.sleep(delay)
     60             this_rate = []
     61             for _ in range(tries):
     62                 time.sleep(seconds)
     63                 status.refresh()
     64                 this_rate.append(status.battery[0].energy_rate)
     65             rate = min(this_rate)
     66             keyvals['w_bl_%d_rate' % i] = rate
     67             rates.append(rate)
     68         self.write_perf_keyval(keyvals)
     69         for i in range(1, len(levels)):
     70             if rates[i] <= rates[i-1]:
     71                 raise error.TestFail('Turning up the backlight ' \
     72                                      'should increase energy consumption')
     73 
     74 
     75     def cleanup(self):
     76         if self._backlight:
     77             self._backlight.restore()
     78         self._services.restore_services()
     79         super(power_Backlight, self).cleanup()
     80 
     81 
     82     def _get_highest_sysfs_max_brightness(self):
     83         # Print |max_brightness| for all backlight sysfs directories, and return
     84         # the highest of these max_brightness values.
     85         cmd = 'cat /sys/class/backlight/*/max_brightness'
     86         output = utils.system_output(cmd)
     87         return max(map(int, output.split()))
     88