OLD | NEW |
1 # Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 1 # Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. |
2 # | 2 # |
3 # Use of this source code is governed by a BSD-style license | 3 # Use of this source code is governed by a BSD-style license |
4 # that can be found in the LICENSE file in the root of the source | 4 # that can be found in the LICENSE file in the root of the source |
5 # tree. An additional intellectual property rights grant can be found | 5 # tree. An additional intellectual property rights grant can be found |
6 # in the file PATENTS. All contributing project authors may | 6 # in the file PATENTS. All contributing project authors may |
7 # be found in the AUTHORS file in the root of the source tree. | 7 # be found in the AUTHORS file in the root of the source tree. |
8 | 8 |
9 """Unit tests for the simulation module. | 9 """Unit tests for the simulation module. |
10 """ | 10 """ |
11 | 11 |
| 12 import logging |
12 import os | 13 import os |
13 import shutil | 14 import shutil |
14 import sys | 15 import sys |
15 import tempfile | 16 import tempfile |
16 import unittest | 17 import unittest |
17 | 18 |
18 SRC = os.path.abspath(os.path.join( | 19 SRC = os.path.abspath(os.path.join( |
19 os.path.dirname((__file__)), os.pardir, os.pardir, os.pardir, os.pardir)) | 20 os.path.dirname((__file__)), os.pardir, os.pardir, os.pardir, os.pardir)) |
20 sys.path.append(os.path.join(SRC, 'third_party', 'pymock')) | 21 sys.path.append(os.path.join(SRC, 'third_party', 'pymock')) |
21 | 22 |
22 import mock | 23 import mock |
23 import pydub | 24 import pydub |
24 | 25 |
25 from . import audioproc_wrapper | 26 from . import audioproc_wrapper |
26 from . import evaluation | 27 from . import evaluation |
27 from . import signal_processing | 28 from . import signal_processing |
28 from . import simulation | 29 from . import simulation |
29 | 30 |
30 | 31 |
31 class TestApmModuleSimulator(unittest.TestCase): | 32 class TestApmModuleSimulator(unittest.TestCase): |
32 """Unit tests for the ApmModuleSimulator class. | 33 """Unit tests for the ApmModuleSimulator class. |
33 """ | 34 """ |
34 | 35 |
35 def setUp(self): | 36 def setUp(self): |
36 """Create temporary folder and fake audio track.""" | 37 """Create temporary folders and fake audio track.""" |
37 self._output_path = tempfile.mkdtemp() | 38 self._output_path = tempfile.mkdtemp() |
| 39 self._tmp_path = tempfile.mkdtemp() |
38 | 40 |
39 silence = pydub.AudioSegment.silent(duration=1000, frame_rate=48000) | 41 silence = pydub.AudioSegment.silent(duration=1000, frame_rate=48000) |
40 fake_signal = signal_processing.SignalProcessingUtils.GenerateWhiteNoise( | 42 fake_signal = signal_processing.SignalProcessingUtils.GenerateWhiteNoise( |
41 silence) | 43 silence) |
42 self._fake_audio_track_path = os.path.join(self._output_path, 'fake.wav') | 44 self._fake_audio_track_path = os.path.join(self._output_path, 'fake.wav') |
43 signal_processing.SignalProcessingUtils.SaveWav( | 45 signal_processing.SignalProcessingUtils.SaveWav( |
44 self._fake_audio_track_path, fake_signal) | 46 self._fake_audio_track_path, fake_signal) |
45 | 47 |
46 def tearDown(self): | 48 def tearDown(self): |
47 """Recursively delete temporary folders.""" | 49 """Recursively delete temporary folders.""" |
48 shutil.rmtree(self._output_path) | 50 shutil.rmtree(self._output_path) |
| 51 shutil.rmtree(self._tmp_path) |
49 | 52 |
50 def testSimulation(self): | 53 def testSimulation(self): |
51 # Instance dependencies to inject and mock. | 54 # Instance dependencies to inject and mock. |
52 ap_wrapper = audioproc_wrapper.AudioProcWrapper() | 55 ap_wrapper = audioproc_wrapper.AudioProcWrapper() |
53 evaluator = evaluation.ApmModuleEvaluator() | 56 evaluator = evaluation.ApmModuleEvaluator() |
54 ap_wrapper.Run = mock.MagicMock(name='Run') | 57 ap_wrapper.Run = mock.MagicMock(name='Run') |
55 evaluator.Run = mock.MagicMock(name='Run') | 58 evaluator.Run = mock.MagicMock(name='Run') |
56 | 59 |
57 # Instance simulator. | 60 # Instance simulator. |
58 simulator = simulation.ApmModuleSimulator( | 61 simulator = simulation.ApmModuleSimulator( |
(...skipping 21 matching lines...) Expand all Loading... |
80 # TODO(alessiob): Once the TestDataGenerator classes can be configured by | 83 # TODO(alessiob): Once the TestDataGenerator classes can be configured by |
81 # the client code (e.g., number of SNR pairs for the white noise teste data | 84 # the client code (e.g., number of SNR pairs for the white noise teste data |
82 # gnerator), the exact number of calls to ap_wrapper.Run and evaluator.Run | 85 # gnerator), the exact number of calls to ap_wrapper.Run and evaluator.Run |
83 # is known; use that with assertEqual. | 86 # is known; use that with assertEqual. |
84 min_number_of_simulations = len(config_files) * len(input_files) * len( | 87 min_number_of_simulations = len(config_files) * len(input_files) * len( |
85 test_data_generators) | 88 test_data_generators) |
86 self.assertGreaterEqual(len(ap_wrapper.Run.call_args_list), | 89 self.assertGreaterEqual(len(ap_wrapper.Run.call_args_list), |
87 min_number_of_simulations) | 90 min_number_of_simulations) |
88 self.assertGreaterEqual(len(evaluator.Run.call_args_list), | 91 self.assertGreaterEqual(len(evaluator.Run.call_args_list), |
89 min_number_of_simulations) | 92 min_number_of_simulations) |
| 93 |
| 94 def testPureToneGenerationWithTotalHarmonicDistorsion(self): |
| 95 logging.warning = mock.MagicMock(name='warning') |
| 96 |
| 97 # Instance simulator. |
| 98 simulator = simulation.ApmModuleSimulator( |
| 99 aechen_ir_database_path='', |
| 100 polqa_tool_bin_path=os.path.join( |
| 101 os.path.dirname(__file__), 'fake_polqa'), |
| 102 ap_wrapper=audioproc_wrapper.AudioProcWrapper(), |
| 103 evaluator=evaluation.ApmModuleEvaluator()) |
| 104 |
| 105 # What to simulate. |
| 106 config_files = ['apm_configs/default.json'] |
| 107 input_files = [os.path.join(self._tmp_path, 'pure_tone-440_1000.wav')] |
| 108 eval_scores = ['thd'] |
| 109 |
| 110 # Should work. |
| 111 simulator.Run( |
| 112 config_filepaths=config_files, |
| 113 capture_input_filepaths=input_files, |
| 114 test_data_generator_names=['identity'], |
| 115 eval_score_names=eval_scores, |
| 116 output_dir=self._output_path) |
| 117 self.assertFalse(logging.warning.called) |
| 118 |
| 119 # Warning expected. |
| 120 simulator.Run( |
| 121 config_filepaths=config_files, |
| 122 capture_input_filepaths=input_files, |
| 123 test_data_generator_names=['white_noise'], # Not allowed with THD. |
| 124 eval_score_names=eval_scores, |
| 125 output_dir=self._output_path) |
| 126 logging.warning.assert_called_with('the evaluation failed: %s', ( |
| 127 'The THD score cannot be used with any test data generator other than ' |
| 128 '"identity"')) |
OLD | NEW |