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