Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / voice_engine / test / auto_test / voe_standard_test.cc
1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10
11 #include "webrtc/voice_engine/test/auto_test/voe_standard_test.h"
12
13 #include <assert.h>
14 #include <stdio.h>
15 #include <string.h>
16
17 #include "webrtc/engine_configurations.h"
18 #include "webrtc/system_wrappers/interface/event_wrapper.h"
19 #include "webrtc/voice_engine/include/voe_neteq_stats.h"
20 #include "webrtc/voice_engine/test/auto_test/automated_mode.h"
21 #include "webrtc/voice_engine/test/auto_test/voe_cpu_test.h"
22 #include "webrtc/voice_engine/test/auto_test/voe_stress_test.h"
23 #include "webrtc/voice_engine/test/auto_test/voe_test_defines.h"
24 #include "webrtc/voice_engine/voice_engine_defines.h"
25
26 DEFINE_bool(include_timing_dependent_tests, true,
27             "If true, we will include tests / parts of tests that are known "
28             "to break in slow execution environments (such as valgrind).");
29 DEFINE_bool(automated, false,
30             "If true, we'll run the automated tests we have in noninteractive "
31             "mode.");
32
33 using namespace webrtc;
34
35 namespace voetest {
36
37 int dummy = 0;  // Dummy used in different functions to avoid warnings
38
39 void SubAPIManager::DisplayStatus() const {
40   TEST_LOG("Supported sub APIs:\n\n");
41   if (_base)
42     TEST_LOG("  Base\n");
43   if (_codec)
44     TEST_LOG("  Codec\n");
45   if (_dtmf)
46     TEST_LOG("  Dtmf\n");
47   if (_externalMedia)
48     TEST_LOG("  ExternalMedia\n");
49   if (_file)
50     TEST_LOG("  File\n");
51   if (_hardware)
52     TEST_LOG("  Hardware\n");
53   if (_netEqStats)
54     TEST_LOG("  NetEqStats\n");
55   if (_network)
56     TEST_LOG("  Network\n");
57   if (_rtp_rtcp)
58     TEST_LOG("  RTP_RTCP\n");
59   if (_videoSync)
60     TEST_LOG("  VideoSync\n");
61   if (_volumeControl)
62     TEST_LOG("  VolumeControl\n");
63   if (_apm)
64     TEST_LOG("  AudioProcessing\n");
65   ANL();
66   TEST_LOG("Excluded sub APIs:\n\n");
67   if (!_base)
68     TEST_LOG("  Base\n");
69   if (!_codec)
70     TEST_LOG("  Codec\n");
71   if (!_dtmf)
72     TEST_LOG("  Dtmf\n");
73   if (!_externalMedia)
74     TEST_LOG("  ExternamMedia\n");
75   if (!_file)
76     TEST_LOG("  File\n");
77   if (!_hardware)
78     TEST_LOG("  Hardware\n");
79   if (!_netEqStats)
80     TEST_LOG("  NetEqStats\n");
81   if (!_network)
82     TEST_LOG("  Network\n");
83   if (!_rtp_rtcp)
84     TEST_LOG("  RTP_RTCP\n");
85   if (!_videoSync)
86     TEST_LOG("  VideoSync\n");
87   if (!_volumeControl)
88     TEST_LOG("  VolumeControl\n");
89   if (!_apm)
90     TEST_LOG("  AudioProcessing\n");
91   ANL();
92 }
93
94 VoETestManager::VoETestManager()
95     : initialized_(false),
96       voice_engine_(NULL),
97       voe_base_(0),
98       voe_codec_(0),
99       voe_dtmf_(0),
100       voe_xmedia_(0),
101       voe_file_(0),
102       voe_hardware_(0),
103       voe_network_(0),
104 #ifdef WEBRTC_VOICE_ENGINE_NETEQ_STATS_API
105       voe_neteq_stats_(NULL),
106 #endif
107       voe_rtp_rtcp_(0),
108       voe_vsync_(0),
109       voe_volume_control_(0),
110       voe_apm_(0) {
111 }
112
113 VoETestManager::~VoETestManager() {
114 }
115
116 bool VoETestManager::Init() {
117   if (initialized_)
118     return true;
119
120   if (VoiceEngine::SetTraceFile(NULL) != -1) {
121     // should not be possible to call a Trace method before the VoE is
122     // created
123     TEST_LOG("\nError at line: %i (VoiceEngine::SetTraceFile()"
124       "should fail)!\n", __LINE__);
125     return false;
126   }
127
128   voice_engine_ = VoiceEngine::Create();
129   if (!voice_engine_) {
130     TEST_LOG("Failed to create VoiceEngine\n");
131     return false;
132   }
133
134   return true;
135 }
136
137 void VoETestManager::GetInterfaces() {
138   if (voice_engine_) {
139     voe_base_ = VoEBase::GetInterface(voice_engine_);
140     voe_codec_ = VoECodec::GetInterface(voice_engine_);
141     voe_volume_control_ = VoEVolumeControl::GetInterface(voice_engine_);
142     voe_dtmf_ = VoEDtmf::GetInterface(voice_engine_);
143     voe_rtp_rtcp_ = VoERTP_RTCP::GetInterface(voice_engine_);
144     voe_apm_ = VoEAudioProcessing::GetInterface(voice_engine_);
145     voe_network_ = VoENetwork::GetInterface(voice_engine_);
146     voe_file_ = VoEFile::GetInterface(voice_engine_);
147 #ifdef _TEST_VIDEO_SYNC_
148     voe_vsync_ = VoEVideoSync::GetInterface(voice_engine_);
149 #endif
150     voe_hardware_ = VoEHardware::GetInterface(voice_engine_);
151     // Set the audio layer to use in all tests
152     if (voe_hardware_) {
153       int res = voe_hardware_->SetAudioDeviceLayer(TESTED_AUDIO_LAYER);
154       if (res < 0) {
155         printf("\nERROR: failed to set audio layer to use in "
156           "testing\n");
157       } else {
158         printf("\nAudio layer %d will be used in testing\n",
159                TESTED_AUDIO_LAYER);
160       }
161     }
162 #ifdef _TEST_XMEDIA_
163     voe_xmedia_ = VoEExternalMedia::GetInterface(voice_engine_);
164 #endif
165 #ifdef WEBRTC_VOICE_ENGINE_NETEQ_STATS_API
166     voe_neteq_stats_ = VoENetEqStats::GetInterface(voice_engine_);
167 #endif
168   }
169 }
170
171 int VoETestManager::ReleaseInterfaces() {
172   bool releaseOK(true);
173
174   if (voe_base_) {
175     voe_base_->Release();
176     voe_base_ = NULL;
177   }
178   if (voe_codec_) {
179     voe_codec_->Release();
180     voe_codec_ = NULL;
181   }
182   if (voe_volume_control_) {
183     voe_volume_control_->Release();
184     voe_volume_control_ = NULL;
185   }
186   if (voe_dtmf_) {
187     voe_dtmf_->Release();
188     voe_dtmf_ = NULL;
189   }
190   if (voe_rtp_rtcp_) {
191     voe_rtp_rtcp_->Release();
192     voe_rtp_rtcp_ = NULL;
193   }
194   if (voe_apm_) {
195     voe_apm_->Release();
196     voe_apm_ = NULL;
197   }
198   if (voe_network_) {
199     voe_network_->Release();
200     voe_network_ = NULL;
201   }
202   if (voe_file_) {
203     voe_file_->Release();
204     voe_file_ = NULL;
205   }
206 #ifdef _TEST_VIDEO_SYNC_
207   if (voe_vsync_) {
208     voe_vsync_->Release();
209     voe_vsync_ = NULL;
210   }
211 #endif
212   if (voe_hardware_) {
213     voe_hardware_->Release();
214     voe_hardware_ = NULL;
215   }
216 #ifdef _TEST_XMEDIA_
217   if (voe_xmedia_) {
218     voe_xmedia_->Release();
219     voe_xmedia_ = NULL;
220   }
221 #endif
222 #ifdef WEBRTC_VOICE_ENGINE_NETEQ_STATS_API
223   if (voe_neteq_stats_) {
224     voe_neteq_stats_->Release();
225     voe_neteq_stats_ = NULL;
226   }
227 #endif
228   if (false == VoiceEngine::Delete(voice_engine_)) {
229     TEST_LOG("\n\nVoiceEngine::Delete() failed. \n");
230     releaseOK = false;
231   }
232
233   if (VoiceEngine::SetTraceFile(NULL) != -1) {
234     TEST_LOG("\nError at line: %i (VoiceEngine::SetTraceFile()"
235       "should fail)!\n", __LINE__);
236   }
237
238   return (releaseOK == true) ? 0 : -1;
239 }
240
241 int run_auto_test(TestType test_type) {
242   assert(test_type != Standard);
243
244   SubAPIManager api_manager;
245   api_manager.DisplayStatus();
246
247   ////////////////////////////////////
248   // Create VoiceEngine and sub API:s
249
250   voetest::VoETestManager test_manager;
251   if (!test_manager.Init()) {
252     return -1;
253   }
254   test_manager.GetInterfaces();
255
256   int result = -1;
257   if (test_type == Stress) {
258     VoEStressTest stressTest(test_manager);
259     result = stressTest.DoTest();
260   } else if (test_type == CPU) {
261     VoECpuTest cpuTest(test_manager);
262     result = cpuTest.DoTest();
263   } else {
264     // Should never end up here
265     assert(false);
266   }
267
268   //////////////////
269   // Release/Delete
270
271   int release_ok = test_manager.ReleaseInterfaces();
272
273   if ((0 == result) && (release_ok != -1)) {
274     TEST_LOG("\n\n*** All tests passed *** \n\n");
275   } else {
276     TEST_LOG("\n\n*** Test failed! *** \n");
277   }
278
279   return 0;
280 }
281 }  // namespace voetest
282
283 int RunInManualMode() {
284   using namespace voetest;
285
286   SubAPIManager api_manager;
287   api_manager.DisplayStatus();
288
289   printf("----------------------------\n");
290   printf("Select type of test\n\n");
291   printf(" (0)  Quit\n");
292   printf(" (1)  Standard test\n");
293   printf(" (2)  [OBSOLETE: Extended test(s)...]\n");
294   printf(" (3)  Stress test(s)...\n");
295   printf(" (4)  [OBSOLETE: Unit test(s)...]\n");
296   printf(" (5)  CPU & memory reference test [Windows]...\n");
297   printf("\n: ");
298
299   int selection(0);
300   dummy = scanf("%d", &selection);
301
302   TestType test_type = Invalid;
303   switch (selection) {
304     case 0:
305       return 0;
306     case 1:
307       test_type = Standard;
308       break;
309     case 2:
310       break;
311     case 3:
312       test_type = Stress;
313       break;
314     case 4:
315       break;
316     case 5:
317       test_type = CPU;
318       break;
319     default:
320       TEST_LOG("Invalid selection!\n");
321       return 0;
322   }
323
324   if (test_type == Standard) {
325     TEST_LOG("\n\n+++ Running standard tests +++\n\n");
326
327     // Currently, all googletest-rewritten tests are in the "automated" suite.
328     return RunInAutomatedMode();
329   }
330
331   // Function that can be called from other entry functions.
332   return run_auto_test(test_type);
333 }
334
335 // ----------------------------------------------------------------------------
336 //                                       main
337 // ----------------------------------------------------------------------------
338
339 #if !defined(WEBRTC_IOS)
340 int main(int argc, char** argv) {
341   // This function and RunInAutomatedMode is defined in automated_mode.cc
342   // to avoid macro clashes with googletest (for instance ASSERT_TRUE).
343   InitializeGoogleTest(&argc, argv);
344   // AllowCommandLineParsing allows us to ignore flags passed on to us by
345   // Chromium build bots without having to explicitly disable them.
346   google::AllowCommandLineReparsing();
347   google::ParseCommandLineFlags(&argc, &argv, true);
348
349   if (FLAGS_automated) {
350     return RunInAutomatedMode();
351   }
352
353   return RunInManualMode();
354 }
355 #endif //#if !defined(WEBRTC_IOS)