OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
3 # Use of this source code is governed by a BSD-style license that can be | |
4 # found in the LICENSE file. | |
5 | |
6 """Audio basic playback test. Verifies basic audio output. | |
7 | |
8 The tests plays an audio file and records its output while playing. It uses | |
9 SOX tool to eliminate silence from begining and end of audio recorded. Then it | |
10 uses PESQ tool to verify the recorded audio against expected file. | |
11 | |
12 The output of PESQ is a pair of numbers between 0 and 5 describing how close the | |
13 recorded audio is to its reference file. | |
14 | |
15 The output of this test are the PESQ values that are graphed, example: | |
16 RESULT audio_pesq: ref= 4.498 score | |
17 RESULT audio_pesq: actual= 4.547 score | |
18 """ | |
19 | |
20 import logging | |
21 import os | |
22 import sys | |
23 import tempfile | |
24 | |
25 import audio_tools | |
26 import pyauto_media | |
27 import pyauto | |
28 import pyauto_utils | |
29 | |
30 | |
31 _TEST_HTML_PATH = pyauto.PyUITest.GetFileURLForDataPath('media', 'html', | |
32 'audio_record.html') | |
33 _MEDIA_PATH = os.path.abspath(os.path.join(pyauto.PyUITest.DataDir(), | |
34 'pyauto_private', 'media')) | |
35 | |
36 # The media file to play. | |
37 _TEST_AUDIO = pyauto.PyUITest.GetFileURLForPath(_MEDIA_PATH, 'dance2_10sec.wav') | |
38 # The recording duration should be at least as the media duration. We use 5 | |
39 # extra seconds of record in this test. | |
40 _RECORD_DURATION = 15 | |
41 | |
42 # Due to different noise introduced by audio recording tools on windows and | |
43 # linux, we require an expected audio file per platform. | |
44 if 'win32' in sys.platform: | |
45 _TEST_EXPECTED_AUDIO = os.path.join(_MEDIA_PATH, 'audio_record_win.wav') | |
46 else: | |
47 _TEST_EXPECTED_AUDIO = os.path.join(_MEDIA_PATH, 'audio_record_lin.wav') | |
48 | |
49 | |
50 def GetTempFilename(): | |
51 """Returns an absolute path to an empty temp file.""" | |
52 f, path = tempfile.mkstemp(suffix='_actual.wav') | |
53 os.close(f) | |
54 return path | |
55 | |
56 | |
57 class AudioRecordPerfTest(pyauto.PyUITest): | |
58 """PyAuto test container. See file doc string for more information.""" | |
59 | |
60 def testBasicAudioPlaybackRecord(self): | |
61 """Plays an audio file and verifies its output against expected.""" | |
62 # The 2 temp files that will be potentially used in the test. | |
63 temp_file = None | |
64 file_no_silence = None | |
65 # Rebase test expectation file is REBASE=1 env variable is set. | |
66 rebase = 'REBASE' in os.environ | |
67 | |
68 try: | |
69 temp_file = GetTempFilename() | |
70 record_thread = audio_tools.AudioRecorderThread(_RECORD_DURATION, | |
71 temp_file) | |
72 record_thread.start() | |
73 self.NavigateToURL(_TEST_HTML_PATH) | |
74 self.assertTrue(self.ExecuteJavascript("startTest('%s');" % _TEST_AUDIO)) | |
75 record_thread.join() | |
76 | |
77 if record_thread.error: | |
78 self.fail(record_thread.error) | |
79 file_no_silence = _TEST_EXPECTED_AUDIO if rebase else GetTempFilename() | |
80 audio_tools.RemoveSilence(temp_file, file_no_silence) | |
81 | |
82 # Exit if we just want to rebase expected output. | |
83 if rebase: | |
84 return | |
85 | |
86 pesq_values = audio_tools.RunPESQ(_TEST_EXPECTED_AUDIO, file_no_silence) | |
87 if not pesq_values: | |
88 self.fail('Test failed to get pesq results.') | |
89 pyauto_utils.PrintPerfResult('audio_pesq', 'ref', pesq_values[0], 'score') | |
90 pyauto_utils.PrintPerfResult('audio_pesq', 'actual', pesq_values[1], | |
91 'score') | |
92 except: | |
93 logging.error('Test failed: %s', self.GetDOMValue('error')) | |
94 finally: | |
95 # Delete the temporary files used by the test. | |
96 if temp_file: | |
97 os.remove(temp_file) | |
98 if not rebase and file_no_silence: | |
99 os.remove(file_no_silence) | |
100 | |
101 | |
102 if __name__ == '__main__': | |
103 pyauto_media.Main() | |
OLD | NEW |