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

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


class dummy_IdleSuspend(test.test):
    """
    This is not a complete test. It is a dummy test that must be run in parallel
    with power_SuspendStress(method='idle') to control powerd idle values and
    perform a login.
    """
    version = 1

    _IDLE_TIMINGS = {
        'disable_idle_suspend': 0,
        'ignore_external_policy': 1,
        'unplugged_dim_ms': 4000,
        'unplugged_off_ms': 6000,
        'unplugged_suspend_ms': 8000,
        'plugged_dim_ms': 4000,
        'plugged_off_ms': 6000,
        'plugged_suspend_ms': 8000,
    }

    # Don't wait longer than this to start... if power_SuspendStress died before
    # creating the HWCLOCK_FILE, we might otherwise wait forever
    _TEST_START_TIMEOUT = 70

    def run_once(self):
        with chrome.Chrome():
            # Just idle while power_SuspendStress does all the work. Existence
            # of the HWCLOCK_FILE tells us when it starts and when it's done.
            for _ in xrange(self._TEST_START_TIMEOUT):
                time.sleep(1)
                if os.path.exists(power_suspend.Suspender.HWCLOCK_FILE):
                    break
            else:
                raise error.TestError("Parallel test didn't create Suspender.")

            # These must not be enabled too soon, or the system might suspend
            # before a wakeup is scheduled. They must not be disabled too late
            # either, or we might suspend again after the parallel test is done.
            power_prefs = power_utils.PowerPrefChanger(self._IDLE_TIMINGS)

            while os.path.exists(power_suspend.Suspender.HWCLOCK_FILE):
                time.sleep(1)

            power_prefs.finalize()
