# 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.chameleon import chameleon_audio_ids
from autotest_lib.server import utils

AUTHOR = "chromeos-chameleon"
NAME = "audio_AudioQualityAfterSuspend.internal_speaker.mp3"
PURPOSE = ("Remotely controlled internal_speaker AFTER SUSPEND "
           "Chrome 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_unstable"
DEPENDENCIES = "audio_box"
JOB_RETRIES = 2

DOC = """
This test remotely tests internal_speaker audio function against DUT after suspend.
"""

args_dict = utils.args_to_dict(args)
chameleon_args = hosts.CrosHost.get_chameleon_arguments(args_dict)
test_file = ('http://commondatastorage.googleapis.com/chromiumos-test-assets-'
             'public/audio_test/chameleon/Speaker/test_512_16.mp3')

def run(machine):
    host = hosts.create_host(machine, chameleon_args=chameleon_args)
    job.run_test("audio_AudioQualityAfterSuspend", host=host,
                 audio_test_data=audio_test_data.MEDIA_SPEAKER_TEST_FILE,
                 lowpass_freq=1000,
                 test_playback_file=test_file,
                 recorder=chameleon_audio_ids.ChameleonIds.MIC,
                 source=chameleon_audio_ids.CrosIds.SPEAKER,
                 audio_nodes=(['INTERNAL_SPEAKER'], ['INTERNAL_MIC']),
                 tag = "internal_speaker")

parallel_simple(run, machines)
