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