# Copyright (c) 2012 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, os, subprocess, tempfile, time

from autotest_lib.client.common_lib import error
from autotest_lib.server import autotest, hosts
from autotest_lib.server import test, utils

class power_BacklightServer(test.test):
    version = 1

    def _client_cmd(self, cmd):
        """Execute a command on the client.

        Args:
          cmd: command to execute on client.

        Returns:
          The output object, with stdout and stderr fields.
        """
        logging.info('Client cmd: [%s]', cmd)
        return self._client.run(cmd)

    def _client_cmd_and_wait_for_restart(self, cmd):
        boot_id = self._client.get_boot_id()
        self._client_cmd('sh -c "sync; sleep 1; %s" >/dev/null 2>&1 &' % cmd)
        self._client.wait_for_restart(old_boot_id=boot_id)

    def _get_brightness(self):
        result = self._client_cmd('backlight-tool --get_brightness')
        return int(result.stdout.rstrip())

    def _check_power_status(self):
        for daemon in ['powerd', 'powerm']:
            cmd_result = self._client_cmd('status ' + daemon)
            if 'running' not in cmd_result.stdout:
                raise error.TestError(daemon + ' must be running.')

        result = self._client_cmd('power-supply-info | grep online')
        if 'yes' not in result.stdout:
            raise error.TestError('power must be plugged in.')

    def _do_reboot(self):
        self._client_cmd_and_wait_for_restart('reboot')

    def _do_panic(self):
        self._client_cmd_and_wait_for_restart('echo panic > /proc/breakme')

    def _do_logout(self):
        self._client_cmd('restart ui')

    def _do_suspend(self):
        self._client_at.run_test('power_Resume')

    def _do_power_off(self):
        # TODO(sque): Do power off thru servo.  crosbug.com/25867
        pass

    _transitions = { 'reboot': _do_reboot,
                     'panic': _do_panic,
                     'logout': _do_logout,
                     'suspend': _do_suspend,
                     # 'power_off': _do_power_off,
                     }

    _als_disabled = False

    def _set_als_disable(self):
        """Turns off ALS in power manager.  Saves the old disable_als flag if
           it exists.
        """
        als_path = '/var/lib/power_manager/disable_als'
        self._client_cmd('if [ -e %s ]; then mv %s %s_backup; fi' %
                         (als_path, als_path, als_path))
        self._client_cmd('echo 1 > %s' % als_path)
        self._client_cmd('restart powerd')
        self._als_disabled = True

    def _restore_als_disable(self):
        """Restore the disable_als flag setting that was overwritten in
           _set_als_disable.
        """
        if not self._als_disabled:
            return
        als_path = '/var/lib/power_manager/disable_als'
        self._client_cmd('rm %s' % als_path)
        self._client_cmd('if [ -e %s_backup ]; then mv %s_backup %s; fi' %
                         (als_path, als_path, als_path))
        self._client_cmd('restart powerd')

    def run_once(self, client_ip):
        """Run the test.

        For each system transition event in |_transitions|:
           Read the brightness.
           Trigger transition event.
           Wait for client to come back up.
           Check new brightness against previous brightness.

        Args:
          client_ip: string of client's ip address (required)
        """
        if not client_ip:
            error.TestError("Must provide client's IP address to test")

        self._client = hosts.create_host(client_ip)
        self._client_at = autotest.Autotest(self._client)

        self._results = {}

        self._check_power_status()
        self._set_als_disable()

        # Run the transition event tests.
        for test_name in self._transitions:
            self._old_brightness = self._get_brightness()

            self._transitions[test_name](self)

            # Save the before and after backlight values.
            self._results[test_name] = { 'old': self._old_brightness,
                                         'new': self._get_brightness() }

    def cleanup(self):
        self._restore_als_disable()

        # Check results to make sure backlight levels were preserved across
        # transition events.
        num_failed = 0
        for test_name in self._results:
            old_brightness = self._results[test_name]['old']
            new_brightness = self._results[test_name]['new']

            if old_brightness == new_brightness:
                logging.info('Transition event [  PASSED  ]: %s', test_name)
            else:
                logging.info('Transition event [  FAILED  ]: %s', test_name)
                logging.info('   Brightness changed: %d -> %d' %
                             (old_brightness, new_brightness))
                num_failed += 1

        if num_failed > 0:
            raise error.TestFail('Failed to preserve backlight over %d ' +
                                 'transition event(s).' % num_failed)