# Copyright 2015 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from autotest_lib.client.cros.audio import audio_test_data
from autotest_lib.client.cros.chameleon import audio_test_utils
from autotest_lib.client.cros.chameleon import chameleon_audio_ids
from autotest_lib.server import utils

NAME = "audio_AudioAfterSuspend.internal_speaker"
METADATA = {
    "contacts": ["chromeos-audio-bugs@google.com"],
    "bug_component": "b:875558",
    "criteria": "This test will fail if the captured audio does not match original file.",
    "doc" : " Tests speaker audio function against DUT after suspend",
    'variant_category': '{"name": "Audio_SoC_Codec_Amp"}',
}
TEST_TYPE = "server"
ATTRIBUTES = "suite:audio_essential"
DEPENDENCIES = "audio_box, chameleon_state:WORKING"
JOB_RETRIES = 1

# Plug unplug sequnce
# (plugged_before_suspend, plugged_after_suspend, plugged_before_resume,
# plugged_after_resume)
plug_status = [(False,False,False,False)]

args_dict = utils.args_to_dict(args)
chameleon_args = hosts.CrosHost.get_chameleon_arguments(args_dict)

def run(machine):
    host = hosts.create_host(machine, chameleon_args=chameleon_args)
    expected_internal_mic_node = audio_test_utils.get_internal_mic_node(host)
    job.run_test("audio_AudioAfterSuspend", host=host,
                 golden_data=(audio_test_data.SIMPLE_FREQUENCY_SPEAKER_TEST_FILE, 3000),
                 recorder=chameleon_audio_ids.ChameleonIds.MIC,
                 source=chameleon_audio_ids.CrosIds.SPEAKER,
                 audio_nodes=(['INTERNAL_SPEAKER'],
                              [expected_internal_mic_node]),
                 plug_status=plug_status, tag = "internal_speaker")

parallel_simple(run, machines)
