| # Copyright (c) 2014 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.common_lib import error |
| from autotest_lib.server import autotest, test |
| |
| |
| # TODO(b/163372205): Some models before unibuild have ambient light sensors |
| # only on certain skus. However, has_ambient_light_sensor powerd pref has to |
| # be set for all skus. For these models, skip checking the existence of ambient |
| # light sensors against has_ambient_light_sensor powerd pref. |
| IGNORE_ALS_PREF_MODELS = ['caroline'] |
| |
| class power_BrightnessResetAfterReboot(test.test): |
| """Verifies that the panel brightness level resets after device reboots. |
| """ |
| version = 2 |
| |
| def run_once(self, host, client_autotest): |
| """This test verifies that the panel brightness level resets after |
| device reboots. |
| """ |
| if host.has_internal_display() is None: |
| raise error.TestNAError('Device has no internal display.') |
| autotest_client = autotest.Autotest(host) |
| host.reboot() |
| autotest_client.run_test(client_autotest, |
| exit_without_logout=True) |
| |
| cmd = 'check_powerd_config --ambient_light_sensor' |
| num_als_pref = int(host.run_output(cmd, ignore_status=True)) |
| |
| cmd = 'backlight_tool --get_ambient_light_lux' |
| result = host.run(cmd, ignore_status=True) |
| als_exists = not result.exit_status # 0 is cmd success. |
| |
| if num_als_pref and not als_exists: |
| model = host.get_platform() |
| msg = ('Powerd pref indicates %d ambient light sensor(s) but device ' |
| 'is unable to find it (them).' % num_als_pref) |
| if model in IGNORE_ALS_PREF_MODELS: |
| logging.info('%s However, skip this check for model: %s.', |
| msg, model) |
| else: |
| raise error.TestFail(msg) |
| |
| initial_lux = -1 |
| if als_exists: |
| initial_lux = int(result.stdout.rstrip()) |
| lux_domain = [initial_lux / 2, initial_lux * 2] |
| brightness_range = \ |
| [get_backlight(host, lux) for lux in lux_domain] |
| else: |
| brightness_range = [10.0, 90.0] |
| |
| initial_brightness = get_backlight(host) |
| if (initial_brightness < brightness_range[0] or |
| initial_brightness > brightness_range[1]): |
| raise error.TestFail('Default brightness level is out of scope ' |
| '(%d%% - %d%%): %f' % (brightness_range[0], |
| brightness_range[1], |
| initial_brightness)) |
| |
| brightness_min = 0.0 |
| if (not set_backlight(host, brightness_min) or |
| get_backlight(host) != brightness_min): |
| raise error.TestFail('Unable to change the brightness to minimum ' |
| '(%f%%) level.' % brightness_min) |
| |
| brightness_max = 100.0 |
| if (not set_backlight(host, brightness_max) or |
| get_backlight(host) != brightness_max): |
| raise error.TestFail('Unable to change the brightness to maximum ' |
| '(%f%%) level.' % brightness_max) |
| |
| host.reboot() |
| autotest_client.run_test(client_autotest, |
| exit_without_logout=True) |
| brightness_after_reboot = get_backlight(host) |
| if not als_exists and initial_brightness == brightness_after_reboot: |
| return |
| # If there is an ambient light sensor, allow a small change in internal |
| # display brightness, in case that the ambient light changes slightly. |
| if als_exists: |
| cushion = 0.2 |
| lux_domain_after_reboot = [(1.0 - cushion) * initial_lux, |
| (1.0 + cushion) * initial_lux] |
| brightness_range_after_reboot = [get_backlight(host, lux) for lux |
| in lux_domain_after_reboot] |
| if (brightness_range_after_reboot[0] <= |
| brightness_after_reboot <= |
| brightness_range_after_reboot[1]): |
| return |
| |
| raise error.TestFail('Unable to reset internal display brightness back ' |
| 'to default after reboot.\n' |
| 'Previous boot default brightness: %f\n' |
| 'Current boot default brightness: %f' % |
| (initial_brightness, brightness_after_reboot)) |
| |
| |
| def set_backlight(host, percentage): |
| """Executes backlight_tool to set internal display backlight. |
| @param host: host object representing the DUT. |
| @param percentage: linear percentage to set internal display |
| backlight to. |
| """ |
| cmd = 'backlight_tool --set_brightness_percent=%f' % percentage |
| try: |
| exit_status = host.run(cmd).exit_status |
| except error.CmdError: |
| raise error.TestFail(cmd) |
| return not exit_status # 0 is cmd success. |
| |
| def get_backlight(host, lux=-1): |
| """Executes backlight_tool to get internal display backlight. |
| @param host: host object representing the DUT. |
| """ |
| cmd = 'backlight_tool --get_brightness_percent' |
| if lux >= 0: |
| cmd = '%s --lux=%d' % (cmd, lux) |
| try: |
| result = host.run_output(cmd) |
| except error.CmdError: |
| raise error.TestFail(cmd) |
| return float(result) |