# Lint as: python2, python3
# Copyright 2016 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
import re
import time

from autotest_lib.client.bin import test
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import chrome
from autotest_lib.client.cros.input_playback import input_playback
from autotest_lib.client.cros.audio import cras_utils
from telemetry.core import exceptions


class platform_InputVolume(test.test):
    """Tests if device suspends using shortcut keys."""
    version = 1
    _WAIT = 15
    MUTE_STATUS = 'Muted'
    CTC_GREP_FOR = "cras_test_client --dump_server_info | grep "

    def warmup(self):
        """Test setup."""
        # Emulate keyboard.
        # See input_playback. The keyboard is used to play back shortcuts.
        self._player = input_playback.InputPlayback()
        self._player.emulate(input_type='keyboard')
        self._player.find_connected_inputs()

    def test_volume_down(self, volume):
        """
        Use keyboard shortcut to test Volume Down (F9) key.

        @param volume: expected volume.

        @raises: error.TestFail if system volume did not decrease or is muted.

        """
        self._player.blocking_playback_of_default_file(
            input_type='keyboard', filename='keyboard_f9')
        # If expected volume is 0, we should be muted.
        if volume == 0 and not self.is_muted():
            raise error.TestFail("Volume should be muted.")
        sys_volume = self.get_active_volume()
        if sys_volume != volume:
            raise error.TestFail("Volume did not decrease: %s" % sys_volume)

    def test_volume_up(self, volume):
        """
        Use keyboard shortcut to test Volume Up (F10) key.

        @param volume: expected volume

        @raises: error.TestFail if system volume muted or did not increase.

        """
        self._player.blocking_playback_of_default_file(
            input_type='keyboard', filename='keyboard_f10')
        if self.is_muted():
            raise error.TestFail("Volume is muted when it shouldn't be.")
        sys_volume = self.get_active_volume()
        if sys_volume != volume:
            raise error.TestFail("Volume did not increase: %s" % sys_volume)

    def test_mute(self, volume):
        """Use keyboard shortcut to test Mute (F8) key.

        @param volume: expected volume

        @raises: error.TestFail if system volume not muted.

        """
        self._player.blocking_playback_of_default_file(
            input_type='keyboard', filename='keyboard_f8')
        sys_volume = self.get_active_volume()
        if not self.is_muted():
            raise error.TestFail("Volume not muted.")
        if sys_volume != volume:
            raise error.TestFail("Volume changed while mute: %s" % sys_volume)

    def get_active_volume(self):
        """
        Get current active node volume (0-100).

        @returns: current volume on active node.
        """
        return cras_utils.get_active_node_volume()

    def is_muted(self):
        """
        Returns mute status of system.

        @returns: True if system muted, False if not

        """
        output = utils.system_output(self.CTC_GREP_FOR + 'muted')
        muted = output.split(':')[-1].strip()
        return muted == self.MUTE_STATUS

    def run_once(self):
        """
        Open browser, and affect volume using mute, up, and down functions.

        """
        with chrome.Chrome(disable_default_apps=False):
            current_volume = self.get_active_volume()
            self.test_volume_down(current_volume - 4)
            self.test_volume_up(current_volume)
            self.test_mute(current_volume)
            self.test_volume_up(current_volume)

    def cleanup(self):
        """Test cleanup."""
        self._player.close()
