# 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 time

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros.power import power_suspend


# In cases like crosbug.com/p/26289, we want results, but also want
# to make sure we are suspending quickly enough. Retry with this amount
# of extra suspend time to make sure we can get some results, even
# if we throw a warning.
EXTRA_TIME = 10


class power_Resume(test.test):
    """class for power_Resume test."""
    version = 1
    preserve_srcdir = True

    def initialize(self,
                   suspend_state='',
                   suspend_iterations=None,
                   iteration_delay=0):
        """
        Entry point.

        @param suspend_state: Force to suspend to a specific
                state ("mem" or "freeze"). If the string is empty, suspend
                state is left to the default pref on the system.
        @param suspend_iterations: number of times to attempt suspend.
        @param iteration_delay: number of seconds to wait between suspend iterations (default: 0).
        """
        self._suspend_iterations = suspend_iterations
        self._iteration_delay = iteration_delay
        self._suspender = power_suspend.Suspender(
                self.resultsdir,
                throw=True,
                device_times=True,
                suspend_state=suspend_state)


    def run_once(self, max_devs_returned=10, seconds=0,
                 ignore_kernel_warns=False, measure_arc=False):
        system_suspends = []
        system_resumes = []
        while not self._done():
            time.sleep(self._iteration_delay)

            suspend_time = 0.0
            resume_time = 0.0
            try:
                (suspend_time,
                 resume_time) = self._suspend_once(max_devs_returned, seconds,
                                                   ignore_kernel_warns,
                                                   measure_arc)
            except error.TestWarn:
                (suspend_time, resume_time) = self._suspend_once(
                        max_devs_returned, seconds + EXTRA_TIME,
                        ignore_kernel_warns, measure_arc)
                raise
            system_suspends.append(suspend_time)
            system_resumes.append(resume_time)

        self.output_perf_value(description='system_suspend',
                               value=system_suspends,
                               units='sec',
                               higher_is_better=False)
        self.output_perf_value(description='system_resume',
                               value=system_resumes,
                               units='sec',
                               higher_is_better=False)

    def _done(self):
        if self._suspend_iterations == None:
            # At least one iteration.
            self._suspend_iterations = 1

        self._suspend_iterations -= 1
        return self._suspend_iterations < 0


    def _suspend_once(self, max_devs_returned, seconds, ignore_kernel_warns,
                      measure_arc=False):
        (results, device_times) = \
            self._suspender.suspend(seconds,
                                    ignore_kernel_warns=ignore_kernel_warns,
                                    measure_arc=measure_arc)

        # return as keyvals the slowest n devices
        slowest_devs = sorted(
            device_times,
            key=device_times.get,
            reverse=True)[:max_devs_returned]
        for dev in slowest_devs:
            results[dev] = device_times[dev]

        self.write_perf_keyval(results)
        return (results['seconds_system_suspend'],
                results['seconds_system_resume'])

    def cleanup(self):
        """
        Clean the suspender.
        """
        self._suspender.finalize()
