# 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

from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import arc, chrome
from autotest_lib.client.cros import upstart


class power_UiResume(arc.ArcTest):
    """
    Suspend the system while simulating user behavior.

    If ARC is present, open ARC before suspending. If ARC is not present, log
    into Chrome before suspending. To suspend, call autotest power_Resume. This
    reduces duplicate code, while cover all 3 cases: with ARC, with Chrome but
    without ARC, and without Chrome.

    """
    version = 3

    def initialize(self, no_arc=False):
        """
        Entry point. Initialize ARC if it is enabled on the DUT, otherwise log
        in Chrome browser.

        """
        self._enable_arc = utils.is_arc_available() and not no_arc
        if self._enable_arc:
            super(power_UiResume, self).initialize()
        else:
            self._chrome = chrome.Chrome()


    def run_once(self, max_devs_returned=10, seconds=0,
                 ignore_kernel_warns=False):
        """
        Run client side autotest power_Resume, to reduce duplicate code.

        """
        service = 'powerd'
        err = 0
        pid_start = upstart.get_pid(service)
        if not pid_start:
            upstart.restart_job(service)
        pid_start = upstart.get_pid(service)
        if not pid_start:
            logging.error('%s is not running at start of test', service)
            err += 1

        self.job.run_test(
                'power_Resume',
                max_devs_returned=max_devs_returned,
                seconds=seconds,
                ignore_kernel_warns=ignore_kernel_warns,
                measure_arc=self._enable_arc)

        pid_end = upstart.get_pid('powerd')
        if not pid_end:
            logging.error('%s is not running at end of test', service)
            err += 1

        if pid_start and pid_end and pid_start != pid_end:
            logging.error('%s respawned during test', service)
            err += 1

        if err:
            raise error.TestFail('Test failed.  See errors for details.')

    def cleanup(self):
        """
        Clean up ARC if it is enabled on the DUT, otherwise close the Chrome
        browser.
        """
        if self._enable_arc:
            super(power_UiResume, self).cleanup()
        else:
            self._chrome.close()
