# 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 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():

      ./run_remote_tests.sh --board=<board> -a "iterations=3" --remote=w.x.y.z \
                            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')

        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')
