# 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 gobject
from dbus.mainloop.glib import DBusGMainLoop

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib.cros import chrome, session_manager
from autotest_lib.client.cros import asan


class login_LoginSuccess(test.test):
    """Sign in using Telemetry and validate system state."""
    version = 1

    _SESSION_START_TIMEOUT = 10
    _SESSION_STOP_TIMEOUT = 60
    # TODO(afakhry): Remove this timeout increase for asan bots once we figure
    # out why logging out is taking so long. See crbug.com/488291
    if asan.running_on_asan():
      _SESSION_STOP_TIMEOUT *= 2


    def initialize(self):
        super(login_LoginSuccess, self).initialize()

        bus_loop = DBusGMainLoop(set_as_default=True)
        self._session_manager = session_manager.connect(bus_loop)
        self._listener = session_manager.SessionSignalListener(
                gobject.MainLoop())


    def run_once(self, stress_run=False, arc_mode=None):
        """
        Runs the test.

        @param stress_run: True if we are doing a stress run and want to
                           double the timeout.
        @param arc_mode: This value is passed to Chrome and determines how
                         the ARC/Android instance should start. Possible values
                         are defined in common_lib/cros/arc_common.py.

        """
        if stress_run:
            self._SESSION_STOP_TIMEOUT *= 2
        self._listener.listen_for_session_state_change('started')
        with chrome.Chrome(arc_mode=arc_mode):
            self._listener.wait_for_signals(desc='Session started.',
                                            timeout=self._SESSION_START_TIMEOUT)
            # To enable use as a 'helper test'.
            self.job.set_state('client_success', True)

            # Start listening to stop signal before logging out.
            self._listener.listen_for_session_state_change('stopped')

        self._listener.wait_for_signals(desc='Session stopped.',
                                        timeout=self._SESSION_STOP_TIMEOUT)
