# Copyright 2018 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.common_lib import error
from autotest_lib.client.common_lib.cros import arc
from autotest_lib.client.common_lib.cros import chrome
from autotest_lib.client.bin import test
from autotest_lib.client.bin import utils
from autotest_lib.client.cros import cros_ui


TIMEOUT=5
SLEEP_INTERVAL=1


# TODO(pmalani): Change this to actually talk to midis and make
# sure basic functionality works.
class cheets_Midis_P(test.test):
    """ Test to verify midis daemon starts correctly.

    A simple test which verifies whether:
    - midis starts up correctly on ARC container start-up.
    - midis restarts correctly on logging-out.
    """
    version = 1

    def _get_midis_pid(self):
        """ Get the midis daemon pid using pgrep. """
        cmd = 'pgrep midis'
        result = utils.run(cmd, ignore_status=True).stdout
        try:
            return int(result)
        except ValueError:
            logging.error('Error parsing pgrep result: %s', result)
            return None

    def _poll_for_midis_pid(self):
        """ Repeatedly calls _get_midis_pid, until we succeed or timeout. """
        try:
            return utils.poll_for_condition(condition=self._get_midis_pid,
                                            timeout=TIMEOUT,
                                            sleep_interval=SLEEP_INTERVAL)
        except utils.TimeoutError:
            logging.error('Timed out waiting for midis')
            return None

    def run_once(self):
        """ Restart Chrome with ARC and check that midis also restarts. """

        old_midis_pid = None
        session = None
        with chrome.Chrome(
            arc_mode=arc.arc_common.ARC_MODE_ENABLED,
            dont_override_profile=False) as cr:
            session = cros_ui.get_chrome_session_ident()
            old_midis_pid = self._poll_for_midis_pid()

        if old_midis_pid == None:
            raise error.TestFail('midis not running in Chrome OS.')

        cros_ui.wait_for_chrome_ready(session)
        new_midis_pid = self._poll_for_midis_pid()
        if new_midis_pid == None:
            raise error.TestFail('midis not running after Chrome shut down.')

        if new_midis_pid == old_midis_pid:
            raise error.TestFail('midis didn\'t restart.')
        logging.info('Restarted midis with pid %d.', new_midis_pid)
