# Copyright (c) 2013 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 random, time

from autotest_lib.client.bin import test
from autotest_lib.client.cros.power import sys_power


# Suspend tests need to allow time for the kernel to settle.
MIN_ALLOWED_SUSPEND_S = 10


class power_CheckAfterSuspend(test.test):
    """Checks capabilities by running tests after suspend/resume cycle.

    This can easily run multiple iterations with the built in Autotest
    iterations parameter to run_test():

      test_that -b <board> --iterations=3 ${MACHINE_IP} \
          f:client/site_tests/power_CheckAfterSuspend/control
    """
    version = 1


    def initialize(self, tests=[], min_suspend_s=2, enable_baseline=False):
        """
        @param tests: list of client tests to run before/after suspend.
        @param min_suspend_s: suspend durations (in seconds).
        @param enable_baseline: If True, run one pass of tests before suspend,
                                otherwise only run tests after suspend.
        """
        self._tests = tests
        self._min_suspend_s = min_suspend_s
        self._enable_baseline = enable_baseline


    def run_once(self):
        """Run a series of tests supplied by the control file.

        Handles iterations by adding tags with the iteration#.

        Normally runs each test once after each suspend.  If enable_baseline
        is True then run an initial pass through the tests before any suspend.

        The test runs a series
        """
        if self.iteration is not None and self.iteration > 1:
            test_tag = '%03d' % self.iteration
        else:
            test_tag = ''
            if self._enable_baseline:
                for t in self._tests:
                    self.job.run_test(t, tag=test_tag+'preSuspend', disable_sysinfo=True)

        time.sleep(random.randint(0, 3))
        sys_power.do_suspend(max(self._min_suspend_s, MIN_ALLOWED_SUSPEND_S))

        for t in self._tests:
            self.job.run_test(t, tag=test_tag+'postSuspend', disable_sysinfo=True)
