# Copyright (c) 2010 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.cros import power_utils, service_stopper class hardware_Backlight(test.test): version = 1 def initialize(self): """Perform necessary initialization prior to test run. Private Attributes: _backlight: power_utils.Backlight object _services: service_stopper.ServiceStopper object """ super(hardware_Backlight, self).initialize() self._backlight = None # Stop powerd to avoid it adjusting backlight levels self._services = service_stopper.ServiceStopper(['powerd']) self._services.stop_services() def run_once(self): # optionally test keyboard backlight kblight = None kblight_errs = 0 try: kblight = power_utils.KbdBacklight() except power_utils.KbdBacklightException as e: logging.info("Assuming no keyboard backlight due to %s", str(e)) if kblight: init_percent = kblight.get_percent() try: for i in xrange(100, -1, -1): kblight.set_percent(i) result = int(kblight.get_percent()) if i != result: logging.error('keyboard backlight set %d != %d get', i, result) kblight_errs += 1 finally: kblight.set_percent(init_percent) if kblight_errs: raise error.TestFail("%d errors testing keyboard backlight." % \ kblight_errs) self._backlight = power_utils.Backlight() backlight_errs = 0 backlight_max = self._backlight.get_max_level() for i in xrange(backlight_max + 1): self._backlight.set_level(i) result = self._backlight.get_level() if i != result: # The kernel Documentation/ABI/stable/sysfs-class-backlight # states that the requested brightness may not be the # actual_brightness. # Although not specified in the docs, let's allow the difference # between requested brightness and actual_brightness percent be # within a tolerance of 1 of each other. actual_percent = self._backlight.get_percent() expected_percent = float(i) / float(backlight_max) * 100.0 diff_percent = abs(actual_percent - expected_percent) log_level_func = logging.warn if diff_percent > 1: backlight_errs += 1 log_level_func = logging.error log_level_func('backlight expected vs. actual exceeds error' 'tolerance') log_level_func('backlight set %d != %d get', i, result) log_level_func('backlight percent difference is %f%%', diff_percent) if backlight_errs: raise error.TestFail("%d errors testing backlight." % \ backlight_errs) def cleanup(self): if self._backlight: self._backlight.restore() self._services.restore_services() super(hardware_Backlight, self).cleanup()