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

from autotest_lib.client.cros.audio import audio_test_data
from autotest_lib.client.cros.audio import cras_configs
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

AUTHOR = "chromeos-chameleon"
NAME = "audio_AudioAfterSuspend.internal_speaker"
PURPOSE = "Remotely controlled internal_speaker AFTER SUSPEND audio test."
CRITERIA = "This test will fail if the captured audio does not match original file."
TIME = "SHORT"
TEST_CATEGORY = "Functional"
TEST_CLASS = "audio"
TEST_TYPE = "server"
ATTRIBUTES = "suite:chameleon_audio_perbuild"
DEPENDENCIES = "chameleon, audio_board, audio_box"
JOB_RETRIES = 2

DOC = """
This test remotely tests internal_speaker audio function against DUT after suspend.
"""
# 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 = cras_configs.get_internal_mic_node(
            audio_test_utils.get_board_name(host), host.get_platform())
    job.run_test("audio_AudioAfterSuspend", host=host,
                 golden_data=(audio_test_data.SIMPLE_FREQUENCY_SPEAKER_TEST_FILE, 1000),
                 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)
