13ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org/*
23ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * libjingle
33ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * Copyright 2008 Google Inc.
43ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org *
53ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
63ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
73ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org *
83ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
93ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org *     this list of conditions and the following disclaimer.
103ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
113ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
123ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org *     and/or other materials provided with the distribution.
133ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
143ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org *     derived from this software without specific prior written permission.
153ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org *
163ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
173ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
183ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
193ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
203ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
213ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
223ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
233ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
243ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
253ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
263ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef WIN32
292a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/win32.h"
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <objbase.h>
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
332a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/byteorder.h"
342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/gunit.h"
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/constants.h"
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h"
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakemediaprocessor.h"
3880303b162fe139828d0661df23e03f09126508acwu@webrtc.org#include "talk/media/base/fakenetworkinterface.h"
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakertp.h"
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
415462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org#include "talk/media/webrtc/webrtcvie.h"
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/webrtc/webrtcvoiceengine.h"
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/fakesession.h"
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/channel.h"
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests for the WebRtcVoiceEngine/VoiceChannel code.
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
482ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgusing cricket::kRtpAudioLevelHeaderExtension;
492ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgusing cricket::kRtpAbsoluteSenderTimeHeaderExtension;
502ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kCeltCodec(110, "CELT", 32000, 64000, 2, 0);
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kTelephoneEventCodec(106, "telephone-event", 8000, 0, 1, 0);
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec* const kAudioCodecs[] = {
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    &kPcmuCodec, &kIsacCodec, &kCeltCodec, &kOpusCodec, &kRedCodec,
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst char kRingbackTone[] = "RIFF____WAVE____ABCD1234";
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic uint32 kSsrc1 = 0x99;
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic uint32 kSsrc2 = 0x98;
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeVoEWrapper : public cricket::VoEWrapper {
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : cricket::VoEWrapper(engine,  // processing
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            engine,  // base
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            engine,  // codec
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            engine,  // dtmf
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            engine,  // file
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            engine,  // hw
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            engine,  // media
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            engine,  // neteq
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            engine,  // network
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            engine,  // rtp
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            engine,  // sync
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            engine) {  // volume
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
865c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgclass FakeVoETraceWrapper : public cricket::VoETraceWrapper {
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int SetTraceFilter(const unsigned int filter) {
895c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    filter_ = filter;
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int SetTraceFile(const char* fileNameUTF8) {
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int SetTraceCallback(webrtc::TraceCallback* callback) {
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
985c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  unsigned int filter_;
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass WebRtcVoiceEngineTestFake : public testing::Test {
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  class ChannelErrorListener : public sigslot::has_slots<> {
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org   public:
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    explicit ChannelErrorListener(cricket::VoiceMediaChannel* channel)
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        : ssrc_(0), error_(cricket::VoiceMediaChannel::ERROR_NONE) {
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ASSERT(channel != NULL);
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channel->SignalMediaError.connect(
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          this, &ChannelErrorListener::OnVoiceChannelError);
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    void OnVoiceChannelError(uint32 ssrc,
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             cricket::VoiceMediaChannel::Error error) {
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ssrc_ = ssrc;
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      error_ = error;
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    void Reset() {
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ssrc_ = 0;
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      error_ = cricket::VoiceMediaChannel::ERROR_NONE;
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    uint32 ssrc() const {
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return ssrc_;
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::VoiceMediaChannel::Error error() const {
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return error_;
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org   private:
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    uint32 ssrc_;
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::VoiceMediaChannel::Error error_;
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WebRtcVoiceEngineTestFake()
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : voe_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)),
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        voe_sc_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)),
1355c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org        trace_wrapper_(new FakeVoETraceWrapper()),
1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        engine_(new FakeVoEWrapper(&voe_),
1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                new FakeVoEWrapper(&voe_sc_),
1385c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org                trace_wrapper_),
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        channel_(NULL), soundclip_(NULL) {
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    options_conference_.conference_mode.Set(true);
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    options_adjust_agc_.adjust_agc_delta.Set(-10);
1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1432ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  bool SetupEngineWithoutStream() {
1442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    if (!engine_.Init(rtc::Thread::Current())) {
1452ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org      return false;
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1472ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    channel_ = engine_.CreateChannel();
1482ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    return (channel_ != NULL);
1492ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  }
1502ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  bool SetupEngine() {
1512ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    if (!SetupEngineWithoutStream()) {
1522ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org      return false;
1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1542ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    return channel_->AddSendStream(
1552ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org        cricket::StreamParams::CreateLegacy(kSsrc1));
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
157f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  void SetupForMultiSendStream() {
158f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(SetupEngine());
159f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    // Remove stream added in Setup, which is corresponding to default channel.
160f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    int default_channel_num = voe_.GetLastChannel();
161c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org    uint32 default_send_ssrc = 0u;
162f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
163f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(kSsrc1, default_send_ssrc);
164f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
165f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
166f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    // Verify the default channel still exists.
167f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
168f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void DeliverPacket(const void* data, int len) {
1702a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::Buffer packet(data, len);
1712a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    channel_->OnPacketReceived(&packet, rtc::PacketTime());
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void TearDown() {
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    delete soundclip_;
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    delete channel_;
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    engine_.Terminate();
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
179952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  void TestInsertDtmf(uint32 ssrc, bool caller) {
1802a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
181952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org    channel_ = engine_.CreateChannel();
182952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org    EXPECT_TRUE(channel_ != NULL);
183952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org    if (caller) {
184952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      // if this is a caller, local description will be applied and add the
185952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      // send stream.
186952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      EXPECT_TRUE(channel_->AddSendStream(
187952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org          cricket::StreamParams::CreateLegacy(kSsrc1)));
188952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org    }
189952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org    int channel_id = voe_.GetLastChannel();
190952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Test we can only InsertDtmf when the other side supports telephone-event.
1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::vector<cricket::AudioCodec> codecs;
1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codecs.push_back(kPcmuCodec);
1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel_->CanInsertDtmf());
1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codecs.push_back(kTelephoneEventCodec);
1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel_->SetSendCodecs(codecs));
2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel_->CanInsertDtmf());
201952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
202952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org    if (!caller) {
203952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      // There's no active send channel yet.
204952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
205952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      EXPECT_TRUE(channel_->AddSendStream(
206952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org          cricket::StreamParams::CreateLegacy(kSsrc1)));
207952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org    }
208952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Check we fail if the ssrc is invalid.
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Test send
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Test play
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Test send and play
2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     cricket::DF_PLAY | cricket::DF_SEND));
2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that send bandwidth is set correctly.
2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // |codec| is the codec under test.
233f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
234f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // |expected_result| is the expected result from SetMaxSendBandwidth().
235f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // |expected_bitrate| is the expected audio bitrate afterward.
2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSendBandwidth(const cricket::AudioCodec& codec,
237f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                         int max_bitrate,
238f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                         bool expected_result,
239f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                         int expected_bitrate) {
2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int channel_num = voe_.GetLastChannel();
2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::vector<cricket::AudioCodec> codecs;
2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codecs.push_back(codec);
2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel_->SetSendCodecs(codecs));
2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
246f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    bool result = channel_->SetMaxSendBandwidth(max_bitrate);
2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(expected_result, result);
2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
249cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org    webrtc::CodecInst temp_codec;
2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
252f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_EQ(expected_bitrate, temp_codec.rate);
2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2552ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  void TestSetSendRtpHeaderExtensions(const std::string& ext) {
2562ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_TRUE(SetupEngineWithoutStream());
2572ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    int channel_num = voe_.GetLastChannel();
258f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
2593ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    // Ensure extensions are off by default.
2602ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
261f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
2622ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    std::vector<cricket::RtpHeaderExtension> extensions;
263f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    // Ensure unknown extensions won't cause an error.
264f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    extensions.push_back(cricket::RtpHeaderExtension(
2653ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org        "urn:ietf:params:unknownextention", 1));
266f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
2672ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
268f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
2693ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    // Ensure extensions stay off with an empty list of headers.
2703ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    extensions.clear();
271f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
2722ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
273f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
2742ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    // Ensure extension is set properly.
2752ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    const int id = 1;
2762ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    extensions.push_back(cricket::RtpHeaderExtension(ext, id));
277f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
2782ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
2793ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org
2802ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    // Ensure extension is set properly on new channel.
2812ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    // The first stream to occupy the default channel.
2822ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_TRUE(channel_->AddSendStream(
2832ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org        cricket::StreamParams::CreateLegacy(123)));
2842ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_TRUE(channel_->AddSendStream(
2852ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org        cricket::StreamParams::CreateLegacy(234)));
2862ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    int new_channel_num = voe_.GetLastChannel();
2872ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_NE(channel_num, new_channel_num);
2882ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
289f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
2903ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    // Ensure all extensions go back off with an empty list.
291f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    extensions.clear();
292f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
2932ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
2942ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
2953ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  }
2963ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org
2972ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
2982ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_TRUE(SetupEngineWithoutStream());
2992ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    int channel_num = voe_.GetLastChannel();
3003ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org
3013ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    // Ensure extensions are off by default.
3022ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
3033ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org
3042ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    std::vector<cricket::RtpHeaderExtension> extensions;
3053ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    // Ensure unknown extensions won't cause an error.
3063ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    extensions.push_back(cricket::RtpHeaderExtension(
3073ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org        "urn:ietf:params:unknownextention", 1));
3083ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
3092ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
3103ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org
3112ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    // Ensure extensions stay off with an empty list of headers.
3123ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    extensions.clear();
3133ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
3142ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
3153ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org
3162ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    // Ensure extension is set properly.
3172ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    const int id = 2;
3182ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    extensions.push_back(cricket::RtpHeaderExtension(ext, id));
3193ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
3202ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
3213ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org
3222ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    // Ensure extension is set properly on new channel.
3232ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    // The first stream to occupy the default channel.
3242ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_TRUE(channel_->AddRecvStream(
3252ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org        cricket::StreamParams::CreateLegacy(345)));
3262ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_TRUE(channel_->AddRecvStream(
3272ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org        cricket::StreamParams::CreateLegacy(456)));
3282ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    int new_channel_num = voe_.GetLastChannel();
3292ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_NE(channel_num, new_channel_num);
3302ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
3312ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org
3322ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    // Ensure all extensions go back off with an empty list.
3333ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    extensions.clear();
3343ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
3352ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
3362ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
337f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
338f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeWebRtcVoiceEngine voe_;
3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeWebRtcVoiceEngine voe_sc_;
3425c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  FakeVoETraceWrapper* trace_wrapper_;
3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceEngine engine_;
3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VoiceMediaChannel* channel_;
3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::SoundclipMedia* soundclip_;
3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::AudioOptions options_conference_;
3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::AudioOptions options_adjust_agc_;
3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that our stub library "works".
3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.IsInited());
3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_sc_.IsInited());
3552a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.IsInited());
35762fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  // The soundclip engine is lazily initialized.
35862fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  EXPECT_FALSE(voe_sc_.IsInited());
3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine_.Terminate();
3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.IsInited());
3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_sc_.IsInited());
3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that we can create and destroy a channel.
3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
3662a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel_ = engine_.CreateChannel();
3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_ != NULL);
3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that we properly handle failures in CreateChannel.
3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CreateChannelFail) {
3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_fail_create_channel(true);
3742a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel_ = engine_.CreateChannel();
3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_ == NULL);
3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that the list of supported codecs is created properly and ordered
3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// correctly
3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_FALSE(codecs.empty());
3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(48000, codecs[0].clockrate);
3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, codecs[0].channels);
3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(64000, codecs[0].bitrate);
3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int pref = codecs[0].preference;
3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (size_t i = 1; i < codecs.size(); ++i) {
3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_GT(pref, codecs[i].preference);
3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    pref = codecs[i].preference;
3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that we can find codecs by name or id, and that we interpret the
3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// clockrate and bitrate fields properly.
3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::AudioCodec codec;
3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst codec_inst;
4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Find PCMU with explicit clockrate and bitrate.
4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Find ISAC with explicit clockrate and 0 bitrate.
4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Find telephone-event with explicit clockrate and 0 bitrate.
4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Find ISAC with a different payload id.
4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codec = kIsacCodec;
4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codec.id = 127;
4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(codec.id, codec_inst.pltype);
4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Find PCMU with a 0 clockrate.
4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codec = kPcmuCodec;
4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codec.clockrate = 0;
4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(codec.id, codec_inst.pltype);
4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(8000, codec_inst.plfreq);
4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Find PCMU with a 0 bitrate.
4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codec = kPcmuCodec;
4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codec.bitrate = 0;
4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(codec.id, codec_inst.pltype);
4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(64000, codec_inst.rate);
4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Find ISAC with an explicit bitrate.
4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codec = kIsacCodec;
4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codec.bitrate = 32000;
4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(codec.id, codec_inst.pltype);
4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(32000, codec_inst.rate);
4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we set our inbound codecs properly, including changing PT.
4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kTelephoneEventCodec);
4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 106;  // collide with existing telephone-event
4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[2].id = 126;
4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
4432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  gcodec.plfreq = 16000;
4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  gcodec.channels = 1;
4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(106, gcodec.pltype);
4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
4492a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "telephone-event");
4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  gcodec.plfreq = 8000;
4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(126, gcodec.pltype);
4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("telephone-event", gcodec.plname);
4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail to set an unknown inbound codec.
4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail if we have duplicate types in the inbound list.
4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kCn16000Codec);
4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[1].id = kIsacCodec.id;
4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can decode OPUS without stereo parameters.
4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(
4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc1)));
4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num2 = voe_.GetLastChannel();
4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst opus;
4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine_.FindWebRtcCodec(kOpusCodec, &opus);
4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Even without stereo parameters, recv codecs still specify channels = 2.
4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, opus.channels);
4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(111, opus.pltype);
4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("opus", opus.plname);
4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  opus.pltype = 0;
4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(111, opus.pltype);
4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can decode OPUS with stereo = 0.
5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[2].params["stereo"] = "0";
5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(
5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc1)));
5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num2 = voe_.GetLastChannel();
5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst opus;
5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine_.FindWebRtcCodec(kOpusCodec, &opus);
5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Even when stereo is off, recv codecs still specify channels = 2.
5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, opus.channels);
5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(111, opus.pltype);
5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("opus", opus.plname);
5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  opus.pltype = 0;
5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(111, opus.pltype);
5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can decode OPUS with stereo = 1.
5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[2].params["stereo"] = "1";
5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(
5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc1)));
5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num2 = voe_.GetLastChannel();
5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst opus;
5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine_.FindWebRtcCodec(kOpusCodec, &opus);
5380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, opus.channels);
5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(111, opus.pltype);
5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("opus", opus.plname);
5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  opus.pltype = 0;
5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
5430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(111, opus.pltype);
5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that changes to recv codecs are applied to all streams.
5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kTelephoneEventCodec);
5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 106;  // collide with existing telephone-event
5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[2].id = 126;
5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(
5580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc1)));
5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num2 = voe_.GetLastChannel();
5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
5612a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
5620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  gcodec.plfreq = 16000;
5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  gcodec.channels = 1;
5640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(106, gcodec.pltype);
5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
5672a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "telephone-event");
5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  gcodec.plfreq = 8000;
5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  gcodec.channels = 1;
5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(126, gcodec.pltype);
5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("telephone-event", gcodec.plname);
5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
5750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 106;  // collide with existing telephone-event
5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(
5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc1)));
5850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
5860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num2 = voe_.GetLastChannel();
5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
5892a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  gcodec.plfreq = 16000;
5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  gcodec.channels = 1;
5920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
5930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(106, gcodec.pltype);
5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
5950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
5960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can apply the same set of codecs again while playing.
5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
6020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kCn16000Codec);
6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(true));
6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Changing the payload type of a codec should fail.
6090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 127;
6100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
6110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num));
6120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
6130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can add a codec while playing.
6150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
6160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
6170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
6180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
6190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
6200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kCn16000Codec);
6210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
6220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(true));
6230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
6250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
6260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num));
6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
6280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
6290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
6300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
6310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
6330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
6340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
6350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
636f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // Test that when autobw is enabled, bitrate is kept as the default
637f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // value. autobw is enabled for the following tests because the target
638f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // bitrate is <= 0.
6390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // ISAC, default bitrate == 32000.
641f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kIsacCodec, 0, true, 32000);
6420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // PCMU, default bitrate == 64000.
644f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kPcmuCodec, -1, true, 64000);
6450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // CELT, default bitrate == 64000.
647f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kCeltCodec, 0, true, 64000);
6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // opus, default bitrate == 64000.
650f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kOpusCodec, -1, true, 64000);
6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
653f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgTEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
6540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
6560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
657f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // Test that the bitrate of a multi-rate codec is always the maximum.
6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // ISAC, default bitrate == 32000.
660f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kIsacCodec, 128000, true, 128000);
661f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kIsacCodec, 16000, true, 16000);
6620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // CELT, default bitrate == 64000.
664f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kCeltCodec, 96000, true, 96000);
665f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kCeltCodec, 32000, true, 32000);
6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // opus, default bitrate == 64000.
668f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kOpusCodec, 96000, true, 96000);
669f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kOpusCodec, 48000, true, 48000);
670f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org}
671f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org
672f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgTEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
673f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  EXPECT_TRUE(SetupEngine());
674f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
675f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org
676f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // Test that we can only set a maximum bitrate for a fixed-rate codec
677f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // if it's bigger than the fixed rate.
678f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org
679f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // PCMU, fixed bitrate == 64000.
680f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kPcmuCodec, 0, true, 64000);
681f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kPcmuCodec, 1, false, 64000);
682f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
683f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
684f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
685f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
686f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
6870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
689f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgTEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
6902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
691cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  channel_ = engine_.CreateChannel();
692cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  EXPECT_TRUE(channel_ != NULL);
693cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
694cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org
695cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  int desired_bitrate = 128000;
696f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  EXPECT_TRUE(channel_->SetMaxSendBandwidth(desired_bitrate));
697cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org
698cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  EXPECT_TRUE(channel_->AddSendStream(
699cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc1)));
700cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org
701cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  int channel_num = voe_.GetLastChannel();
702cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  webrtc::CodecInst codec;
703cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
704cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  EXPECT_EQ(desired_bitrate, codec.rate);
705cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org}
706cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org
7070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that bitrate cannot be set for CBR codecs.
7080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Bitrate is ignored if it is higher than the fixed bitrate.
7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Bitrate less then the fixed bitrate is an error.
710f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgTEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
7110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst codec;
7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // PCMU, default bitrate == 64000.
7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(64000, codec.rate);
723f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  EXPECT_TRUE(channel_->SetMaxSendBandwidth(128000));
7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(64000, codec.rate);
726f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  EXPECT_FALSE(channel_->SetMaxSendBandwidth(128));
7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(64000, codec.rate);
7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we apply codecs properly.
7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kRedCodec);
7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 96;
7400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 48000;
7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
742a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
7430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
7450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
7460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(48000, gcodec.rate);
7470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetVAD(channel_num));
74907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetRED(channel_num));
7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
7520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
7530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
755a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
756a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org// to apply.
757a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
758a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  EXPECT_TRUE(SetupEngine());
759a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  std::vector<cricket::AudioCodec> codecs;
760a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  codecs.push_back(kIsacCodec);
761a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  codecs.push_back(kPcmuCodec);
762a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  codecs.push_back(kRedCodec);
763a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  codecs[0].id = 96;
764a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  codecs[0].bitrate = 48000;
765a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
766a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
767a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  // Calling SetSendCodec again with same codec which is already set.
768a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  // In this case media channel shouldn't send codec to VoE.
769a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
770a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
771a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org}
772a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org
7737587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that if clockrate is not 48000 for opus, we fail.
7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;
7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].clockrate = 50000;
7807587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_FALSE(channel_->SetSendCodecs(codecs));
7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7837587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that if channels=0 for opus, we fail.
7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
7850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;
7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].channels = 0;
7907587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_FALSE(channel_->SetSendCodecs(codecs));
7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7937587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that if channels=0 for opus, we fail.
7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
7950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
7970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;
7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].channels = 0;
8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params["stereo"] = "1";
8017587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_FALSE(channel_->SetSendCodecs(codecs));
8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
8030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that if channel is 1 for opus and there's no stereo, we fail.
8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
8090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;
8100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].channels = 1;
8117587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_FALSE(channel_->SetSendCodecs(codecs));
8120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
8130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that if channel is 1 for opus and stereo=0, we fail.
8150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
8160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
8170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
8180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
8190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;
8200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].channels = 1;
8210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params["stereo"] = "0";
8227587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_FALSE(channel_->SetSendCodecs(codecs));
8230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
8240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that if channel is 1 for opus and stereo=1, we fail.
8260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
8270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
8280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
8290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
8300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;
8310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].channels = 1;
8320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params["stereo"] = "1";
8337587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_FALSE(channel_->SetSendCodecs(codecs));
8340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
8350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=0 and no stereo,
8370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 1 and 32000.
8380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
8420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;
8440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, gcodec.channels);
8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=0 and stereo=0,
8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 1 and 32000.
8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
8580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;
8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params["stereo"] = "0";
8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
8630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, gcodec.channels);
8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8697162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// Test that with bitrate=invalid and stereo=0,
8707162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// channels and bitrate are 1 and 32000.
8717162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
8727162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_TRUE(SetupEngine());
8737162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  int channel_num = voe_.GetLastChannel();
8747162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
8757162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs.push_back(kOpusCodec);
8767162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs[0].params["stereo"] = "0";
8777162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  webrtc::CodecInst gcodec;
8787162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org
8797162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  // bitrate that's out of the range between 6000 and 510000 will be considered
8807162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  // as invalid and ignored.
8817162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs[0].bitrate = 5999;
8827162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
8837162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
8847162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
8857162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(1, gcodec.channels);
8867162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
8877162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org
8887162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs[0].bitrate = 510001;
8897162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
8907162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
8917162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
8927162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(1, gcodec.channels);
8937162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
8947162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org}
8957162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org
8960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=0 and stereo=1,
8970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 2 and 64000.
8980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
9000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
9010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
9020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
9030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;
9040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params["stereo"] = "1";
9050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
9060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
9070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
9080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
9090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, gcodec.channels);
9100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(64000, gcodec.rate);
9110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
9120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9137162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// Test that with bitrate=invalid and stereo=1,
9147162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// channels and bitrate are 2 and 64000.
9157162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
9167162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_TRUE(SetupEngine());
9177162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  int channel_num = voe_.GetLastChannel();
9187162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
9197162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs.push_back(kOpusCodec);
9207162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs[0].params["stereo"] = "1";
9217162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  webrtc::CodecInst gcodec;
9227162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org
9237162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  // bitrate that's out of the range between 6000 and 510000 will be considered
9247162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  // as invalid and ignored.
9257162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs[0].bitrate = 5999;
9267162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
9277162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
9287162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
9297162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(2, gcodec.channels);
9307162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(64000, gcodec.rate);
9317162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org
9327162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs[0].bitrate = 510001;
9337162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
9347162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
9357162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
9367162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(2, gcodec.channels);
9377162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(64000, gcodec.rate);
9387162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org}
9397162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org
9400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=N and stereo unset,
9410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 1 and N.
9420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
9430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
9450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
9470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 96000;
9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
9490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
9510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(111, gcodec.pltype);
9520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96000, gcodec.rate);
9530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, gcodec.channels);
9550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(48000, gcodec.plfreq);
9560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=N and stereo=0,
9590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 1 and N.
9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
9610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
9630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
9640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
9650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 30000;
9660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params["stereo"] = "0";
9670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
9680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
9690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
9700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, gcodec.channels);
9710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(30000, gcodec.rate);
9720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
9730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
9740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=N and without any parameters,
9760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 1 and N.
9770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
9780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
9790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
9800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
9810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
9820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 30000;
9830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
9840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
9850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
9860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, gcodec.channels);
9870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(30000, gcodec.rate);
9880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
9890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
9900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=N and stereo=1,
9920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 2 and N.
9930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
9940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
9950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
9960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
9970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
9980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 30000;
9990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params["stereo"] = "1";
10000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
10010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
10020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
10030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, gcodec.channels);
10040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(30000, gcodec.rate);
10050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
10060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
10070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10087162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
10097162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// Also test that the "maxaveragebitrate" can't be set to values outside the
10107162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// range of 6000 and 510000
10117162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
10127162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_TRUE(SetupEngine());
10137162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  int channel_num = voe_.GetLastChannel();
10147162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
10157162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs.push_back(kOpusCodec);
10167162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs[0].bitrate = 30000;
10177162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  webrtc::CodecInst gcodec;
10187162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org
10197162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  // Ignore if less than 6000.
10207162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs[0].params["maxaveragebitrate"] = "5999";
10217162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
10227162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
10237162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(30000, gcodec.rate);
10247162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org
10257162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  // Ignore if larger than 510000.
10267162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs[0].params["maxaveragebitrate"] = "510001";
10277162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
10287162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
10297162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(30000, gcodec.rate);
10307162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org
10317162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  codecs[0].params["maxaveragebitrate"] = "200000";
10327162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
10337162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
10347162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  EXPECT_EQ(200000, gcodec.rate);
10357162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org}
10367162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org
1037952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test that we can enable NACK with opus as caller.
1038952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
10390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
10400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
10410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
10420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
10430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack,
10440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                    cricket::kParamValueEmpty));
10450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetNACK(channel_num));
10460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
10470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetNACK(channel_num));
10480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
10490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1050952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test that we can enable NACK with opus as callee.
1051952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
10522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
1053952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  channel_ = engine_.CreateChannel();
1054952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(channel_ != NULL);
1055952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
1056952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  int channel_num = voe_.GetLastChannel();
1057952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1058952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs.push_back(kOpusCodec);
1059952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1060952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org                                                    cricket::kParamValueEmpty));
1061952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_FALSE(voe_.GetNACK(channel_num));
1062952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1063952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_FALSE(voe_.GetNACK(channel_num));
1064952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
1065952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(channel_->AddSendStream(
1066952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc1)));
1067952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(voe_.GetNACK(channel_num));
1068952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org}
1069952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
10700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can enable NACK on receive streams.
10710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
10720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
10730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
10740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num1 = voe_.GetLastChannel();
10750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
10760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num2 = voe_.GetLastChannel();
10770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
10780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
10790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack,
10800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                    cricket::kParamValueEmpty));
10810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetNACK(channel_num1));
10820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetNACK(channel_num2));
10830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
10840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetNACK(channel_num1));
10850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetNACK(channel_num2));
10860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
10870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can disable NACK.
10890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
10900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
10910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
10920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
10930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
10940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack,
10950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                    cricket::kParamValueEmpty));
10960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
10970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetNACK(channel_num));
10980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.clear();
11000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
11010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
11020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetNACK(channel_num));
11030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
11040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can disable NACK on receive streams.
11060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
11070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
11080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
11090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num1 = voe_.GetLastChannel();
11100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
11110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num2 = voe_.GetLastChannel();
11120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
11130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
11140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack,
11150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                    cricket::kParamValueEmpty));
11160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
11170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetNACK(channel_num1));
11180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetNACK(channel_num2));
11190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.clear();
11210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kOpusCodec);
11220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
11230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetNACK(channel_num1));
11240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetNACK(channel_num2));
11250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
11260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that NACK is enabled on a new receive stream.
11280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
11290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
11300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
11310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
11320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
11330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
11340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack,
11350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                    cricket::kParamValueEmpty));
11360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kCn16000Codec);
11370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
11380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetNACK(channel_num));
11390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
11410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel_num = voe_.GetLastChannel();
11420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetNACK(channel_num));
11430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
11440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel_num = voe_.GetLastChannel();
11450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetNACK(channel_num));
11460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
11470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
114807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH
114907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that without useinbandfec, Opus FEC is off.
115002632fd0ce3e3625079f6472bd55370ed58509debuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
115107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
115207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
115307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
115407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs.push_back(kOpusCodec);
115507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
115607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
115707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org}
115807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org
115907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that with useinbandfec=0, Opus FEC is off.
116002632fd0ce3e3625079f6472bd55370ed58509debuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
116107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
116207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
116307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
116407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs.push_back(kOpusCodec);
116507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs[0].bitrate = 0;
116607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs[0].params["useinbandfec"] = "0";
116707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
116807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
116907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  webrtc::CodecInst gcodec;
117007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
117107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
117207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(1, gcodec.channels);
117307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
117407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org}
117507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org
117607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that with useinbandfec=1, Opus FEC is on.
117702632fd0ce3e3625079f6472bd55370ed58509debuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
117807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
117907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
118007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
118107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs.push_back(kOpusCodec);
118207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs[0].bitrate = 0;
118307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs[0].params["useinbandfec"] = "1";
118407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
118507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
118607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  webrtc::CodecInst gcodec;
118707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
118807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
118907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(1, gcodec.channels);
119007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
119107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org}
119207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org
119307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
119402632fd0ce3e3625079f6472bd55370ed58509debuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
119507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
119607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
119707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
119807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs.push_back(kOpusCodec);
119907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs[0].bitrate = 0;
120007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs[0].params["stereo"] = "1";
120107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs[0].params["useinbandfec"] = "1";
120207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
120307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
120407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  webrtc::CodecInst gcodec;
120507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
120607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
120707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(2, gcodec.channels);
120807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(64000, gcodec.rate);
120907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org}
121007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org
121107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that with non-Opus, codec FEC is off.
121202632fd0ce3e3625079f6472bd55370ed58509debuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
121307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
121407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
121507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
121607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  codecs.push_back(kIsacCodec);
121707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
121807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
121907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org}
1220c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org
1221c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1222c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
1223c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
1224c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
1225c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1226c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org  codecs.push_back(kIsacCodec);
1227c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org  codecs[0].params["useinbandfec"] = "1";
1228c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1229c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org  EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1230c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org}
1231ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1232ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test that Opus FEC status can be changed.
1233ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
1234ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
1235ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
1236ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1237ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs.push_back(kOpusCodec);
1238ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1239ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1240ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].params["useinbandfec"] = "1";
1241ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1242ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1243ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org}
1244ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1245ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1246ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
1247ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
1248ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
1249ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1250ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs.push_back(kOpusCodec);
1251ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].bitrate = 0;
1252ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1253ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1254ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(cricket::kOpusBandwidthNb,
1255ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org            voe_.GetMaxEncodingBandwidth(channel_num));
1256ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  webrtc::CodecInst gcodec;
1257ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1258ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
1259ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  // TODO(minyue): Default bit rate is not but can in future be affected by
1260ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  // kCodecParamMaxPlaybackRate.
1261ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
1262ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org}
1263ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1264ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1265ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
1266ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
1267ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
1268ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1269ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs.push_back(kOpusCodec);
1270ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].bitrate = 0;
1271ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1272ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1273ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(cricket::kOpusBandwidthMb,
1274ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org            voe_.GetMaxEncodingBandwidth(channel_num));
1275ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  webrtc::CodecInst gcodec;
1276ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1277ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
1278ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  // TODO(minyue): Default bit rate is not but can in future be affected by
1279ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  // kCodecParamMaxPlaybackRate.
1280ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
1281ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org}
1282ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1283ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1284ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
1285ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
1286ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
1287ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1288ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs.push_back(kOpusCodec);
1289ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].bitrate = 0;
1290ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1291ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1292ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(cricket::kOpusBandwidthWb,
1293ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org            voe_.GetMaxEncodingBandwidth(channel_num));
1294ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  webrtc::CodecInst gcodec;
1295ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1296ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
1297ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  // TODO(minyue): Default bit rate is not but can in future be affected by
1298ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  // kCodecParamMaxPlaybackRate.
1299ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
1300ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org}
1301ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1302ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1303ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
1304ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
1305ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
1306ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1307ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs.push_back(kOpusCodec);
1308ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].bitrate = 0;
1309ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1310ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1311ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(cricket::kOpusBandwidthSwb,
1312ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org            voe_.GetMaxEncodingBandwidth(channel_num));
1313ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  webrtc::CodecInst gcodec;
1314ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1315ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
1316ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  // TODO(minyue): Default bit rate is not but can in future be affected by
1317ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  // kCodecParamMaxPlaybackRate.
1318ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
1319ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org}
1320ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1321ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test 24000 < maxplaybackrate triggers Opus full band mode.
1322ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
1323ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
1324ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
1325ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1326ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs.push_back(kOpusCodec);
1327ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].bitrate = 0;
1328ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1329ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1330ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(cricket::kOpusBandwidthFb,
1331ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org            voe_.GetMaxEncodingBandwidth(channel_num));
1332ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  webrtc::CodecInst gcodec;
1333ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1334ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
1335ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  // TODO(minyue): Default bit rate is not but can in future be affected by
1336ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  // kCodecParamMaxPlaybackRate.
1337ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
1338ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org}
1339ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1340ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test Opus that without maxplaybackrate, default playback rate is used.
1341ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
1342ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
1343ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
1344ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1345ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs.push_back(kOpusCodec);
1346ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1347ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(cricket::kOpusBandwidthFb,
1348ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org            voe_.GetMaxEncodingBandwidth(channel_num));
1349ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org}
1350ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1351ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test the with non-Opus, maxplaybackrate has no effect.
1352ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
1353ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
1354ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
1355ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1356ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs.push_back(kIsacCodec);
1357ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1358ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1359ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1360ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org}
1361ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1362ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test maxplaybackrate can be set on two streams.
1363ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
1364ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
1365ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  int channel_num = voe_.GetLastChannel();
1366ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1367ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs.push_back(kOpusCodec);
1368ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1369ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  // Default bandwidth is 24000.
1370ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(cricket::kOpusBandwidthFb,
1371ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org            voe_.GetMaxEncodingBandwidth(channel_num));
1372ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1373ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1374ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1375ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1376ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(cricket::kOpusBandwidthNb,
1377ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org            voe_.GetMaxEncodingBandwidth(channel_num));
1378ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
1379ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1380ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  channel_num = voe_.GetLastChannel();
1381ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  EXPECT_EQ(cricket::kOpusBandwidthNb,
1382ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org            voe_.GetMaxEncodingBandwidth(channel_num));
1383ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org}
138407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org#endif  // USE_WEBRTC_DEV_BRANCH
138507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org
13860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can apply CELT with stereo mode but fail with mono mode.
13870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCelt) {
13880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
13890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
13900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
13910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kCeltCodec);
13927587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs.push_back(kIsacCodec);
13930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 96;
13940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].channels = 2;
13950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 96000;
13967587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs[1].bitrate = 64000;
13970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
13980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
13990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
14000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
14010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96000, gcodec.rate);
14020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, gcodec.channels);
14030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("CELT", gcodec.plname);
14040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Doesn't support mono, expect it to fall back to the next codec in the list.
14050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].channels = 1;
14060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
14070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
14087587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_EQ(103, gcodec.pltype);
14090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, gcodec.channels);
14100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(64000, gcodec.rate);
14117587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
14120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
14130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can switch back and forth between CELT and ISAC with CN.
14150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacCeltSwitching) {
14160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
14170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
14180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> celt_codecs;
14190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  celt_codecs.push_back(kCeltCodec);
14200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(celt_codecs));
14210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
14220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
14230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(110, gcodec.pltype);
14240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("CELT", gcodec.plname);
14250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> isac_codecs;
14270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  isac_codecs.push_back(kIsacCodec);
14280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  isac_codecs.push_back(kCn16000Codec);
14290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  isac_codecs.push_back(kCeltCodec);
14300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(isac_codecs));
14310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
14320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(103, gcodec.pltype);
14330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
14340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(celt_codecs));
14360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
14370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(110, gcodec.pltype);
14380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("CELT", gcodec.plname);
14390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
14400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we handle various ways of specifying bitrate.
14420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
14430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
14440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
14450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
14460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);  // bitrate == 32000
14470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
14480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
14490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
14500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(103, gcodec.pltype);
14510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
14520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
14530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;         // bitrate == default
14550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
14560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
14570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(103, gcodec.pltype);
14580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
14590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(-1, gcodec.rate);
14600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 28000;     // bitrate == 28000
14620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
14630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
14640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(103, gcodec.pltype);
14650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
14660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(28000, gcodec.rate);
14670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0] = kPcmuCodec;        // bitrate == 64000
14690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
14700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
14710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, gcodec.pltype);
14720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("PCMU", gcodec.plname);
14730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(64000, gcodec.rate);
14740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;         // bitrate == default
14760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
14770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
14780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, gcodec.pltype);
14790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("PCMU", gcodec.plname);
14800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(64000, gcodec.rate);
14810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0] = kOpusCodec;
14830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].bitrate = 0;         // bitrate == default
14840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
14850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
14860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(111, gcodec.pltype);
14870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("opus", gcodec.plname);
14880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(32000, gcodec.rate);
14890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
14900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14917587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that we fail if no codecs are specified.
14920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
14930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
14947587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
14957587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_FALSE(channel_->SetSendCodecs(codecs));
14967587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org}
14977587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org
14987587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that we can set send codecs even with telephone-event codec as the first
14997587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// one on the list.
15007587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
15017587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_TRUE(SetupEngine());
15020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
15030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
15047587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs.push_back(kTelephoneEventCodec);
15057587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs.push_back(kIsacCodec);
15067587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs.push_back(kPcmuCodec);
15077587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs[0].id = 98;  // DTMF
15087587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs[1].id = 96;
15090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
15100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
15110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
15127587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
15137587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
15147587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
15157587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org}
15167587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org
15177587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that we can set send codecs even with CN codec as the first
15187587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// one on the list.
15197587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
15207587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_TRUE(SetupEngine());
15217587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  int channel_num = voe_.GetLastChannel();
15227587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
15237587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs.push_back(kCn16000Codec);
15247587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs.push_back(kIsacCodec);
15257587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs.push_back(kPcmuCodec);
15267587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs[0].id = 98;  // wideband CN
15277587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  codecs[1].id = 96;
15287587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
15297587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  webrtc::CodecInst gcodec;
15307587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
15317587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
15327587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
15337587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
15340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
15350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1536952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test that we set VAD and DTMF types correctly as caller.
1537952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
15380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
15390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
15400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
15410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
15420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
15430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // TODO(juberti): cn 32000
15440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kCn16000Codec);
15450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kCn8000Codec);
15460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kTelephoneEventCodec);
15470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kRedCodec);
15480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 96;
15490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[2].id = 97;  // wideband CN
15500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[4].id = 98;  // DTMF
15510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
15520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
15530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
15540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
15550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
15560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetVAD(channel_num));
155707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetRED(channel_num));
15580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
15590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
15600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
15610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
15620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1563952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test that we set VAD and DTMF types correctly as callee.
1564952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
15652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
1566952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  channel_ = engine_.CreateChannel();
1567952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(channel_ != NULL);
1568952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
1569952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  int channel_num = voe_.GetLastChannel();
1570952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1571952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs.push_back(kIsacCodec);
1572952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs.push_back(kPcmuCodec);
1573952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  // TODO(juberti): cn 32000
1574952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs.push_back(kCn16000Codec);
1575952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs.push_back(kCn8000Codec);
1576952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs.push_back(kTelephoneEventCodec);
1577952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs.push_back(kRedCodec);
1578952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs[0].id = 96;
1579952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs[2].id = 97;  // wideband CN
1580952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs[4].id = 98;  // DTMF
1581952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1582952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(channel_->AddSendStream(
1583952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc1)));
1584952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
1585952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  webrtc::CodecInst gcodec;
1586952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1587952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
1588952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
1589952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(voe_.GetVAD(channel_num));
159007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetRED(channel_num));
1591952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1592952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1593952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1594952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org}
1595952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
15960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we only apply VAD if we have a CN codec that matches the
15970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// send codec clockrate.
15980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
15990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
16000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
16010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
16020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Set ISAC(16K) and CN(16K). VAD should be activated.
16030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
16040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kCn16000Codec);
16050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[1].id = 97;
16060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
16070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
16080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
16090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
16100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetVAD(channel_num));
16110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
16120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Set PCMU(8K) and CN(16K). VAD should not be activated.
16130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0] = kPcmuCodec;
16140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
16150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
16160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("PCMU", gcodec.plname);
16170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetVAD(channel_num));
16180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Set PCMU(8K) and CN(8K). VAD should be activated.
16190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[1] = kCn8000Codec;
16200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
16210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
16220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("PCMU", gcodec.plname);
16230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetVAD(channel_num));
16240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
16250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org   // Set ISAC(16K) and CN(8K). VAD should not be activated.
16260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0] = kIsacCodec;
16270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
16280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
16290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
16300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetVAD(channel_num));
16310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
16320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we perform case-insensitive matching of codec names.
16340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
16350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
16360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
16370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
16380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
16390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
16400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kCn16000Codec);
16410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kCn8000Codec);
16420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kTelephoneEventCodec);
16430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kRedCodec);
16440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].name = "iSaC";
16450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 96;
16460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[2].id = 97;  // wideband CN
16470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[4].id = 98;  // DTMF
16480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
16490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
16500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
16510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
16520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
16530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetVAD(channel_num));
165407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetRED(channel_num));
16550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
16560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
16570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
16580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
16590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
166007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that we set up RED correctly as caller.
1661952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
16620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
16630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
16640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
16650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kRedCodec);
16660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
16670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
16680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 127;
16690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params[""] = "96/96";
16700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[1].id = 96;
16710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
16720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
16730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
16740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
16750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
167607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(voe_.GetRED(channel_num));
167707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
16780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
16790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
168007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that we set up RED correctly as callee.
1681952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
16822a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
1683952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  channel_ = engine_.CreateChannel();
1684952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(channel_ != NULL);
1685952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
1686952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  int channel_num = voe_.GetLastChannel();
1687952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1688952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs.push_back(kRedCodec);
1689952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs.push_back(kIsacCodec);
1690952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs.push_back(kPcmuCodec);
1691952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs[0].id = 127;
1692952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs[0].params[""] = "96/96";
1693952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  codecs[1].id = 96;
1694952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1695952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(channel_->AddSendStream(
1696952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc1)));
1697952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  webrtc::CodecInst gcodec;
1698952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1699952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
1700952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
170107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(voe_.GetRED(channel_num));
170207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
1703952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org}
1704952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
170507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that we set up RED correctly if params are omitted.
17060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
17070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
17080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
17090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
17100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kRedCodec);
17110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
17120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
17130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 127;
17140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[1].id = 96;
17150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
17160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
17170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
17180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
17190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
172007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_TRUE(voe_.GetRED(channel_num));
172107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
17220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
17230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we ignore RED if the parameters aren't named the way we expect.
17250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
17260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
17270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
17280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
17290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kRedCodec);
17300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
17310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
17320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 127;
17330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params["ABC"] = "96/96";
17340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[1].id = 96;
17350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
17360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
17370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
17380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
17390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
174007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetRED(channel_num));
17410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
17420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we ignore RED if it uses different primary/secondary encoding.
17440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
17450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
17460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
17470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
17480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kRedCodec);
17490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
17500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
17510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 127;
17520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params[""] = "96/0";
17530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[1].id = 96;
17540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
17550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
17560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
17570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
17580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
175907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetRED(channel_num));
17600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
17610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we ignore RED if it uses more than 2 encodings.
17630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
17640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
17650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
17660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
17670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kRedCodec);
17680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
17690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
17700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 127;
17710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params[""] = "96/96/96";
17720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[1].id = 96;
17730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
17740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
17750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
17760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
17770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
177807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetRED(channel_num));
17790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
17800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we ignore RED if it has bogus codec ids.
17820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
17830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
17840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
17850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
17860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kRedCodec);
17870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
17880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
17890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 127;
17900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params[""] = "ABC/ABC";
17910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[1].id = 96;
17920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
17930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
17940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
17950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
17960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
179707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetRED(channel_num));
17980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
17990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we ignore RED if it refers to a codec that is not present.
18010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
18020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
18030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
18040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
18050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kRedCodec);
18060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
18070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
18080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].id = 127;
18090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[0].params[""] = "97/97";
18100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs[1].id = 96;
18110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
18120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
18130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
18140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(96, gcodec.pltype);
18150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_STREQ("ISAC", gcodec.plname);
181607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  EXPECT_FALSE(voe_.GetRED(channel_num));
18170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
18180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18192ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org// Test support for audio level header extension.
18202ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
18212ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
18222ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org}
18232ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
18242ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
18250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
18260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18272ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org// Test support for absolute send time header extension.
18282ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
18292ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
18302ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org}
18312ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
18322ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
18330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
18340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can create a channel and start sending/playing out on it.
18360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SendAndPlayout) {
18370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
18380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
18390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
18400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
18410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
18420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
18430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetSend(channel_num));
18440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(true));
18450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num));
18460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
18470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetSend(channel_num));
18480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(false));
18490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetPlayout(channel_num));
18500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
18510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1852f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// Test that we can add and remove send streams.
1853f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1854f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  SetupForMultiSendStream();
1855f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1856f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1857f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1858f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Set the global state for sending.
1859f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1860f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1861f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1862f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(channel_->AddSendStream(
1863f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org        cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1864f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1865f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    // Verify that we are in a sending state for all the created streams.
1866f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1867f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(voe_.GetSend(channel_num));
1868f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
1869f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1870f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Remove the first send channel, which is the default channel. It will only
1871f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // recycle the default channel but not delete it.
1872f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[0]));
1873f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Stream should already be Removed from the send stream list.
1874f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[0]));
1875f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // But the default still exists.
1876f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_EQ(0, voe_.GetChannelFromLocalSsrc(kSsrcs4[0]));
1877f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1878f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Delete the rest of send channel streams.
1879f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1880f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[i]));
1881f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    // Stream should already be deleted.
1882f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[i]));
1883f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrcs4[i]));
1884f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
1885f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org}
1886f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1887f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// Test SetSendCodecs correctly configure the codecs in all send streams.
1888f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1889f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  SetupForMultiSendStream();
1890f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1891f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1892f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Create send streams.
1893f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1894f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(channel_->AddSendStream(
1895f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org        cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1896f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
1897f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1898f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1899f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Set ISAC(16K) and CN(16K). VAD should be activated.
1900f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  codecs.push_back(kIsacCodec);
1901f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  codecs.push_back(kCn16000Codec);
1902f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  codecs[1].id = 97;
1903f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1904f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1905f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Verify ISAC and VAD are corrected configured on all send channels.
1906f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  webrtc::CodecInst gcodec;
1907f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1908f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1909f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1910f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_STREQ("ISAC", gcodec.plname);
1911f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(voe_.GetVAD(channel_num));
1912f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1913f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
1914f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1915f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Change to PCMU(8K) and CN(16K). VAD should not be activated.
1916f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  codecs[0] = kPcmuCodec;
1917f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1918f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1919f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1920f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1921f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_STREQ("PCMU", gcodec.plname);
1922f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_FALSE(voe_.GetVAD(channel_num));
1923f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
1924f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org}
1925f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1926f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// Test we can SetSend on all send streams correctly.
1927f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
1928f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  SetupForMultiSendStream();
1929f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1930f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1931f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Create the send channels and they should be a SEND_NOTHING date.
1932f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1933f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(channel_->AddSendStream(
1934f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org        cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1935f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    int channel_num = voe_.GetLastChannel();
1936f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_FALSE(voe_.GetSend(channel_num));
1937f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
1938f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1939f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Set the global state for starting sending.
1940f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1941f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1942f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    // Verify that we are in a sending state for all the send streams.
1943f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1944f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(voe_.GetSend(channel_num));
1945f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
1946f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1947f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Set the global state for stopping sending.
1948f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1949f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1950f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    // Verify that we are in a stop state for all the send streams.
1951f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1952f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_FALSE(voe_.GetSend(channel_num));
1953f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
1954f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org}
1955f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1956f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// Test we can set the correct statistics on all send streams.
1957f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
1958f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  SetupForMultiSendStream();
1959f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1960f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1961f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Create send streams.
1962f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1963f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_TRUE(channel_->AddSendStream(
1964f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org        cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1965f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
1966ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  // Create a receive stream to check that none of the send streams end up in
1967ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  // the receive stream stats.
1968ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(
1969ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc2)));
1970f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // We need send codec to be set to get all stats.
1971f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  std::vector<cricket::AudioCodec> codecs;
1972f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  codecs.push_back(kPcmuCodec);
1973f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1974ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1975f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1976f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  cricket::VoiceMediaInfo info;
1977f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_EQ(true, channel_->GetStats(&info));
1978f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
1979f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1980f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  // Verify the statistic information is correct.
1981f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
198297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc());
1983f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
1984f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent);
1985f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent);
1986f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost);
1987f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost);
1988f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum);
1989f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms);
1990f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
1991ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org    EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
1992f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
1993f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
1994ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(0u, info.receivers.size());
1995ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
1996ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(true, channel_->GetStats(&info));
1997ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org
1998f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  EXPECT_EQ(1u, info.receivers.size());
1999ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2000ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2001ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2002ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2003ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
2004f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org}
2005f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org
2006f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// Test that we can add and remove receive streams, and do proper send/playout.
2007f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// We can receive on multiple streams while sending one stream.
2008f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
20090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
20100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num1 = voe_.GetLastChannel();
20110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Start playout on the default channel.
20130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
20140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(true));
20150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num1));
20160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Adding another stream should disable playout on the default channel.
20180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
20190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num2 = voe_.GetLastChannel();
20200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
20210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
20220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
20230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
20240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetSend(channel_num1));
20250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetSend(channel_num2));
20260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Make sure only the new channel is played out.
20280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetPlayout(channel_num1));
20290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num2));
20300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Adding yet another stream should have stream 2 and 3 enabled for playout.
20320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
20330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num3 = voe_.GetLastChannel();
20340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetPlayout(channel_num1));
20350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num2));
20360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num3));
20370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetSend(channel_num3));
20380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Stop sending.
20400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
20410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetSend(channel_num1));
20420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetSend(channel_num2));
20430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetSend(channel_num3));
20440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Stop playout.
20460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(false));
20470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetPlayout(channel_num1));
20480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetPlayout(channel_num2));
20490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetPlayout(channel_num3));
20500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Restart playout and make sure the default channel still is not played out.
20520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(true));
20530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetPlayout(channel_num1));
20540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num2));
20550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num3));
20560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Now remove the new streams and verify that the default channel is
20580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // played out again.
20590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->RemoveRecvStream(3));
20600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->RemoveRecvStream(2));
20610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num1));
20630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set the devices to use.
20660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
20670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
20680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
20690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
20700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
20710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
20720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
20740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              cricket::kFakeDefaultDeviceId);
20750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::Device dev(cricket::kFakeDeviceName,
20760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      cricket::kFakeDeviceId);
20770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test SetDevices() while not sending or playing.
20790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
20800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test SetDevices() while sending and playing.
20820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.SetLocalMonitor(true));
20830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
20840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(true));
20850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetRecordingMicrophone());
20860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetSend(channel_num));
20870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num));
20880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
20900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetRecordingMicrophone());
20920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetSend(channel_num));
20930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num));
20940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that failure to open newly selected devices does not prevent opening
20960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // ones after that.
20970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_fail_start_recording_microphone(true);
20980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_playout_fail_channel(channel_num);
20990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_send_fail_channel(channel_num);
21000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
21020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetRecordingMicrophone());
21040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetSend(channel_num));
21050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetPlayout(channel_num));
21060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_fail_start_recording_microphone(false);
21080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_playout_fail_channel(-1);
21090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_send_fail_channel(-1);
21100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
21120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetRecordingMicrophone());
21140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetSend(channel_num));
21150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num));
21160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set the devices to use even if we failed to
21190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// open the initial ones.
21200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
21210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
21220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
21230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
21240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
21250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
21260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
21280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              cricket::kFakeDefaultDeviceId);
21290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::Device dev(cricket::kFakeDeviceName,
21300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      cricket::kFakeDeviceId);
21310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that failure to open devices selected before starting
21330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // send/play does not prevent opening newly selected ones after that.
21340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_fail_start_recording_microphone(true);
21350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_playout_fail_channel(channel_num);
21360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_send_fail_channel(channel_num);
21370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
21390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine_.SetLocalMonitor(true));
21410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
21420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(channel_->SetPlayout(true));
21430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetRecordingMicrophone());
21440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetSend(channel_num));
21450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetPlayout(channel_num));
21460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_fail_start_recording_microphone(false);
21480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_playout_fail_channel(-1);
21490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_send_fail_channel(-1);
21500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
21520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetRecordingMicrophone());
21540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetSend(channel_num));
21550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num));
21560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can create a channel configured for multi-point conferences,
21590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// and start sending/playing out on it.
21600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, ConferenceSendAndPlayout) {
21610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
21620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
21630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
21640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
21650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
21660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
21670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
21680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetSend(channel_num));
21690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can create a channel configured for Codian bridges,
21720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// and start sending/playing out on it.
21730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CodianSendAndPlayout) {
21740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
21750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
21760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::AgcConfig agc_config;
21770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
21780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, agc_config.targetLeveldBOv);
21790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_adjust_agc_));
21800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
21810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
21820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
21830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
21840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetSend(channel_num));
21850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
21860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(agc_config.targetLeveldBOv, 10);  // level was attenuated
21870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(true));
21880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.GetPlayout(channel_num));
21890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
21900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetSend(channel_num));
21910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
21920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, agc_config.targetLeveldBOv);  // level was restored
21930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(false));
21940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.GetPlayout(channel_num));
21950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21975c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
21985c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE(SetupEngine());
21995c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  webrtc::AgcConfig agc_config;
22005c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
22015c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(0, agc_config.targetLeveldBOv);
22025c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
22035c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  cricket::AudioOptions options;
22045c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  options.tx_agc_target_dbov.Set(3);
22055c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  options.tx_agc_digital_compression_gain.Set(9);
22065c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  options.tx_agc_limiter.Set(true);
22075c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  options.auto_gain_control.Set(true);
22085c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE(engine_.SetOptions(options));
22095c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
22105c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
22115c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(3, agc_config.targetLeveldBOv);
22125c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
22135c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE(agc_config.limiterEnable);
22145c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
22155c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  // Check interaction with adjust_agc_delta. Both should be respected, for
22165c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  // backwards compatibility.
22175c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  options.adjust_agc_delta.Set(-10);
22185c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE(engine_.SetOptions(options));
22195c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
22205c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
22215c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(13, agc_config.targetLeveldBOv);
22225c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org}
22235c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
22245c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, RxAgcConfigViaOptions) {
22255c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE(SetupEngine());
22265c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  int channel_num = voe_.GetLastChannel();
22275c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  cricket::AudioOptions options;
22285c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  options.rx_agc_target_dbov.Set(6);
22295c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  options.rx_agc_digital_compression_gain.Set(0);
22305c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  options.rx_agc_limiter.Set(true);
22315c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  options.rx_auto_gain_control.Set(true);
22325c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options));
22335c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
22345c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  webrtc::AgcConfig agc_config;
22355c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(0, engine_.voe()->processing()->GetRxAgcConfig(
22365c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      channel_num, agc_config));
22375c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(6, agc_config.targetLeveldBOv);
22385c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(0, agc_config.digitalCompressionGaindB);
22395c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE(agc_config.limiterEnable);
22405c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org}
22415c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
22425c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
22435c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE(SetupEngine());
22445c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  cricket::AudioOptions options;
22455c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  options.recording_sample_rate.Set(48000u);
22465c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  options.playout_sample_rate.Set(44100u);
22475c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE(engine_.SetOptions(options));
22485c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
22495c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  unsigned int recording_sample_rate, playout_sample_rate;
22505c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
22515c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
22525c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(48000u, recording_sample_rate);
22535c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(44100u, playout_sample_rate);
22545c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org}
22555c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
22565c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
22575c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE(SetupEngine());
22582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  engine_.SetLogging(rtc::LS_INFO, "");
22595c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(
22605c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      // Info:
22615c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      webrtc::kTraceStateInfo | webrtc::kTraceInfo |
22625c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      // Warning:
22635c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
22645c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      // Error:
22655c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      webrtc::kTraceError | webrtc::kTraceCritical,
22665c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      static_cast<int>(trace_wrapper_->filter_));
22675c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  // Now set it explicitly
22685c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  std::string filter =
22692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
22702a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
22715c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
22725c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org            trace_wrapper_->filter_);
22735c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org}
22745c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
22750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set the outgoing SSRC properly.
22760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SSRC is set in SetupEngine by calling AddSendStream.
22770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
22780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
22790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
22800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  unsigned int send_ssrc;
22810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
22820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_NE(0U, send_ssrc);
22830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
22840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(kSsrc1, send_ssrc);
22850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, GetStats) {
22880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Setup. We need send codec to be set to get all stats.
22890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
2290ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  // SetupEngine adds a send stream with kSsrc1, so the receive stream has to
2291ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  // use a different SSRC.
2292ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(
2293ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc2)));
22940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
22950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
22960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
2297ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
22980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VoiceMediaInfo info;
23000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(true, channel_->GetStats(&info));
23010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1u, info.senders.size());
230297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
23030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
23040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
23050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
23060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
23070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
23080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
23090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
23100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
2311ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
23120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // TODO(sriniv): Add testing for more fields. These are not populated
23130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // in FakeWebrtcVoiceEngine yet.
23140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
23150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
23160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
23170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
23180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // EXPECT_EQ(cricket::kIntStatValue,
23190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  //           info.senders[0].echo_return_loss_enhancement);
23200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2321ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(0u, info.receivers.size());
2322ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2323ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(true, channel_->GetStats(&info));
23240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1u, info.receivers.size());
2325ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org
2326ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2327ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2328ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2329ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2330ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
2331ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  // TODO(sriniv): Add testing for more receiver fields.
23320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
23330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set the outgoing SSRC properly with multiple streams.
23350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SSRC is set in SetupEngine by calling AddSendStream.
23360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
23370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
23380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
23390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num1 = voe_.GetLastChannel();
23400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  unsigned int send_ssrc;
23410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
23420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(kSsrc1, send_ssrc);
23430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
23450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num2 = voe_.GetLastChannel();
23460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
23470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(kSsrc1, send_ssrc);
23480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
23490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that the local SSRC is the same on sending and receiving channels if the
23510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// receive channel is created before the send channel.
23520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
23532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
23540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel_ = engine_.CreateChannel();
23550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
23560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
23580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int receive_channel_num = voe_.GetLastChannel();
23590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddSendStream(
23600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::StreamParams::CreateLegacy(1234)));
23610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int send_channel_num = voe_.GetLastChannel();
23620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  unsigned int ssrc = 0;
23640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
23650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1234U, ssrc);
23660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ssrc = 0;
23670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
23680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1234U, ssrc);
23690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
23700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can properly receive packets.
23720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, Recv) {
23730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
23740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
23750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
23760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
23770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               sizeof(kPcmuFrame)));
23780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
23790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can properly receive packets on multiple streams.
23810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
23820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
23830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
23840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
23850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num1 = voe_.GetLastChannel();
23860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
23870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num2 = voe_.GetLastChannel();
23880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
23890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num3 = voe_.GetLastChannel();
23900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Create packets with the right SSRCs.
23910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  char packets[4][sizeof(kPcmuFrame)];
23920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
23930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
23942a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::SetBE32(packets[i] + 8, static_cast<uint32>(i));
23950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
23960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
23970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
23980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
23990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DeliverPacket(packets[0], sizeof(packets[0]));
24000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
24010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
24020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
24030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DeliverPacket(packets[1], sizeof(packets[1]));
24040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
24050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               sizeof(packets[1])));
24060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
24070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
24080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DeliverPacket(packets[2], sizeof(packets[2]));
24090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
24100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
24110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               sizeof(packets[2])));
24120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
24130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DeliverPacket(packets[3], sizeof(packets[3]));
24140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
24150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
24160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
24170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               sizeof(packets[3])));
24180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->RemoveRecvStream(3));
24190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->RemoveRecvStream(2));
24200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->RemoveRecvStream(1));
24210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we properly handle failures to add a stream.
24240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, AddStreamFail) {
24250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
24260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_fail_create_channel(true);
24270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
24280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
24290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // In 1:1 call, we should not try to create a new channel.
24310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::AudioOptions options_no_conference_;
24320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options_no_conference_.conference_mode.Set(false);
24330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_no_conference_));
24340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
24350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that AddRecvStream doesn't create new channel for 1:1 call.
24380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, AddRecvStream1On1) {
24390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
24400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
24410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
24420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(channel_num, voe_.GetLastChannel());
24430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that after adding a recv stream, we do not decode more codecs than
24460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// those previously passed into SetRecvCodecs.
24470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
24480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
24490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
24500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
24510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kIsacCodec);
24520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
24530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
24540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(
24550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc1)));
24560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num2 = voe_.GetLastChannel();
24570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::CodecInst gcodec;
24582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "CELT");
24590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  gcodec.plfreq = 32000;
24600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  gcodec.channels = 2;
24610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
24620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we properly clean up any streams that were added, even if
24650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// not explicitly removed.
24660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
24670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
24680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
24690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
24700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
24710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(3, voe_.GetNumChannels());  // default channel + 2 added
24720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  delete channel_;
24730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel_ = NULL;
24740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetNumChannels());
24750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2477861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
2478861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  EXPECT_TRUE(SetupEngine());
2479861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2480861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org}
2481861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org
2482861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2483861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  EXPECT_TRUE(SetupEngine());
2484861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  // Stream 1 reuses default channel.
2485861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2486861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  // Manually delete default channel to simulate a failure.
2487861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  int default_channel = voe_.GetLastChannel();
2488861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  EXPECT_EQ(0, voe_.DeleteChannel(default_channel));
2489861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  // Add recv stream 2 should fail because default channel is gone.
2490861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2491861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  int new_channel = voe_.GetLastChannel();
2492861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  EXPECT_NE(default_channel, new_channel);
2493861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  // The last created channel should have already been deleted.
2494861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  EXPECT_EQ(-1, voe_.DeleteChannel(new_channel));
2495861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org}
2496861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org
2497952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test the InsertDtmf on default send stream as caller.
2498952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2499952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  TestInsertDtmf(0, true);
25000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2502952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test the InsertDtmf on default send stream as callee
2503952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2504952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  TestInsertDtmf(0, false);
2505952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org}
2506952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
2507952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test the InsertDtmf on specified send stream as caller.
2508952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2509952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  TestInsertDtmf(kSsrc1, true);
2510952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org}
2511952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
2512952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test the InsertDtmf on specified send stream as callee.
2513952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2514952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  TestInsertDtmf(kSsrc1, false);
25150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can play a ringback tone properly in a single-stream call.
25180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, PlayRingback) {
25190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
25200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
25210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
25220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check we fail if no ringback tone specified.
25230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(channel_->PlayRingbackTone(0, true, true));
25240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
25250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check we can set and play a ringback tone.
2526cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org  EXPECT_TRUE(channel_->SetRingbackTone(
2527cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org                  kRingbackTone, static_cast<int>(strlen(kRingbackTone))));
25280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->PlayRingbackTone(0, true, true));
25290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num));
25300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check we can stop the tone manually.
25310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->PlayRingbackTone(0, false, false));
25320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
25330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check we stop the tone if a packet arrives.
25340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->PlayRingbackTone(0, true, true));
25350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num));
25360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
25370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
25380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can play a ringback tone properly in a multi-stream call.
25410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, PlayRingbackWithMultipleStreams) {
25420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
25430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
25440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
25450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
25460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_.GetLastChannel();
25470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
25480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check we fail if no ringback tone specified.
25490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(channel_->PlayRingbackTone(2, true, true));
25500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
25510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check we can set and play a ringback tone on the correct ssrc.
2552cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org  EXPECT_TRUE(channel_->SetRingbackTone(
2553cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org                  kRingbackTone, static_cast<int>(strlen(kRingbackTone))));
25540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(channel_->PlayRingbackTone(77, true, true));
25550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->PlayRingbackTone(2, true, true));
25560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num));
25570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check we can stop the tone manually.
25580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->PlayRingbackTone(2, false, false));
25590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
25600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check we stop the tone if a packet arrives, but only with the right SSRC.
25610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->PlayRingbackTone(2, true, true));
25620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num));
25630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Send a packet with SSRC 1; the tone should not stop.
25640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
25650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num));
25660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Send a packet with SSRC 2; the tone should stop.
25670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  char packet[sizeof(kPcmuFrame)];
25680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
25692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::SetBE32(packet + 8, 2);
25700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DeliverPacket(packet, sizeof(packet));
25710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
25720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests creating soundclips, and make sure they come from the right engine.
25750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CreateSoundclip) {
25762a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
257762fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  EXPECT_FALSE(voe_sc_.IsInited());
25780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  soundclip_ = engine_.CreateSoundclip();
257962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  EXPECT_TRUE(voe_sc_.IsInited());
25800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(soundclip_ != NULL);
25810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetNumChannels());
25820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, voe_sc_.GetNumChannels());
25830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int channel_num = voe_sc_.GetLastChannel();
25840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_sc_.GetPlayout(channel_num));
25850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  delete soundclip_;
25860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  soundclip_ = NULL;
25870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_sc_.GetNumChannels());
258862fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  // Make sure the soundclip engine is uninitialized on shutdown, now that
258962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  // we've initialized it by creating a soundclip.
259062fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  engine_.Terminate();
259162fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  EXPECT_FALSE(voe_sc_.IsInited());
25920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests playing out a fake sound.
25950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, PlaySoundclip) {
25960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const char kZeroes[16000] = {};
25972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
25980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  soundclip_ = engine_.CreateSoundclip();
25990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(soundclip_ != NULL);
26000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(soundclip_->PlaySound(kZeroes, sizeof(kZeroes), 0));
26010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
26020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, MediaEngineCallbackOnError) {
26042a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<ChannelErrorListener> listener;
26050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceMediaChannel* media_channel;
26060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  unsigned int ssrc = 0;
26070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
26090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
26100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
26110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  media_channel = static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
26130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  listener.reset(new ChannelErrorListener(channel_));
26140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test on WebRtc VoE channel.
26160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerCallbackOnError(media_channel->voe_channel(),
26170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              VE_SATURATION_WARNING);
26180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_SATURATION,
26190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            listener->error());
26200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_NE(-1, voe_.GetLocalSSRC(voe_.GetLastChannel(), ssrc));
26210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(ssrc, listener->ssrc());
26220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  listener->Reset();
26240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerCallbackOnError(-1, VE_TYPING_NOISE_WARNING);
26250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_TYPING_NOISE_DETECTED,
26260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            listener->error());
26270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0U, listener->ssrc());
26280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Add another stream and test on that.
26300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ++ssrc;
26310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(
26320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ssrc)));
26330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  listener->Reset();
26340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerCallbackOnError(voe_.GetLastChannel(),
26350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              VE_SATURATION_WARNING);
26360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_SATURATION,
26370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            listener->error());
26380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(ssrc, listener->ssrc());
26390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Testing a non-existing channel.
26410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  listener->Reset();
26420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerCallbackOnError(voe_.GetLastChannel() + 2,
26430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              VE_SATURATION_WARNING);
26440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, listener->error());
26450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
26460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
26480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
26490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
26500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::AudioCodec> codecs;
26510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  codecs.push_back(kPcmuCodec);
26520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
26530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
26540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
26550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
26560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(true));
26570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
26580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetPlayout(false));
26590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(channel_->SetPlayout(true));
26600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
26610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that the Registering/Unregistering with the
26630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// webrtcvoiceengine works as expected
26640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, RegisterVoiceProcessor) {
26650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
26660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
26670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(
26680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::StreamParams::CreateLegacy(kSsrc2)));
26690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeMediaProcessor vp_1;
26700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeMediaProcessor vp_2;
26710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_TX));
26730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_RX));
26740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.RegisterProcessor(kSsrc2, &vp_2, cricket::MPD_RX));
26750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerProcessPacket(cricket::MPD_RX);
26760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerProcessPacket(cricket::MPD_TX);
26770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
26790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, vp_1.voice_frame_count());
26800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, vp_2.voice_frame_count());
26810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc2,
26830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          &vp_2,
26840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          cricket::MPD_RX));
26850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerProcessPacket(cricket::MPD_RX);
26860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
26870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, vp_2.voice_frame_count());
26880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, vp_1.voice_frame_count());
26890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc2,
26910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          &vp_1,
26920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          cricket::MPD_RX));
26930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerProcessPacket(cricket::MPD_RX);
26940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered());
26950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, vp_1.voice_frame_count());
26960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine_.RegisterProcessor(kSsrc1, &vp_1, cricket::MPD_RX));
26980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.RegisterProcessor(kSsrc1, &vp_1, cricket::MPD_TX));
26990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerProcessPacket(cricket::MPD_RX);
27000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerProcessPacket(cricket::MPD_TX);
27010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
27020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(3, vp_1.voice_frame_count());
27030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc1,
27050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          &vp_1,
27060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          cricket::MPD_RX_AND_TX));
27070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerProcessPacket(cricket::MPD_TX);
27080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered());
27090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(3, vp_1.voice_frame_count());
27100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
27110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_RX));
27120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered());
27130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that we can register a processor on the receive channel on SSRC 0.
27150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // This tests the 1:1 case when the receive SSRC is unknown.
27160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.RegisterProcessor(0, &vp_1, cricket::MPD_RX));
27170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.TriggerProcessPacket(cricket::MPD_RX);
27180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
27190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(4, vp_1.voice_frame_count());
27200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.UnregisterProcessor(0,
27210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          &vp_1,
27220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          cricket::MPD_RX));
27230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // The following tests test that FindChannelNumFromSsrc is doing
27250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // what we expect.
27260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // pick an invalid ssrc and make sure we can't register
27270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine_.RegisterProcessor(99,
27280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                         &vp_1,
27290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                         cricket::MPD_RX));
27300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
27310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.RegisterProcessor(1,
27320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                        &vp_1,
27330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                        cricket::MPD_RX));
27340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine_.UnregisterProcessor(1,
27350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          &vp_1,
27360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          cricket::MPD_RX));
27370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine_.RegisterProcessor(1,
27380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                         &vp_1,
27390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                         cricket::MPD_TX));
27400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->RemoveRecvStream(1));
27410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
27440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
27450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ec_enabled;
27470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::EcModes ec_mode;
27480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ec_metrics_enabled;
27490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::AecmModes aecm_mode;
27500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool cng_enabled;
27510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool agc_enabled;
27520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::AgcModes agc_mode;
27530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::AgcConfig agc_config;
27540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ns_enabled;
27550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::NsModes ns_mode;
27560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool highpass_filter_enabled;
27570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool stereo_swapping_enabled;
27580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool typing_detection_enabled;
27590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
27600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcMetricsStatus(ec_metrics_enabled);
27610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAecmMode(aecm_mode, cng_enabled);
27620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
27630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcConfig(agc_config);
27640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
27650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
27660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
27670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetTypingDetectionStatus(typing_detection_enabled);
27680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_enabled);
27690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_metrics_enabled);
27700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(cng_enabled);
27710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(agc_enabled);
27720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, agc_config.targetLeveldBOv);
27730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ns_enabled);
27740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(highpass_filter_enabled);
27750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(stereo_swapping_enabled);
27760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(typing_detection_enabled);
27770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(ec_mode, webrtc::kEcConference);
27780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
27790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Nothing set, so all ignored.
27810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::AudioOptions options;
27825528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  ASSERT_TRUE(engine_.SetOptions(options));
27830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
27840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcMetricsStatus(ec_metrics_enabled);
27850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAecmMode(aecm_mode, cng_enabled);
27860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
27870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcConfig(agc_config);
27880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
27890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
27900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
27910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetTypingDetectionStatus(typing_detection_enabled);
27920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_enabled);
27930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_metrics_enabled);
27940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(cng_enabled);
27950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(agc_enabled);
27960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, agc_config.targetLeveldBOv);
27970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ns_enabled);
27980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(highpass_filter_enabled);
27990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(stereo_swapping_enabled);
28000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(typing_detection_enabled);
28010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(ec_mode, webrtc::kEcConference);
28020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
28030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Turn echo cancellation off
28050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options.echo_cancellation.Set(false);
28065528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  ASSERT_TRUE(engine_.SetOptions(options));
28070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
28080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(ec_enabled);
28090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Turn echo cancellation back on, with settings, and make sure
28110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // nothing else changed.
28120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options.echo_cancellation.Set(true);
28135528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  ASSERT_TRUE(engine_.SetOptions(options));
28140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
28150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcMetricsStatus(ec_metrics_enabled);
28160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAecmMode(aecm_mode, cng_enabled);
28170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
28180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcConfig(agc_config);
28190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
28200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
28210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
28220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetTypingDetectionStatus(typing_detection_enabled);
28230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_enabled);
28240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_metrics_enabled);
28250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(agc_enabled);
28260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, agc_config.targetLeveldBOv);
28270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ns_enabled);
28280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(highpass_filter_enabled);
28290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(stereo_swapping_enabled);
28300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(typing_detection_enabled);
28310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(ec_mode, webrtc::kEcConference);
28320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
28330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Turn off AGC
28350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options.auto_gain_control.Set(false);
28365528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  ASSERT_TRUE(engine_.SetOptions(options));
28370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
28380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(agc_enabled);
28390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Turn AGC back on
28410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options.auto_gain_control.Set(true);
28420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options.adjust_agc_delta.Clear();
28435528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  ASSERT_TRUE(engine_.SetOptions(options));
28440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
28450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(agc_enabled);
28460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcConfig(agc_config);
28470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, agc_config.targetLeveldBOv);
28480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Turn off other options (and stereo swapping on).
28500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options.noise_suppression.Set(false);
28510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options.highpass_filter.Set(false);
28520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options.typing_detection.Set(false);
28530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options.stereo_swapping.Set(true);
28545528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  ASSERT_TRUE(engine_.SetOptions(options));
28550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
28560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
28570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
28580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetTypingDetectionStatus(typing_detection_enabled);
28590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(ns_enabled);
28600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(highpass_filter_enabled);
28610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(typing_detection_enabled);
28620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(stereo_swapping_enabled);
28630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Turn on "conference mode" to ensure it has no impact.
28650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options.conference_mode.Set(true);
28665528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  ASSERT_TRUE(engine_.SetOptions(options));
28670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
28680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
28690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_enabled);
28700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(webrtc::kEcConference, ec_mode);
28710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(ns_enabled);
28720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
28730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28755528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
28760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
28770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ec_enabled;
28790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::EcModes ec_mode;
28800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ec_metrics_enabled;
28810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool agc_enabled;
28820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::AgcModes agc_mode;
28830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ns_enabled;
28840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::NsModes ns_mode;
28850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool highpass_filter_enabled;
28860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool stereo_swapping_enabled;
28870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool typing_detection_enabled;
28880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
28900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcMetricsStatus(ec_metrics_enabled);
28910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
28920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
28930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
28940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
28950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetTypingDetectionStatus(typing_detection_enabled);
28960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_enabled);
28970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(agc_enabled);
28980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ns_enabled);
28990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(highpass_filter_enabled);
29000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(typing_detection_enabled);
29010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(stereo_swapping_enabled);
29020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
29030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
29050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::AgcConfig set_config = {0};
29060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  set_config.targetLeveldBOv = 3;
29070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  set_config.digitalCompressionGaindB = 9;
29080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  set_config.limiterEnable = true;
29090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
29102a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
29110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::AgcConfig config = {0};
29130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, voe_.GetAgcConfig(config));
29140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
29150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(set_config.digitalCompressionGaindB,
29160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            config.digitalCompressionGaindB);
29170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
29180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
29190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
29210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
29222a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<cricket::VoiceMediaChannel> channel1(
29230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      engine_.CreateChannel());
29242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<cricket::VoiceMediaChannel> channel2(
29250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      engine_.CreateChannel());
29260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Have to add a stream to make SetSend work.
29280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::StreamParams stream1;
29290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stream1.ssrcs.push_back(1);
29300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel1->AddSendStream(stream1);
29310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::StreamParams stream2;
29320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stream2.ssrcs.push_back(2);
29330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel2->AddSendStream(stream2);
29340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // AEC and AGC and NS
29360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::AudioOptions options_all;
29370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options_all.echo_cancellation.Set(true);
29380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options_all.auto_gain_control.Set(true);
29390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options_all.noise_suppression.Set(true);
29400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(channel1->SetOptions(options_all));
29420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::AudioOptions expected_options = options_all;
29430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::AudioOptions actual_options;
29440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(channel1->GetOptions(&actual_options));
29450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(expected_options, actual_options);
29460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(channel2->SetOptions(options_all));
29470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(channel2->GetOptions(&actual_options));
29480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(expected_options, actual_options);
29490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // unset NS
29510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::AudioOptions options_no_ns;
29520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options_no_ns.noise_suppression.Set(false);
29530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(channel1->SetOptions(options_no_ns));
29540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  expected_options.echo_cancellation.Set(true);
29560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  expected_options.auto_gain_control.Set(true);
29570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  expected_options.noise_suppression.Set(false);
29580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(channel1->GetOptions(&actual_options));
29590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(expected_options, actual_options);
29600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // unset AGC
29620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::AudioOptions options_no_agc;
29630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options_no_agc.auto_gain_control.Set(false);
29640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(channel2->SetOptions(options_no_agc));
29650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  expected_options.echo_cancellation.Set(true);
29670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  expected_options.auto_gain_control.Set(false);
29680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  expected_options.noise_suppression.Set(true);
29690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(channel2->GetOptions(&actual_options));
29700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(expected_options, actual_options);
29710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29725528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  ASSERT_TRUE(engine_.SetOptions(options_all));
29730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ec_enabled;
29740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::EcModes ec_mode;
29750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool agc_enabled;
29760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::AgcModes agc_mode;
29770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ns_enabled;
29780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::NsModes ns_mode;
29790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
29800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
29810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
29820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_enabled);
29830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(agc_enabled);
29840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ns_enabled);
29850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel1->SetSend(cricket::SEND_MICROPHONE);
29870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
29880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
29890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
29900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_enabled);
29910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(agc_enabled);
29920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(ns_enabled);
29930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel1->SetSend(cricket::SEND_NOTHING);
29950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
29960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
29970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
29980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_enabled);
29990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(agc_enabled);
30000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ns_enabled);
30010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
30020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel2->SetSend(cricket::SEND_MICROPHONE);
30030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
30040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
30050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
30060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_enabled);
30070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(agc_enabled);
30080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ns_enabled);
30090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
30100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel2->SetSend(cricket::SEND_NOTHING);
30110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
30120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
30130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
30140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_enabled);
30150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(agc_enabled);
30160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ns_enabled);
30170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
30180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Make sure settings take effect while we are sending.
30195528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  ASSERT_TRUE(engine_.SetOptions(options_all));
30200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::AudioOptions options_no_agc_nor_ns;
30210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options_no_agc_nor_ns.auto_gain_control.Set(false);
30220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  options_no_agc_nor_ns.noise_suppression.Set(false);
30230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel2->SetSend(cricket::SEND_MICROPHONE);
30240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel2->SetOptions(options_no_agc_nor_ns);
30250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
30260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  expected_options.echo_cancellation.Set(true);
30270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  expected_options.auto_gain_control.Set(false);
30280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  expected_options.noise_suppression.Set(false);
30290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(channel2->GetOptions(&actual_options));
30300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(expected_options, actual_options);
30310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetEcStatus(ec_enabled, ec_mode);
30320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetAgcStatus(agc_enabled, agc_mode);
30330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  voe_.GetNsStatus(ns_enabled, ns_mode);
30340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ec_enabled);
30350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(agc_enabled);
30360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(ns_enabled);
30370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
30380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
303980303b162fe139828d0661df23e03f09126508acwu@webrtc.org// This test verifies DSCP settings are properly applied on voice media channel.
304080303b162fe139828d0661df23e03f09126508acwu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
304180303b162fe139828d0661df23e03f09126508acwu@webrtc.org  EXPECT_TRUE(SetupEngine());
30422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
304380303b162fe139828d0661df23e03f09126508acwu@webrtc.org      engine_.CreateChannel());
30442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
304580303b162fe139828d0661df23e03f09126508acwu@webrtc.org      new cricket::FakeNetworkInterface);
304680303b162fe139828d0661df23e03f09126508acwu@webrtc.org  channel->SetInterface(network_interface.get());
304780303b162fe139828d0661df23e03f09126508acwu@webrtc.org  cricket::AudioOptions options;
304880303b162fe139828d0661df23e03f09126508acwu@webrtc.org  options.dscp.Set(true);
304980303b162fe139828d0661df23e03f09126508acwu@webrtc.org  EXPECT_TRUE(channel->SetOptions(options));
30502a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
30518485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org  // Verify previous value is not modified if dscp option is not set.
30528485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org  cricket::AudioOptions options1;
30538485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org  EXPECT_TRUE(channel->SetOptions(options1));
30542a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
305580303b162fe139828d0661df23e03f09126508acwu@webrtc.org  options.dscp.Set(false);
305680303b162fe139828d0661df23e03f09126508acwu@webrtc.org  EXPECT_TRUE(channel->SetOptions(options));
30572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
305880303b162fe139828d0661df23e03f09126508acwu@webrtc.org}
305980303b162fe139828d0661df23e03f09126508acwu@webrtc.org
3060cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.orgTEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3061cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  cricket::WebRtcVoiceEngine engine;
3062cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  cricket::AudioOptions options = engine.GetOptions();
3063cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  // The default options should have at least a few things set. We purposefully
3064cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  // don't check the option values here, though.
3065cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  EXPECT_TRUE(options.echo_cancellation.IsSet());
3066cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  EXPECT_TRUE(options.auto_gain_control.IsSet());
3067cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org  EXPECT_TRUE(options.noise_suppression.IsSet());
3068cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org}
3069cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org
30700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that GetReceiveChannelNum returns the default channel for the first
30710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// recv stream in 1-1 calls.
30720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelNumIn1To1Calls) {
30730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
30740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceMediaChannel* media_channel =
30750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
30760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that GetChannelNum returns the default channel if the SSRC is unknown.
30770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(media_channel->voe_channel(),
30780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            media_channel->GetReceiveChannelNum(0));
30790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::StreamParams stream;
30800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stream.ssrcs.push_back(kSsrc2);
30810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(stream));
30820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(media_channel->voe_channel(),
30830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            media_channel->GetReceiveChannelNum(kSsrc2));
30840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
30850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
30860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that GetReceiveChannelNum doesn't return the default channel for the
30870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// first recv stream in conference calls.
30880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestGetChannelNumInConferenceCalls) {
30890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
30900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOptions(options_conference_));
30910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::StreamParams stream;
30920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stream.ssrcs.push_back(kSsrc2);
30930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(stream));
30940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceMediaChannel* media_channel =
30950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
30960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_LT(media_channel->voe_channel(),
30970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            media_channel->GetReceiveChannelNum(kSsrc2));
30980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
30990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOutputScaling) {
31010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SetupEngine());
31020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  double left, right;
31030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOutputScaling(0, 1, 2));
31040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->GetOutputScaling(0, &left, &right));
31050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1, left);
31060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(2, right);
31070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(channel_->SetOutputScaling(kSsrc2, 1, 2));
31090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::StreamParams stream;
31100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stream.ssrcs.push_back(kSsrc2);
31110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->AddRecvStream(stream));
31120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->SetOutputScaling(kSsrc2, 2, 1));
31140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel_->GetOutputScaling(kSsrc2, &left, &right));
31150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(2, left);
31160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1, right);
31170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
31180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests for the actual WebRtc VoE library.
31200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that the library initializes and shuts down properly.
31220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, StartupShutdown) {
31230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceEngine engine;
31242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
31250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VoiceMediaChannel* channel = engine.CreateChannel();
31260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel != NULL);
31270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  delete channel;
31280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine.Terminate();
31290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Reinit to catch regression where VoiceEngineObserver reference is lost
31312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
31320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine.Terminate();
31330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
31340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that the logging from the library is cleartext.
31360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, DISABLED_HasUnencryptedLogging) {
31370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceEngine engine;
31382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<rtc::MemoryStream> stream(
31392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      new rtc::MemoryStream);
31400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  size_t size = 0;
31410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool cleartext = true;
31422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::LogMessage::AddLogToStream(stream.get(), rtc::LS_VERBOSE);
31432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  engine.SetLogging(rtc::LS_VERBOSE, "");
31442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
31450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(stream->GetSize(&size));
31460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_GT(size, 0U);
31470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine.Terminate();
31482a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::LogMessage::RemoveLogToStream(stream.get());
31490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const char* buf = stream->GetBuffer();
31500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (size_t i = 0; i < size && cleartext; ++i) {
31510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int ch = static_cast<int>(buf[i]);
31520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_GE(ch, 0) << "Out of bounds character in WebRtc VoE log: "
31530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     << std::hex << ch;
31540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cleartext = (isprint(ch) || isspace(ch));
31550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
31560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(cleartext);
31570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
31580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests we do not see any references to a monitor thread being spun up
31600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// when initiating the engine.
31610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, HasNoMonitorThread) {
31620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceEngine engine;
31632a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<rtc::MemoryStream> stream(
31642a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      new rtc::MemoryStream);
31652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::LogMessage::AddLogToStream(stream.get(), rtc::LS_VERBOSE);
31662a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  engine.SetLogging(rtc::LS_VERBOSE, "");
31672a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
31680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine.Terminate();
31692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::LogMessage::RemoveLogToStream(stream.get());
31700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  size_t size = 0;
31720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(stream->GetSize(&size));
31730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_GT(size, 0U);
3174cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org  const std::string logs(stream->GetBuffer(), size);
31750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_NE(std::string::npos, logs.find("ProcessThread"));
31760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
31770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that the library is configured with the codecs we want.
31790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
31800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceEngine engine;
31810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check codecs by name.
31820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
31830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
31840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
31850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
31860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
31870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
31880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check that name matching is case-insensitive.
31890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
31900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
31910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
31920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
31930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
31940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
31950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
31960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
31970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
31980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "G722", 16000, 0, 1, 0)));
31990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
32000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
32010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
32020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
32030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
32040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
32050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
32060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
32070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
32080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
32090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check codecs with an id by id.
32100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
32110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(0, "", 8000, 0, 1, 0)));   // PCMU
32120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
32130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(8, "", 8000, 0, 1, 0)));   // PCMA
32140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
32150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(9, "", 16000, 0, 1, 0)));  // G722
32160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
32170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(13, "", 8000, 0, 1, 0)));  // CN
32180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check sample/bitrate matching.
32190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(engine.FindCodec(
32200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
32210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check that bad codecs fail.
32220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
32230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
32240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
32250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
32260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
32270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
32280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (std::vector<cricket::AudioCodec>::const_iterator it =
32290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      engine.codecs().begin(); it != engine.codecs().end(); ++it) {
32300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (it->name == "CN" && it->clockrate == 16000) {
32310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(105, it->id);
32320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (it->name == "CN" && it->clockrate == 32000) {
32330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(106, it->id);
32340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (it->name == "ISAC" && it->clockrate == 16000) {
32350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(103, it->id);
32360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (it->name == "ISAC" && it->clockrate == 32000) {
32370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(104, it->id);
32380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (it->name == "G722" && it->clockrate == 16000) {
32390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(9, it->id);
32400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (it->name == "telephone-event") {
32410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(126, it->id);
32420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (it->name == "red") {
32430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(127, it->id);
32440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (it->name == "opus") {
32450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(111, it->id);
3246cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org      ASSERT_TRUE(it->params.find("minptime") != it->params.end());
32470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ("10", it->params.find("minptime")->second);
3248cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org      ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
32490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ("60", it->params.find("maxptime")->second);
32500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
32510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
32520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine.Terminate();
32540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
32550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that VoE supports at least 32 channels
32570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, Has32Channels) {
32580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceEngine engine;
32592a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
32600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VoiceMediaChannel* channels[32];
32620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int num_channels = 0;
32630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  while (num_channels < ARRAY_SIZE(channels)) {
32650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::VoiceMediaChannel* channel = engine.CreateChannel();
32660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!channel)
32670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
32680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels[num_channels++] = channel;
32700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
32710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int expected = ARRAY_SIZE(channels);
32730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(expected, num_channels);
32740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  while (num_channels > 0) {
32760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    delete channels[--num_channels];
32770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
32780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine.Terminate();
32800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
32810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we set our preferred codecs properly.
32830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
32840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceEngine engine;
32852a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
32860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceMediaChannel channel(&engine);
32870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel.SetRecvCodecs(engine.codecs()));
32880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
32890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef WIN32
32910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test our workarounds to WebRtc VoE' munging of the coinit count
32920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, CoInitialize) {
32930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::WebRtcVoiceEngine* engine = new cricket::WebRtcVoiceEngine();
32940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Initial refcount should be 0.
32960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(S_OK, CoInitializeEx(NULL, COINIT_MULTITHREADED));
32970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
32980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Engine should start even with COM already inited.
32992a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine->Init(rtc::Thread::Current()));
33000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine->Terminate();
33012a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_TRUE(engine->Init(rtc::Thread::Current()));
33020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  engine->Terminate();
33030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
33040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Refcount after terminate should be 1 (in reality 3); test if it is nonzero.
33050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(S_FALSE, CoInitializeEx(NULL, COINIT_MULTITHREADED));
33060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Decrement refcount to (hopefully) 0.
33070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CoUninitialize();
33080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CoUninitialize();
33090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  delete engine;
33100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
33110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ensure refcount is 0.
33120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(S_OK, CoInitializeEx(NULL, COINIT_MULTITHREADED));
33130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CoUninitialize();
33140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
33150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif
33165462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33175462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, ChangeCombinedAudioVideoBweOption) {
33185462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // Test that changing the combined_audio_video_bwe option results in the
33195462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // expected state changes in VoiceEngine.
33205462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  cricket::ViEWrapper vie;
33215462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  const int kVieCh = 667;
33225462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33235462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
33245462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  cricket::WebRtcVoiceMediaChannel* media_channel =
33255462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org      static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
33265462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie.engine(),
33275462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org                                                            kVieCh));
33285462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->AddRecvStream(
33295462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org      cricket::StreamParams::CreateLegacy(2)));
33305462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  int recv_ch = voe_.GetLastChannel();
33315462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33325462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // Combined BWE should not be set up yet.
33335462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch));
33345462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch));
33355462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33365462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // Enable combined BWE option - now it should be set up.
33375462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  cricket::AudioOptions options;
33385462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  options.combined_audio_video_bwe.Set(true);
33395462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->SetOptions(options));
33405462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(vie.network(), voe_.GetViENetwork(recv_ch));
33415462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(kVieCh, voe_.GetVideoChannel(recv_ch));
33425462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33435462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // Disable combined BWE option - should be disabled again.
33445462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  options.combined_audio_video_bwe.Set(false);
33455462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->SetOptions(options));
33465462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch));
33475462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch));
33485462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33495462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(NULL, -1));
33505462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org}
33515462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33525462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetupSharedBandwidthEstimation) {
33535462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // Test that calling SetupSharedBandwidthEstimation() on the voice media
33545462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // channel results in the expected state changes in VoiceEngine.
33555462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  cricket::ViEWrapper vie1;
33565462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  cricket::ViEWrapper vie2;
33575462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  const int kVieCh1 = 667;
33585462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  const int kVieCh2 = 70;
33595462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33605462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
33615462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  cricket::WebRtcVoiceMediaChannel* media_channel =
33625462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org      static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
33635462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  cricket::AudioOptions options;
33645462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  options.combined_audio_video_bwe.Set(true);
33655462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->SetOptions(options));
33665462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->AddRecvStream(
33675462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org      cricket::StreamParams::CreateLegacy(2)));
33685462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  int recv_ch = voe_.GetLastChannel();
33695462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33705462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // Combined BWE should not be set up yet.
33715462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch));
33725462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch));
33735462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33745462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // Register - should be enabled.
33755462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie1.engine(),
33765462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org                                                            kVieCh1));
33775462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(vie1.network(), voe_.GetViENetwork(recv_ch));
33785462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(kVieCh1, voe_.GetVideoChannel(recv_ch));
33795462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33805462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // Re-register - should still be enabled.
33815462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie2.engine(),
33825462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org                                                            kVieCh2));
33835462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(vie2.network(), voe_.GetViENetwork(recv_ch));
33845462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(kVieCh2, voe_.GetVideoChannel(recv_ch));
33855462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33865462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // Unregister - should be disabled again.
33875462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(NULL, -1));
33885462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch));
33895462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch));
33905462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org}
33915462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33925462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
33935462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // Test that adding receive streams after enabling combined bandwidth
33945462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  // estimation will correctly configure each channel.
33955462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  cricket::ViEWrapper vie;
33965462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  const int kVieCh = 667;
33975462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
33985462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(SetupEngine());
33995462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  cricket::WebRtcVoiceMediaChannel* media_channel =
34005462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org      static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
34015462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie.engine(),
34025462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org                                                            kVieCh));
34035462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  cricket::AudioOptions options;
34045462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  options.combined_audio_video_bwe.Set(true);
34055462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->SetOptions(options));
34065462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
34075462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  static const uint32 kSsrcs[] = {1, 2, 3, 4};
34085462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  int voe_channels[ARRAY_SIZE(kSsrcs)] = {0};
34095462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
34105462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    EXPECT_TRUE(media_channel->AddRecvStream(
34115462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org        cricket::StreamParams::CreateLegacy(kSsrcs[i])));
34125462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    int recv_ch = media_channel->GetReceiveChannelNum(kSsrcs[i]);
34135462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    EXPECT_NE(-1, recv_ch);
34145462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    voe_channels[i] = recv_ch;
34155462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    EXPECT_EQ(vie.network(), voe_.GetViENetwork(recv_ch));
34165462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    EXPECT_EQ(kVieCh, voe_.GetVideoChannel(recv_ch));
34175462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  }
34185462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
34195462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(NULL, -1));
34205462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org
34215462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  for (unsigned int i = 0; i < ARRAY_SIZE(voe_channels); ++i) {
34225462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    EXPECT_EQ(NULL, voe_.GetViENetwork(voe_channels[i]));
34235462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    EXPECT_EQ(-1, voe_.GetVideoChannel(voe_channels[i]));
34245462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org  }
34255462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org}
3426