# Copyright 2019 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.

"""
This is a server side audio sanity test testing assumptions other audio tests
rely on.
"""

from autotest_lib.client.common_lib import error
from autotest_lib.client.cros.chameleon import audio_test_utils
from autotest_lib.server.cros.multimedia import remote_facade_factory
from autotest_lib.server import test

class audio_AudioSanityCheck(test.test):
    """
    This test talks to a Cros device to verify if some basic functions that
    other audio tests rely on still work after a suspension.
    """
    version = 1

    def verify_chrome_audio(self, audio_facade):
        """"Verify if chrome.audio API is available"""
        if not audio_facade.get_chrome_audio_availablity():
            raise error.TestFail("chrome.audio API is not available")

    def verify_suspend(self, host, factory):
        """"Verify and trigger a suspension"""
        audio_test_utils.suspend_resume_and_verify(host, factory)

    def run_once(self, host, suspend_only=False):
        """Runs Audio sanity test to make sure chrome api works. """
        factory = remote_facade_factory.RemoteFacadeFactory(
                host, results_dir=self.resultsdir)
        audio_facade = factory.create_audio_facade()

        # The suspend_only flag is for crbug:978593, which causes sanity check
        # to always fail. however, we still want to check the suspend operation
        # as it also potentially fails the audio tests. This should be removed
        # once the blocker is fixed
        if suspend_only:
            self.verify_suspend(host, factory)
            return

        # Check if the chrome.audio API is available
        self.verify_chrome_audio(audio_facade)
        # chrome.audio API should remain available after a suspension
        self.verify_suspend(host, factory)
        self.verify_chrome_audio(audio_facade)
