# 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_path'
        result = host.run(cmd, ignore_status=True)
        als_exists = not result.exit_status # 0 is cmd success.
        als_path = result.stdout.rstrip()

        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:
            cmd = 'cat %s' % als_path
            initial_lux = int(host.run_output(cmd))
            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)
