10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2012, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/test/fakeaudiocapturemodule.h" 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <algorithm> 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/gunit.h" 332a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/scoped_ref_ptr.h" 342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/thread.h" 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing std::min; 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeAdmTest : public testing::Test, 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public webrtc::AudioTransport { 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static const int kMsInSecond = 1000; 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeAdmTest() 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : push_iterations_(0), 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pull_iterations_(0), 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rec_buffer_bytes_(0) { 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memset(rec_buffer_, 0, sizeof(rec_buffer_)); 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void SetUp() { 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org fake_audio_capture_module_ = FakeAudioCaptureModule::Create( 522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current()); 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(fake_audio_capture_module_.get() != NULL); 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Callbacks inherited from webrtc::AudioTransport. 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // ADM is pushing data. 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual int32_t RecordedDataIsAvailable(const void* audioSamples, 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint32_t nSamples, 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8_t nBytesPerSample, 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8_t nChannels, 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint32_t samplesPerSec, 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint32_t totalDelayMS, 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const int32_t clockDrift, 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint32_t currentMicLevel, 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const bool keyPressed, 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32_t& newMicLevel) { 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rec_buffer_bytes_ = nSamples * nBytesPerSample; 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if ((rec_buffer_bytes_ <= 0) || 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (rec_buffer_bytes_ > FakeAudioCaptureModule::kNumberSamples * 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeAudioCaptureModule::kNumberBytesPerSample)) { 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ADD_FAILURE(); 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return -1; 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memcpy(rec_buffer_, audioSamples, rec_buffer_bytes_); 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++push_iterations_; 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org newMicLevel = currentMicLevel; 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return 0; 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // ADM is pulling data. 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual int32_t NeedMorePlayData(const uint32_t nSamples, 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8_t nBytesPerSample, 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8_t nChannels, 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint32_t samplesPerSec, 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void* audioSamples, 87aa9e01db86a290df1a0a7a2730f4a611bc852e14wu@webrtc.org uint32_t& nSamplesOut, 889d8544ccf73e9072bf7e0d747028ff004333e677buildbot@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH 89b5f0570d3fef0be89c236b1a063e0da5bdfb383fwu@webrtc.org int64_t* elapsed_time_ms, 90aa9e01db86a290df1a0a7a2730f4a611bc852e14wu@webrtc.org#else 919d8544ccf73e9072bf7e0d747028ff004333e677buildbot@webrtc.org uint32_t* rtp_timestamp, 92aa9e01db86a290df1a0a7a2730f4a611bc852e14wu@webrtc.org#endif 939d8544ccf73e9072bf7e0d747028ff004333e677buildbot@webrtc.org int64_t* ntp_time_ms) { 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++pull_iterations_; 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint32_t audio_buffer_size = nSamples * nBytesPerSample; 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint32_t bytes_out = RecordedDataReceived() ? 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CopyFromRecBuffer(audioSamples, audio_buffer_size): 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org GenerateZeroBuffer(audioSamples, audio_buffer_size); 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org nSamplesOut = bytes_out / nBytesPerSample; 100aa9e01db86a290df1a0a7a2730f4a611bc852e14wu@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH 101b5f0570d3fef0be89c236b1a063e0da5bdfb383fwu@webrtc.org *elapsed_time_ms = 0; 1029d8544ccf73e9072bf7e0d747028ff004333e677buildbot@webrtc.org#else 1039d8544ccf73e9072bf7e0d747028ff004333e677buildbot@webrtc.org *rtp_timestamp = 0; 104aa9e01db86a290df1a0a7a2730f4a611bc852e14wu@webrtc.org#endif 1059d8544ccf73e9072bf7e0d747028ff004333e677buildbot@webrtc.org *ntp_time_ms = 0; 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return 0; 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int push_iterations() const { return push_iterations_; } 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int pull_iterations() const { return pull_iterations_; } 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1122a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_; 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool RecordedDataReceived() const { 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return rec_buffer_bytes_ != 0; 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int32_t GenerateZeroBuffer(void* audio_buffer, uint32_t audio_buffer_size) { 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memset(audio_buffer, 0, audio_buffer_size); 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return audio_buffer_size; 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int32_t CopyFromRecBuffer(void* audio_buffer, uint32_t audio_buffer_size) { 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(audio_buffer_size, rec_buffer_bytes_); 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint32_t min_buffer_size = min(audio_buffer_size, rec_buffer_bytes_); 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memcpy(audio_buffer, rec_buffer_, min_buffer_size); 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return min_buffer_size; 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int push_iterations_; 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int pull_iterations_; 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char rec_buffer_[FakeAudioCaptureModule::kNumberSamples * 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeAudioCaptureModule::kNumberBytesPerSample]; 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32_t rec_buffer_bytes_; 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(FakeAdmTest, TestProccess) { 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Next process call must be some time in the future (or now). 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LE(0, fake_audio_capture_module_->TimeUntilNextProcess()); 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Process call updates TimeUntilNextProcess() but there are no guarantees on 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // timing so just check that Process can ba called successfully. 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LE(0, fake_audio_capture_module_->Process()); 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(FakeAdmTest, PlayoutTest) { 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this)); 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool stereo_available = false; 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org fake_audio_capture_module_->StereoPlayoutIsAvailable( 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &stereo_available)); 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stereo_available); 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(0, fake_audio_capture_module_->StartPlayout()); 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(fake_audio_capture_module_->PlayoutIsInitialized()); 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(fake_audio_capture_module_->Playing()); 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout()); 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->InitPlayout()); 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(fake_audio_capture_module_->PlayoutIsInitialized()); 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(fake_audio_capture_module_->Playing()); 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->StartPlayout()); 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(fake_audio_capture_module_->Playing()); 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint16_t delay_ms = 10; 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->PlayoutDelay(&delay_ms)); 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, delay_ms); 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(pull_iterations() > 0, kMsInSecond); 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_GE(0, push_iterations()); 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout()); 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(fake_audio_capture_module_->Playing()); 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(FakeAdmTest, RecordTest) { 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this)); 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool stereo_available = false; 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->StereoRecordingIsAvailable( 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &stereo_available)); 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(stereo_available); 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(0, fake_audio_capture_module_->StartRecording()); 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(fake_audio_capture_module_->Recording()); 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->StopRecording()); 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->InitRecording()); 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->StartRecording()); 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(fake_audio_capture_module_->Recording()); 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(push_iterations() > 0, kMsInSecond); 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_GE(0, pull_iterations()); 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->StopRecording()); 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(fake_audio_capture_module_->Recording()); 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(FakeAdmTest, DuplexTest) { 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this)); 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->InitPlayout()); 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->StartPlayout()); 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->InitRecording()); 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->StartRecording()); 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(push_iterations() > 0, kMsInSecond); 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE_WAIT(pull_iterations() > 0, kMsInSecond); 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout()); 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, fake_audio_capture_module_->StopRecording()); 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 215