10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// libjingle
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Copyright 2009 Google Inc.
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Redistribution and use in source and binary forms, with or without
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// modification, are permitted provided that the following conditions are met:
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//  1. Redistributions of source code must retain the above copyright notice,
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//     this list of conditions and the following disclaimer.
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//  2. Redistributions in binary form must reproduce the above copyright notice,
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//     this list of conditions and the following disclaimer in the documentation
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//     and/or other materials provided with the distribution.
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//  3. The name of the author may not be used to endorse or promote products
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//     derived from this software without specific prior written permission.
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h"
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakertp.h"
28cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/media/base/fakescreencapturerfactory.h"
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakevideocapturer.h"
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/mediachannel.h"
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/rtpdump.h"
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/screencastid.h"
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/testutils.h"
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/fakesession.h"
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/channel.h"
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/mediamessages.h"
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/mediarecorder.h"
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/mediasessionclient.h"
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/typingmonitor.h"
40c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org#include "webrtc/base/fileutils.h"
41c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org#include "webrtc/base/gunit.h"
42c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org#include "webrtc/base/helpers.h"
43c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org#include "webrtc/base/logging.h"
44c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org#include "webrtc/base/pathutils.h"
45c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org#include "webrtc/base/signalthread.h"
46c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org#include "webrtc/base/ssladapter.h"
47c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org#include "webrtc/base/sslidentity.h"
48c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org#include "webrtc/base/window.h"
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define MAYBE_SKIP_TEST(feature)                    \
512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  if (!(rtc::SSLStreamAdapter::feature())) {  \
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    LOG(LS_INFO) << "Feature disabled... skipping"; \
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return;                                         \
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::CA_OFFER;
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::CA_PRANSWER;
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::CA_ANSWER;
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::CA_UPDATE;
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::FakeVoiceMediaChannel;
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::ScreencastId;
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::StreamParams;
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::TransportChannel;
642a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgusing rtc::WindowId;
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1, 0);
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1, 0);
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1, 0);
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::VideoCodec kH264Codec(97, "H264", 640, 400, 30, 0);
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC", 320, 200, 15, 0);
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::DataCodec kGoogleDataCodec(101, "google-data", 0);
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kSsrc1 = 0x1111;
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kSsrc2 = 0x2222;
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kSsrc3 = 0x3333;
75907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgstatic const int kAudioPts[] = {0, 8};
76907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgstatic const int kVideoPts[] = {97, 99};
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<class ChannelT,
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         class MediaChannelT,
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         class ContentT,
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         class CodecT,
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         class MediaInfoT>
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass Traits {
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef ChannelT Channel;
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef MediaChannelT MediaChannel;
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef ContentT Content;
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef CodecT Codec;
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef MediaInfoT MediaInfo;
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Controls how long we wait for a session to send messages that we
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// expect, in milliseconds.  We put it high to avoid flaky tests.
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kEventTimeout = 5000;
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass VoiceTraits : public Traits<cricket::VoiceChannel,
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  cricket::FakeVoiceMediaChannel,
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  cricket::AudioContentDescription,
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  cricket::AudioCodec,
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  cricket::VoiceMediaInfo> {
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass VideoTraits : public Traits<cricket::VideoChannel,
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  cricket::FakeVideoMediaChannel,
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  cricket::VideoContentDescription,
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  cricket::VideoCodec,
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  cricket::VideoMediaInfo> {
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass DataTraits : public Traits<cricket::DataChannel,
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 cricket::FakeDataMediaChannel,
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 cricket::DataContentDescription,
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 cricket::DataCodec,
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 cricket::DataMediaInfo> {
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1182a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgrtc::StreamInterface* Open(const std::string& path) {
1192a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  return rtc::Filesystem::OpenFile(
1202a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      rtc::Pathname(path), "wb");
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Base class for Voice/VideoChannel tests
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<class T>
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass ChannelTest : public testing::Test, public sigslot::has_slots<> {
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  enum Flags { RTCP = 0x1, RTCP_MUX = 0x2, SECURE = 0x4, SSRC_MUX = 0x8,
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org               DTLS = 0x10 };
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ChannelTest(const uint8* rtp_data, int rtp_len,
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              const uint8* rtcp_data, int rtcp_len)
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : session1_(true),
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        session2_(false),
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        media_channel1_(NULL),
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        media_channel2_(NULL),
1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        rtp_packet_(reinterpret_cast<const char*>(rtp_data), rtp_len),
1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        rtcp_packet_(reinterpret_cast<const char*>(rtcp_data), rtcp_len),
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        media_info_callbacks1_(),
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        media_info_callbacks2_(),
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        mute_callback_recved_(false),
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        mute_callback_value_(false),
1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ssrc_(0),
1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        error_(T::MediaChannel::ERROR_NONE) {
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static void SetUpTestCase() {
1472a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::InitializeSSL();
1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1507162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  static void TearDownTestCase() {
1512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::CleanupSSL();
1527162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  }
1537162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org
1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void CreateChannels(int flags1, int flags2) {
1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(new typename T::MediaChannel(NULL),
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   new typename T::MediaChannel(NULL),
1572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                   flags1, flags2, rtc::Thread::Current());
1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void CreateChannels(int flags) {
1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     CreateChannels(new typename T::MediaChannel(NULL),
1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                    new typename T::MediaChannel(NULL),
1622a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                    flags, rtc::Thread::Current());
1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void CreateChannels(int flags1, int flags2,
1652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                      rtc::Thread* thread) {
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(new typename T::MediaChannel(NULL),
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   new typename T::MediaChannel(NULL),
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   flags1, flags2, thread);
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void CreateChannels(int flags,
1712a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                      rtc::Thread* thread) {
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(new typename T::MediaChannel(NULL),
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   new typename T::MediaChannel(NULL),
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   flags, thread);
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void CreateChannels(
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      typename T::MediaChannel* ch1, typename T::MediaChannel* ch2,
1782a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      int flags1, int flags2, rtc::Thread* thread) {
1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    media_channel1_ = ch1;
1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    media_channel2_ = ch2;
1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_.reset(CreateChannel(thread, &media_engine_, ch1, &session1_,
1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  (flags1 & RTCP) != 0));
1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_.reset(CreateChannel(thread, &media_engine_, ch2, &session2_,
1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  (flags2 & RTCP) != 0));
1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SignalMediaMonitor.connect(
1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &ChannelTest<T>::OnMediaMonitor);
1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->SignalMediaMonitor.connect(
1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &ChannelTest<T>::OnMediaMonitor);
1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SignalMediaError.connect(
1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &ChannelTest<T>::OnMediaChannelError);
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->SignalMediaError.connect(
1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &ChannelTest<T>::OnMediaChannelError);
1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SignalAutoMuted.connect(
1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &ChannelTest<T>::OnMediaMuted);
1958841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org    if ((flags1 & DTLS) && (flags2 & DTLS)) {
1968841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org      flags1 = (flags1 & ~SECURE);
1978841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org      flags2 = (flags2 & ~SECURE);
1988841d7bf4010478a4b3978ff2d181d9504b2bbe3mallinath@webrtc.org    }
1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(flags1, kPcmuCodec, kH264Codec,
2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                  &local_media_content1_);
2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(flags2, kPcmuCodec, kH264Codec,
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                  &local_media_content2_);
2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CopyContent(local_media_content1_, &remote_media_content1_);
2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CopyContent(local_media_content2_, &remote_media_content2_);
2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (flags1 & DTLS) {
2072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      identity1_.reset(rtc::SSLIdentity::Generate("session1"));
2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      session1_.set_ssl_identity(identity1_.get());
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (flags2 & DTLS) {
2112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      identity2_.reset(rtc::SSLIdentity::Generate("session2"));
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      session2_.set_ssl_identity(identity2_.get());
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Add stream information (SSRC) to the local content but not to the remote
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // content. This means that we per default know the SSRC of what we send but
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // not what we receive.
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (flags1 & SSRC_MUX) {
2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (flags2 & SSRC_MUX) {
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void CreateChannels(
2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      typename T::MediaChannel* ch1, typename T::MediaChannel* ch2,
2322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      int flags, rtc::Thread* thread) {
2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    media_channel1_ = ch1;
2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    media_channel2_ = ch2;
2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_.reset(CreateChannel(thread, &media_engine_, ch1, &session1_,
2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  (flags & RTCP) != 0));
2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_.reset(CreateChannel(thread, &media_engine_, ch2, &session1_,
2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  (flags & RTCP) != 0));
2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SignalMediaMonitor.connect(
2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &ChannelTest<T>::OnMediaMonitor);
2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->SignalMediaMonitor.connect(
2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &ChannelTest<T>::OnMediaMonitor);
2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->SignalMediaError.connect(
2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &ChannelTest<T>::OnMediaChannelError);
2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(flags, kPcmuCodec, kH264Codec,
2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                  &local_media_content1_);
2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(flags, kPcmuCodec, kH264Codec,
2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                  &local_media_content2_);
2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CopyContent(local_media_content1_, &remote_media_content1_);
2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CopyContent(local_media_content2_, &remote_media_content2_);
2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Add stream information (SSRC) to the local content but not to the remote
2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // content. This means that we per default know the SSRC of what we send but
2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // not what we receive.
2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    AddLegacyStreamInContent(kSsrc1, flags, &local_media_content1_);
2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    AddLegacyStreamInContent(kSsrc2, flags, &local_media_content2_);
2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (flags & SSRC_MUX) {
2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      AddLegacyStreamInContent(kSsrc1, flags, &remote_media_content1_);
2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      AddLegacyStreamInContent(kSsrc2, flags, &remote_media_content2_);
2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  typename T::Channel* CreateChannel(rtc::Thread* thread,
2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     cricket::MediaEngineInterface* engine,
2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     typename T::MediaChannel* ch,
2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     cricket::BaseSession* session,
2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     bool rtcp) {
2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Channel* channel = new typename T::Channel(
2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        thread, engine, ch, session, cricket::CN_AUDIO, rtcp);
2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!channel->Init()) {
2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      delete channel;
2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channel = NULL;
2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channel;
2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendInitiate() {
280f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    bool result = channel1_->SetLocalContent(&local_media_content1_,
281f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                             CA_OFFER, NULL);
2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (result) {
2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channel1_->Enable(true);
284f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org      result = channel2_->SetRemoteContent(&remote_media_content1_,
285f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                           CA_OFFER, NULL);
2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (result) {
2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        session1_.Connect(&session2_);
2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
289f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org        result = channel2_->SetLocalContent(&local_media_content2_,
290f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                            CA_ANSWER, NULL);
2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return result;
2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendAccept() {
2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->Enable(true);
298f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    return channel1_->SetRemoteContent(&remote_media_content2_,
299f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                       CA_ANSWER, NULL);
3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendOffer() {
303f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    bool result = channel1_->SetLocalContent(&local_media_content1_,
304f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                             CA_OFFER, NULL);
3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (result) {
3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channel1_->Enable(true);
307f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org      result = channel2_->SetRemoteContent(&remote_media_content1_,
308f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                           CA_OFFER, NULL);
3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
3100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return result;
3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendProvisionalAnswer() {
3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool result = channel2_->SetLocalContent(&local_media_content2_,
315f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                             CA_PRANSWER, NULL);
3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (result) {
3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channel2_->Enable(true);
3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      result = channel1_->SetRemoteContent(&remote_media_content2_,
319f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                           CA_PRANSWER, NULL);
3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      session1_.Connect(&session2_);
3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return result;
3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendFinalAnswer() {
326f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    bool result = channel2_->SetLocalContent(&local_media_content2_,
327f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                             CA_ANSWER, NULL);
3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (result)
329f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org      result = channel1_->SetRemoteContent(&remote_media_content2_,
330f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                           CA_ANSWER, NULL);
3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return result;
3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendTerminate() {
3350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_.reset();
3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_.reset();
3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool AddStream1(int id) {
3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool RemoveStream1(int id) {
3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channel1_->RemoveRecvStream(id);
3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeTransport* GetTransport1() {
3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return session1_.GetTransport(channel1_->content_name());
3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeTransport* GetTransport2() {
3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return session2_.GetTransport(channel2_->content_name());
3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendRtp1() {
3551a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel1_->SendRtp(rtp_packet_.c_str(),
3561a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                    static_cast<int>(rtp_packet_.size()));
3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendRtp2() {
3591a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel2_->SendRtp(rtp_packet_.c_str(),
3601a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                    static_cast<int>(rtp_packet_.size()));
3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendRtcp1() {
3631a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel1_->SendRtcp(rtcp_packet_.c_str(),
3641a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                     static_cast<int>(rtcp_packet_.size()));
3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendRtcp2() {
3671a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel2_->SendRtcp(rtcp_packet_.c_str(),
3681a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                     static_cast<int>(rtcp_packet_.size()));
3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Methods to send custom data.
371907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  bool SendCustomRtp1(uint32 ssrc, int sequence_number, int pl_type = -1) {
372907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    std::string data(CreateRtpData(ssrc, sequence_number, pl_type));
3731a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel1_->SendRtp(data.c_str(),
3741a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                    static_cast<int>(data.size()));
3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
376907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  bool SendCustomRtp2(uint32 ssrc, int sequence_number, int pl_type = -1) {
377907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    std::string data(CreateRtpData(ssrc, sequence_number, pl_type));
3781a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel2_->SendRtp(data.c_str(),
3791a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                    static_cast<int>(data.size()));
3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendCustomRtcp1(uint32 ssrc) {
3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string data(CreateRtcpData(ssrc));
3831a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel1_->SendRtcp(data.c_str(),
3841a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                     static_cast<int>(data.size()));
3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendCustomRtcp2(uint32 ssrc) {
3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string data(CreateRtcpData(ssrc));
3881a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel2_->SendRtcp(data.c_str(),
3891a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                     static_cast<int>(data.size()));
3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckRtp1() {
3921a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel1_->CheckRtp(rtp_packet_.c_str(),
3931a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                     static_cast<int>(rtp_packet_.size()));
3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckRtp2() {
3961a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel2_->CheckRtp(rtp_packet_.c_str(),
3971a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                     static_cast<int>(rtp_packet_.size()));
3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckRtcp1() {
4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return media_channel1_->CheckRtcp(rtcp_packet_.c_str(),
4011a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                      static_cast<int>(rtcp_packet_.size()));
4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckRtcp2() {
4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return media_channel2_->CheckRtcp(rtcp_packet_.c_str(),
4051a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                      static_cast<int>(rtcp_packet_.size()));
4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Methods to check custom data.
408907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  bool CheckCustomRtp1(uint32 ssrc, int sequence_number, int pl_type = -1 ) {
409907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    std::string data(CreateRtpData(ssrc, sequence_number, pl_type));
4101a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel1_->CheckRtp(data.c_str(),
4111a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                     static_cast<int>(data.size()));
4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
413907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  bool CheckCustomRtp2(uint32 ssrc, int sequence_number, int pl_type = -1) {
414907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    std::string data(CreateRtpData(ssrc, sequence_number, pl_type));
4151a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel2_->CheckRtp(data.c_str(),
4161a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                     static_cast<int>(data.size()));
4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckCustomRtcp1(uint32 ssrc) {
4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string data(CreateRtcpData(ssrc));
4201a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel1_->CheckRtcp(data.c_str(),
4211a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                      static_cast<int>(data.size()));
4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckCustomRtcp2(uint32 ssrc) {
4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string data(CreateRtcpData(ssrc));
4251a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return media_channel2_->CheckRtcp(data.c_str(),
4261a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org                                      static_cast<int>(data.size()));
4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
428907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  std::string CreateRtpData(uint32 ssrc, int sequence_number, int pl_type) {
4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string data(rtp_packet_);
4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Set SSRC in the rtp packet copy.
4312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::SetBE32(const_cast<char*>(data.c_str()) + 8, ssrc);
4322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::SetBE16(const_cast<char*>(data.c_str()) + 2, sequence_number);
433907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    if (pl_type >= 0) {
4342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      rtc::Set8(const_cast<char*>(data.c_str()), 1, pl_type);
435907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    }
4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return data;
4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string CreateRtcpData(uint32 ssrc) {
4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string data(rtcp_packet_);
4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Set SSRC in the rtcp packet copy.
4412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::SetBE32(const_cast<char*>(data.c_str()) + 4, ssrc);
4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return data;
4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckNoRtp1() {
4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return media_channel1_->CheckNoRtp();
4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckNoRtp2() {
4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return media_channel2_->CheckNoRtp();
4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckNoRtcp1() {
4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return media_channel1_->CheckNoRtcp();
4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckNoRtcp2() {
4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return media_channel2_->CheckNoRtcp();
4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void CreateContent(int flags,
4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     const cricket::AudioCodec& audio_codec,
4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     const cricket::VideoCodec& video_codec,
4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     typename T::Content* content) {
4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // overridden in specialized classes
4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void CopyContent(const typename T::Content& source,
4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   typename T::Content* content) {
4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // overridden in specialized classes
4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Creates a cricket::SessionDescription with one MediaContent and one stream.
4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::SessionDescription* CreateSessionDescriptionWithStream(uint32 ssrc) {
4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     typename T::Content content;
4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     cricket::SessionDescription* sdesc = new cricket::SessionDescription();
4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     CreateContent(SECURE, kPcmuCodec, kH264Codec, &content);
4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     AddLegacyStreamInContent(ssrc, 0, &content);
4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     sdesc->AddContent("DUMMY_CONTENT_NAME",
4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       cricket::NS_JINGLE_RTP, content.Copy());
4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     return sdesc;
4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4812a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  class CallThread : public rtc::SignalThread {
4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org   public:
4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typedef bool (ChannelTest<T>::*Method)();
4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CallThread(ChannelTest<T>* obj, Method method, bool* result)
4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        : obj_(obj),
4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          method_(method),
4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          result_(result) {
4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      *result = false;
4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    virtual void DoWork() {
4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      bool result = (*obj_.*method_)();
4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (result_) {
4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        *result_ = result;
4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org   private:
4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ChannelTest<T>* obj_;
4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    Method method_;
4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool* result_;
5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void CallOnThread(typename CallThread::Method method, bool* result) {
5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CallThread* thread = new CallThread(this, method, result);
5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    thread->Start();
5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    thread->Release();
5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void CallOnThreadAndWaitForDone(typename CallThread::Method method,
5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  bool* result) {
5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CallThread* thread = new CallThread(this, method, result);
5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    thread->Start();
5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    thread->Destroy(true);
5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;  // overridden in specialized classes
5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnMediaMonitor(typename T::Channel* channel,
5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      const typename T::MediaInfo& info) {
5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (channel == channel1_.get()) {
5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      media_info_callbacks1_++;
5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (channel == channel2_.get()) {
5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      media_info_callbacks2_++;
5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnMediaChannelError(typename T::Channel* channel,
5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           uint32 ssrc,
5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           typename T::MediaChannel::Error error) {
5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ssrc_ = ssrc;
5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    error_ = error;
5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnMediaMuted(cricket::BaseChannel* channel, bool muted) {
5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    mute_callback_recved_ = true;
5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    mute_callback_value_ = muted;
5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void AddLegacyStreamInContent(uint32 ssrc, int flags,
5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        typename T::Content* content) {
5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Base implementation.
5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Tests that can be used by derived classes.
5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Basic sanity check.
5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestInit() {
5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->secure());
5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->sending());
5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->playout());
5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->codecs().empty());
5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->recv_streams().empty());
5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->rtp_packets().empty());
5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that SetLocalContent and SetRemoteContent properly configure
5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // the codecs.
5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSetContents() {
5610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
5620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content;
5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content);
564f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0U, media_channel1_->codecs().size());
566f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(1U, media_channel1_->codecs().size());
5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CodecMatches(content.codecs()[0],
5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             media_channel1_->codecs()[0]));
5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that SetLocalContent and SetRemoteContent properly deals
5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // with an empty offer.
5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSetContentsNullOffer() {
5750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content;
577f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content);
5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0U, media_channel1_->codecs().size());
580f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(1U, media_channel1_->codecs().size());
5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CodecMatches(content.codecs()[0],
5830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             media_channel1_->codecs()[0]));
5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that SetLocalContent and SetRemoteContent properly set RTCP
5870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // mux.
5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSetContentsRtcpMux() {
5890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP, RTCP);
5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->rtcp_transport_channel() != NULL);
5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel2_->rtcp_transport_channel() != NULL);
5920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content;
5930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content);
5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Both sides agree on mux. Should no longer be a separate RTCP channel.
5950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content.set_rtcp_mux(true);
596f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
597f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->rtcp_transport_channel() == NULL);
5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Only initiator supports mux. Should still have a separate RTCP channel.
600f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content.set_rtcp_mux(false);
602f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel2_->rtcp_transport_channel() != NULL);
6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that SetLocalContent and SetRemoteContent properly set RTCP
6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // mux when a provisional answer is received.
6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSetContentsRtcpMuxWithPrAnswer() {
6090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP, RTCP);
6100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->rtcp_transport_channel() != NULL);
6110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel2_->rtcp_transport_channel() != NULL);
6120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content;
6130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content);
6140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content.set_rtcp_mux(true);
615f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
616f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL));
6170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->rtcp_transport_channel() != NULL);
618f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
6190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Both sides agree on mux. Should no longer be a separate RTCP channel.
6200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->rtcp_transport_channel() == NULL);
6210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Only initiator supports mux. Should still have a separate RTCP channel.
622f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
6230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content.set_rtcp_mux(false);
624f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL));
625f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
6260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel2_->rtcp_transport_channel() != NULL);
6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that SetLocalContent and SetRemoteContent properly set
6300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // video options to the media channel.
6310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSetContentsVideoOptions() {
6320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
6330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content;
6340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content);
6350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content.set_buffered_mode_latency(101);
636f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
6370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0U, media_channel1_->codecs().size());
6380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::VideoOptions options;
6390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_TRUE(media_channel1_->GetOptions(&options));
6400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int latency = 0;
6410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(options.buffered_mode_latency.Get(&latency));
6420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(101, latency);
6430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content.set_buffered_mode_latency(102);
644f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
6450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(1U, media_channel1_->codecs().size());
6460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CodecMatches(content.codecs()[0],
6470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             media_channel1_->codecs()[0]));
6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_TRUE(media_channel1_->GetOptions(&options));
6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(options.buffered_mode_latency.Get(&latency));
6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(102, latency);
6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that SetRemoteContent properly deals with a content update.
6540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSetRemoteContentUpdate() {
6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
6560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content;
6570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(RTCP | RTCP_MUX | SECURE,
6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                  kPcmuCodec, kH264Codec,
6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                  &content);
6600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0U, media_channel1_->codecs().size());
661f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
662f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(1U, media_channel1_->codecs().size());
6640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CodecMatches(content.codecs()[0],
6650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             media_channel1_->codecs()[0]));
6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Now update with other codecs.
6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content update_content;
6680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    update_content.set_partial(true);
6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kIsacCodec, kH264SvcCodec,
6700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                  &update_content);
671f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&update_content, CA_UPDATE, NULL));
6720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(1U, media_channel1_->codecs().size());
6730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
6740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             media_channel1_->codecs()[0]));
6750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Now update without any codecs. This is ignored.
6760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content empty_content;
6770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    empty_content.set_partial(true);
678f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&empty_content, CA_UPDATE, NULL));
6790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(1U, media_channel1_->codecs().size());
6800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
6810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             media_channel1_->codecs()[0]));
6820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that Add/RemoveStream properly forward to the media channel.
6850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestStreams() {
6860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
6870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(AddStream1(1));
6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(AddStream1(2));
6890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, media_channel1_->recv_streams().size());
6900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(RemoveStream1(2));
6910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, media_channel1_->recv_streams().size());
6920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(RemoveStream1(1));
6930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0U, media_channel1_->recv_streams().size());
6940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that SetLocalContent properly handles adding and removing StreamParams
6970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // to the local content description.
6980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // This test uses the CA_UPDATE action that don't require a full
6990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // MediaContentDescription to do an update.
7000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestUpdateStreamsInLocalContent() {
7010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::StreamParams stream1;
7020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.groupid = "group1";
7030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.id = "stream1";
7040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.ssrcs.push_back(kSsrc1);
7050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.cname = "stream1_cname";
7060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::StreamParams stream2;
7080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.groupid = "group2";
7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.id = "stream2";
7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.ssrcs.push_back(kSsrc2);
7110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.cname = "stream2_cname";
7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::StreamParams stream3;
7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream3.groupid = "group3";
7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream3.id = "stream3";
7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream3.ssrcs.push_back(kSsrc3);
7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream3.cname = "stream3_cname";
7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content1;
7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content1);
7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content1.AddStream(stream1);
7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0u, media_channel1_->send_streams().size());
724f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(1u, media_channel1_->send_streams().size());
7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Update the local streams by adding another sending stream.
7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Use a partial updated session description.
7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content2;
7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content2.AddStream(stream2);
7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content2.AddStream(stream3);
7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content2.set_partial(true);
735f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content2, CA_UPDATE, NULL));
7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(3u, media_channel1_->send_streams().size());
7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream2, media_channel1_->send_streams()[1]);
7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream3, media_channel1_->send_streams()[2]);
7400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Update the local streams by removing the first sending stream.
7420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // This is done by removing all SSRCS for this particular stream.
7430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content3;
7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.ssrcs.clear();
7450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content3.AddStream(stream1);
7460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content3.set_partial(true);
747f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content3, CA_UPDATE, NULL));
7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(2u, media_channel1_->send_streams().size());
7490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Update the local streams with a stream that does not change.
7530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // THe update is ignored.
7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content4;
7550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content4.AddStream(stream2);
7560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content4.set_partial(true);
757f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_UPDATE, NULL));
7580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(2u, media_channel1_->send_streams().size());
7590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
7610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that SetRemoteContent properly handles adding and removing
7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // StreamParams to the remote content description.
7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // This test uses the CA_UPDATE action that don't require a full
7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // MediaContentDescription to do an update.
7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestUpdateStreamsInRemoteContent() {
7680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::StreamParams stream1;
7690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.id = "Stream1";
7700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.groupid = "1";
7710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.ssrcs.push_back(kSsrc1);
7720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.cname = "stream1_cname";
7730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::StreamParams stream2;
7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.id = "Stream2";
7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.groupid = "2";
7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.ssrcs.push_back(kSsrc2);
7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.cname = "stream2_cname";
7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::StreamParams stream3;
7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream3.id = "Stream3";
7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream3.groupid = "3";
7830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream3.ssrcs.push_back(kSsrc3);
7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream3.cname = "stream3_cname";
7850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content1;
7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content1);
7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content1.AddStream(stream1);
7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0u, media_channel1_->recv_streams().size());
791f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content1, CA_OFFER, NULL));
7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(1u, media_channel1_->codecs().size());
7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(1u, media_channel1_->recv_streams().size());
7950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Update the remote streams by adding another sending stream.
7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Use a partial updated session description.
7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content2;
8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content2.AddStream(stream2);
8010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content2.AddStream(stream3);
8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content2.set_partial(true);
803f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_UPDATE, NULL));
8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(3u, media_channel1_->recv_streams().size());
8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream2, media_channel1_->recv_streams()[1]);
8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream3, media_channel1_->recv_streams()[2]);
8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Update the remote streams by removing the first stream.
8100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // This is done by removing all SSRCS for this particular stream.
8110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content3;
8120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.ssrcs.clear();
8130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content3.AddStream(stream1);
8140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content3.set_partial(true);
815f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_UPDATE, NULL));
8160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(2u, media_channel1_->recv_streams().size());
8170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
8180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
8190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Update the remote streams with a stream that does not change.
8210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // The update is ignored.
8220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content4;
8230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content4.AddStream(stream2);
8240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content4.set_partial(true);
825f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content4, CA_UPDATE, NULL));
8260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(2u, media_channel1_->recv_streams().size());
8270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
8280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
8290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that SetLocalContent and SetRemoteContent properly
8320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // handles adding and removing StreamParams when the action is a full
8330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // CA_OFFER / CA_ANSWER.
8340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestChangeStreamParamsInContent() {
8350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::StreamParams stream1;
8360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.groupid = "group1";
8370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.id = "stream1";
8380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.ssrcs.push_back(kSsrc1);
8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream1.cname = "stream1_cname";
8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::StreamParams stream2;
8420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.groupid = "group1";
8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.id = "stream2";
8440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.ssrcs.push_back(kSsrc2);
8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream2.cname = "stream2_cname";
8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Setup a call where channel 1 send |stream1| to channel 2.
8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content1;
8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content1);
8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content1.AddStream(stream1);
852f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->Enable(true));
8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1u, media_channel1_->send_streams().size());
8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
856f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1u, media_channel2_->recv_streams().size());
8580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.Connect(&session2_);
8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Channel 2 do not send anything.
8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content2;
8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content2);
863f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0u, media_channel1_->recv_streams().size());
865f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel2_->Enable(true));
8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0u, media_channel2_->send_streams().size());
8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendCustomRtp1(kSsrc1, 0));
8700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
8710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Let channel 2 update the content by sending |stream2| and enable SRTP.
8730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content3;
8740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
8750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content3.AddStream(stream2);
876f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
8770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(1u, media_channel2_->send_streams().size());
8780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
8790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
880f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
8810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_EQ(1u, media_channel1_->recv_streams().size());
8820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
8830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Channel 1 replies but stop sending stream1.
8850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content4;
8860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
887f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
8880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0u, media_channel1_->send_streams().size());
8890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
890f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
8910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0u, media_channel2_->recv_streams().size());
8920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->secure());
8940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel2_->secure());
8950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendCustomRtp2(kSsrc2, 0));
8960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
8970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that we only start playout and sending at the right times.
9000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestPlayoutAndSendingStates() {
9010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
9020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->playout());
9030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->sending());
9040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->playout());
9050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->sending());
9060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->Enable(true));
9070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->playout());
9080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->sending());
909f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
910f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                           CA_OFFER, NULL));
9110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->playout());
9120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->sending());
913f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
914f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                            CA_OFFER, NULL));
9150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->playout());
9160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->sending());
917f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
918f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                           CA_ANSWER, NULL));
9190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->playout());
9200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->sending());
9210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.Connect(&session2_);
9220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->playout());
9230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->sending());
9240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->playout());
9250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->sending());
9260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel2_->Enable(true));
9270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel2_->playout());
9280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel2_->sending());
929f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
930f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org                                            CA_ANSWER, NULL));
9310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->playout());
9320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->sending());
9330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestMuteStream() {
9360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
9370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Test that we can Mute the default channel even though the sending SSRC is
9380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // unknown.
9390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
9400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->MuteStream(0, true));
9410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
9420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->MuteStream(0, false));
9430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Test that we can not mute an unknown SSRC.
9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->MuteStream(kSsrc1, true));
9470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    SendInitiate();
9490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // After the local session description has been set, we can mute a stream
9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // with its SSRC.
9510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->MuteStream(kSsrc1, true));
9520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
9530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->MuteStream(kSsrc1, false));
9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
9550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that changing the MediaContentDirection in the local and remote
9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // session description start playout and sending at the right time.
9590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestMediaContentDirection() {
9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
9610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content1;
9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content1);
9630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content2;
9640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content2);
9650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Set |content2| to be InActive.
9660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content2.set_direction(cricket::MD_INACTIVE);
9670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->Enable(true));
9690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel2_->Enable(true));
9700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->playout());
9710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->sending());
9720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->playout());
9730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->sending());
9740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
975f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
976f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
977f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
978f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
9790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.Connect(&session2_);
9800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->playout());
9820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->sending());  // remote InActive
9830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->playout());  // local InActive
9840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->sending());  // local InActive
9850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Update |content2| to be RecvOnly.
9870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content2.set_direction(cricket::MD_RECVONLY);
988f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
989f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
9900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->playout());
9920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->sending());
9930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel2_->playout());  // local RecvOnly
9940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->sending());  // local RecvOnly
9950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Update |content2| to be SendRecv.
9970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content2.set_direction(cricket::MD_SENDRECV);
998f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
999f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
10000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->playout());
10020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->sending());
10030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel2_->playout());
10040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel2_->sending());
10050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test setting up a call.
10080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestCallSetup() {
10090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
10100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->secure());
10110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
10120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->playout());
10130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->sending());
10140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
10150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->secure());
10160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->sending());
10170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, media_channel1_->codecs().size());
10180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel2_->playout());
10190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel2_->sending());
10200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, media_channel2_->codecs().size());
10210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that we don't crash if packets are sent during call teardown
10240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // when RTCP mux is enabled. This is a regression test against a specific
10250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // race condition that would only occur when a RTCP packet was sent during
10260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // teardown of a channel on which RTCP mux was enabled.
10270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestCallTeardownRtcpMux() {
10280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    class LastWordMediaChannel : public T::MediaChannel {
10290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     public:
10300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LastWordMediaChannel() : T::MediaChannel(NULL) {}
10310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ~LastWordMediaChannel() {
10320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame));
10330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
10340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
10350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    };
10360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(new LastWordMediaChannel(), new LastWordMediaChannel(),
10370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   RTCP | RTCP_MUX, RTCP | RTCP_MUX,
10382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                   rtc::Thread::Current());
10390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
10400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
10410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendTerminate());
10420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Send voice RTP data to the other side and ensure it gets there.
10450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendRtpToRtp() {
10460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
10470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
10480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
10490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport1()->channels().size());
10500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport2()->channels().size());
10510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp1());
10520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp2());
10530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp1());
10540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp2());
10550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
10560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
10570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check that RTCP is not transmitted if both sides don't support RTCP.
10600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendNoRtcpToNoRtcp() {
10610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
10620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
10630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
10640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport1()->channels().size());
10650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport2()->channels().size());
10660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(SendRtcp1());
10670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(SendRtcp2());
10680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp1());
10690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
10700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check that RTCP is not transmitted if the callee doesn't support RTCP.
10730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendNoRtcpToRtcp() {
10740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, RTCP);
10750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
10760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
10770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport1()->channels().size());
10780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport2()->channels().size());
10790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(SendRtcp1());
10800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(SendRtcp2());
10810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp1());
10820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
10830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check that RTCP is not transmitted if the caller doesn't support RTCP.
10860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendRtcpToNoRtcp() {
10870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP, 0);
10880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
10890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
10900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport1()->channels().size());
10910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport2()->channels().size());
10920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(SendRtcp1());
10930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(SendRtcp2());
10940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp1());
10950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
10960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check that RTCP is transmitted if both sides support RTCP.
10990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendRtcpToRtcp() {
11000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP, RTCP);
11010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
11020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
11030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport1()->channels().size());
11040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport2()->channels().size());
11050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp1());
11060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp2());
11070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp1());
11080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp2());
11090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp1());
11100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
11110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check that RTCP is transmitted if only the initiator supports mux.
11140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendRtcpMuxToRtcp() {
11150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP | RTCP_MUX, RTCP);
11160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
11170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
11180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport1()->channels().size());
11190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport2()->channels().size());
11200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp1());
11210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp2());
11220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp1());
11230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp2());
11240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp1());
11250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
11260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check that RTP and RTCP are transmitted ok when both sides support mux.
11290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendRtcpMuxToRtcpMux() {
11300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP | RTCP_MUX, RTCP | RTCP_MUX);
11310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
11320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport1()->channels().size());
11330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport2()->channels().size());
11340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
11350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport1()->channels().size());
11360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp1());
11370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp2());
11380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp1());
11390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp2());
11400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp1());
11410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp2());
11420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
11430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
11440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp1());
11450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp2());
11460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp1());
11470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
11480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check that RTCP data sent by the initiator before the accept is not muxed.
11510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendEarlyRtcpMuxToRtcp() {
11520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP | RTCP_MUX, RTCP);
11530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
11540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport1()->channels().size());
11550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport2()->channels().size());
11560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // RTCP can be sent before the call is accepted, if the transport is ready.
11580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // It should not be muxed though, as the remote side doesn't support mux.
11590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp1());
11600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
11610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp2());
11620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Send RTCP packet from callee and verify that it is received.
11640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp2());
11650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
11660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp1());
11670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Complete call setup and ensure everything is still OK.
11690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
11700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport1()->channels().size());
11710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp1());
11720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp2());
11730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp2());
11740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp1());
11750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Check that RTCP data is not muxed until both sides have enabled muxing,
11790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // but that we properly demux before we get the accept message, since there
11800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // is a race between RTP data and the jingle accept.
11810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendEarlyRtcpMuxToRtcpMux() {
11820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP | RTCP_MUX, RTCP | RTCP_MUX);
11830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
11840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport1()->channels().size());
11850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport2()->channels().size());
11860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // RTCP can't be sent yet, since the RTCP transport isn't writable, and
11880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // we haven't yet received the accept that says we should mux.
11890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(SendRtcp1());
11900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Send muxed RTCP packet from callee and verify that it is received.
11920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp2());
11930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
11940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp1());
11950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Complete call setup and ensure everything is still OK.
11970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
11980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport1()->channels().size());
11990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp1());
12000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp2());
12010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp2());
12020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp1());
12030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that we properly send SRTP with RTCP in both directions.
12060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // You can pass in DTLS and/or RTCP_MUX as flags.
12070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
12080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT((flags1_in & ~(RTCP_MUX | DTLS)) == 0);
12090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT((flags2_in & ~(RTCP_MUX | DTLS)) == 0);
12100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int flags1 = RTCP | SECURE | flags1_in;
12120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int flags2 = RTCP | SECURE | flags2_in;
12130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool dtls1 = !!(flags1_in & DTLS);
12140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool dtls2 = !!(flags2_in & DTLS);
12150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(flags1, flags2);
12160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->secure());
12170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel2_->secure());
12180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
12190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(channel1_->writable(), kEventTimeout);
12200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(channel2_->writable(), kEventTimeout);
12210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
12220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->secure());
12230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel2_->secure());
12240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(dtls1 && dtls2, channel1_->secure_dtls());
12250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(dtls1 && dtls2, channel2_->secure_dtls());
12260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp1());
12270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp2());
12280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp1());
12290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp2());
12300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp1());
12310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp2());
12320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
12330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
12340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp1());
12350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp2());
12360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp1());
12370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
12380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that we properly handling SRTP negotiating down to RTP.
12410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendSrtpToRtp() {
12420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP | SECURE, RTCP);
12430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->secure());
12440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel2_->secure());
12450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
12460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
12470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->secure());
12480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel2_->secure());
12490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp1());
12500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp2());
12510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp1());
12520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtcp2());
12530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp1());
12540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp2());
12550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
12560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
12570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp1());
12580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp2());
12590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp1());
12600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
12610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that we can send and receive early media when a provisional answer is
12640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
12650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendEarlyMediaUsingRtcpMuxSrtp() {
12660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int sequence_number1_1 = 0, sequence_number2_2 = 0;
12670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      CreateChannels(SSRC_MUX | RTCP | RTCP_MUX | SECURE,
12690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     SSRC_MUX | RTCP | RTCP_MUX | SECURE);
12700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(SendOffer());
12710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(SendProvisionalAnswer());
12720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(channel1_->secure());
12730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(channel2_->secure());
12740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(2U, GetTransport1()->channels().size());
12750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(2U, GetTransport2()->channels().size());
12760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(SendCustomRtcp1(kSsrc1));
12770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
12780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(SendCustomRtp1(kSsrc1, ++sequence_number1_1));
12790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
12800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Send packets from callee and verify that it is received.
12820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(SendCustomRtcp2(kSsrc2));
12830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
12840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(SendCustomRtp2(kSsrc2, ++sequence_number2_2));
12850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
12860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Complete call setup and ensure everything is still OK.
12880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(SendFinalAnswer());
12890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(1U, GetTransport1()->channels().size());
12900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(1U, GetTransport2()->channels().size());
12910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(channel1_->secure());
12920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(channel2_->secure());
12930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(SendCustomRtcp1(kSsrc1));
12940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
12950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(SendCustomRtp1(kSsrc1, ++sequence_number1_1));
12960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
12970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(SendCustomRtcp2(kSsrc2));
12980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
12990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(SendCustomRtp2(kSsrc2, ++sequence_number2_2));
13000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
13010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
13020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that we properly send RTP without SRTP from a thread.
13040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendRtpToRtpOnThread() {
13057634b1949e4b3a288a6c908ccbf422134ab45f97buildbot@webrtc.org    bool sent_rtp1, sent_rtp2, sent_rtcp1, sent_rtcp2;
13067634b1949e4b3a288a6c908ccbf422134ab45f97buildbot@webrtc.org    CreateChannels(RTCP, RTCP);
13070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
13080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
13090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CallOnThread(&ChannelTest<T>::SendRtp1, &sent_rtp1);
13100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CallOnThread(&ChannelTest<T>::SendRtp2, &sent_rtp2);
13117634b1949e4b3a288a6c908ccbf422134ab45f97buildbot@webrtc.org    CallOnThread(&ChannelTest<T>::SendRtcp1, &sent_rtcp1);
13127634b1949e4b3a288a6c908ccbf422134ab45f97buildbot@webrtc.org    CallOnThread(&ChannelTest<T>::SendRtcp2, &sent_rtcp2);
13130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(CheckRtp1(), 1000);
13140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(CheckRtp2(), 1000);
13150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(sent_rtp1, 1000);
13160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(sent_rtp2, 1000);
13170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
13180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
13190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(CheckRtcp1(), 1000);
13200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(CheckRtcp2(), 1000);
13210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(sent_rtcp1, 1000);
13220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(sent_rtcp2, 1000);
13230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp1());
13240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
13250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
13260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that we properly send SRTP with RTCP from a thread.
13280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendSrtpToSrtpOnThread() {
13290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool sent_rtp1, sent_rtp2, sent_rtcp1, sent_rtcp2;
13300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP | SECURE, RTCP | SECURE);
13310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
13320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
13330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CallOnThread(&ChannelTest<T>::SendRtp1, &sent_rtp1);
13340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CallOnThread(&ChannelTest<T>::SendRtp2, &sent_rtp2);
13350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CallOnThread(&ChannelTest<T>::SendRtcp1, &sent_rtcp1);
13360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CallOnThread(&ChannelTest<T>::SendRtcp2, &sent_rtcp2);
13370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(CheckRtp1(), 1000);
13380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(CheckRtp2(), 1000);
13390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(sent_rtp1, 1000);
13400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(sent_rtp2, 1000);
13410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
13420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
13430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(CheckRtcp1(), 1000);
13440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(CheckRtcp2(), 1000);
13450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(sent_rtcp1, 1000);
13460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(sent_rtcp2, 1000);
13470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp1());
13480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
13490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
13500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that the mediachannel retains its sending state after the transport
13520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // becomes non-writable.
13530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SendWithWritabilityLoss() {
13540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
13550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
13560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
13570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport1()->channels().size());
13580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1U, GetTransport2()->channels().size());
13590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp1());
13600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp2());
13610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp1());
13620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp2());
13630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
13640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
13650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13665c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    // Lose writability, which should fail.
13670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    GetTransport1()->SetWritable(false);
13680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(SendRtp1());
13690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp2());
13700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp1());
13710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
13720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Regain writability
13740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    GetTransport1()->SetWritable(true);
13750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->sending());
13760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp1());
13770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp2());
13780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp1());
13790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp2());
13800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
13810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
13820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Lose writability completely
13840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    GetTransport1()->SetDestination(NULL);
13850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->sending());
13860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13875c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    // Should fail also.
13880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(SendRtp1());
13890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp2());
13900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp1());
13910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
13920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Gain writability back
13940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    GetTransport1()->SetDestination(GetTransport2());
13950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->sending());
13960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp1());
13970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp2());
13980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp1());
13990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtp2());
14000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
14010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
14020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
14030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1404907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  void SendBundleToBundle(
1405907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org      const int* pl_types, int len, bool rtcp_mux, bool secure) {
1406907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    ASSERT_EQ(2, len);
14070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int sequence_number1_1 = 0, sequence_number2_2 = 0;
1408907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    // Only pl_type1 was added to the bundle filter for both |channel1_|
1409907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    // and |channel2_|.
1410907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    int pl_type1 = pl_types[0];
1411907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    int pl_type2 = pl_types[1];
1412907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    int flags = SSRC_MUX | RTCP;
1413907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    if (secure) flags |= SECURE;
1414907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    uint32 expected_channels = 2U;
1415907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    if (rtcp_mux) {
1416907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org      flags |= RTCP_MUX;
1417907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org      expected_channels = 1U;
1418907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    }
1419907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    CreateChannels(flags, flags);
14200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
14210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport1()->channels().size());
1422907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_EQ(expected_channels, GetTransport2()->channels().size());
14230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
1424907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_EQ(expected_channels, GetTransport1()->channels().size());
1425907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_EQ(expected_channels, GetTransport2()->channels().size());
1426907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(channel1_->bundle_filter()->FindPayloadType(pl_type1));
1427907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(channel2_->bundle_filter()->FindPayloadType(pl_type1));
1428907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_FALSE(channel1_->bundle_filter()->FindPayloadType(pl_type2));
1429907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_FALSE(channel2_->bundle_filter()->FindPayloadType(pl_type2));
1430907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    // channel1 - should only have media_content2 as remote. i.e. kSsrc2
1431907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(channel1_->bundle_filter()->FindStream(kSsrc2));
1432907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_FALSE(channel1_->bundle_filter()->FindStream(kSsrc1));
1433907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    // channel2 - should only have media_content1 as remote. i.e. kSsrc1
1434907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(channel2_->bundle_filter()->FindStream(kSsrc1));
1435907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_FALSE(channel2_->bundle_filter()->FindStream(kSsrc2));
1436907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
1437907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    // Both channels can receive pl_type1 only.
1438907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1));
1439907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
1440907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1));
1441907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
14420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp1());
14430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtp2());
1444907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
1445907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    // RTCP test
1446907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2));
1447907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
1448907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2));
1449907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1450907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
1451907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(SendCustomRtcp1(kSsrc1));
1452907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(SendCustomRtcp2(kSsrc2));
14530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
14540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp1());
14550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
14560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
14570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1458907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(SendCustomRtcp1(kSsrc2));
1459907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    EXPECT_TRUE(SendCustomRtcp2(kSsrc1));
14600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(CheckCustomRtcp1(kSsrc1));
14610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(CheckCustomRtcp2(kSsrc2));
14620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
14630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Test that the media monitor can be run and gives timely callbacks.
14650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestMediaMonitor() {
14660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    static const int kTimeout = 500;
14670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
14680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
14690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
14700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->StartMediaMonitor(100);
14710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->StartMediaMonitor(100);
14720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Ensure we get callbacks and stop.
14730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kTimeout);
14740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kTimeout);
14750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->StopMediaMonitor();
14760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->StopMediaMonitor();
14770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Ensure a restart of a stopped monitor works.
14780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->StartMediaMonitor(100);
14790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kTimeout);
14800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->StopMediaMonitor();
14810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Ensure stopping a stopped monitor is OK.
14820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->StopMediaMonitor();
14830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
14840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestMediaSinks() {
14860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
14870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
14880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
14890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->HasSendSinks(cricket::SINK_POST_CRYPTO));
14900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->HasRecvSinks(cricket::SINK_POST_CRYPTO));
14910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->HasSendSinks(cricket::SINK_PRE_CRYPTO));
14920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->HasRecvSinks(cricket::SINK_PRE_CRYPTO));
14930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
14942a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::Pathname path;
14952a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    EXPECT_TRUE(rtc::Filesystem::GetTemporaryFolder(path, true, NULL));
14960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    path.SetFilename("sink-test.rtpdump");
14972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::scoped_ptr<cricket::RtpDumpSink> sink(
14980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        new cricket::RtpDumpSink(Open(path.pathname())));
14990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sink->set_packet_filter(cricket::PF_ALL);
15000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(sink->Enable(true));
15010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->RegisterSendSink(
15020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        sink.get(), &cricket::RtpDumpSink::OnPacket, cricket::SINK_POST_CRYPTO);
15030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->HasSendSinks(cricket::SINK_POST_CRYPTO));
15040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->HasRecvSinks(cricket::SINK_POST_CRYPTO));
15050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->HasSendSinks(cricket::SINK_PRE_CRYPTO));
15060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->HasRecvSinks(cricket::SINK_PRE_CRYPTO));
15070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // The first packet is recorded with header + data.
15090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp1());
15100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // The second packet is recorded with header only.
15110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sink->set_packet_filter(cricket::PF_RTPHEADER);
15120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp1());
15130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // The third packet is not recorded since sink is disabled.
15140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(sink->Enable(false));
15150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp1());
15160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     // The fourth packet is not recorded since sink is unregistered.
15170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(sink->Enable(true));
15180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->UnregisterSendSink(sink.get(), cricket::SINK_POST_CRYPTO);
15190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendRtp1());
15200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sink.reset();  // This will close the file.
15210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Read the recorded file and verify two packets.
15232a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::scoped_ptr<rtc::StreamInterface> stream(
15242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        rtc::Filesystem::OpenFile(path, "rb"));
15250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::RtpDumpReader reader(stream.get());
15270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::RtpDumpPacket packet;
15282a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    EXPECT_EQ(rtc::SR_SUCCESS, reader.ReadPacket(&packet));
15290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string read_packet(reinterpret_cast<const char*>(&packet.data[0]),
15300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        packet.data.size());
15310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(rtp_packet_, read_packet);
15320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15332a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    EXPECT_EQ(rtc::SR_SUCCESS, reader.ReadPacket(&packet));
15340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    size_t len = 0;
15350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    packet.GetRtpHeaderLen(&len);
15360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(len, packet.data.size());
15370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0, memcmp(&packet.data[0], rtp_packet_.c_str(), len));
15380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    EXPECT_EQ(rtc::SR_EOS, reader.ReadPacket(&packet));
15400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Delete the file for media recording.
15420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stream.reset();
15432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    EXPECT_TRUE(rtc::Filesystem::DeleteFile(path));
15440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
15450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSetContentFailure() {
15470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
15480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content;
15490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::SessionDescription* sdesc_loc = new cricket::SessionDescription();
15500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::SessionDescription* sdesc_rem = new cricket::SessionDescription();
15510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Set up the session description.
15530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content);
15540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sdesc_loc->AddContent(cricket::CN_AUDIO, cricket::NS_JINGLE_RTP,
15550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          new cricket::AudioContentDescription());
15560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sdesc_loc->AddContent(cricket::CN_VIDEO, cricket::NS_JINGLE_RTP,
15570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          new cricket::VideoContentDescription());
155832a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_local_description(sdesc_loc);
15590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sdesc_rem->AddContent(cricket::CN_AUDIO, cricket::NS_JINGLE_RTP,
15600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          new cricket::AudioContentDescription());
15610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sdesc_rem->AddContent(cricket::CN_VIDEO, cricket::NS_JINGLE_RTP,
15620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          new cricket::VideoContentDescription());
156332a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_remote_description(sdesc_rem);
15640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Test failures in SetLocalContent.
15660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    media_channel1_->set_fail_set_recv_codecs(true);
1567f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    session1_.SetError(cricket::BaseSession::ERROR_NONE, "");
15680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_SENTINITIATE);
15690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_CONTENT, session1_.error());
15700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    media_channel1_->set_fail_set_recv_codecs(true);
1571f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    session1_.SetError(cricket::BaseSession::ERROR_NONE, "");
15720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_SENTACCEPT);
15730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_CONTENT, session1_.error());
15740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Test failures in SetRemoteContent.
15760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    media_channel1_->set_fail_set_send_codecs(true);
1577f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    session1_.SetError(cricket::BaseSession::ERROR_NONE, "");
15780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_RECEIVEDINITIATE);
15790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_CONTENT, session1_.error());
15800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    media_channel1_->set_fail_set_send_codecs(true);
1581f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    session1_.SetError(cricket::BaseSession::ERROR_NONE, "");
15820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_RECEIVEDACCEPT);
15830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_CONTENT, session1_.error());
15840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
15850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSendTwoOffers() {
15870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
15880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Set up the initial session description.
15900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::SessionDescription* sdesc = CreateSessionDescriptionWithStream(1);
159132a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_local_description(sdesc);
15920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1593f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    session1_.SetError(cricket::BaseSession::ERROR_NONE, "");
15940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_SENTINITIATE);
15950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error());
15960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasSendStream(1));
15970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
15980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Update the local description and set the state again.
15990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sdesc = CreateSessionDescriptionWithStream(2);
160032a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_local_description(sdesc);
16010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_SENTINITIATE);
16030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error());
16040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->HasSendStream(1));
16050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasSendStream(2));
16060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
16070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestReceiveTwoOffers() {
16090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
16100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Set up the initial session description.
16120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::SessionDescription* sdesc = CreateSessionDescriptionWithStream(1);
161332a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_remote_description(sdesc);
16140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1615f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    session1_.SetError(cricket::BaseSession::ERROR_NONE, "");
16160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_RECEIVEDINITIATE);
16170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error());
16180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasRecvStream(1));
16190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sdesc = CreateSessionDescriptionWithStream(2);
162132a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_remote_description(sdesc);
16220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_RECEIVEDINITIATE);
16230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error());
16240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->HasRecvStream(1));
16250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasRecvStream(2));
16260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
16270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSendPrAnswer() {
16290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
16300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Set up the initial session description.
16320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::SessionDescription* sdesc = CreateSessionDescriptionWithStream(1);
163332a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_remote_description(sdesc);
16340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1635f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    session1_.SetError(cricket::BaseSession::ERROR_NONE, "");
16360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_RECEIVEDINITIATE);
16370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error());
16380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasRecvStream(1));
16390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Send PRANSWER
16410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sdesc = CreateSessionDescriptionWithStream(2);
164232a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_local_description(sdesc);
16430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_SENTPRACCEPT);
16450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error());
16460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasRecvStream(1));
16470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasSendStream(2));
16480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Send ACCEPT
16500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sdesc = CreateSessionDescriptionWithStream(3);
165132a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_local_description(sdesc);
16520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_SENTACCEPT);
16540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error());
16550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasRecvStream(1));
16560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->HasSendStream(2));
16570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasSendStream(3));
16580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
16590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestReceivePrAnswer() {
16610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
16620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Set up the initial session description.
16640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::SessionDescription* sdesc = CreateSessionDescriptionWithStream(1);
166532a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_local_description(sdesc);
16660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1667f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    session1_.SetError(cricket::BaseSession::ERROR_NONE, "");
16680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_SENTINITIATE);
16690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error());
16700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasSendStream(1));
16710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Receive PRANSWER
16730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sdesc = CreateSessionDescriptionWithStream(2);
167432a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_remote_description(sdesc);
16750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_RECEIVEDPRACCEPT);
16770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error());
16780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasSendStream(1));
16790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasRecvStream(2));
16800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Receive ACCEPT
16820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sdesc = CreateSessionDescriptionWithStream(3);
168332a0ac7e336c6132d7a48aa08fe2c912c0eb749etommi@webrtc.org    session1_.set_remote_description(sdesc);
16840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    session1_.SetState(cricket::Session::STATE_RECEIVEDACCEPT);
16860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error());
16870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasSendStream(1));
16880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->HasRecvStream(2));
16890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->HasRecvStream(3));
16900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
16910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestFlushRtcp() {
16930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool send_rtcp1;
16940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP, RTCP);
16960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
16970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
16980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport1()->channels().size());
16990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(2U, GetTransport2()->channels().size());
17000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Send RTCP1 from a different thread.
17020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CallOnThreadAndWaitForDone(&ChannelTest<T>::SendRtcp1, &send_rtcp1);
17030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(send_rtcp1);
17040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // The sending message is only posted.  channel2_ should be empty.
17050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckNoRtcp2());
17060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // When channel1_ is deleted, the RTCP packet should be sent out to
17080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // channel2_.
17090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_.reset();
17100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(CheckRtcp2());
17110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
17120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestChangeStateError() {
17140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP, RTCP);
17150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
17160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    media_channel2_->set_fail_set_send(true);
17170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel2_->Enable(true));
17180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_OPEN_FAILED,
17190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              error_);
17200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
17210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1722907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  void TestSrtpError(int pl_type) {
1723907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    // For Audio, only pl_type 0 is added to the bundle filter.
1724907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    // For Video, only pl_type 97 is added to the bundle filter.
1725907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    // So we need to pass in pl_type so that the packet can pass through
1726907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    // the bundle filter before it can be processed by the srtp filter.
1727907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org    // The packet is not a valid srtp packet because it is too short.
1728ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org    unsigned const char kBadPacket[] = {0x84,
1729ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org                                        static_cast<unsigned char>(pl_type),
1730ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org                                        0x00,
1731ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org                                        0x01,
1732ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org                                        0x00,
1733ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org                                        0x00,
1734ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org                                        0x00,
1735ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org                                        0x00,
1736ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org                                        0x00,
1737ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org                                        0x00,
1738ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org                                        0x00,
1739ffd44a8cc44412332ba4da7b5ace22217bd74983pbos@webrtc.org                                        0x01};
17400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP | SECURE, RTCP | SECURE);
17410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel1_->secure());
17420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(channel2_->secure());
17430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendInitiate());
17440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(SendAccept());
17450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->secure());
17460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel2_->secure());
17470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->set_srtp_signal_silent_time(200);
17480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Testing failures in sending packets.
17500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->SendRtp(kBadPacket, sizeof(kBadPacket)));
17510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // The first failure will trigger an error.
17520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ_WAIT(T::MediaChannel::ERROR_REC_SRTP_ERROR, error_, 500);
17530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    error_ = T::MediaChannel::ERROR_NONE;
17540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // The next 1 sec failures will not trigger an error.
17550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->SendRtp(kBadPacket, sizeof(kBadPacket)));
17560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Wait for a while to ensure no message comes in.
17572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::Thread::Current()->ProcessMessages(210);
17580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(T::MediaChannel::ERROR_NONE, error_);
17590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // The error will be triggered again.
17600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel2_->SendRtp(kBadPacket, sizeof(kBadPacket)));
17610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ_WAIT(T::MediaChannel::ERROR_REC_SRTP_ERROR, error_, 500);
17620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Testing failures in receiving packets.
17640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    error_ = T::MediaChannel::ERROR_NONE;
17650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::TransportChannel* transport_channel =
17660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        channel2_->transport_channel();
17670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    transport_channel->SignalReadPacket(
17680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        transport_channel, reinterpret_cast<const char*>(kBadPacket),
17692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        sizeof(kBadPacket), rtc::PacketTime(), 0);
1770569e45bc77872e360a1d114fda34f9690069ca01mallinath@webrtc.org    EXPECT_EQ_WAIT(T::MediaChannel::ERROR_PLAY_SRTP_ERROR, error_, 500);
17710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
17720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestOnReadyToSend() {
17740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP, RTCP);
17750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TransportChannel* rtp = channel1_->transport_channel();
17760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TransportChannel* rtcp = channel1_->rtcp_transport_channel();
17770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->ready_to_send());
17780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    rtp->SignalReadyToSend(rtp);
17790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->ready_to_send());
17800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    rtcp->SignalReadyToSend(rtcp);
17810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // MediaChannel::OnReadyToSend only be called when both rtp and rtcp
17820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // channel are ready to send.
17830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->ready_to_send());
17840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // rtp channel becomes not ready to send will be propagated to mediachannel
17860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SetReadyToSend(rtp, false);
17870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->ready_to_send());
17880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SetReadyToSend(rtp, true);
17890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->ready_to_send());
17900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // rtcp channel becomes not ready to send will be propagated to mediachannel
17920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SetReadyToSend(rtcp, false);
17930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->ready_to_send());
17940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SetReadyToSend(rtcp, true);
17950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->ready_to_send());
17960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
17970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestOnReadyToSendWithRtcpMux() {
17990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(RTCP, RTCP);
18000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typename T::Content content;
18010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateContent(0, kPcmuCodec, kH264Codec, &content);
18020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Both sides agree on mux. Should no longer be a separate RTCP channel.
18030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    content.set_rtcp_mux(true);
1804f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
1805f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
18060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(channel1_->rtcp_transport_channel() == NULL);
18070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TransportChannel* rtp = channel1_->transport_channel();
18080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->ready_to_send());
18090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
18100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // should trigger the MediaChannel's OnReadyToSend.
18110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    rtp->SignalReadyToSend(rtp);
18120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->ready_to_send());
18130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SetReadyToSend(rtp, false);
18140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(media_channel1_->ready_to_send());
18150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
18160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
18180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeSession session1_;
18190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeSession session2_;
18200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeMediaEngine media_engine_;
18210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // The media channels are owned by the voice channel objects below.
18220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typename T::MediaChannel* media_channel1_;
18230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typename T::MediaChannel* media_channel2_;
18242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<typename T::Channel> channel1_;
18252a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<typename T::Channel> channel2_;
18260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typename T::Content local_media_content1_;
18270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typename T::Content local_media_content2_;
18280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typename T::Content remote_media_content1_;
18290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typename T::Content remote_media_content2_;
18302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<rtc::SSLIdentity> identity1_;
18312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<rtc::SSLIdentity> identity2_;
18320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // The RTP and RTCP packets to send in the tests.
18330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string rtp_packet_;
18340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string rtcp_packet_;
18350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int media_info_callbacks1_;
18360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int media_info_callbacks2_;
18370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool mute_callback_recved_;
18380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool mute_callback_value_;
18390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  uint32 ssrc_;
18410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typename T::MediaChannel::Error error_;
18420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
18430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
18460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid ChannelTest<VoiceTraits>::CreateContent(
18470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int flags,
18480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::AudioCodec& audio_codec,
18490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::VideoCodec& video_codec,
18500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::AudioContentDescription* audio) {
18510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  audio->AddCodec(audio_codec);
18520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
18530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (flags & SECURE) {
18540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    audio->AddCrypto(cricket::CryptoParams(
18550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        1, cricket::CS_AES_CM_128_HMAC_SHA1_32,
18562a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        "inline:" + rtc::CreateRandomString(40), ""));
18570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
18580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
18590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
18610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid ChannelTest<VoiceTraits>::CopyContent(
18620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::AudioContentDescription& source,
18630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::AudioContentDescription* audio) {
18640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  *audio = source;
18650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
18660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
18680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
18690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                            const cricket::AudioCodec& c2) {
18700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return c1.name == c2.name && c1.clockrate == c2.clockrate &&
18710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      c1.bitrate == c2.bitrate && c1.channels == c2.channels;
18720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
18730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
18750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
18760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    uint32 ssrc, int flags, cricket::AudioContentDescription* audio) {
18770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  audio->AddLegacyStream(ssrc);
18780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
18790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass VoiceChannelTest
18810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    : public ChannelTest<VoiceTraits> {
18820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
18830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef ChannelTest<VoiceTraits>
18840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base;
18850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VoiceChannelTest() : Base(kPcmuFrame, sizeof(kPcmuFrame),
18860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            kRtcpReport, sizeof(kRtcpReport)) {
18870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
18880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSetChannelOptions() {
18900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
18910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::AudioOptions options1;
18930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    options1.echo_cancellation.Set(false);
18940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::AudioOptions options2;
18950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    options2.echo_cancellation.Set(true);
18960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SetChannelOptions(options1);
18980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->SetChannelOptions(options1);
18990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::AudioOptions actual_options;
19000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_TRUE(media_channel1_->GetOptions(&actual_options));
19010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(options1, actual_options);
19020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_TRUE(media_channel2_->GetOptions(&actual_options));
19030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(options1, actual_options);
19040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SetChannelOptions(options2);
19060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->SetChannelOptions(options2);
19070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_TRUE(media_channel1_->GetOptions(&actual_options));
19080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(options2, actual_options);
19090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT_TRUE(media_channel2_->GetOptions(&actual_options));
19100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(options2, actual_options);
19110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
19120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
19130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// override to add NULL parameter
19150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
19160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgcricket::VideoChannel* ChannelTest<VideoTraits>::CreateChannel(
19172a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::Thread* thread, cricket::MediaEngineInterface* engine,
19180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::FakeVideoMediaChannel* ch, cricket::BaseSession* session,
19190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool rtcp) {
19200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoChannel* channel = new cricket::VideoChannel(
19210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      thread, engine, ch, session, cricket::CN_VIDEO, rtcp, NULL);
19220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (!channel->Init()) {
19230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    delete channel;
19240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel = NULL;
19250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
19260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return channel;
19270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
19280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// override to add 0 parameter
19300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
19310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool ChannelTest<VideoTraits>::AddStream1(int id) {
19320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
19330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
19340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
19360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid ChannelTest<VideoTraits>::CreateContent(
19370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int flags,
19380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::AudioCodec& audio_codec,
19390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::VideoCodec& video_codec,
19400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::VideoContentDescription* video) {
19410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  video->AddCodec(video_codec);
19420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  video->set_rtcp_mux((flags & RTCP_MUX) != 0);
19430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (flags & SECURE) {
19440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    video->AddCrypto(cricket::CryptoParams(
19450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        1, cricket::CS_AES_CM_128_HMAC_SHA1_80,
19462a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        "inline:" + rtc::CreateRandomString(40), ""));
19470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
19480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
19490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
19510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid ChannelTest<VideoTraits>::CopyContent(
19520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::VideoContentDescription& source,
19530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::VideoContentDescription* video) {
19540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  *video = source;
19550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
19560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
19580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
19590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                            const cricket::VideoCodec& c2) {
19600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return c1.name == c2.name && c1.width == c2.width && c1.height == c2.height &&
19610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      c1.framerate == c2.framerate;
19620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
19630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
19650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid ChannelTest<VideoTraits>::AddLegacyStreamInContent(
19660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    uint32 ssrc, int flags, cricket::VideoContentDescription* video) {
19670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  video->AddLegacyStream(ssrc);
19680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
19690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass VideoChannelTest
19710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    : public ChannelTest<VideoTraits> {
19720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
19730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef ChannelTest<VideoTraits>
19740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base;
19750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoChannelTest() : Base(kH264Packet, sizeof(kH264Packet),
19760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            kRtcpReport, sizeof(kRtcpReport)) {
19770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
19780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSetChannelOptions() {
19800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(0, 0);
19810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::VideoOptions o1, o2;
19830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    o1.video_noise_reduction.Set(true);
19840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SetChannelOptions(o1);
19860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->SetChannelOptions(o1);
19870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->GetOptions(&o2));
19880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(o1, o2);
19890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel2_->GetOptions(&o2));
19900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(o1, o2);
19910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
19920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    o1.video_leaky_bucket.Set(true);
19930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel1_->SetChannelOptions(o1);
19940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel2_->SetChannelOptions(o1);
19950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel1_->GetOptions(&o2));
19960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(o1, o2);
19970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(media_channel2_->GetOptions(&o2));
19980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(o1, o2);
19990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
20000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
20010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// VoiceChannelTest
20040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestInit) {
20060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestInit();
20070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
20080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
20090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestSetContents) {
20120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContents();
20130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestSetContentsNullOffer) {
20160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContentsNullOffer();
20170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestSetContentsRtcpMux) {
20200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContentsRtcpMux();
20210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestSetContentsRtcpMuxWithPrAnswer) {
20240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContentsRtcpMux();
20250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestSetRemoteContentUpdate) {
20280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetRemoteContentUpdate();
20290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestStreams) {
20320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestStreams();
20330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestUpdateStreamsInLocalContent) {
20360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestUpdateStreamsInLocalContent();
20370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestUpdateRemoteStreamsInContent) {
20400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestUpdateStreamsInRemoteContent();
20410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestChangeStreamParamsInContent) {
20440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestChangeStreamParamsInContent();
20450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestPlayoutAndSendingStates) {
20480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestPlayoutAndSendingStates();
20490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestMuteStream) {
20520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestMuteStream();
20530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestMediaContentDirection) {
20560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestMediaContentDirection();
20570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestCallSetup) {
20600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestCallSetup();
20610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestCallTeardownRtcpMux) {
20640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestCallTeardownRtcpMux();
20650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendRtpToRtp) {
20680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtpToRtp();
20690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendNoRtcpToNoRtcp) {
20720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendNoRtcpToNoRtcp();
20730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendNoRtcpToRtcp) {
20760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendNoRtcpToRtcp();
20770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendRtcpToNoRtcp) {
20800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpToNoRtcp();
20810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendRtcpToRtcp) {
20840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpToRtcp();
20850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendRtcpMuxToRtcp) {
20880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpMuxToRtcp();
20890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendRtcpMuxToRtcpMux) {
20920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpMuxToRtcpMux();
20930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendEarlyRtcpMuxToRtcp) {
20960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendEarlyRtcpMuxToRtcp();
20970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
20980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
20990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendEarlyRtcpMuxToRtcpMux) {
21000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendEarlyRtcpMuxToRtcpMux();
21010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendSrtpToSrtpRtcpMux) {
21040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
21050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendSrtpToRtp) {
21080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp();
21090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendSrtcpMux) {
21120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
21130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendDtlsSrtpToSrtp) {
21160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MAYBE_SKIP_TEST(HaveDtlsSrtp);
21170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp(DTLS, 0);
21180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendDtlsSrtpToDtlsSrtp) {
21210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MAYBE_SKIP_TEST(HaveDtlsSrtp);
21220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp(DTLS, DTLS);
21230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
21260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MAYBE_SKIP_TEST(HaveDtlsSrtp);
21270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
21280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendEarlyMediaUsingRtcpMuxSrtp) {
21310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendEarlyMediaUsingRtcpMuxSrtp();
21320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendRtpToRtpOnThread) {
21350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtpToRtpOnThread();
21360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendSrtpToSrtpOnThread) {
21390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtpOnThread();
21400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, SendWithWritabilityLoss) {
21430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendWithWritabilityLoss();
21440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestMediaMonitor) {
21470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestMediaMonitor();
21480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that MuteStream properly forwards to the media channel and does
21510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// not signal.
21520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestVoiceSpecificMuteStream) {
21530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(0, 0);
21540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
21550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(mute_callback_recved_);
21560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->MuteStream(0, true));
21570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
21580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(mute_callback_recved_);
21590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->MuteStream(0, false));
21600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
21610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(mute_callback_recved_);
21620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that keyboard automute works correctly and signals upwards.
21657262c0074086d60e77a075d336d2594fa0234b92asapersson@webrtc.orgTEST_F(VoiceChannelTest, DISABLED_TestKeyboardMute) {
21660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(0, 0);
21670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
21680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_NONE, error_);
21690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VoiceMediaChannel::Error e =
21710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VoiceMediaChannel::ERROR_REC_TYPING_NOISE_DETECTED;
21720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Typing doesn't mute automatically unless typing monitor has been installed
21740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  media_channel1_->TriggerError(0, e);
21752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::Thread::Current()->ProcessMessages(0);
21760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(e, error_);
21770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
21780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(mute_callback_recved_);
21790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::TypingMonitorOptions o = {0};
21810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  o.mute_period = 1500;
21820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel1_->StartTypingMonitor(o);
21830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  media_channel1_->TriggerError(0, e);
21842a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::Thread::Current()->ProcessMessages(0);
21850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
21860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(mute_callback_recved_);
21870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
21880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that PressDTMF properly forwards to the media channel.
21900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestDtmf) {
21910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(0, 0);
21920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendInitiate());
21930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendAccept());
21940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
21950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->PressDTMF(1, true));
21970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->PressDTMF(8, false));
21980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
21990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_EQ(2U, media_channel1_->dtmf_info_queue().size());
22000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
22010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              0, 1, 160, cricket::DF_PLAY | cricket::DF_SEND));
22020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
22030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              0, 8, 160, cricket::DF_SEND));
22040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that InsertDtmf properly forwards to the media channel.
22070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestInsertDtmf) {
22080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(0, 0);
22090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendInitiate());
22100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendAccept());
22110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
22120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100, cricket::DF_SEND));
22140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110, cricket::DF_PLAY));
22150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120,
22160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                    cricket::DF_PLAY | cricket::DF_SEND));
22170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2218692d748e58db01318ef10a7a19147da601e13e93henrike@webrtc.org  ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
22190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
22200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              1, 3, 100, cricket::DF_SEND));
2221692d748e58db01318ef10a7a19147da601e13e93henrike@webrtc.org  EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
22220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              2, 5, 110, cricket::DF_PLAY));
2223692d748e58db01318ef10a7a19147da601e13e93henrike@webrtc.org  EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
22240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              3, 7, 120, cricket::DF_PLAY | cricket::DF_SEND));
22250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestMediaSinks) {
22280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestMediaSinks();
22290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestSetContentFailure) {
22320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContentFailure();
22330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestSendTwoOffers) {
22360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSendTwoOffers();
22370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestReceiveTwoOffers) {
22400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestReceiveTwoOffers();
22410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestSendPrAnswer) {
22440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSendPrAnswer();
22450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestReceivePrAnswer) {
22480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestReceivePrAnswer();
22490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestFlushRtcp) {
22520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestFlushRtcp();
22530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestChangeStateError) {
22560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestChangeStateError();
22570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestSrtpError) {
2260907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  Base::TestSrtpError(kAudioPts[0]);
22610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestOnReadyToSend) {
22640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestOnReadyToSend();
22650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestOnReadyToSendWithRtcpMux) {
22680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestOnReadyToSendWithRtcpMux();
22690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can play a ringback tone properly.
22720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestRingbackTone) {
22730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(RTCP, RTCP);
22740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->ringback_tone_play());
22750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->SetRingbackTone("RIFF", 4));
22760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendInitiate());
22770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendAccept());
22780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Play ringback tone, no loop.
22790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->PlayRingbackTone(0, true, false));
22800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0U, media_channel1_->ringback_tone_ssrc());
22810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->ringback_tone_play());
22820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->ringback_tone_loop());
22830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Stop the ringback tone.
22840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->PlayRingbackTone(0, false, false));
22850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->ringback_tone_play());
22860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Add a stream.
22870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(AddStream1(1));
22880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Play ringback tone, looping, on the new stream.
22890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->PlayRingbackTone(1, true, true));
22900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1U, media_channel1_->ringback_tone_ssrc());
22910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->ringback_tone_play());
22920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->ringback_tone_loop());
22930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Stop the ringback tone.
22940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->PlayRingbackTone(1, false, false));
22950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->ringback_tone_play());
22960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
22970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
22980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can scale the output volume properly for 1:1 calls.
22990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestScaleVolume1to1Call) {
23000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(RTCP, RTCP);
23010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendInitiate());
23020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendAccept());
23030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  double left, right;
23040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Default is (1.0, 1.0).
23060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
23070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, left);
23080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, right);
23090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // invalid ssrc.
23100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->GetOutputScaling(3, &left, &right));
23110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Set scale to (1.5, 0.5).
23130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->SetOutputScaling(0, 1.5, 0.5));
23140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
23150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.5, left);
23160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(0.5, right);
23170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Set scale to (0, 0).
23190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->SetOutputScaling(0, 0.0, 0.0));
23200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
23210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(0.0, left);
23220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(0.0, right);
23230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
23240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can scale the output volume properly for multiway calls.
23260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestScaleVolumeMultiwayCall) {
23270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(RTCP, RTCP);
23280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendInitiate());
23290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendAccept());
23300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(AddStream1(1));
23310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(AddStream1(2));
23320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  double left, right;
23340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Default is (1.0, 1.0).
23350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
23360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, left);
23370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, right);
23380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(1, &left, &right));
23390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, left);
23400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, right);
23410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(2, &left, &right));
23420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, left);
23430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, right);
23440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // invalid ssrc.
23450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->GetOutputScaling(3, &left, &right));
23460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Set scale to (1.5, 0.5) for ssrc = 1.
23480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->SetOutputScaling(1, 1.5, 0.5));
23490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(1, &left, &right));
23500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.5, left);
23510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(0.5, right);
23520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(2, &left, &right));
23530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, left);
23540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, right);
23550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
23560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, left);
23570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(1.0, right);
23580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Set scale to (0, 0) for all ssrcs.
23600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->SetOutputScaling(0,  0.0, 0.0));
23610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
23620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(0.0, left);
23630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(0.0, right);
23640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(1, &left, &right));
23650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(0.0, left);
23660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(0.0, right);
23670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetOutputScaling(2, &left, &right));
23680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(0.0, left);
23690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_DOUBLE_EQ(0.0, right);
23700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
23710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2372907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgTEST_F(VoiceChannelTest, SendBundleToBundle) {
2373907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  Base::SendBundleToBundle(kAudioPts, ARRAY_SIZE(kAudioPts), false, false);
23740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
23750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2376907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgTEST_F(VoiceChannelTest, SendBundleToBundleSecure) {
2377907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  Base::SendBundleToBundle(kAudioPts, ARRAY_SIZE(kAudioPts), false, true);
2378907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org}
2379907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
2380907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgTEST_F(VoiceChannelTest, SendBundleToBundleWithRtcpMux) {
2381907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  Base::SendBundleToBundle(
2382907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org      kAudioPts, ARRAY_SIZE(kAudioPts), true, false);
2383907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org}
2384907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
2385907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgTEST_F(VoiceChannelTest, SendBundleToBundleWithRtcpMuxSecure) {
2386907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  Base::SendBundleToBundle(
2387907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org      kAudioPts, ARRAY_SIZE(kAudioPts), true, true);
23880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
23890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VoiceChannelTest, TestSetChannelOptions) {
23910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TestSetChannelOptions();
23920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
23930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// VideoChannelTest
23950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestInit) {
23960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestInit();
23970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
23980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestSetContents) {
24000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContents();
24010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestSetContentsNullOffer) {
24040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContentsNullOffer();
24050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestSetContentsRtcpMux) {
24080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContentsRtcpMux();
24090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestSetContentsRtcpMuxWithPrAnswer) {
24120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContentsRtcpMux();
24130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestSetContentsVideoOptions) {
24160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContentsVideoOptions();
24170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestSetRemoteContentUpdate) {
24200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetRemoteContentUpdate();
24210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestStreams) {
24240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestStreams();
24250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestScreencastEvents) {
24280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const int kTimeoutMs = 500;
24290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TestInit();
24300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::ScreencastEventCatcher catcher;
24310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  channel1_->SignalScreencastWindowEvent.connect(
24320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      &catcher,
24330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      &cricket::ScreencastEventCatcher::OnEvent);
2434c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org
2435c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org  rtc::scoped_ptr<cricket::FakeScreenCapturerFactory>
2436c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org      screen_capturer_factory(new cricket::FakeScreenCapturerFactory());
2437c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org  cricket::VideoCapturer* screen_capturer = screen_capturer_factory->Create(
2438c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org      ScreencastId(WindowId(0)));
2439c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org  ASSERT_TRUE(screen_capturer != NULL);
2440c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org
2441c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org  EXPECT_TRUE(channel1_->AddScreencast(0, screen_capturer));
2442c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_STOPPED, screen_capturer_factory->capture_state(),
24430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                 kTimeoutMs);
2444c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org
2445c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org  screen_capturer->SignalStateChange(screen_capturer, cricket::CS_PAUSED);
24462a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ_WAIT(rtc::WE_MINIMIZE, catcher.event(), kTimeoutMs);
2447c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org
2448c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org  screen_capturer->SignalStateChange(screen_capturer, cricket::CS_RUNNING);
24492a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ_WAIT(rtc::WE_RESTORE, catcher.event(), kTimeoutMs);
2450c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org
2451c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org  screen_capturer->SignalStateChange(screen_capturer, cricket::CS_STOPPED);
24522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ_WAIT(rtc::WE_CLOSE, catcher.event(), kTimeoutMs);
2453c7416745e9d35902e62517d1bddcd546623e1c34buildbot@webrtc.org
24540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->RemoveScreencast(0));
24550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestUpdateStreamsInLocalContent) {
24580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestUpdateStreamsInLocalContent();
24590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestUpdateRemoteStreamsInContent) {
24620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestUpdateStreamsInRemoteContent();
24630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestChangeStreamParamsInContent) {
24660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestChangeStreamParamsInContent();
24670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestPlayoutAndSendingStates) {
24700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestPlayoutAndSendingStates();
24710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestMuteStream) {
24740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestMuteStream();
24750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestMediaContentDirection) {
24780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestMediaContentDirection();
24790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestCallSetup) {
24820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestCallSetup();
24830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestCallTeardownRtcpMux) {
24860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestCallTeardownRtcpMux();
24870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendRtpToRtp) {
24900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtpToRtp();
24910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendNoRtcpToNoRtcp) {
24940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendNoRtcpToNoRtcp();
24950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
24960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
24970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendNoRtcpToRtcp) {
24980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendNoRtcpToRtcp();
24990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendRtcpToNoRtcp) {
25020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpToNoRtcp();
25030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendRtcpToRtcp) {
25060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpToRtcp();
25070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendRtcpMuxToRtcp) {
25100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpMuxToRtcp();
25110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendRtcpMuxToRtcpMux) {
25140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpMuxToRtcpMux();
25150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendEarlyRtcpMuxToRtcp) {
25180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendEarlyRtcpMuxToRtcp();
25190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendEarlyRtcpMuxToRtcpMux) {
25220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendEarlyRtcpMuxToRtcpMux();
25230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendSrtpToSrtp) {
25260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp();
25270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendSrtpToRtp) {
25300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp();
25310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendDtlsSrtpToSrtp) {
25340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MAYBE_SKIP_TEST(HaveDtlsSrtp);
25350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp(DTLS, 0);
25360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendDtlsSrtpToDtlsSrtp) {
25390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MAYBE_SKIP_TEST(HaveDtlsSrtp);
25400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp(DTLS, DTLS);
25410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
25440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MAYBE_SKIP_TEST(HaveDtlsSrtp);
25450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
25460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendSrtcpMux) {
25490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
25500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendEarlyMediaUsingRtcpMuxSrtp) {
25530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendEarlyMediaUsingRtcpMuxSrtp();
25540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendRtpToRtpOnThread) {
25570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtpToRtpOnThread();
25580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendSrtpToSrtpOnThread) {
25610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtpOnThread();
25620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, SendWithWritabilityLoss) {
25650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendWithWritabilityLoss();
25660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestMediaMonitor) {
25690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestMediaMonitor();
25700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestMediaSinks) {
25730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestMediaSinks();
25740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestSetContentFailure) {
25770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContentFailure();
25780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestSendTwoOffers) {
25810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSendTwoOffers();
25820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestReceiveTwoOffers) {
25850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestReceiveTwoOffers();
25860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestSendPrAnswer) {
25890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSendPrAnswer();
25900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestReceivePrAnswer) {
25930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestReceivePrAnswer();
25940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
25960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestFlushRtcp) {
25970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestFlushRtcp();
25980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
25990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2600907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgTEST_F(VideoChannelTest, SendBundleToBundle) {
2601907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  Base::SendBundleToBundle(kVideoPts, ARRAY_SIZE(kVideoPts), false, false);
2602907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org}
2603907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
2604907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgTEST_F(VideoChannelTest, SendBundleToBundleSecure) {
2605907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  Base::SendBundleToBundle(kVideoPts, ARRAY_SIZE(kVideoPts), false, true);
2606907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org}
2607907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
2608907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgTEST_F(VideoChannelTest, SendBundleToBundleWithRtcpMux) {
2609907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  Base::SendBundleToBundle(
2610907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org      kVideoPts, ARRAY_SIZE(kVideoPts), true, false);
26110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
26120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2613907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgTEST_F(VideoChannelTest, SendBundleToBundleWithRtcpMuxSecure) {
2614907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  Base::SendBundleToBundle(
2615907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org      kVideoPts, ARRAY_SIZE(kVideoPts), true, true);
26160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
26170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TODO(gangji): Add VideoChannelTest.TestChangeStateError.
26190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestSrtpError) {
2621907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  Base::TestSrtpError(kVideoPts[0]);
26220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
26230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestOnReadyToSend) {
26250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestOnReadyToSend();
26260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
26270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestOnReadyToSendWithRtcpMux) {
26290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestOnReadyToSendWithRtcpMux();
26300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
26310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestApplyViewRequest) {
26330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(0, 0);
26340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::StreamParams stream2;
26350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stream2.id = "stream2";
26360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  stream2.ssrcs.push_back(2222);
26370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  local_media_content1_.AddStream(stream2);
26380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendInitiate());
26400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendAccept());
26410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat send_format;
26430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetSendStreamFormat(kSsrc1, &send_format));
26440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, send_format.width);
26450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(400, send_format.height);
26460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), send_format.interval);
26470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::ViewRequest request;
26490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // stream1: 320x200x15; stream2: 0x0x0
26500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  request.static_video_views.push_back(cricket::StaticVideoView(
26510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::StreamSelector(kSsrc1), 320, 200, 15));
26520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->ApplyViewRequest(request));
26530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetSendStreamFormat(kSsrc1, &send_format));
26540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(320, send_format.width);
26550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(200, send_format.height);
26560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), send_format.interval);
26570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetSendStreamFormat(2222, &send_format));
26580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, send_format.width);
26590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, send_format.height);
26600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // stream1: 160x100x8; stream2: 0x0x0
26620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  request.static_video_views.clear();
26630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  request.static_video_views.push_back(cricket::StaticVideoView(
26640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::StreamSelector(kSsrc1), 160, 100, 8));
26650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->ApplyViewRequest(request));
26660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetSendStreamFormat(kSsrc1, &send_format));
26670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(160, send_format.width);
26680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(100, send_format.height);
26690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(8), send_format.interval);
26700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // stream1: 0x0x0; stream2: 640x400x30
26720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  request.static_video_views.clear();
26730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  request.static_video_views.push_back(cricket::StaticVideoView(
26740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::StreamSelector("", stream2.id), 640, 400, 30));
26750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->ApplyViewRequest(request));
26760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetSendStreamFormat(kSsrc1, &send_format));
26770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, send_format.width);
26780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, send_format.height);
26790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetSendStreamFormat(2222, &send_format));
26800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, send_format.width);
26810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(400, send_format.height);
26820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), send_format.interval);
26830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // stream1: 0x0x0; stream2: 0x0x0
26850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  request.static_video_views.clear();
26860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(channel1_->ApplyViewRequest(request));
26870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(media_channel1_->GetSendStreamFormat(kSsrc1, &send_format));
26880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, send_format.width);
26890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, send_format.height);
26900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
26910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoChannelTest, TestSetChannelOptions) {
26930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TestSetChannelOptions();
26940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
26950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// DataChannelTest
26980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
26990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass DataChannelTest
27000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    : public ChannelTest<DataTraits> {
27010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
27020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef ChannelTest<DataTraits>
27030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base;
27040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DataChannelTest() : Base(kDataPacket, sizeof(kDataPacket),
27050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           kRtcpReport, sizeof(kRtcpReport)) {
27060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
27070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
27080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Override to avoid engine channel parameter.
27100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
27110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgcricket::DataChannel* ChannelTest<DataTraits>::CreateChannel(
27122a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::Thread* thread, cricket::MediaEngineInterface* engine,
27130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::FakeDataMediaChannel* ch, cricket::BaseSession* session,
27140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool rtcp) {
27150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::DataChannel* channel = new cricket::DataChannel(
27160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      thread, ch, session, cricket::CN_DATA, rtcp);
27170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (!channel->Init()) {
27180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    delete channel;
27190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel = NULL;
27200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
27210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return channel;
27220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
27250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid ChannelTest<DataTraits>::CreateContent(
27260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int flags,
27270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::AudioCodec& audio_codec,
27280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::VideoCodec& video_codec,
27290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::DataContentDescription* data) {
27300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  data->AddCodec(kGoogleDataCodec);
27310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  data->set_rtcp_mux((flags & RTCP_MUX) != 0);
27320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (flags & SECURE) {
27330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    data->AddCrypto(cricket::CryptoParams(
27340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        1, cricket::CS_AES_CM_128_HMAC_SHA1_32,
27352a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        "inline:" + rtc::CreateRandomString(40), ""));
27360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
27370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
27400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid ChannelTest<DataTraits>::CopyContent(
27410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::DataContentDescription& source,
27420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::DataContentDescription* data) {
27430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  *data = source;
27440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
27470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
27480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                           const cricket::DataCodec& c2) {
27490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return c1.name == c2.name;
27500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate<>
27530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid ChannelTest<DataTraits>::AddLegacyStreamInContent(
27540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    uint32 ssrc, int flags, cricket::DataContentDescription* data) {
27550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  data->AddLegacyStream(ssrc);
27560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestInit) {
27590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestInit();
27600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
27610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestSetContents) {
27640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContents();
27650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestSetContentsNullOffer) {
27680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContentsNullOffer();
27690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestSetContentsRtcpMux) {
27720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetContentsRtcpMux();
27730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestSetRemoteContentUpdate) {
27760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestSetRemoteContentUpdate();
27770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestStreams) {
27800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestStreams();
27810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestUpdateStreamsInLocalContent) {
27840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestUpdateStreamsInLocalContent();
27850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestUpdateRemoteStreamsInContent) {
27880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestUpdateStreamsInRemoteContent();
27890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestChangeStreamParamsInContent) {
27920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestChangeStreamParamsInContent();
27930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestPlayoutAndSendingStates) {
27960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestPlayoutAndSendingStates();
27970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
27980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
27990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestMediaContentDirection) {
28000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestMediaContentDirection();
28010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestCallSetup) {
28040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestCallSetup();
28050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestCallTeardownRtcpMux) {
28080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestCallTeardownRtcpMux();
28090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestOnReadyToSend) {
28120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestOnReadyToSend();
28130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestOnReadyToSendWithRtcpMux) {
28160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestOnReadyToSendWithRtcpMux();
28170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendRtpToRtp) {
28200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtpToRtp();
28210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendNoRtcpToNoRtcp) {
28240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendNoRtcpToNoRtcp();
28250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendNoRtcpToRtcp) {
28280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendNoRtcpToRtcp();
28290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendRtcpToNoRtcp) {
28320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpToNoRtcp();
28330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendRtcpToRtcp) {
28360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpToRtcp();
28370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendRtcpMuxToRtcp) {
28400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpMuxToRtcp();
28410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendRtcpMuxToRtcpMux) {
28440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtcpMuxToRtcpMux();
28450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendEarlyRtcpMuxToRtcp) {
28480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendEarlyRtcpMuxToRtcp();
28490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendEarlyRtcpMuxToRtcpMux) {
28520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendEarlyRtcpMuxToRtcpMux();
28530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendSrtpToSrtp) {
28560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp();
28570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendSrtpToRtp) {
28600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp();
28610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendSrtcpMux) {
28640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
28650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendRtpToRtpOnThread) {
28680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendRtpToRtpOnThread();
28690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendSrtpToSrtpOnThread) {
28720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendSrtpToSrtpOnThread();
28730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, SendWithWritabilityLoss) {
28760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::SendWithWritabilityLoss();
28770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestMediaMonitor) {
28800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Base::TestMediaMonitor();
28810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
28820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(DataChannelTest, TestSendData) {
28840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(0, 0);
28850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendInitiate());
28860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(SendAccept());
28870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::SendDataParams params;
28890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  params.ssrc = 42;
28900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  unsigned char data[] = {
28910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    'f', 'o', 'o'
28920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
28932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::Buffer payload(data, 3);
28940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::SendDataResult result;
28950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
28960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(params.ssrc,
28970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            media_channel1_->last_sent_data_params().ssrc);
28980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ("foo", media_channel1_->last_sent_data());
28990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
29000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
29010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TODO(pthatcher): TestSetReceiver?
2902