1 // libjingle 2 // Copyright 2009 Google Inc. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are met: 6 // 7 // 1. Redistributions of source code must retain the above copyright notice, 8 // this list of conditions and the following disclaimer. 9 // 2. Redistributions in binary form must reproduce the above copyright notice, 10 // this list of conditions and the following disclaimer in the documentation 11 // and/or other materials provided with the distribution. 12 // 3. The name of the author may not be used to endorse or promote products 13 // derived from this software without specific prior written permission. 14 // 15 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 16 // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 17 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 18 // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 19 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 21 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 24 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 26 #include "talk/base/fileutils.h" 27 #include "talk/base/gunit.h" 28 #include "talk/base/helpers.h" 29 #include "talk/base/logging.h" 30 #include "talk/base/pathutils.h" 31 #include "talk/base/signalthread.h" 32 #include "talk/base/ssladapter.h" 33 #include "talk/base/sslidentity.h" 34 #include "talk/base/window.h" 35 #include "talk/media/base/fakemediaengine.h" 36 #include "talk/media/base/fakertp.h" 37 #include "talk/media/base/fakevideocapturer.h" 38 #include "talk/media/base/mediachannel.h" 39 #include "talk/media/base/rtpdump.h" 40 #include "talk/media/base/screencastid.h" 41 #include "talk/media/base/testutils.h" 42 #include "talk/p2p/base/fakesession.h" 43 #include "talk/session/media/channel.h" 44 #include "talk/session/media/mediamessages.h" 45 #include "talk/session/media/mediarecorder.h" 46 #include "talk/session/media/mediasessionclient.h" 47 #include "talk/session/media/typingmonitor.h" 48 49 #define MAYBE_SKIP_TEST(feature) \ 50 if (!(talk_base::SSLStreamAdapter::feature())) { \ 51 LOG(LS_INFO) << "Feature disabled... skipping"; \ 52 return; \ 53 } 54 55 using cricket::CA_OFFER; 56 using cricket::CA_PRANSWER; 57 using cricket::CA_ANSWER; 58 using cricket::CA_UPDATE; 59 using cricket::FakeVoiceMediaChannel; 60 using cricket::ScreencastId; 61 using cricket::StreamParams; 62 using cricket::TransportChannel; 63 using talk_base::WindowId; 64 65 static const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1, 0); 66 static const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1, 0); 67 static const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1, 0); 68 static const cricket::VideoCodec kH264Codec(97, "H264", 640, 400, 30, 0); 69 static const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC", 320, 200, 15, 0); 70 static const cricket::DataCodec kGoogleDataCodec(101, "google-data", 0); 71 static const uint32 kSsrc1 = 0x1111; 72 static const uint32 kSsrc2 = 0x2222; 73 static const uint32 kSsrc3 = 0x3333; 74 static const int kAudioPts[] = {0, 8}; 75 static const int kVideoPts[] = {97, 99}; 76 77 template<class ChannelT, 78 class MediaChannelT, 79 class ContentT, 80 class CodecT, 81 class MediaInfoT> 82 class Traits { 83 public: 84 typedef ChannelT Channel; 85 typedef MediaChannelT MediaChannel; 86 typedef ContentT Content; 87 typedef CodecT Codec; 88 typedef MediaInfoT MediaInfo; 89 }; 90 91 class FakeScreenCaptureFactory 92 : public cricket::VideoChannel::ScreenCapturerFactory, 93 public sigslot::has_slots<> { 94 public: 95 FakeScreenCaptureFactory() 96 : window_capturer_(NULL), 97 capture_state_(cricket::CS_STOPPED) {} 98 99 virtual cricket::VideoCapturer* CreateScreenCapturer( 100 const ScreencastId& window) { 101 if (window_capturer_ != NULL) { 102 // Class is only designed to handle one fake screencapturer. 103 ADD_FAILURE(); 104 return NULL; 105 } 106 window_capturer_ = new cricket::FakeVideoCapturer; 107 window_capturer_->SignalDestroyed.connect( 108 this, 109 &FakeScreenCaptureFactory::OnWindowCapturerDestroyed); 110 window_capturer_->SignalStateChange.connect( 111 this, 112 &FakeScreenCaptureFactory::OnStateChange); 113 return window_capturer_; 114 } 115 116 cricket::FakeVideoCapturer* window_capturer() { return window_capturer_; } 117 118 cricket::CaptureState capture_state() { return capture_state_; } 119 120 private: 121 void OnWindowCapturerDestroyed(cricket::FakeVideoCapturer* capturer) { 122 if (capturer == window_capturer_) { 123 window_capturer_ = NULL; 124 } 125 } 126 void OnStateChange(cricket::VideoCapturer*, cricket::CaptureState state) { 127 capture_state_ = state; 128 } 129 130 cricket::FakeVideoCapturer* window_capturer_; 131 cricket::CaptureState capture_state_; 132 }; 133 134 // Controls how long we wait for a session to send messages that we 135 // expect, in milliseconds. We put it high to avoid flaky tests. 136 static const int kEventTimeout = 5000; 137 138 class VoiceTraits : public Traits<cricket::VoiceChannel, 139 cricket::FakeVoiceMediaChannel, 140 cricket::AudioContentDescription, 141 cricket::AudioCodec, 142 cricket::VoiceMediaInfo> { 143 }; 144 145 class VideoTraits : public Traits<cricket::VideoChannel, 146 cricket::FakeVideoMediaChannel, 147 cricket::VideoContentDescription, 148 cricket::VideoCodec, 149 cricket::VideoMediaInfo> { 150 }; 151 152 class DataTraits : public Traits<cricket::DataChannel, 153 cricket::FakeDataMediaChannel, 154 cricket::DataContentDescription, 155 cricket::DataCodec, 156 cricket::DataMediaInfo> { 157 }; 158 159 160 talk_base::StreamInterface* Open(const std::string& path) { 161 return talk_base::Filesystem::OpenFile( 162 talk_base::Pathname(path), "wb"); 163 } 164 165 // Base class for Voice/VideoChannel tests 166 template<class T> 167 class ChannelTest : public testing::Test, public sigslot::has_slots<> { 168 public: 169 enum Flags { RTCP = 0x1, RTCP_MUX = 0x2, SECURE = 0x4, SSRC_MUX = 0x8, 170 DTLS = 0x10 }; 171 172 ChannelTest(const uint8* rtp_data, int rtp_len, 173 const uint8* rtcp_data, int rtcp_len) 174 : session1_(true), 175 session2_(false), 176 media_channel1_(NULL), 177 media_channel2_(NULL), 178 rtp_packet_(reinterpret_cast<const char*>(rtp_data), rtp_len), 179 rtcp_packet_(reinterpret_cast<const char*>(rtcp_data), rtcp_len), 180 media_info_callbacks1_(), 181 media_info_callbacks2_(), 182 mute_callback_recved_(false), 183 mute_callback_value_(false), 184 ssrc_(0), 185 error_(T::MediaChannel::ERROR_NONE) { 186 } 187 188 static void SetUpTestCase() { 189 talk_base::InitializeSSL(); 190 } 191 192 static void TearDownTestCase() { 193 talk_base::CleanupSSL(); 194 } 195 196 void CreateChannels(int flags1, int flags2) { 197 CreateChannels(new typename T::MediaChannel(NULL), 198 new typename T::MediaChannel(NULL), 199 flags1, flags2, talk_base::Thread::Current()); 200 } 201 void CreateChannels(int flags) { 202 CreateChannels(new typename T::MediaChannel(NULL), 203 new typename T::MediaChannel(NULL), 204 flags, talk_base::Thread::Current()); 205 } 206 void CreateChannels(int flags1, int flags2, 207 talk_base::Thread* thread) { 208 CreateChannels(new typename T::MediaChannel(NULL), 209 new typename T::MediaChannel(NULL), 210 flags1, flags2, thread); 211 } 212 void CreateChannels(int flags, 213 talk_base::Thread* thread) { 214 CreateChannels(new typename T::MediaChannel(NULL), 215 new typename T::MediaChannel(NULL), 216 flags, thread); 217 } 218 void CreateChannels( 219 typename T::MediaChannel* ch1, typename T::MediaChannel* ch2, 220 int flags1, int flags2, talk_base::Thread* thread) { 221 media_channel1_ = ch1; 222 media_channel2_ = ch2; 223 channel1_.reset(CreateChannel(thread, &media_engine_, ch1, &session1_, 224 (flags1 & RTCP) != 0)); 225 channel2_.reset(CreateChannel(thread, &media_engine_, ch2, &session2_, 226 (flags2 & RTCP) != 0)); 227 channel1_->SignalMediaMonitor.connect( 228 this, &ChannelTest<T>::OnMediaMonitor); 229 channel2_->SignalMediaMonitor.connect( 230 this, &ChannelTest<T>::OnMediaMonitor); 231 channel1_->SignalMediaError.connect( 232 this, &ChannelTest<T>::OnMediaChannelError); 233 channel2_->SignalMediaError.connect( 234 this, &ChannelTest<T>::OnMediaChannelError); 235 channel1_->SignalAutoMuted.connect( 236 this, &ChannelTest<T>::OnMediaMuted); 237 if ((flags1 & DTLS) && (flags2 & DTLS)) { 238 flags1 = (flags1 & ~SECURE); 239 flags2 = (flags2 & ~SECURE); 240 } 241 CreateContent(flags1, kPcmuCodec, kH264Codec, 242 &local_media_content1_); 243 CreateContent(flags2, kPcmuCodec, kH264Codec, 244 &local_media_content2_); 245 CopyContent(local_media_content1_, &remote_media_content1_); 246 CopyContent(local_media_content2_, &remote_media_content2_); 247 248 if (flags1 & DTLS) { 249 identity1_.reset(talk_base::SSLIdentity::Generate("session1")); 250 session1_.set_ssl_identity(identity1_.get()); 251 } 252 if (flags2 & DTLS) { 253 identity2_.reset(talk_base::SSLIdentity::Generate("session2")); 254 session2_.set_ssl_identity(identity2_.get()); 255 } 256 257 // Add stream information (SSRC) to the local content but not to the remote 258 // content. This means that we per default know the SSRC of what we send but 259 // not what we receive. 260 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_); 261 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_); 262 263 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream. 264 if (flags1 & SSRC_MUX) { 265 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_); 266 } 267 if (flags2 & SSRC_MUX) { 268 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_); 269 } 270 } 271 272 void CreateChannels( 273 typename T::MediaChannel* ch1, typename T::MediaChannel* ch2, 274 int flags, talk_base::Thread* thread) { 275 media_channel1_ = ch1; 276 media_channel2_ = ch2; 277 278 channel1_.reset(CreateChannel(thread, &media_engine_, ch1, &session1_, 279 (flags & RTCP) != 0)); 280 channel2_.reset(CreateChannel(thread, &media_engine_, ch2, &session1_, 281 (flags & RTCP) != 0)); 282 channel1_->SignalMediaMonitor.connect( 283 this, &ChannelTest<T>::OnMediaMonitor); 284 channel2_->SignalMediaMonitor.connect( 285 this, &ChannelTest<T>::OnMediaMonitor); 286 channel2_->SignalMediaError.connect( 287 this, &ChannelTest<T>::OnMediaChannelError); 288 CreateContent(flags, kPcmuCodec, kH264Codec, 289 &local_media_content1_); 290 CreateContent(flags, kPcmuCodec, kH264Codec, 291 &local_media_content2_); 292 CopyContent(local_media_content1_, &remote_media_content1_); 293 CopyContent(local_media_content2_, &remote_media_content2_); 294 // Add stream information (SSRC) to the local content but not to the remote 295 // content. This means that we per default know the SSRC of what we send but 296 // not what we receive. 297 AddLegacyStreamInContent(kSsrc1, flags, &local_media_content1_); 298 AddLegacyStreamInContent(kSsrc2, flags, &local_media_content2_); 299 300 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream. 301 if (flags & SSRC_MUX) { 302 AddLegacyStreamInContent(kSsrc1, flags, &remote_media_content1_); 303 AddLegacyStreamInContent(kSsrc2, flags, &remote_media_content2_); 304 } 305 } 306 307 typename T::Channel* CreateChannel(talk_base::Thread* thread, 308 cricket::MediaEngineInterface* engine, 309 typename T::MediaChannel* ch, 310 cricket::BaseSession* session, 311 bool rtcp) { 312 typename T::Channel* channel = new typename T::Channel( 313 thread, engine, ch, session, cricket::CN_AUDIO, rtcp); 314 if (!channel->Init()) { 315 delete channel; 316 channel = NULL; 317 } 318 return channel; 319 } 320 321 bool SendInitiate() { 322 bool result = channel1_->SetLocalContent(&local_media_content1_, 323 CA_OFFER, NULL); 324 if (result) { 325 channel1_->Enable(true); 326 result = channel2_->SetRemoteContent(&remote_media_content1_, 327 CA_OFFER, NULL); 328 if (result) { 329 session1_.Connect(&session2_); 330 331 result = channel2_->SetLocalContent(&local_media_content2_, 332 CA_ANSWER, NULL); 333 } 334 } 335 return result; 336 } 337 338 bool SendAccept() { 339 channel2_->Enable(true); 340 return channel1_->SetRemoteContent(&remote_media_content2_, 341 CA_ANSWER, NULL); 342 } 343 344 bool SendOffer() { 345 bool result = channel1_->SetLocalContent(&local_media_content1_, 346 CA_OFFER, NULL); 347 if (result) { 348 channel1_->Enable(true); 349 result = channel2_->SetRemoteContent(&remote_media_content1_, 350 CA_OFFER, NULL); 351 } 352 return result; 353 } 354 355 bool SendProvisionalAnswer() { 356 bool result = channel2_->SetLocalContent(&local_media_content2_, 357 CA_PRANSWER, NULL); 358 if (result) { 359 channel2_->Enable(true); 360 result = channel1_->SetRemoteContent(&remote_media_content2_, 361 CA_PRANSWER, NULL); 362 session1_.Connect(&session2_); 363 } 364 return result; 365 } 366 367 bool SendFinalAnswer() { 368 bool result = channel2_->SetLocalContent(&local_media_content2_, 369 CA_ANSWER, NULL); 370 if (result) 371 result = channel1_->SetRemoteContent(&remote_media_content2_, 372 CA_ANSWER, NULL); 373 return result; 374 } 375 376 bool SendTerminate() { 377 channel1_.reset(); 378 channel2_.reset(); 379 return true; 380 } 381 382 bool AddStream1(int id) { 383 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id)); 384 } 385 bool RemoveStream1(int id) { 386 return channel1_->RemoveRecvStream(id); 387 } 388 389 cricket::FakeTransport* GetTransport1() { 390 return session1_.GetTransport(channel1_->content_name()); 391 } 392 cricket::FakeTransport* GetTransport2() { 393 return session2_.GetTransport(channel2_->content_name()); 394 } 395 396 bool SendRtp1() { 397 return media_channel1_->SendRtp(rtp_packet_.c_str(), 398 static_cast<int>(rtp_packet_.size())); 399 } 400 bool SendRtp2() { 401 return media_channel2_->SendRtp(rtp_packet_.c_str(), 402 static_cast<int>(rtp_packet_.size())); 403 } 404 bool SendRtcp1() { 405 return media_channel1_->SendRtcp(rtcp_packet_.c_str(), 406 static_cast<int>(rtcp_packet_.size())); 407 } 408 bool SendRtcp2() { 409 return media_channel2_->SendRtcp(rtcp_packet_.c_str(), 410 static_cast<int>(rtcp_packet_.size())); 411 } 412 // Methods to send custom data. 413 bool SendCustomRtp1(uint32 ssrc, int sequence_number, int pl_type = -1) { 414 std::string data(CreateRtpData(ssrc, sequence_number, pl_type)); 415 return media_channel1_->SendRtp(data.c_str(), 416 static_cast<int>(data.size())); 417 } 418 bool SendCustomRtp2(uint32 ssrc, int sequence_number, int pl_type = -1) { 419 std::string data(CreateRtpData(ssrc, sequence_number, pl_type)); 420 return media_channel2_->SendRtp(data.c_str(), 421 static_cast<int>(data.size())); 422 } 423 bool SendCustomRtcp1(uint32 ssrc) { 424 std::string data(CreateRtcpData(ssrc)); 425 return media_channel1_->SendRtcp(data.c_str(), 426 static_cast<int>(data.size())); 427 } 428 bool SendCustomRtcp2(uint32 ssrc) { 429 std::string data(CreateRtcpData(ssrc)); 430 return media_channel2_->SendRtcp(data.c_str(), 431 static_cast<int>(data.size())); 432 } 433 bool CheckRtp1() { 434 return media_channel1_->CheckRtp(rtp_packet_.c_str(), 435 static_cast<int>(rtp_packet_.size())); 436 } 437 bool CheckRtp2() { 438 return media_channel2_->CheckRtp(rtp_packet_.c_str(), 439 static_cast<int>(rtp_packet_.size())); 440 } 441 bool CheckRtcp1() { 442 return media_channel1_->CheckRtcp(rtcp_packet_.c_str(), 443 static_cast<int>(rtcp_packet_.size())); 444 } 445 bool CheckRtcp2() { 446 return media_channel2_->CheckRtcp(rtcp_packet_.c_str(), 447 static_cast<int>(rtcp_packet_.size())); 448 } 449 // Methods to check custom data. 450 bool CheckCustomRtp1(uint32 ssrc, int sequence_number, int pl_type = -1 ) { 451 std::string data(CreateRtpData(ssrc, sequence_number, pl_type)); 452 return media_channel1_->CheckRtp(data.c_str(), 453 static_cast<int>(data.size())); 454 } 455 bool CheckCustomRtp2(uint32 ssrc, int sequence_number, int pl_type = -1) { 456 std::string data(CreateRtpData(ssrc, sequence_number, pl_type)); 457 return media_channel2_->CheckRtp(data.c_str(), 458 static_cast<int>(data.size())); 459 } 460 bool CheckCustomRtcp1(uint32 ssrc) { 461 std::string data(CreateRtcpData(ssrc)); 462 return media_channel1_->CheckRtcp(data.c_str(), 463 static_cast<int>(data.size())); 464 } 465 bool CheckCustomRtcp2(uint32 ssrc) { 466 std::string data(CreateRtcpData(ssrc)); 467 return media_channel2_->CheckRtcp(data.c_str(), 468 static_cast<int>(data.size())); 469 } 470 std::string CreateRtpData(uint32 ssrc, int sequence_number, int pl_type) { 471 std::string data(rtp_packet_); 472 // Set SSRC in the rtp packet copy. 473 talk_base::SetBE32(const_cast<char*>(data.c_str()) + 8, ssrc); 474 talk_base::SetBE16(const_cast<char*>(data.c_str()) + 2, sequence_number); 475 if (pl_type >= 0) { 476 talk_base::Set8(const_cast<char*>(data.c_str()), 1, pl_type); 477 } 478 return data; 479 } 480 std::string CreateRtcpData(uint32 ssrc) { 481 std::string data(rtcp_packet_); 482 // Set SSRC in the rtcp packet copy. 483 talk_base::SetBE32(const_cast<char*>(data.c_str()) + 4, ssrc); 484 return data; 485 } 486 487 bool CheckNoRtp1() { 488 return media_channel1_->CheckNoRtp(); 489 } 490 bool CheckNoRtp2() { 491 return media_channel2_->CheckNoRtp(); 492 } 493 bool CheckNoRtcp1() { 494 return media_channel1_->CheckNoRtcp(); 495 } 496 bool CheckNoRtcp2() { 497 return media_channel2_->CheckNoRtcp(); 498 } 499 500 void CreateContent(int flags, 501 const cricket::AudioCodec& audio_codec, 502 const cricket::VideoCodec& video_codec, 503 typename T::Content* content) { 504 // overridden in specialized classes 505 } 506 void CopyContent(const typename T::Content& source, 507 typename T::Content* content) { 508 // overridden in specialized classes 509 } 510 511 // Creates a cricket::SessionDescription with one MediaContent and one stream. 512 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec. 513 cricket::SessionDescription* CreateSessionDescriptionWithStream(uint32 ssrc) { 514 typename T::Content content; 515 cricket::SessionDescription* sdesc = new cricket::SessionDescription(); 516 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content); 517 AddLegacyStreamInContent(ssrc, 0, &content); 518 sdesc->AddContent("DUMMY_CONTENT_NAME", 519 cricket::NS_JINGLE_RTP, content.Copy()); 520 return sdesc; 521 } 522 523 class CallThread : public talk_base::SignalThread { 524 public: 525 typedef bool (ChannelTest<T>::*Method)(); 526 CallThread(ChannelTest<T>* obj, Method method, bool* result) 527 : obj_(obj), 528 method_(method), 529 result_(result) { 530 *result = false; 531 } 532 virtual void DoWork() { 533 bool result = (*obj_.*method_)(); 534 if (result_) { 535 *result_ = result; 536 } 537 } 538 private: 539 ChannelTest<T>* obj_; 540 Method method_; 541 bool* result_; 542 }; 543 void CallOnThread(typename CallThread::Method method, bool* result) { 544 CallThread* thread = new CallThread(this, method, result); 545 thread->Start(); 546 thread->Release(); 547 } 548 549 void CallOnThreadAndWaitForDone(typename CallThread::Method method, 550 bool* result) { 551 CallThread* thread = new CallThread(this, method, result); 552 thread->Start(); 553 thread->Destroy(true); 554 } 555 556 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) { 557 return false; // overridden in specialized classes 558 } 559 560 void OnMediaMonitor(typename T::Channel* channel, 561 const typename T::MediaInfo& info) { 562 if (channel == channel1_.get()) { 563 media_info_callbacks1_++; 564 } else if (channel == channel2_.get()) { 565 media_info_callbacks2_++; 566 } 567 } 568 569 void OnMediaChannelError(typename T::Channel* channel, 570 uint32 ssrc, 571 typename T::MediaChannel::Error error) { 572 ssrc_ = ssrc; 573 error_ = error; 574 } 575 576 void OnMediaMuted(cricket::BaseChannel* channel, bool muted) { 577 mute_callback_recved_ = true; 578 mute_callback_value_ = muted; 579 } 580 581 void AddLegacyStreamInContent(uint32 ssrc, int flags, 582 typename T::Content* content) { 583 // Base implementation. 584 } 585 586 // Tests that can be used by derived classes. 587 588 // Basic sanity check. 589 void TestInit() { 590 CreateChannels(0, 0); 591 EXPECT_FALSE(channel1_->secure()); 592 EXPECT_FALSE(media_channel1_->sending()); 593 EXPECT_FALSE(media_channel1_->playout()); 594 EXPECT_TRUE(media_channel1_->codecs().empty()); 595 EXPECT_TRUE(media_channel1_->recv_streams().empty()); 596 EXPECT_TRUE(media_channel1_->rtp_packets().empty()); 597 EXPECT_TRUE(media_channel1_->rtcp_packets().empty()); 598 } 599 600 // Test that SetLocalContent and SetRemoteContent properly configure 601 // the codecs. 602 void TestSetContents() { 603 CreateChannels(0, 0); 604 typename T::Content content; 605 CreateContent(0, kPcmuCodec, kH264Codec, &content); 606 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL)); 607 EXPECT_EQ(0U, media_channel1_->codecs().size()); 608 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL)); 609 ASSERT_EQ(1U, media_channel1_->codecs().size()); 610 EXPECT_TRUE(CodecMatches(content.codecs()[0], 611 media_channel1_->codecs()[0])); 612 } 613 614 // Test that SetLocalContent and SetRemoteContent properly deals 615 // with an empty offer. 616 void TestSetContentsNullOffer() { 617 CreateChannels(0, 0); 618 typename T::Content content; 619 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL)); 620 CreateContent(0, kPcmuCodec, kH264Codec, &content); 621 EXPECT_EQ(0U, media_channel1_->codecs().size()); 622 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL)); 623 ASSERT_EQ(1U, media_channel1_->codecs().size()); 624 EXPECT_TRUE(CodecMatches(content.codecs()[0], 625 media_channel1_->codecs()[0])); 626 } 627 628 // Test that SetLocalContent and SetRemoteContent properly set RTCP 629 // mux. 630 void TestSetContentsRtcpMux() { 631 CreateChannels(RTCP, RTCP); 632 EXPECT_TRUE(channel1_->rtcp_transport_channel() != NULL); 633 EXPECT_TRUE(channel2_->rtcp_transport_channel() != NULL); 634 typename T::Content content; 635 CreateContent(0, kPcmuCodec, kH264Codec, &content); 636 // Both sides agree on mux. Should no longer be a separate RTCP channel. 637 content.set_rtcp_mux(true); 638 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL)); 639 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL)); 640 EXPECT_TRUE(channel1_->rtcp_transport_channel() == NULL); 641 // Only initiator supports mux. Should still have a separate RTCP channel. 642 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL)); 643 content.set_rtcp_mux(false); 644 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL)); 645 EXPECT_TRUE(channel2_->rtcp_transport_channel() != NULL); 646 } 647 648 // Test that SetLocalContent and SetRemoteContent properly set RTCP 649 // mux when a provisional answer is received. 650 void TestSetContentsRtcpMuxWithPrAnswer() { 651 CreateChannels(RTCP, RTCP); 652 EXPECT_TRUE(channel1_->rtcp_transport_channel() != NULL); 653 EXPECT_TRUE(channel2_->rtcp_transport_channel() != NULL); 654 typename T::Content content; 655 CreateContent(0, kPcmuCodec, kH264Codec, &content); 656 content.set_rtcp_mux(true); 657 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL)); 658 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL)); 659 EXPECT_TRUE(channel1_->rtcp_transport_channel() != NULL); 660 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL)); 661 // Both sides agree on mux. Should no longer be a separate RTCP channel. 662 EXPECT_TRUE(channel1_->rtcp_transport_channel() == NULL); 663 // Only initiator supports mux. Should still have a separate RTCP channel. 664 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL)); 665 content.set_rtcp_mux(false); 666 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL)); 667 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL)); 668 EXPECT_TRUE(channel2_->rtcp_transport_channel() != NULL); 669 } 670 671 // Test that SetLocalContent and SetRemoteContent properly set 672 // video options to the media channel. 673 void TestSetContentsVideoOptions() { 674 CreateChannels(0, 0); 675 typename T::Content content; 676 CreateContent(0, kPcmuCodec, kH264Codec, &content); 677 content.set_buffered_mode_latency(101); 678 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL)); 679 EXPECT_EQ(0U, media_channel1_->codecs().size()); 680 cricket::VideoOptions options; 681 ASSERT_TRUE(media_channel1_->GetOptions(&options)); 682 int latency = 0; 683 EXPECT_TRUE(options.buffered_mode_latency.Get(&latency)); 684 EXPECT_EQ(101, latency); 685 content.set_buffered_mode_latency(102); 686 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL)); 687 ASSERT_EQ(1U, media_channel1_->codecs().size()); 688 EXPECT_TRUE(CodecMatches(content.codecs()[0], 689 media_channel1_->codecs()[0])); 690 ASSERT_TRUE(media_channel1_->GetOptions(&options)); 691 EXPECT_TRUE(options.buffered_mode_latency.Get(&latency)); 692 EXPECT_EQ(102, latency); 693 } 694 695 // Test that SetRemoteContent properly deals with a content update. 696 void TestSetRemoteContentUpdate() { 697 CreateChannels(0, 0); 698 typename T::Content content; 699 CreateContent(RTCP | RTCP_MUX | SECURE, 700 kPcmuCodec, kH264Codec, 701 &content); 702 EXPECT_EQ(0U, media_channel1_->codecs().size()); 703 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL)); 704 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL)); 705 ASSERT_EQ(1U, media_channel1_->codecs().size()); 706 EXPECT_TRUE(CodecMatches(content.codecs()[0], 707 media_channel1_->codecs()[0])); 708 // Now update with other codecs. 709 typename T::Content update_content; 710 update_content.set_partial(true); 711 CreateContent(0, kIsacCodec, kH264SvcCodec, 712 &update_content); 713 EXPECT_TRUE(channel1_->SetRemoteContent(&update_content, CA_UPDATE, NULL)); 714 ASSERT_EQ(1U, media_channel1_->codecs().size()); 715 EXPECT_TRUE(CodecMatches(update_content.codecs()[0], 716 media_channel1_->codecs()[0])); 717 // Now update without any codecs. This is ignored. 718 typename T::Content empty_content; 719 empty_content.set_partial(true); 720 EXPECT_TRUE(channel1_->SetRemoteContent(&empty_content, CA_UPDATE, NULL)); 721 ASSERT_EQ(1U, media_channel1_->codecs().size()); 722 EXPECT_TRUE(CodecMatches(update_content.codecs()[0], 723 media_channel1_->codecs()[0])); 724 } 725 726 // Test that Add/RemoveStream properly forward to the media channel. 727 void TestStreams() { 728 CreateChannels(0, 0); 729 EXPECT_TRUE(AddStream1(1)); 730 EXPECT_TRUE(AddStream1(2)); 731 EXPECT_EQ(2U, media_channel1_->recv_streams().size()); 732 EXPECT_TRUE(RemoveStream1(2)); 733 EXPECT_EQ(1U, media_channel1_->recv_streams().size()); 734 EXPECT_TRUE(RemoveStream1(1)); 735 EXPECT_EQ(0U, media_channel1_->recv_streams().size()); 736 } 737 738 // Test that SetLocalContent properly handles adding and removing StreamParams 739 // to the local content description. 740 // This test uses the CA_UPDATE action that don't require a full 741 // MediaContentDescription to do an update. 742 void TestUpdateStreamsInLocalContent() { 743 cricket::StreamParams stream1; 744 stream1.groupid = "group1"; 745 stream1.id = "stream1"; 746 stream1.ssrcs.push_back(kSsrc1); 747 stream1.cname = "stream1_cname"; 748 749 cricket::StreamParams stream2; 750 stream2.groupid = "group2"; 751 stream2.id = "stream2"; 752 stream2.ssrcs.push_back(kSsrc2); 753 stream2.cname = "stream2_cname"; 754 755 cricket::StreamParams stream3; 756 stream3.groupid = "group3"; 757 stream3.id = "stream3"; 758 stream3.ssrcs.push_back(kSsrc3); 759 stream3.cname = "stream3_cname"; 760 761 CreateChannels(0, 0); 762 typename T::Content content1; 763 CreateContent(0, kPcmuCodec, kH264Codec, &content1); 764 content1.AddStream(stream1); 765 EXPECT_EQ(0u, media_channel1_->send_streams().size()); 766 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL)); 767 768 ASSERT_EQ(1u, media_channel1_->send_streams().size()); 769 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]); 770 771 // Update the local streams by adding another sending stream. 772 // Use a partial updated session description. 773 typename T::Content content2; 774 content2.AddStream(stream2); 775 content2.AddStream(stream3); 776 content2.set_partial(true); 777 EXPECT_TRUE(channel1_->SetLocalContent(&content2, CA_UPDATE, NULL)); 778 ASSERT_EQ(3u, media_channel1_->send_streams().size()); 779 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]); 780 EXPECT_EQ(stream2, media_channel1_->send_streams()[1]); 781 EXPECT_EQ(stream3, media_channel1_->send_streams()[2]); 782 783 // Update the local streams by removing the first sending stream. 784 // This is done by removing all SSRCS for this particular stream. 785 typename T::Content content3; 786 stream1.ssrcs.clear(); 787 content3.AddStream(stream1); 788 content3.set_partial(true); 789 EXPECT_TRUE(channel1_->SetLocalContent(&content3, CA_UPDATE, NULL)); 790 ASSERT_EQ(2u, media_channel1_->send_streams().size()); 791 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]); 792 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]); 793 794 // Update the local streams with a stream that does not change. 795 // THe update is ignored. 796 typename T::Content content4; 797 content4.AddStream(stream2); 798 content4.set_partial(true); 799 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_UPDATE, NULL)); 800 ASSERT_EQ(2u, media_channel1_->send_streams().size()); 801 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]); 802 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]); 803 } 804 805 // Test that SetRemoteContent properly handles adding and removing 806 // StreamParams to the remote content description. 807 // This test uses the CA_UPDATE action that don't require a full 808 // MediaContentDescription to do an update. 809 void TestUpdateStreamsInRemoteContent() { 810 cricket::StreamParams stream1; 811 stream1.id = "Stream1"; 812 stream1.groupid = "1"; 813 stream1.ssrcs.push_back(kSsrc1); 814 stream1.cname = "stream1_cname"; 815 816 cricket::StreamParams stream2; 817 stream2.id = "Stream2"; 818 stream2.groupid = "2"; 819 stream2.ssrcs.push_back(kSsrc2); 820 stream2.cname = "stream2_cname"; 821 822 cricket::StreamParams stream3; 823 stream3.id = "Stream3"; 824 stream3.groupid = "3"; 825 stream3.ssrcs.push_back(kSsrc3); 826 stream3.cname = "stream3_cname"; 827 828 CreateChannels(0, 0); 829 typename T::Content content1; 830 CreateContent(0, kPcmuCodec, kH264Codec, &content1); 831 content1.AddStream(stream1); 832 EXPECT_EQ(0u, media_channel1_->recv_streams().size()); 833 EXPECT_TRUE(channel1_->SetRemoteContent(&content1, CA_OFFER, NULL)); 834 835 ASSERT_EQ(1u, media_channel1_->codecs().size()); 836 ASSERT_EQ(1u, media_channel1_->recv_streams().size()); 837 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]); 838 839 // Update the remote streams by adding another sending stream. 840 // Use a partial updated session description. 841 typename T::Content content2; 842 content2.AddStream(stream2); 843 content2.AddStream(stream3); 844 content2.set_partial(true); 845 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_UPDATE, NULL)); 846 ASSERT_EQ(3u, media_channel1_->recv_streams().size()); 847 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]); 848 EXPECT_EQ(stream2, media_channel1_->recv_streams()[1]); 849 EXPECT_EQ(stream3, media_channel1_->recv_streams()[2]); 850 851 // Update the remote streams by removing the first stream. 852 // This is done by removing all SSRCS for this particular stream. 853 typename T::Content content3; 854 stream1.ssrcs.clear(); 855 content3.AddStream(stream1); 856 content3.set_partial(true); 857 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_UPDATE, NULL)); 858 ASSERT_EQ(2u, media_channel1_->recv_streams().size()); 859 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]); 860 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]); 861 862 // Update the remote streams with a stream that does not change. 863 // The update is ignored. 864 typename T::Content content4; 865 content4.AddStream(stream2); 866 content4.set_partial(true); 867 EXPECT_TRUE(channel1_->SetRemoteContent(&content4, CA_UPDATE, NULL)); 868 ASSERT_EQ(2u, media_channel1_->recv_streams().size()); 869 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]); 870 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]); 871 } 872 873 // Test that SetLocalContent and SetRemoteContent properly 874 // handles adding and removing StreamParams when the action is a full 875 // CA_OFFER / CA_ANSWER. 876 void TestChangeStreamParamsInContent() { 877 cricket::StreamParams stream1; 878 stream1.groupid = "group1"; 879 stream1.id = "stream1"; 880 stream1.ssrcs.push_back(kSsrc1); 881 stream1.cname = "stream1_cname"; 882 883 cricket::StreamParams stream2; 884 stream2.groupid = "group1"; 885 stream2.id = "stream2"; 886 stream2.ssrcs.push_back(kSsrc2); 887 stream2.cname = "stream2_cname"; 888 889 // Setup a call where channel 1 send |stream1| to channel 2. 890 CreateChannels(0, 0); 891 typename T::Content content1; 892 CreateContent(0, kPcmuCodec, kH264Codec, &content1); 893 content1.AddStream(stream1); 894 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL)); 895 EXPECT_TRUE(channel1_->Enable(true)); 896 EXPECT_EQ(1u, media_channel1_->send_streams().size()); 897 898 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL)); 899 EXPECT_EQ(1u, media_channel2_->recv_streams().size()); 900 session1_.Connect(&session2_); 901 902 // Channel 2 do not send anything. 903 typename T::Content content2; 904 CreateContent(0, kPcmuCodec, kH264Codec, &content2); 905 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL)); 906 EXPECT_EQ(0u, media_channel1_->recv_streams().size()); 907 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL)); 908 EXPECT_TRUE(channel2_->Enable(true)); 909 EXPECT_EQ(0u, media_channel2_->send_streams().size()); 910 911 EXPECT_TRUE(SendCustomRtp1(kSsrc1, 0)); 912 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0)); 913 914 // Let channel 2 update the content by sending |stream2| and enable SRTP. 915 typename T::Content content3; 916 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3); 917 content3.AddStream(stream2); 918 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL)); 919 ASSERT_EQ(1u, media_channel2_->send_streams().size()); 920 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]); 921 922 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL)); 923 ASSERT_EQ(1u, media_channel1_->recv_streams().size()); 924 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]); 925 926 // Channel 1 replies but stop sending stream1. 927 typename T::Content content4; 928 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4); 929 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL)); 930 EXPECT_EQ(0u, media_channel1_->send_streams().size()); 931 932 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL)); 933 EXPECT_EQ(0u, media_channel2_->recv_streams().size()); 934 935 EXPECT_TRUE(channel1_->secure()); 936 EXPECT_TRUE(channel2_->secure()); 937 EXPECT_TRUE(SendCustomRtp2(kSsrc2, 0)); 938 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0)); 939 } 940 941 // Test that we only start playout and sending at the right times. 942 void TestPlayoutAndSendingStates() { 943 CreateChannels(0, 0); 944 EXPECT_FALSE(media_channel1_->playout()); 945 EXPECT_FALSE(media_channel1_->sending()); 946 EXPECT_FALSE(media_channel2_->playout()); 947 EXPECT_FALSE(media_channel2_->sending()); 948 EXPECT_TRUE(channel1_->Enable(true)); 949 EXPECT_FALSE(media_channel1_->playout()); 950 EXPECT_FALSE(media_channel1_->sending()); 951 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_, 952 CA_OFFER, NULL)); 953 EXPECT_TRUE(media_channel1_->playout()); 954 EXPECT_FALSE(media_channel1_->sending()); 955 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_, 956 CA_OFFER, NULL)); 957 EXPECT_FALSE(media_channel2_->playout()); 958 EXPECT_FALSE(media_channel2_->sending()); 959 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_, 960 CA_ANSWER, NULL)); 961 EXPECT_FALSE(media_channel2_->playout()); 962 EXPECT_FALSE(media_channel2_->sending()); 963 session1_.Connect(&session2_); 964 EXPECT_TRUE(media_channel1_->playout()); 965 EXPECT_FALSE(media_channel1_->sending()); 966 EXPECT_FALSE(media_channel2_->playout()); 967 EXPECT_FALSE(media_channel2_->sending()); 968 EXPECT_TRUE(channel2_->Enable(true)); 969 EXPECT_TRUE(media_channel2_->playout()); 970 EXPECT_TRUE(media_channel2_->sending()); 971 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_, 972 CA_ANSWER, NULL)); 973 EXPECT_TRUE(media_channel1_->playout()); 974 EXPECT_TRUE(media_channel1_->sending()); 975 } 976 977 void TestMuteStream() { 978 CreateChannels(0, 0); 979 // Test that we can Mute the default channel even though the sending SSRC is 980 // unknown. 981 EXPECT_FALSE(media_channel1_->IsStreamMuted(0)); 982 EXPECT_TRUE(channel1_->MuteStream(0, true)); 983 EXPECT_TRUE(media_channel1_->IsStreamMuted(0)); 984 EXPECT_TRUE(channel1_->MuteStream(0, false)); 985 EXPECT_FALSE(media_channel1_->IsStreamMuted(0)); 986 987 // Test that we can not mute an unknown SSRC. 988 EXPECT_FALSE(channel1_->MuteStream(kSsrc1, true)); 989 990 SendInitiate(); 991 // After the local session description has been set, we can mute a stream 992 // with its SSRC. 993 EXPECT_TRUE(channel1_->MuteStream(kSsrc1, true)); 994 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1)); 995 EXPECT_TRUE(channel1_->MuteStream(kSsrc1, false)); 996 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1)); 997 } 998 999 // Test that changing the MediaContentDirection in the local and remote 1000 // session description start playout and sending at the right time. 1001 void TestMediaContentDirection() { 1002 CreateChannels(0, 0); 1003 typename T::Content content1; 1004 CreateContent(0, kPcmuCodec, kH264Codec, &content1); 1005 typename T::Content content2; 1006 CreateContent(0, kPcmuCodec, kH264Codec, &content2); 1007 // Set |content2| to be InActive. 1008 content2.set_direction(cricket::MD_INACTIVE); 1009 1010 EXPECT_TRUE(channel1_->Enable(true)); 1011 EXPECT_TRUE(channel2_->Enable(true)); 1012 EXPECT_FALSE(media_channel1_->playout()); 1013 EXPECT_FALSE(media_channel1_->sending()); 1014 EXPECT_FALSE(media_channel2_->playout()); 1015 EXPECT_FALSE(media_channel2_->sending()); 1016 1017 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL)); 1018 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL)); 1019 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL)); 1020 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL)); 1021 session1_.Connect(&session2_); 1022 1023 EXPECT_TRUE(media_channel1_->playout()); 1024 EXPECT_FALSE(media_channel1_->sending()); // remote InActive 1025 EXPECT_FALSE(media_channel2_->playout()); // local InActive 1026 EXPECT_FALSE(media_channel2_->sending()); // local InActive 1027 1028 // Update |content2| to be RecvOnly. 1029 content2.set_direction(cricket::MD_RECVONLY); 1030 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL)); 1031 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL)); 1032 1033 EXPECT_TRUE(media_channel1_->playout()); 1034 EXPECT_TRUE(media_channel1_->sending()); 1035 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly 1036 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly 1037 1038 // Update |content2| to be SendRecv. 1039 content2.set_direction(cricket::MD_SENDRECV); 1040 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL)); 1041 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL)); 1042 1043 EXPECT_TRUE(media_channel1_->playout()); 1044 EXPECT_TRUE(media_channel1_->sending()); 1045 EXPECT_TRUE(media_channel2_->playout()); 1046 EXPECT_TRUE(media_channel2_->sending()); 1047 } 1048 1049 // Test setting up a call. 1050 void TestCallSetup() { 1051 CreateChannels(0, 0); 1052 EXPECT_FALSE(channel1_->secure()); 1053 EXPECT_TRUE(SendInitiate()); 1054 EXPECT_TRUE(media_channel1_->playout()); 1055 EXPECT_FALSE(media_channel1_->sending()); 1056 EXPECT_TRUE(SendAccept()); 1057 EXPECT_FALSE(channel1_->secure()); 1058 EXPECT_TRUE(media_channel1_->sending()); 1059 EXPECT_EQ(1U, media_channel1_->codecs().size()); 1060 EXPECT_TRUE(media_channel2_->playout()); 1061 EXPECT_TRUE(media_channel2_->sending()); 1062 EXPECT_EQ(1U, media_channel2_->codecs().size()); 1063 } 1064 1065 // Test that we don't crash if packets are sent during call teardown 1066 // when RTCP mux is enabled. This is a regression test against a specific 1067 // race condition that would only occur when a RTCP packet was sent during 1068 // teardown of a channel on which RTCP mux was enabled. 1069 void TestCallTeardownRtcpMux() { 1070 class LastWordMediaChannel : public T::MediaChannel { 1071 public: 1072 LastWordMediaChannel() : T::MediaChannel(NULL) {} 1073 ~LastWordMediaChannel() { 1074 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame)); 1075 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport)); 1076 } 1077 }; 1078 CreateChannels(new LastWordMediaChannel(), new LastWordMediaChannel(), 1079 RTCP | RTCP_MUX, RTCP | RTCP_MUX, 1080 talk_base::Thread::Current()); 1081 EXPECT_TRUE(SendInitiate()); 1082 EXPECT_TRUE(SendAccept()); 1083 EXPECT_TRUE(SendTerminate()); 1084 } 1085 1086 // Send voice RTP data to the other side and ensure it gets there. 1087 void SendRtpToRtp() { 1088 CreateChannels(0, 0); 1089 EXPECT_TRUE(SendInitiate()); 1090 EXPECT_TRUE(SendAccept()); 1091 EXPECT_EQ(1U, GetTransport1()->channels().size()); 1092 EXPECT_EQ(1U, GetTransport2()->channels().size()); 1093 EXPECT_TRUE(SendRtp1()); 1094 EXPECT_TRUE(SendRtp2()); 1095 EXPECT_TRUE(CheckRtp1()); 1096 EXPECT_TRUE(CheckRtp2()); 1097 EXPECT_TRUE(CheckNoRtp1()); 1098 EXPECT_TRUE(CheckNoRtp2()); 1099 } 1100 1101 // Check that RTCP is not transmitted if both sides don't support RTCP. 1102 void SendNoRtcpToNoRtcp() { 1103 CreateChannels(0, 0); 1104 EXPECT_TRUE(SendInitiate()); 1105 EXPECT_TRUE(SendAccept()); 1106 EXPECT_EQ(1U, GetTransport1()->channels().size()); 1107 EXPECT_EQ(1U, GetTransport2()->channels().size()); 1108 EXPECT_FALSE(SendRtcp1()); 1109 EXPECT_FALSE(SendRtcp2()); 1110 EXPECT_TRUE(CheckNoRtcp1()); 1111 EXPECT_TRUE(CheckNoRtcp2()); 1112 } 1113 1114 // Check that RTCP is not transmitted if the callee doesn't support RTCP. 1115 void SendNoRtcpToRtcp() { 1116 CreateChannels(0, RTCP); 1117 EXPECT_TRUE(SendInitiate()); 1118 EXPECT_TRUE(SendAccept()); 1119 EXPECT_EQ(1U, GetTransport1()->channels().size()); 1120 EXPECT_EQ(2U, GetTransport2()->channels().size()); 1121 EXPECT_FALSE(SendRtcp1()); 1122 EXPECT_FALSE(SendRtcp2()); 1123 EXPECT_TRUE(CheckNoRtcp1()); 1124 EXPECT_TRUE(CheckNoRtcp2()); 1125 } 1126 1127 // Check that RTCP is not transmitted if the caller doesn't support RTCP. 1128 void SendRtcpToNoRtcp() { 1129 CreateChannels(RTCP, 0); 1130 EXPECT_TRUE(SendInitiate()); 1131 EXPECT_TRUE(SendAccept()); 1132 EXPECT_EQ(2U, GetTransport1()->channels().size()); 1133 EXPECT_EQ(1U, GetTransport2()->channels().size()); 1134 EXPECT_FALSE(SendRtcp1()); 1135 EXPECT_FALSE(SendRtcp2()); 1136 EXPECT_TRUE(CheckNoRtcp1()); 1137 EXPECT_TRUE(CheckNoRtcp2()); 1138 } 1139 1140 // Check that RTCP is transmitted if both sides support RTCP. 1141 void SendRtcpToRtcp() { 1142 CreateChannels(RTCP, RTCP); 1143 EXPECT_TRUE(SendInitiate()); 1144 EXPECT_TRUE(SendAccept()); 1145 EXPECT_EQ(2U, GetTransport1()->channels().size()); 1146 EXPECT_EQ(2U, GetTransport2()->channels().size()); 1147 EXPECT_TRUE(SendRtcp1()); 1148 EXPECT_TRUE(SendRtcp2()); 1149 EXPECT_TRUE(CheckRtcp1()); 1150 EXPECT_TRUE(CheckRtcp2()); 1151 EXPECT_TRUE(CheckNoRtcp1()); 1152 EXPECT_TRUE(CheckNoRtcp2()); 1153 } 1154 1155 // Check that RTCP is transmitted if only the initiator supports mux. 1156 void SendRtcpMuxToRtcp() { 1157 CreateChannels(RTCP | RTCP_MUX, RTCP); 1158 EXPECT_TRUE(SendInitiate()); 1159 EXPECT_TRUE(SendAccept()); 1160 EXPECT_EQ(2U, GetTransport1()->channels().size()); 1161 EXPECT_EQ(2U, GetTransport2()->channels().size()); 1162 EXPECT_TRUE(SendRtcp1()); 1163 EXPECT_TRUE(SendRtcp2()); 1164 EXPECT_TRUE(CheckRtcp1()); 1165 EXPECT_TRUE(CheckRtcp2()); 1166 EXPECT_TRUE(CheckNoRtcp1()); 1167 EXPECT_TRUE(CheckNoRtcp2()); 1168 } 1169 1170 // Check that RTP and RTCP are transmitted ok when both sides support mux. 1171 void SendRtcpMuxToRtcpMux() { 1172 CreateChannels(RTCP | RTCP_MUX, RTCP | RTCP_MUX); 1173 EXPECT_TRUE(SendInitiate()); 1174 EXPECT_EQ(2U, GetTransport1()->channels().size()); 1175 EXPECT_EQ(1U, GetTransport2()->channels().size()); 1176 EXPECT_TRUE(SendAccept()); 1177 EXPECT_EQ(1U, GetTransport1()->channels().size()); 1178 EXPECT_TRUE(SendRtp1()); 1179 EXPECT_TRUE(SendRtp2()); 1180 EXPECT_TRUE(SendRtcp1()); 1181 EXPECT_TRUE(SendRtcp2()); 1182 EXPECT_TRUE(CheckRtp1()); 1183 EXPECT_TRUE(CheckRtp2()); 1184 EXPECT_TRUE(CheckNoRtp1()); 1185 EXPECT_TRUE(CheckNoRtp2()); 1186 EXPECT_TRUE(CheckRtcp1()); 1187 EXPECT_TRUE(CheckRtcp2()); 1188 EXPECT_TRUE(CheckNoRtcp1()); 1189 EXPECT_TRUE(CheckNoRtcp2()); 1190 } 1191 1192 // Check that RTCP data sent by the initiator before the accept is not muxed. 1193 void SendEarlyRtcpMuxToRtcp() { 1194 CreateChannels(RTCP | RTCP_MUX, RTCP); 1195 EXPECT_TRUE(SendInitiate()); 1196 EXPECT_EQ(2U, GetTransport1()->channels().size()); 1197 EXPECT_EQ(2U, GetTransport2()->channels().size()); 1198 1199 // RTCP can be sent before the call is accepted, if the transport is ready. 1200 // It should not be muxed though, as the remote side doesn't support mux. 1201 EXPECT_TRUE(SendRtcp1()); 1202 EXPECT_TRUE(CheckNoRtp2()); 1203 EXPECT_TRUE(CheckRtcp2()); 1204 1205 // Send RTCP packet from callee and verify that it is received. 1206 EXPECT_TRUE(SendRtcp2()); 1207 EXPECT_TRUE(CheckNoRtp1()); 1208 EXPECT_TRUE(CheckRtcp1()); 1209 1210 // Complete call setup and ensure everything is still OK. 1211 EXPECT_TRUE(SendAccept()); 1212 EXPECT_EQ(2U, GetTransport1()->channels().size()); 1213 EXPECT_TRUE(SendRtcp1()); 1214 EXPECT_TRUE(CheckRtcp2()); 1215 EXPECT_TRUE(SendRtcp2()); 1216 EXPECT_TRUE(CheckRtcp1()); 1217 } 1218 1219 1220 // Check that RTCP data is not muxed until both sides have enabled muxing, 1221 // but that we properly demux before we get the accept message, since there 1222 // is a race between RTP data and the jingle accept. 1223 void SendEarlyRtcpMuxToRtcpMux() { 1224 CreateChannels(RTCP | RTCP_MUX, RTCP | RTCP_MUX); 1225 EXPECT_TRUE(SendInitiate()); 1226 EXPECT_EQ(2U, GetTransport1()->channels().size()); 1227 EXPECT_EQ(1U, GetTransport2()->channels().size()); 1228 1229 // RTCP can't be sent yet, since the RTCP transport isn't writable, and 1230 // we haven't yet received the accept that says we should mux. 1231 EXPECT_FALSE(SendRtcp1()); 1232 1233 // Send muxed RTCP packet from callee and verify that it is received. 1234 EXPECT_TRUE(SendRtcp2()); 1235 EXPECT_TRUE(CheckNoRtp1()); 1236 EXPECT_TRUE(CheckRtcp1()); 1237 1238 // Complete call setup and ensure everything is still OK. 1239 EXPECT_TRUE(SendAccept()); 1240 EXPECT_EQ(1U, GetTransport1()->channels().size()); 1241 EXPECT_TRUE(SendRtcp1()); 1242 EXPECT_TRUE(CheckRtcp2()); 1243 EXPECT_TRUE(SendRtcp2()); 1244 EXPECT_TRUE(CheckRtcp1()); 1245 } 1246 1247 // Test that we properly send SRTP with RTCP in both directions. 1248 // You can pass in DTLS and/or RTCP_MUX as flags. 1249 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) { 1250 ASSERT((flags1_in & ~(RTCP_MUX | DTLS)) == 0); 1251 ASSERT((flags2_in & ~(RTCP_MUX | DTLS)) == 0); 1252 1253 int flags1 = RTCP | SECURE | flags1_in; 1254 int flags2 = RTCP | SECURE | flags2_in; 1255 bool dtls1 = !!(flags1_in & DTLS); 1256 bool dtls2 = !!(flags2_in & DTLS); 1257 CreateChannels(flags1, flags2); 1258 EXPECT_FALSE(channel1_->secure()); 1259 EXPECT_FALSE(channel2_->secure()); 1260 EXPECT_TRUE(SendInitiate()); 1261 EXPECT_TRUE_WAIT(channel1_->writable(), kEventTimeout); 1262 EXPECT_TRUE_WAIT(channel2_->writable(), kEventTimeout); 1263 EXPECT_TRUE(SendAccept()); 1264 EXPECT_TRUE(channel1_->secure()); 1265 EXPECT_TRUE(channel2_->secure()); 1266 EXPECT_EQ(dtls1 && dtls2, channel1_->secure_dtls()); 1267 EXPECT_EQ(dtls1 && dtls2, channel2_->secure_dtls()); 1268 EXPECT_TRUE(SendRtp1()); 1269 EXPECT_TRUE(SendRtp2()); 1270 EXPECT_TRUE(SendRtcp1()); 1271 EXPECT_TRUE(SendRtcp2()); 1272 EXPECT_TRUE(CheckRtp1()); 1273 EXPECT_TRUE(CheckRtp2()); 1274 EXPECT_TRUE(CheckNoRtp1()); 1275 EXPECT_TRUE(CheckNoRtp2()); 1276 EXPECT_TRUE(CheckRtcp1()); 1277 EXPECT_TRUE(CheckRtcp2()); 1278 EXPECT_TRUE(CheckNoRtcp1()); 1279 EXPECT_TRUE(CheckNoRtcp2()); 1280 } 1281 1282 // Test that we properly handling SRTP negotiating down to RTP. 1283 void SendSrtpToRtp() { 1284 CreateChannels(RTCP | SECURE, RTCP); 1285 EXPECT_FALSE(channel1_->secure()); 1286 EXPECT_FALSE(channel2_->secure()); 1287 EXPECT_TRUE(SendInitiate()); 1288 EXPECT_TRUE(SendAccept()); 1289 EXPECT_FALSE(channel1_->secure()); 1290 EXPECT_FALSE(channel2_->secure()); 1291 EXPECT_TRUE(SendRtp1()); 1292 EXPECT_TRUE(SendRtp2()); 1293 EXPECT_TRUE(SendRtcp1()); 1294 EXPECT_TRUE(SendRtcp2()); 1295 EXPECT_TRUE(CheckRtp1()); 1296 EXPECT_TRUE(CheckRtp2()); 1297 EXPECT_TRUE(CheckNoRtp1()); 1298 EXPECT_TRUE(CheckNoRtp2()); 1299 EXPECT_TRUE(CheckRtcp1()); 1300 EXPECT_TRUE(CheckRtcp2()); 1301 EXPECT_TRUE(CheckNoRtcp1()); 1302 EXPECT_TRUE(CheckNoRtcp2()); 1303 } 1304 1305 // Test that we can send and receive early media when a provisional answer is 1306 // sent and received. The test uses SRTP, RTCP mux and SSRC mux. 1307 void SendEarlyMediaUsingRtcpMuxSrtp() { 1308 int sequence_number1_1 = 0, sequence_number2_2 = 0; 1309 1310 CreateChannels(SSRC_MUX | RTCP | RTCP_MUX | SECURE, 1311 SSRC_MUX | RTCP | RTCP_MUX | SECURE); 1312 EXPECT_TRUE(SendOffer()); 1313 EXPECT_TRUE(SendProvisionalAnswer()); 1314 EXPECT_TRUE(channel1_->secure()); 1315 EXPECT_TRUE(channel2_->secure()); 1316 EXPECT_EQ(2U, GetTransport1()->channels().size()); 1317 EXPECT_EQ(2U, GetTransport2()->channels().size()); 1318 EXPECT_TRUE(SendCustomRtcp1(kSsrc1)); 1319 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1)); 1320 EXPECT_TRUE(SendCustomRtp1(kSsrc1, ++sequence_number1_1)); 1321 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1)); 1322 1323 // Send packets from callee and verify that it is received. 1324 EXPECT_TRUE(SendCustomRtcp2(kSsrc2)); 1325 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2)); 1326 EXPECT_TRUE(SendCustomRtp2(kSsrc2, ++sequence_number2_2)); 1327 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2)); 1328 1329 // Complete call setup and ensure everything is still OK. 1330 EXPECT_TRUE(SendFinalAnswer()); 1331 EXPECT_EQ(1U, GetTransport1()->channels().size()); 1332 EXPECT_EQ(1U, GetTransport2()->channels().size()); 1333 EXPECT_TRUE(channel1_->secure()); 1334 EXPECT_TRUE(channel2_->secure()); 1335 EXPECT_TRUE(SendCustomRtcp1(kSsrc1)); 1336 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1)); 1337 EXPECT_TRUE(SendCustomRtp1(kSsrc1, ++sequence_number1_1)); 1338 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1)); 1339 EXPECT_TRUE(SendCustomRtcp2(kSsrc2)); 1340 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2)); 1341 EXPECT_TRUE(SendCustomRtp2(kSsrc2, ++sequence_number2_2)); 1342 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2)); 1343 } 1344 1345 // Test that we properly send RTP without SRTP from a thread. 1346 void SendRtpToRtpOnThread() { 1347 bool sent_rtp1, sent_rtp2, sent_rtcp1, sent_rtcp2; 1348 CreateChannels(RTCP, RTCP); 1349 EXPECT_TRUE(SendInitiate()); 1350 EXPECT_TRUE(SendAccept()); 1351 CallOnThread(&ChannelTest<T>::SendRtp1, &sent_rtp1); 1352 CallOnThread(&ChannelTest<T>::SendRtp2, &sent_rtp2); 1353 CallOnThread(&ChannelTest<T>::SendRtcp1, &sent_rtcp1); 1354 CallOnThread(&ChannelTest<T>::SendRtcp2, &sent_rtcp2); 1355 EXPECT_TRUE_WAIT(CheckRtp1(), 1000); 1356 EXPECT_TRUE_WAIT(CheckRtp2(), 1000); 1357 EXPECT_TRUE_WAIT(sent_rtp1, 1000); 1358 EXPECT_TRUE_WAIT(sent_rtp2, 1000); 1359 EXPECT_TRUE(CheckNoRtp1()); 1360 EXPECT_TRUE(CheckNoRtp2()); 1361 EXPECT_TRUE_WAIT(CheckRtcp1(), 1000); 1362 EXPECT_TRUE_WAIT(CheckRtcp2(), 1000); 1363 EXPECT_TRUE_WAIT(sent_rtcp1, 1000); 1364 EXPECT_TRUE_WAIT(sent_rtcp2, 1000); 1365 EXPECT_TRUE(CheckNoRtcp1()); 1366 EXPECT_TRUE(CheckNoRtcp2()); 1367 } 1368 1369 // Test that we properly send SRTP with RTCP from a thread. 1370 void SendSrtpToSrtpOnThread() { 1371 bool sent_rtp1, sent_rtp2, sent_rtcp1, sent_rtcp2; 1372 CreateChannels(RTCP | SECURE, RTCP | SECURE); 1373 EXPECT_TRUE(SendInitiate()); 1374 EXPECT_TRUE(SendAccept()); 1375 CallOnThread(&ChannelTest<T>::SendRtp1, &sent_rtp1); 1376 CallOnThread(&ChannelTest<T>::SendRtp2, &sent_rtp2); 1377 CallOnThread(&ChannelTest<T>::SendRtcp1, &sent_rtcp1); 1378 CallOnThread(&ChannelTest<T>::SendRtcp2, &sent_rtcp2); 1379 EXPECT_TRUE_WAIT(CheckRtp1(), 1000); 1380 EXPECT_TRUE_WAIT(CheckRtp2(), 1000); 1381 EXPECT_TRUE_WAIT(sent_rtp1, 1000); 1382 EXPECT_TRUE_WAIT(sent_rtp2, 1000); 1383 EXPECT_TRUE(CheckNoRtp1()); 1384 EXPECT_TRUE(CheckNoRtp2()); 1385 EXPECT_TRUE_WAIT(CheckRtcp1(), 1000); 1386 EXPECT_TRUE_WAIT(CheckRtcp2(), 1000); 1387 EXPECT_TRUE_WAIT(sent_rtcp1, 1000); 1388 EXPECT_TRUE_WAIT(sent_rtcp2, 1000); 1389 EXPECT_TRUE(CheckNoRtcp1()); 1390 EXPECT_TRUE(CheckNoRtcp2()); 1391 } 1392 1393 // Test that the mediachannel retains its sending state after the transport 1394 // becomes non-writable. 1395 void SendWithWritabilityLoss() { 1396 CreateChannels(0, 0); 1397 EXPECT_TRUE(SendInitiate()); 1398 EXPECT_TRUE(SendAccept()); 1399 EXPECT_EQ(1U, GetTransport1()->channels().size()); 1400 EXPECT_EQ(1U, GetTransport2()->channels().size()); 1401 EXPECT_TRUE(SendRtp1()); 1402 EXPECT_TRUE(SendRtp2()); 1403 EXPECT_TRUE(CheckRtp1()); 1404 EXPECT_TRUE(CheckRtp2()); 1405 EXPECT_TRUE(CheckNoRtp1()); 1406 EXPECT_TRUE(CheckNoRtp2()); 1407 1408 // Lose writability, which should fail. 1409 GetTransport1()->SetWritable(false); 1410 EXPECT_FALSE(SendRtp1()); 1411 EXPECT_TRUE(SendRtp2()); 1412 EXPECT_TRUE(CheckRtp1()); 1413 EXPECT_TRUE(CheckNoRtp2()); 1414 1415 // Regain writability 1416 GetTransport1()->SetWritable(true); 1417 EXPECT_TRUE(media_channel1_->sending()); 1418 EXPECT_TRUE(SendRtp1()); 1419 EXPECT_TRUE(SendRtp2()); 1420 EXPECT_TRUE(CheckRtp1()); 1421 EXPECT_TRUE(CheckRtp2()); 1422 EXPECT_TRUE(CheckNoRtp1()); 1423 EXPECT_TRUE(CheckNoRtp2()); 1424 1425 // Lose writability completely 1426 GetTransport1()->SetDestination(NULL); 1427 EXPECT_TRUE(media_channel1_->sending()); 1428 1429 // Should fail also. 1430 EXPECT_FALSE(SendRtp1()); 1431 EXPECT_TRUE(SendRtp2()); 1432 EXPECT_TRUE(CheckRtp1()); 1433 EXPECT_TRUE(CheckNoRtp2()); 1434 1435 // Gain writability back 1436 GetTransport1()->SetDestination(GetTransport2()); 1437 EXPECT_TRUE(media_channel1_->sending()); 1438 EXPECT_TRUE(SendRtp1()); 1439 EXPECT_TRUE(SendRtp2()); 1440 EXPECT_TRUE(CheckRtp1()); 1441 EXPECT_TRUE(CheckRtp2()); 1442 EXPECT_TRUE(CheckNoRtp1()); 1443 EXPECT_TRUE(CheckNoRtp2()); 1444 } 1445 1446 void SendBundleToBundle( 1447 const int* pl_types, int len, bool rtcp_mux, bool secure) { 1448 ASSERT_EQ(2, len); 1449 int sequence_number1_1 = 0, sequence_number2_2 = 0; 1450 // Only pl_type1 was added to the bundle filter for both |channel1_| 1451 // and |channel2_|. 1452 int pl_type1 = pl_types[0]; 1453 int pl_type2 = pl_types[1]; 1454 int flags = SSRC_MUX | RTCP; 1455 if (secure) flags |= SECURE; 1456 uint32 expected_channels = 2U; 1457 if (rtcp_mux) { 1458 flags |= RTCP_MUX; 1459 expected_channels = 1U; 1460 } 1461 CreateChannels(flags, flags); 1462 EXPECT_TRUE(SendInitiate()); 1463 EXPECT_EQ(2U, GetTransport1()->channels().size()); 1464 EXPECT_EQ(expected_channels, GetTransport2()->channels().size()); 1465 EXPECT_TRUE(SendAccept()); 1466 EXPECT_EQ(expected_channels, GetTransport1()->channels().size()); 1467 EXPECT_EQ(expected_channels, GetTransport2()->channels().size()); 1468 EXPECT_TRUE(channel1_->bundle_filter()->FindPayloadType(pl_type1)); 1469 EXPECT_TRUE(channel2_->bundle_filter()->FindPayloadType(pl_type1)); 1470 EXPECT_FALSE(channel1_->bundle_filter()->FindPayloadType(pl_type2)); 1471 EXPECT_FALSE(channel2_->bundle_filter()->FindPayloadType(pl_type2)); 1472 // channel1 - should only have media_content2 as remote. i.e. kSsrc2 1473 EXPECT_TRUE(channel1_->bundle_filter()->FindStream(kSsrc2)); 1474 EXPECT_FALSE(channel1_->bundle_filter()->FindStream(kSsrc1)); 1475 // channel2 - should only have media_content1 as remote. i.e. kSsrc1 1476 EXPECT_TRUE(channel2_->bundle_filter()->FindStream(kSsrc1)); 1477 EXPECT_FALSE(channel2_->bundle_filter()->FindStream(kSsrc2)); 1478 1479 // Both channels can receive pl_type1 only. 1480 EXPECT_TRUE(SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1)); 1481 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1)); 1482 EXPECT_TRUE(SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1)); 1483 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1)); 1484 EXPECT_TRUE(CheckNoRtp1()); 1485 EXPECT_TRUE(CheckNoRtp2()); 1486 1487 // RTCP test 1488 EXPECT_TRUE(SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2)); 1489 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2)); 1490 EXPECT_TRUE(SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2)); 1491 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2)); 1492 1493 EXPECT_TRUE(SendCustomRtcp1(kSsrc1)); 1494 EXPECT_TRUE(SendCustomRtcp2(kSsrc2)); 1495 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2)); 1496 EXPECT_TRUE(CheckNoRtcp1()); 1497 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1)); 1498 EXPECT_TRUE(CheckNoRtcp2()); 1499 1500 EXPECT_TRUE(SendCustomRtcp1(kSsrc2)); 1501 EXPECT_TRUE(SendCustomRtcp2(kSsrc1)); 1502 EXPECT_FALSE(CheckCustomRtcp1(kSsrc1)); 1503 EXPECT_FALSE(CheckCustomRtcp2(kSsrc2)); 1504 } 1505 1506 // Test that the media monitor can be run and gives timely callbacks. 1507 void TestMediaMonitor() { 1508 static const int kTimeout = 500; 1509 CreateChannels(0, 0); 1510 EXPECT_TRUE(SendInitiate()); 1511 EXPECT_TRUE(SendAccept()); 1512 channel1_->StartMediaMonitor(100); 1513 channel2_->StartMediaMonitor(100); 1514 // Ensure we get callbacks and stop. 1515 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kTimeout); 1516 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kTimeout); 1517 channel1_->StopMediaMonitor(); 1518 channel2_->StopMediaMonitor(); 1519 // Ensure a restart of a stopped monitor works. 1520 channel1_->StartMediaMonitor(100); 1521 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kTimeout); 1522 channel1_->StopMediaMonitor(); 1523 // Ensure stopping a stopped monitor is OK. 1524 channel1_->StopMediaMonitor(); 1525 } 1526 1527 void TestMediaSinks() { 1528 CreateChannels(0, 0); 1529 EXPECT_TRUE(SendInitiate()); 1530 EXPECT_TRUE(SendAccept()); 1531 EXPECT_FALSE(channel1_->HasSendSinks(cricket::SINK_POST_CRYPTO)); 1532 EXPECT_FALSE(channel1_->HasRecvSinks(cricket::SINK_POST_CRYPTO)); 1533 EXPECT_FALSE(channel1_->HasSendSinks(cricket::SINK_PRE_CRYPTO)); 1534 EXPECT_FALSE(channel1_->HasRecvSinks(cricket::SINK_PRE_CRYPTO)); 1535 1536 talk_base::Pathname path; 1537 EXPECT_TRUE(talk_base::Filesystem::GetTemporaryFolder(path, true, NULL)); 1538 path.SetFilename("sink-test.rtpdump"); 1539 talk_base::scoped_ptr<cricket::RtpDumpSink> sink( 1540 new cricket::RtpDumpSink(Open(path.pathname()))); 1541 sink->set_packet_filter(cricket::PF_ALL); 1542 EXPECT_TRUE(sink->Enable(true)); 1543 channel1_->RegisterSendSink( 1544 sink.get(), &cricket::RtpDumpSink::OnPacket, cricket::SINK_POST_CRYPTO); 1545 EXPECT_TRUE(channel1_->HasSendSinks(cricket::SINK_POST_CRYPTO)); 1546 EXPECT_FALSE(channel1_->HasRecvSinks(cricket::SINK_POST_CRYPTO)); 1547 EXPECT_FALSE(channel1_->HasSendSinks(cricket::SINK_PRE_CRYPTO)); 1548 EXPECT_FALSE(channel1_->HasRecvSinks(cricket::SINK_PRE_CRYPTO)); 1549 1550 // The first packet is recorded with header + data. 1551 EXPECT_TRUE(SendRtp1()); 1552 // The second packet is recorded with header only. 1553 sink->set_packet_filter(cricket::PF_RTPHEADER); 1554 EXPECT_TRUE(SendRtp1()); 1555 // The third packet is not recorded since sink is disabled. 1556 EXPECT_TRUE(sink->Enable(false)); 1557 EXPECT_TRUE(SendRtp1()); 1558 // The fourth packet is not recorded since sink is unregistered. 1559 EXPECT_TRUE(sink->Enable(true)); 1560 channel1_->UnregisterSendSink(sink.get(), cricket::SINK_POST_CRYPTO); 1561 EXPECT_TRUE(SendRtp1()); 1562 sink.reset(); // This will close the file. 1563 1564 // Read the recorded file and verify two packets. 1565 talk_base::scoped_ptr<talk_base::StreamInterface> stream( 1566 talk_base::Filesystem::OpenFile(path, "rb")); 1567 1568 cricket::RtpDumpReader reader(stream.get()); 1569 cricket::RtpDumpPacket packet; 1570 EXPECT_EQ(talk_base::SR_SUCCESS, reader.ReadPacket(&packet)); 1571 std::string read_packet(reinterpret_cast<const char*>(&packet.data[0]), 1572 packet.data.size()); 1573 EXPECT_EQ(rtp_packet_, read_packet); 1574 1575 EXPECT_EQ(talk_base::SR_SUCCESS, reader.ReadPacket(&packet)); 1576 size_t len = 0; 1577 packet.GetRtpHeaderLen(&len); 1578 EXPECT_EQ(len, packet.data.size()); 1579 EXPECT_EQ(0, memcmp(&packet.data[0], rtp_packet_.c_str(), len)); 1580 1581 EXPECT_EQ(talk_base::SR_EOS, reader.ReadPacket(&packet)); 1582 1583 // Delete the file for media recording. 1584 stream.reset(); 1585 EXPECT_TRUE(talk_base::Filesystem::DeleteFile(path)); 1586 } 1587 1588 void TestSetContentFailure() { 1589 CreateChannels(0, 0); 1590 typename T::Content content; 1591 cricket::SessionDescription* sdesc_loc = new cricket::SessionDescription(); 1592 cricket::SessionDescription* sdesc_rem = new cricket::SessionDescription(); 1593 1594 // Set up the session description. 1595 CreateContent(0, kPcmuCodec, kH264Codec, &content); 1596 sdesc_loc->AddContent(cricket::CN_AUDIO, cricket::NS_JINGLE_RTP, 1597 new cricket::AudioContentDescription()); 1598 sdesc_loc->AddContent(cricket::CN_VIDEO, cricket::NS_JINGLE_RTP, 1599 new cricket::VideoContentDescription()); 1600 EXPECT_TRUE(session1_.set_local_description(sdesc_loc)); 1601 sdesc_rem->AddContent(cricket::CN_AUDIO, cricket::NS_JINGLE_RTP, 1602 new cricket::AudioContentDescription()); 1603 sdesc_rem->AddContent(cricket::CN_VIDEO, cricket::NS_JINGLE_RTP, 1604 new cricket::VideoContentDescription()); 1605 EXPECT_TRUE(session1_.set_remote_description(sdesc_rem)); 1606 1607 // Test failures in SetLocalContent. 1608 media_channel1_->set_fail_set_recv_codecs(true); 1609 session1_.SetError(cricket::BaseSession::ERROR_NONE, ""); 1610 session1_.SetState(cricket::Session::STATE_SENTINITIATE); 1611 EXPECT_EQ(cricket::BaseSession::ERROR_CONTENT, session1_.error()); 1612 media_channel1_->set_fail_set_recv_codecs(true); 1613 session1_.SetError(cricket::BaseSession::ERROR_NONE, ""); 1614 session1_.SetState(cricket::Session::STATE_SENTACCEPT); 1615 EXPECT_EQ(cricket::BaseSession::ERROR_CONTENT, session1_.error()); 1616 1617 // Test failures in SetRemoteContent. 1618 media_channel1_->set_fail_set_send_codecs(true); 1619 session1_.SetError(cricket::BaseSession::ERROR_NONE, ""); 1620 session1_.SetState(cricket::Session::STATE_RECEIVEDINITIATE); 1621 EXPECT_EQ(cricket::BaseSession::ERROR_CONTENT, session1_.error()); 1622 media_channel1_->set_fail_set_send_codecs(true); 1623 session1_.SetError(cricket::BaseSession::ERROR_NONE, ""); 1624 session1_.SetState(cricket::Session::STATE_RECEIVEDACCEPT); 1625 EXPECT_EQ(cricket::BaseSession::ERROR_CONTENT, session1_.error()); 1626 } 1627 1628 void TestSendTwoOffers() { 1629 CreateChannels(0, 0); 1630 1631 // Set up the initial session description. 1632 cricket::SessionDescription* sdesc = CreateSessionDescriptionWithStream(1); 1633 EXPECT_TRUE(session1_.set_local_description(sdesc)); 1634 1635 session1_.SetError(cricket::BaseSession::ERROR_NONE, ""); 1636 session1_.SetState(cricket::Session::STATE_SENTINITIATE); 1637 EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error()); 1638 EXPECT_TRUE(media_channel1_->HasSendStream(1)); 1639 1640 // Update the local description and set the state again. 1641 sdesc = CreateSessionDescriptionWithStream(2); 1642 EXPECT_TRUE(session1_.set_local_description(sdesc)); 1643 1644 session1_.SetState(cricket::Session::STATE_SENTINITIATE); 1645 EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error()); 1646 EXPECT_FALSE(media_channel1_->HasSendStream(1)); 1647 EXPECT_TRUE(media_channel1_->HasSendStream(2)); 1648 } 1649 1650 void TestReceiveTwoOffers() { 1651 CreateChannels(0, 0); 1652 1653 // Set up the initial session description. 1654 cricket::SessionDescription* sdesc = CreateSessionDescriptionWithStream(1); 1655 EXPECT_TRUE(session1_.set_remote_description(sdesc)); 1656 1657 session1_.SetError(cricket::BaseSession::ERROR_NONE, ""); 1658 session1_.SetState(cricket::Session::STATE_RECEIVEDINITIATE); 1659 EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error()); 1660 EXPECT_TRUE(media_channel1_->HasRecvStream(1)); 1661 1662 sdesc = CreateSessionDescriptionWithStream(2); 1663 EXPECT_TRUE(session1_.set_remote_description(sdesc)); 1664 session1_.SetState(cricket::Session::STATE_RECEIVEDINITIATE); 1665 EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error()); 1666 EXPECT_FALSE(media_channel1_->HasRecvStream(1)); 1667 EXPECT_TRUE(media_channel1_->HasRecvStream(2)); 1668 } 1669 1670 void TestSendPrAnswer() { 1671 CreateChannels(0, 0); 1672 1673 // Set up the initial session description. 1674 cricket::SessionDescription* sdesc = CreateSessionDescriptionWithStream(1); 1675 EXPECT_TRUE(session1_.set_remote_description(sdesc)); 1676 1677 session1_.SetError(cricket::BaseSession::ERROR_NONE, ""); 1678 session1_.SetState(cricket::Session::STATE_RECEIVEDINITIATE); 1679 EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error()); 1680 EXPECT_TRUE(media_channel1_->HasRecvStream(1)); 1681 1682 // Send PRANSWER 1683 sdesc = CreateSessionDescriptionWithStream(2); 1684 EXPECT_TRUE(session1_.set_local_description(sdesc)); 1685 1686 session1_.SetState(cricket::Session::STATE_SENTPRACCEPT); 1687 EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error()); 1688 EXPECT_TRUE(media_channel1_->HasRecvStream(1)); 1689 EXPECT_TRUE(media_channel1_->HasSendStream(2)); 1690 1691 // Send ACCEPT 1692 sdesc = CreateSessionDescriptionWithStream(3); 1693 EXPECT_TRUE(session1_.set_local_description(sdesc)); 1694 1695 session1_.SetState(cricket::Session::STATE_SENTACCEPT); 1696 EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error()); 1697 EXPECT_TRUE(media_channel1_->HasRecvStream(1)); 1698 EXPECT_FALSE(media_channel1_->HasSendStream(2)); 1699 EXPECT_TRUE(media_channel1_->HasSendStream(3)); 1700 } 1701 1702 void TestReceivePrAnswer() { 1703 CreateChannels(0, 0); 1704 1705 // Set up the initial session description. 1706 cricket::SessionDescription* sdesc = CreateSessionDescriptionWithStream(1); 1707 EXPECT_TRUE(session1_.set_local_description(sdesc)); 1708 1709 session1_.SetError(cricket::BaseSession::ERROR_NONE, ""); 1710 session1_.SetState(cricket::Session::STATE_SENTINITIATE); 1711 EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error()); 1712 EXPECT_TRUE(media_channel1_->HasSendStream(1)); 1713 1714 // Receive PRANSWER 1715 sdesc = CreateSessionDescriptionWithStream(2); 1716 EXPECT_TRUE(session1_.set_remote_description(sdesc)); 1717 1718 session1_.SetState(cricket::Session::STATE_RECEIVEDPRACCEPT); 1719 EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error()); 1720 EXPECT_TRUE(media_channel1_->HasSendStream(1)); 1721 EXPECT_TRUE(media_channel1_->HasRecvStream(2)); 1722 1723 // Receive ACCEPT 1724 sdesc = CreateSessionDescriptionWithStream(3); 1725 EXPECT_TRUE(session1_.set_remote_description(sdesc)); 1726 1727 session1_.SetState(cricket::Session::STATE_RECEIVEDACCEPT); 1728 EXPECT_EQ(cricket::BaseSession::ERROR_NONE, session1_.error()); 1729 EXPECT_TRUE(media_channel1_->HasSendStream(1)); 1730 EXPECT_FALSE(media_channel1_->HasRecvStream(2)); 1731 EXPECT_TRUE(media_channel1_->HasRecvStream(3)); 1732 } 1733 1734 void TestFlushRtcp() { 1735 bool send_rtcp1; 1736 1737 CreateChannels(RTCP, RTCP); 1738 EXPECT_TRUE(SendInitiate()); 1739 EXPECT_TRUE(SendAccept()); 1740 EXPECT_EQ(2U, GetTransport1()->channels().size()); 1741 EXPECT_EQ(2U, GetTransport2()->channels().size()); 1742 1743 // Send RTCP1 from a different thread. 1744 CallOnThreadAndWaitForDone(&ChannelTest<T>::SendRtcp1, &send_rtcp1); 1745 EXPECT_TRUE(send_rtcp1); 1746 // The sending message is only posted. channel2_ should be empty. 1747 EXPECT_TRUE(CheckNoRtcp2()); 1748 1749 // When channel1_ is deleted, the RTCP packet should be sent out to 1750 // channel2_. 1751 channel1_.reset(); 1752 EXPECT_TRUE(CheckRtcp2()); 1753 } 1754 1755 void TestChangeStateError() { 1756 CreateChannels(RTCP, RTCP); 1757 EXPECT_TRUE(SendInitiate()); 1758 media_channel2_->set_fail_set_send(true); 1759 EXPECT_TRUE(channel2_->Enable(true)); 1760 EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_OPEN_FAILED, 1761 error_); 1762 } 1763 1764 void TestSrtpError(int pl_type) { 1765 // For Audio, only pl_type 0 is added to the bundle filter. 1766 // For Video, only pl_type 97 is added to the bundle filter. 1767 // So we need to pass in pl_type so that the packet can pass through 1768 // the bundle filter before it can be processed by the srtp filter. 1769 // The packet is not a valid srtp packet because it is too short. 1770 unsigned const char kBadPacket[] = {0x84, 1771 static_cast<unsigned char>(pl_type), 1772 0x00, 1773 0x01, 1774 0x00, 1775 0x00, 1776 0x00, 1777 0x00, 1778 0x00, 1779 0x00, 1780 0x00, 1781 0x01}; 1782 CreateChannels(RTCP | SECURE, RTCP | SECURE); 1783 EXPECT_FALSE(channel1_->secure()); 1784 EXPECT_FALSE(channel2_->secure()); 1785 EXPECT_TRUE(SendInitiate()); 1786 EXPECT_TRUE(SendAccept()); 1787 EXPECT_TRUE(channel1_->secure()); 1788 EXPECT_TRUE(channel2_->secure()); 1789 channel2_->set_srtp_signal_silent_time(200); 1790 1791 // Testing failures in sending packets. 1792 EXPECT_FALSE(media_channel2_->SendRtp(kBadPacket, sizeof(kBadPacket))); 1793 // The first failure will trigger an error. 1794 EXPECT_EQ_WAIT(T::MediaChannel::ERROR_REC_SRTP_ERROR, error_, 500); 1795 error_ = T::MediaChannel::ERROR_NONE; 1796 // The next 1 sec failures will not trigger an error. 1797 EXPECT_FALSE(media_channel2_->SendRtp(kBadPacket, sizeof(kBadPacket))); 1798 // Wait for a while to ensure no message comes in. 1799 talk_base::Thread::Current()->ProcessMessages(210); 1800 EXPECT_EQ(T::MediaChannel::ERROR_NONE, error_); 1801 // The error will be triggered again. 1802 EXPECT_FALSE(media_channel2_->SendRtp(kBadPacket, sizeof(kBadPacket))); 1803 EXPECT_EQ_WAIT(T::MediaChannel::ERROR_REC_SRTP_ERROR, error_, 500); 1804 1805 // Testing failures in receiving packets. 1806 error_ = T::MediaChannel::ERROR_NONE; 1807 cricket::TransportChannel* transport_channel = 1808 channel2_->transport_channel(); 1809 transport_channel->SignalReadPacket( 1810 transport_channel, reinterpret_cast<const char*>(kBadPacket), 1811 sizeof(kBadPacket), talk_base::PacketTime(), 0); 1812 EXPECT_EQ_WAIT(T::MediaChannel::ERROR_PLAY_SRTP_ERROR, error_, 500); 1813 } 1814 1815 void TestOnReadyToSend() { 1816 CreateChannels(RTCP, RTCP); 1817 TransportChannel* rtp = channel1_->transport_channel(); 1818 TransportChannel* rtcp = channel1_->rtcp_transport_channel(); 1819 EXPECT_FALSE(media_channel1_->ready_to_send()); 1820 rtp->SignalReadyToSend(rtp); 1821 EXPECT_FALSE(media_channel1_->ready_to_send()); 1822 rtcp->SignalReadyToSend(rtcp); 1823 // MediaChannel::OnReadyToSend only be called when both rtp and rtcp 1824 // channel are ready to send. 1825 EXPECT_TRUE(media_channel1_->ready_to_send()); 1826 1827 // rtp channel becomes not ready to send will be propagated to mediachannel 1828 channel1_->SetReadyToSend(rtp, false); 1829 EXPECT_FALSE(media_channel1_->ready_to_send()); 1830 channel1_->SetReadyToSend(rtp, true); 1831 EXPECT_TRUE(media_channel1_->ready_to_send()); 1832 1833 // rtcp channel becomes not ready to send will be propagated to mediachannel 1834 channel1_->SetReadyToSend(rtcp, false); 1835 EXPECT_FALSE(media_channel1_->ready_to_send()); 1836 channel1_->SetReadyToSend(rtcp, true); 1837 EXPECT_TRUE(media_channel1_->ready_to_send()); 1838 } 1839 1840 void TestOnReadyToSendWithRtcpMux() { 1841 CreateChannels(RTCP, RTCP); 1842 typename T::Content content; 1843 CreateContent(0, kPcmuCodec, kH264Codec, &content); 1844 // Both sides agree on mux. Should no longer be a separate RTCP channel. 1845 content.set_rtcp_mux(true); 1846 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL)); 1847 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL)); 1848 EXPECT_TRUE(channel1_->rtcp_transport_channel() == NULL); 1849 TransportChannel* rtp = channel1_->transport_channel(); 1850 EXPECT_FALSE(media_channel1_->ready_to_send()); 1851 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel 1852 // should trigger the MediaChannel's OnReadyToSend. 1853 rtp->SignalReadyToSend(rtp); 1854 EXPECT_TRUE(media_channel1_->ready_to_send()); 1855 channel1_->SetReadyToSend(rtp, false); 1856 EXPECT_FALSE(media_channel1_->ready_to_send()); 1857 } 1858 1859 protected: 1860 cricket::FakeSession session1_; 1861 cricket::FakeSession session2_; 1862 cricket::FakeMediaEngine media_engine_; 1863 // The media channels are owned by the voice channel objects below. 1864 typename T::MediaChannel* media_channel1_; 1865 typename T::MediaChannel* media_channel2_; 1866 talk_base::scoped_ptr<typename T::Channel> channel1_; 1867 talk_base::scoped_ptr<typename T::Channel> channel2_; 1868 typename T::Content local_media_content1_; 1869 typename T::Content local_media_content2_; 1870 typename T::Content remote_media_content1_; 1871 typename T::Content remote_media_content2_; 1872 talk_base::scoped_ptr<talk_base::SSLIdentity> identity1_; 1873 talk_base::scoped_ptr<talk_base::SSLIdentity> identity2_; 1874 // The RTP and RTCP packets to send in the tests. 1875 std::string rtp_packet_; 1876 std::string rtcp_packet_; 1877 int media_info_callbacks1_; 1878 int media_info_callbacks2_; 1879 bool mute_callback_recved_; 1880 bool mute_callback_value_; 1881 1882 uint32 ssrc_; 1883 typename T::MediaChannel::Error error_; 1884 }; 1885 1886 1887 template<> 1888 void ChannelTest<VoiceTraits>::CreateContent( 1889 int flags, 1890 const cricket::AudioCodec& audio_codec, 1891 const cricket::VideoCodec& video_codec, 1892 cricket::AudioContentDescription* audio) { 1893 audio->AddCodec(audio_codec); 1894 audio->set_rtcp_mux((flags & RTCP_MUX) != 0); 1895 if (flags & SECURE) { 1896 audio->AddCrypto(cricket::CryptoParams( 1897 1, cricket::CS_AES_CM_128_HMAC_SHA1_32, 1898 "inline:" + talk_base::CreateRandomString(40), "")); 1899 } 1900 } 1901 1902 template<> 1903 void ChannelTest<VoiceTraits>::CopyContent( 1904 const cricket::AudioContentDescription& source, 1905 cricket::AudioContentDescription* audio) { 1906 *audio = source; 1907 } 1908 1909 template<> 1910 bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1, 1911 const cricket::AudioCodec& c2) { 1912 return c1.name == c2.name && c1.clockrate == c2.clockrate && 1913 c1.bitrate == c2.bitrate && c1.channels == c2.channels; 1914 } 1915 1916 template<> 1917 void ChannelTest<VoiceTraits>::AddLegacyStreamInContent( 1918 uint32 ssrc, int flags, cricket::AudioContentDescription* audio) { 1919 audio->AddLegacyStream(ssrc); 1920 } 1921 1922 class VoiceChannelTest 1923 : public ChannelTest<VoiceTraits> { 1924 public: 1925 typedef ChannelTest<VoiceTraits> 1926 Base; 1927 VoiceChannelTest() : Base(kPcmuFrame, sizeof(kPcmuFrame), 1928 kRtcpReport, sizeof(kRtcpReport)) { 1929 } 1930 1931 void TestSetChannelOptions() { 1932 CreateChannels(0, 0); 1933 1934 cricket::AudioOptions options1; 1935 options1.echo_cancellation.Set(false); 1936 cricket::AudioOptions options2; 1937 options2.echo_cancellation.Set(true); 1938 1939 channel1_->SetChannelOptions(options1); 1940 channel2_->SetChannelOptions(options1); 1941 cricket::AudioOptions actual_options; 1942 ASSERT_TRUE(media_channel1_->GetOptions(&actual_options)); 1943 EXPECT_EQ(options1, actual_options); 1944 ASSERT_TRUE(media_channel2_->GetOptions(&actual_options)); 1945 EXPECT_EQ(options1, actual_options); 1946 1947 channel1_->SetChannelOptions(options2); 1948 channel2_->SetChannelOptions(options2); 1949 ASSERT_TRUE(media_channel1_->GetOptions(&actual_options)); 1950 EXPECT_EQ(options2, actual_options); 1951 ASSERT_TRUE(media_channel2_->GetOptions(&actual_options)); 1952 EXPECT_EQ(options2, actual_options); 1953 } 1954 }; 1955 1956 // override to add NULL parameter 1957 template<> 1958 cricket::VideoChannel* ChannelTest<VideoTraits>::CreateChannel( 1959 talk_base::Thread* thread, cricket::MediaEngineInterface* engine, 1960 cricket::FakeVideoMediaChannel* ch, cricket::BaseSession* session, 1961 bool rtcp) { 1962 cricket::VideoChannel* channel = new cricket::VideoChannel( 1963 thread, engine, ch, session, cricket::CN_VIDEO, rtcp, NULL); 1964 if (!channel->Init()) { 1965 delete channel; 1966 channel = NULL; 1967 } 1968 return channel; 1969 } 1970 1971 // override to add 0 parameter 1972 template<> 1973 bool ChannelTest<VideoTraits>::AddStream1(int id) { 1974 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id)); 1975 } 1976 1977 template<> 1978 void ChannelTest<VideoTraits>::CreateContent( 1979 int flags, 1980 const cricket::AudioCodec& audio_codec, 1981 const cricket::VideoCodec& video_codec, 1982 cricket::VideoContentDescription* video) { 1983 video->AddCodec(video_codec); 1984 video->set_rtcp_mux((flags & RTCP_MUX) != 0); 1985 if (flags & SECURE) { 1986 video->AddCrypto(cricket::CryptoParams( 1987 1, cricket::CS_AES_CM_128_HMAC_SHA1_80, 1988 "inline:" + talk_base::CreateRandomString(40), "")); 1989 } 1990 } 1991 1992 template<> 1993 void ChannelTest<VideoTraits>::CopyContent( 1994 const cricket::VideoContentDescription& source, 1995 cricket::VideoContentDescription* video) { 1996 *video = source; 1997 } 1998 1999 template<> 2000 bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1, 2001 const cricket::VideoCodec& c2) { 2002 return c1.name == c2.name && c1.width == c2.width && c1.height == c2.height && 2003 c1.framerate == c2.framerate; 2004 } 2005 2006 template<> 2007 void ChannelTest<VideoTraits>::AddLegacyStreamInContent( 2008 uint32 ssrc, int flags, cricket::VideoContentDescription* video) { 2009 video->AddLegacyStream(ssrc); 2010 } 2011 2012 class VideoChannelTest 2013 : public ChannelTest<VideoTraits> { 2014 public: 2015 typedef ChannelTest<VideoTraits> 2016 Base; 2017 VideoChannelTest() : Base(kH264Packet, sizeof(kH264Packet), 2018 kRtcpReport, sizeof(kRtcpReport)) { 2019 } 2020 2021 void TestSetChannelOptions() { 2022 CreateChannels(0, 0); 2023 2024 cricket::VideoOptions o1, o2; 2025 o1.video_noise_reduction.Set(true); 2026 2027 channel1_->SetChannelOptions(o1); 2028 channel2_->SetChannelOptions(o1); 2029 EXPECT_TRUE(media_channel1_->GetOptions(&o2)); 2030 EXPECT_EQ(o1, o2); 2031 EXPECT_TRUE(media_channel2_->GetOptions(&o2)); 2032 EXPECT_EQ(o1, o2); 2033 2034 o1.video_leaky_bucket.Set(true); 2035 channel1_->SetChannelOptions(o1); 2036 channel2_->SetChannelOptions(o1); 2037 EXPECT_TRUE(media_channel1_->GetOptions(&o2)); 2038 EXPECT_EQ(o1, o2); 2039 EXPECT_TRUE(media_channel2_->GetOptions(&o2)); 2040 EXPECT_EQ(o1, o2); 2041 } 2042 }; 2043 2044 2045 // VoiceChannelTest 2046 2047 TEST_F(VoiceChannelTest, TestInit) { 2048 Base::TestInit(); 2049 EXPECT_FALSE(media_channel1_->IsStreamMuted(0)); 2050 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty()); 2051 } 2052 2053 TEST_F(VoiceChannelTest, TestSetContents) { 2054 Base::TestSetContents(); 2055 } 2056 2057 TEST_F(VoiceChannelTest, TestSetContentsNullOffer) { 2058 Base::TestSetContentsNullOffer(); 2059 } 2060 2061 TEST_F(VoiceChannelTest, TestSetContentsRtcpMux) { 2062 Base::TestSetContentsRtcpMux(); 2063 } 2064 2065 TEST_F(VoiceChannelTest, TestSetContentsRtcpMuxWithPrAnswer) { 2066 Base::TestSetContentsRtcpMux(); 2067 } 2068 2069 TEST_F(VoiceChannelTest, TestSetRemoteContentUpdate) { 2070 Base::TestSetRemoteContentUpdate(); 2071 } 2072 2073 TEST_F(VoiceChannelTest, TestStreams) { 2074 Base::TestStreams(); 2075 } 2076 2077 TEST_F(VoiceChannelTest, TestUpdateStreamsInLocalContent) { 2078 Base::TestUpdateStreamsInLocalContent(); 2079 } 2080 2081 TEST_F(VoiceChannelTest, TestUpdateRemoteStreamsInContent) { 2082 Base::TestUpdateStreamsInRemoteContent(); 2083 } 2084 2085 TEST_F(VoiceChannelTest, TestChangeStreamParamsInContent) { 2086 Base::TestChangeStreamParamsInContent(); 2087 } 2088 2089 TEST_F(VoiceChannelTest, TestPlayoutAndSendingStates) { 2090 Base::TestPlayoutAndSendingStates(); 2091 } 2092 2093 TEST_F(VoiceChannelTest, TestMuteStream) { 2094 Base::TestMuteStream(); 2095 } 2096 2097 TEST_F(VoiceChannelTest, TestMediaContentDirection) { 2098 Base::TestMediaContentDirection(); 2099 } 2100 2101 TEST_F(VoiceChannelTest, TestCallSetup) { 2102 Base::TestCallSetup(); 2103 } 2104 2105 TEST_F(VoiceChannelTest, TestCallTeardownRtcpMux) { 2106 Base::TestCallTeardownRtcpMux(); 2107 } 2108 2109 TEST_F(VoiceChannelTest, SendRtpToRtp) { 2110 Base::SendRtpToRtp(); 2111 } 2112 2113 TEST_F(VoiceChannelTest, SendNoRtcpToNoRtcp) { 2114 Base::SendNoRtcpToNoRtcp(); 2115 } 2116 2117 TEST_F(VoiceChannelTest, SendNoRtcpToRtcp) { 2118 Base::SendNoRtcpToRtcp(); 2119 } 2120 2121 TEST_F(VoiceChannelTest, SendRtcpToNoRtcp) { 2122 Base::SendRtcpToNoRtcp(); 2123 } 2124 2125 TEST_F(VoiceChannelTest, SendRtcpToRtcp) { 2126 Base::SendRtcpToRtcp(); 2127 } 2128 2129 TEST_F(VoiceChannelTest, SendRtcpMuxToRtcp) { 2130 Base::SendRtcpMuxToRtcp(); 2131 } 2132 2133 TEST_F(VoiceChannelTest, SendRtcpMuxToRtcpMux) { 2134 Base::SendRtcpMuxToRtcpMux(); 2135 } 2136 2137 TEST_F(VoiceChannelTest, SendEarlyRtcpMuxToRtcp) { 2138 Base::SendEarlyRtcpMuxToRtcp(); 2139 } 2140 2141 TEST_F(VoiceChannelTest, SendEarlyRtcpMuxToRtcpMux) { 2142 Base::SendEarlyRtcpMuxToRtcpMux(); 2143 } 2144 2145 TEST_F(VoiceChannelTest, SendSrtpToSrtpRtcpMux) { 2146 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX); 2147 } 2148 2149 TEST_F(VoiceChannelTest, SendSrtpToRtp) { 2150 Base::SendSrtpToSrtp(); 2151 } 2152 2153 TEST_F(VoiceChannelTest, SendSrtcpMux) { 2154 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX); 2155 } 2156 2157 TEST_F(VoiceChannelTest, SendDtlsSrtpToSrtp) { 2158 MAYBE_SKIP_TEST(HaveDtlsSrtp); 2159 Base::SendSrtpToSrtp(DTLS, 0); 2160 } 2161 2162 TEST_F(VoiceChannelTest, SendDtlsSrtpToDtlsSrtp) { 2163 MAYBE_SKIP_TEST(HaveDtlsSrtp); 2164 Base::SendSrtpToSrtp(DTLS, DTLS); 2165 } 2166 2167 TEST_F(VoiceChannelTest, SendDtlsSrtpToDtlsSrtpRtcpMux) { 2168 MAYBE_SKIP_TEST(HaveDtlsSrtp); 2169 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX); 2170 } 2171 2172 TEST_F(VoiceChannelTest, SendEarlyMediaUsingRtcpMuxSrtp) { 2173 Base::SendEarlyMediaUsingRtcpMuxSrtp(); 2174 } 2175 2176 TEST_F(VoiceChannelTest, SendRtpToRtpOnThread) { 2177 Base::SendRtpToRtpOnThread(); 2178 } 2179 2180 TEST_F(VoiceChannelTest, SendSrtpToSrtpOnThread) { 2181 Base::SendSrtpToSrtpOnThread(); 2182 } 2183 2184 TEST_F(VoiceChannelTest, SendWithWritabilityLoss) { 2185 Base::SendWithWritabilityLoss(); 2186 } 2187 2188 TEST_F(VoiceChannelTest, TestMediaMonitor) { 2189 Base::TestMediaMonitor(); 2190 } 2191 2192 // Test that MuteStream properly forwards to the media channel and does 2193 // not signal. 2194 TEST_F(VoiceChannelTest, TestVoiceSpecificMuteStream) { 2195 CreateChannels(0, 0); 2196 EXPECT_FALSE(media_channel1_->IsStreamMuted(0)); 2197 EXPECT_FALSE(mute_callback_recved_); 2198 EXPECT_TRUE(channel1_->MuteStream(0, true)); 2199 EXPECT_TRUE(media_channel1_->IsStreamMuted(0)); 2200 EXPECT_FALSE(mute_callback_recved_); 2201 EXPECT_TRUE(channel1_->MuteStream(0, false)); 2202 EXPECT_FALSE(media_channel1_->IsStreamMuted(0)); 2203 EXPECT_FALSE(mute_callback_recved_); 2204 } 2205 2206 // Test that keyboard automute works correctly and signals upwards. 2207 TEST_F(VoiceChannelTest, DISABLED_TestKeyboardMute) { 2208 CreateChannels(0, 0); 2209 EXPECT_FALSE(media_channel1_->IsStreamMuted(0)); 2210 EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_NONE, error_); 2211 2212 cricket::VoiceMediaChannel::Error e = 2213 cricket::VoiceMediaChannel::ERROR_REC_TYPING_NOISE_DETECTED; 2214 2215 // Typing doesn't mute automatically unless typing monitor has been installed 2216 media_channel1_->TriggerError(0, e); 2217 talk_base::Thread::Current()->ProcessMessages(0); 2218 EXPECT_EQ(e, error_); 2219 EXPECT_FALSE(media_channel1_->IsStreamMuted(0)); 2220 EXPECT_FALSE(mute_callback_recved_); 2221 2222 cricket::TypingMonitorOptions o = {0}; 2223 o.mute_period = 1500; 2224 channel1_->StartTypingMonitor(o); 2225 media_channel1_->TriggerError(0, e); 2226 talk_base::Thread::Current()->ProcessMessages(0); 2227 EXPECT_TRUE(media_channel1_->IsStreamMuted(0)); 2228 EXPECT_TRUE(mute_callback_recved_); 2229 } 2230 2231 // Test that PressDTMF properly forwards to the media channel. 2232 TEST_F(VoiceChannelTest, TestDtmf) { 2233 CreateChannels(0, 0); 2234 EXPECT_TRUE(SendInitiate()); 2235 EXPECT_TRUE(SendAccept()); 2236 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size()); 2237 2238 EXPECT_TRUE(channel1_->PressDTMF(1, true)); 2239 EXPECT_TRUE(channel1_->PressDTMF(8, false)); 2240 2241 ASSERT_EQ(2U, media_channel1_->dtmf_info_queue().size()); 2242 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 2243 0, 1, 160, cricket::DF_PLAY | cricket::DF_SEND)); 2244 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2245 0, 8, 160, cricket::DF_SEND)); 2246 } 2247 2248 // Test that InsertDtmf properly forwards to the media channel. 2249 TEST_F(VoiceChannelTest, TestInsertDtmf) { 2250 CreateChannels(0, 0); 2251 EXPECT_TRUE(SendInitiate()); 2252 EXPECT_TRUE(SendAccept()); 2253 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size()); 2254 2255 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100, cricket::DF_SEND)); 2256 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110, cricket::DF_PLAY)); 2257 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120, 2258 cricket::DF_PLAY | cricket::DF_SEND)); 2259 2260 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size()); 2261 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 2262 1, 3, 100, cricket::DF_SEND)); 2263 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2264 2, 5, 110, cricket::DF_PLAY)); 2265 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 2266 3, 7, 120, cricket::DF_PLAY | cricket::DF_SEND)); 2267 } 2268 2269 TEST_F(VoiceChannelTest, TestMediaSinks) { 2270 Base::TestMediaSinks(); 2271 } 2272 2273 TEST_F(VoiceChannelTest, TestSetContentFailure) { 2274 Base::TestSetContentFailure(); 2275 } 2276 2277 TEST_F(VoiceChannelTest, TestSendTwoOffers) { 2278 Base::TestSendTwoOffers(); 2279 } 2280 2281 TEST_F(VoiceChannelTest, TestReceiveTwoOffers) { 2282 Base::TestReceiveTwoOffers(); 2283 } 2284 2285 TEST_F(VoiceChannelTest, TestSendPrAnswer) { 2286 Base::TestSendPrAnswer(); 2287 } 2288 2289 TEST_F(VoiceChannelTest, TestReceivePrAnswer) { 2290 Base::TestReceivePrAnswer(); 2291 } 2292 2293 TEST_F(VoiceChannelTest, TestFlushRtcp) { 2294 Base::TestFlushRtcp(); 2295 } 2296 2297 TEST_F(VoiceChannelTest, TestChangeStateError) { 2298 Base::TestChangeStateError(); 2299 } 2300 2301 TEST_F(VoiceChannelTest, TestSrtpError) { 2302 Base::TestSrtpError(kAudioPts[0]); 2303 } 2304 2305 TEST_F(VoiceChannelTest, TestOnReadyToSend) { 2306 Base::TestOnReadyToSend(); 2307 } 2308 2309 TEST_F(VoiceChannelTest, TestOnReadyToSendWithRtcpMux) { 2310 Base::TestOnReadyToSendWithRtcpMux(); 2311 } 2312 2313 // Test that we can play a ringback tone properly. 2314 TEST_F(VoiceChannelTest, TestRingbackTone) { 2315 CreateChannels(RTCP, RTCP); 2316 EXPECT_FALSE(media_channel1_->ringback_tone_play()); 2317 EXPECT_TRUE(channel1_->SetRingbackTone("RIFF", 4)); 2318 EXPECT_TRUE(SendInitiate()); 2319 EXPECT_TRUE(SendAccept()); 2320 // Play ringback tone, no loop. 2321 EXPECT_TRUE(channel1_->PlayRingbackTone(0, true, false)); 2322 EXPECT_EQ(0U, media_channel1_->ringback_tone_ssrc()); 2323 EXPECT_TRUE(media_channel1_->ringback_tone_play()); 2324 EXPECT_FALSE(media_channel1_->ringback_tone_loop()); 2325 // Stop the ringback tone. 2326 EXPECT_TRUE(channel1_->PlayRingbackTone(0, false, false)); 2327 EXPECT_FALSE(media_channel1_->ringback_tone_play()); 2328 // Add a stream. 2329 EXPECT_TRUE(AddStream1(1)); 2330 // Play ringback tone, looping, on the new stream. 2331 EXPECT_TRUE(channel1_->PlayRingbackTone(1, true, true)); 2332 EXPECT_EQ(1U, media_channel1_->ringback_tone_ssrc()); 2333 EXPECT_TRUE(media_channel1_->ringback_tone_play()); 2334 EXPECT_TRUE(media_channel1_->ringback_tone_loop()); 2335 // Stop the ringback tone. 2336 EXPECT_TRUE(channel1_->PlayRingbackTone(1, false, false)); 2337 EXPECT_FALSE(media_channel1_->ringback_tone_play()); 2338 } 2339 2340 // Test that we can scale the output volume properly for 1:1 calls. 2341 TEST_F(VoiceChannelTest, TestScaleVolume1to1Call) { 2342 CreateChannels(RTCP, RTCP); 2343 EXPECT_TRUE(SendInitiate()); 2344 EXPECT_TRUE(SendAccept()); 2345 double left, right; 2346 2347 // Default is (1.0, 1.0). 2348 EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right)); 2349 EXPECT_DOUBLE_EQ(1.0, left); 2350 EXPECT_DOUBLE_EQ(1.0, right); 2351 // invalid ssrc. 2352 EXPECT_FALSE(media_channel1_->GetOutputScaling(3, &left, &right)); 2353 2354 // Set scale to (1.5, 0.5). 2355 EXPECT_TRUE(channel1_->SetOutputScaling(0, 1.5, 0.5)); 2356 EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right)); 2357 EXPECT_DOUBLE_EQ(1.5, left); 2358 EXPECT_DOUBLE_EQ(0.5, right); 2359 2360 // Set scale to (0, 0). 2361 EXPECT_TRUE(channel1_->SetOutputScaling(0, 0.0, 0.0)); 2362 EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right)); 2363 EXPECT_DOUBLE_EQ(0.0, left); 2364 EXPECT_DOUBLE_EQ(0.0, right); 2365 } 2366 2367 // Test that we can scale the output volume properly for multiway calls. 2368 TEST_F(VoiceChannelTest, TestScaleVolumeMultiwayCall) { 2369 CreateChannels(RTCP, RTCP); 2370 EXPECT_TRUE(SendInitiate()); 2371 EXPECT_TRUE(SendAccept()); 2372 EXPECT_TRUE(AddStream1(1)); 2373 EXPECT_TRUE(AddStream1(2)); 2374 2375 double left, right; 2376 // Default is (1.0, 1.0). 2377 EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right)); 2378 EXPECT_DOUBLE_EQ(1.0, left); 2379 EXPECT_DOUBLE_EQ(1.0, right); 2380 EXPECT_TRUE(media_channel1_->GetOutputScaling(1, &left, &right)); 2381 EXPECT_DOUBLE_EQ(1.0, left); 2382 EXPECT_DOUBLE_EQ(1.0, right); 2383 EXPECT_TRUE(media_channel1_->GetOutputScaling(2, &left, &right)); 2384 EXPECT_DOUBLE_EQ(1.0, left); 2385 EXPECT_DOUBLE_EQ(1.0, right); 2386 // invalid ssrc. 2387 EXPECT_FALSE(media_channel1_->GetOutputScaling(3, &left, &right)); 2388 2389 // Set scale to (1.5, 0.5) for ssrc = 1. 2390 EXPECT_TRUE(channel1_->SetOutputScaling(1, 1.5, 0.5)); 2391 EXPECT_TRUE(media_channel1_->GetOutputScaling(1, &left, &right)); 2392 EXPECT_DOUBLE_EQ(1.5, left); 2393 EXPECT_DOUBLE_EQ(0.5, right); 2394 EXPECT_TRUE(media_channel1_->GetOutputScaling(2, &left, &right)); 2395 EXPECT_DOUBLE_EQ(1.0, left); 2396 EXPECT_DOUBLE_EQ(1.0, right); 2397 EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right)); 2398 EXPECT_DOUBLE_EQ(1.0, left); 2399 EXPECT_DOUBLE_EQ(1.0, right); 2400 2401 // Set scale to (0, 0) for all ssrcs. 2402 EXPECT_TRUE(channel1_->SetOutputScaling(0, 0.0, 0.0)); 2403 EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right)); 2404 EXPECT_DOUBLE_EQ(0.0, left); 2405 EXPECT_DOUBLE_EQ(0.0, right); 2406 EXPECT_TRUE(media_channel1_->GetOutputScaling(1, &left, &right)); 2407 EXPECT_DOUBLE_EQ(0.0, left); 2408 EXPECT_DOUBLE_EQ(0.0, right); 2409 EXPECT_TRUE(media_channel1_->GetOutputScaling(2, &left, &right)); 2410 EXPECT_DOUBLE_EQ(0.0, left); 2411 EXPECT_DOUBLE_EQ(0.0, right); 2412 } 2413 2414 TEST_F(VoiceChannelTest, SendBundleToBundle) { 2415 Base::SendBundleToBundle(kAudioPts, ARRAY_SIZE(kAudioPts), false, false); 2416 } 2417 2418 TEST_F(VoiceChannelTest, SendBundleToBundleSecure) { 2419 Base::SendBundleToBundle(kAudioPts, ARRAY_SIZE(kAudioPts), false, true); 2420 } 2421 2422 TEST_F(VoiceChannelTest, SendBundleToBundleWithRtcpMux) { 2423 Base::SendBundleToBundle( 2424 kAudioPts, ARRAY_SIZE(kAudioPts), true, false); 2425 } 2426 2427 TEST_F(VoiceChannelTest, SendBundleToBundleWithRtcpMuxSecure) { 2428 Base::SendBundleToBundle( 2429 kAudioPts, ARRAY_SIZE(kAudioPts), true, true); 2430 } 2431 2432 TEST_F(VoiceChannelTest, TestSetChannelOptions) { 2433 TestSetChannelOptions(); 2434 } 2435 2436 // VideoChannelTest 2437 TEST_F(VideoChannelTest, TestInit) { 2438 Base::TestInit(); 2439 } 2440 2441 TEST_F(VideoChannelTest, TestSetContents) { 2442 Base::TestSetContents(); 2443 } 2444 2445 TEST_F(VideoChannelTest, TestSetContentsNullOffer) { 2446 Base::TestSetContentsNullOffer(); 2447 } 2448 2449 TEST_F(VideoChannelTest, TestSetContentsRtcpMux) { 2450 Base::TestSetContentsRtcpMux(); 2451 } 2452 2453 TEST_F(VideoChannelTest, TestSetContentsRtcpMuxWithPrAnswer) { 2454 Base::TestSetContentsRtcpMux(); 2455 } 2456 2457 TEST_F(VideoChannelTest, TestSetContentsVideoOptions) { 2458 Base::TestSetContentsVideoOptions(); 2459 } 2460 2461 TEST_F(VideoChannelTest, TestSetRemoteContentUpdate) { 2462 Base::TestSetRemoteContentUpdate(); 2463 } 2464 2465 TEST_F(VideoChannelTest, TestStreams) { 2466 Base::TestStreams(); 2467 } 2468 2469 TEST_F(VideoChannelTest, TestScreencastEvents) { 2470 const int kTimeoutMs = 500; 2471 TestInit(); 2472 FakeScreenCaptureFactory* screencapture_factory = 2473 new FakeScreenCaptureFactory(); 2474 channel1_->SetScreenCaptureFactory(screencapture_factory); 2475 cricket::ScreencastEventCatcher catcher; 2476 channel1_->SignalScreencastWindowEvent.connect( 2477 &catcher, 2478 &cricket::ScreencastEventCatcher::OnEvent); 2479 EXPECT_TRUE(channel1_->AddScreencast(0, ScreencastId(WindowId(0))) != NULL); 2480 ASSERT_TRUE(screencapture_factory->window_capturer() != NULL); 2481 EXPECT_EQ_WAIT(cricket::CS_STOPPED, screencapture_factory->capture_state(), 2482 kTimeoutMs); 2483 screencapture_factory->window_capturer()->SignalStateChange( 2484 screencapture_factory->window_capturer(), cricket::CS_PAUSED); 2485 EXPECT_EQ_WAIT(talk_base::WE_MINIMIZE, catcher.event(), kTimeoutMs); 2486 screencapture_factory->window_capturer()->SignalStateChange( 2487 screencapture_factory->window_capturer(), cricket::CS_RUNNING); 2488 EXPECT_EQ_WAIT(talk_base::WE_RESTORE, catcher.event(), kTimeoutMs); 2489 screencapture_factory->window_capturer()->SignalStateChange( 2490 screencapture_factory->window_capturer(), cricket::CS_STOPPED); 2491 EXPECT_EQ_WAIT(talk_base::WE_CLOSE, catcher.event(), kTimeoutMs); 2492 EXPECT_TRUE(channel1_->RemoveScreencast(0)); 2493 ASSERT_TRUE(screencapture_factory->window_capturer() == NULL); 2494 } 2495 2496 TEST_F(VideoChannelTest, TestUpdateStreamsInLocalContent) { 2497 Base::TestUpdateStreamsInLocalContent(); 2498 } 2499 2500 TEST_F(VideoChannelTest, TestUpdateRemoteStreamsInContent) { 2501 Base::TestUpdateStreamsInRemoteContent(); 2502 } 2503 2504 TEST_F(VideoChannelTest, TestChangeStreamParamsInContent) { 2505 Base::TestChangeStreamParamsInContent(); 2506 } 2507 2508 TEST_F(VideoChannelTest, TestPlayoutAndSendingStates) { 2509 Base::TestPlayoutAndSendingStates(); 2510 } 2511 2512 TEST_F(VideoChannelTest, TestMuteStream) { 2513 Base::TestMuteStream(); 2514 } 2515 2516 TEST_F(VideoChannelTest, TestMediaContentDirection) { 2517 Base::TestMediaContentDirection(); 2518 } 2519 2520 TEST_F(VideoChannelTest, TestCallSetup) { 2521 Base::TestCallSetup(); 2522 } 2523 2524 TEST_F(VideoChannelTest, TestCallTeardownRtcpMux) { 2525 Base::TestCallTeardownRtcpMux(); 2526 } 2527 2528 TEST_F(VideoChannelTest, SendRtpToRtp) { 2529 Base::SendRtpToRtp(); 2530 } 2531 2532 TEST_F(VideoChannelTest, SendNoRtcpToNoRtcp) { 2533 Base::SendNoRtcpToNoRtcp(); 2534 } 2535 2536 TEST_F(VideoChannelTest, SendNoRtcpToRtcp) { 2537 Base::SendNoRtcpToRtcp(); 2538 } 2539 2540 TEST_F(VideoChannelTest, SendRtcpToNoRtcp) { 2541 Base::SendRtcpToNoRtcp(); 2542 } 2543 2544 TEST_F(VideoChannelTest, SendRtcpToRtcp) { 2545 Base::SendRtcpToRtcp(); 2546 } 2547 2548 TEST_F(VideoChannelTest, SendRtcpMuxToRtcp) { 2549 Base::SendRtcpMuxToRtcp(); 2550 } 2551 2552 TEST_F(VideoChannelTest, SendRtcpMuxToRtcpMux) { 2553 Base::SendRtcpMuxToRtcpMux(); 2554 } 2555 2556 TEST_F(VideoChannelTest, SendEarlyRtcpMuxToRtcp) { 2557 Base::SendEarlyRtcpMuxToRtcp(); 2558 } 2559 2560 TEST_F(VideoChannelTest, SendEarlyRtcpMuxToRtcpMux) { 2561 Base::SendEarlyRtcpMuxToRtcpMux(); 2562 } 2563 2564 TEST_F(VideoChannelTest, SendSrtpToSrtp) { 2565 Base::SendSrtpToSrtp(); 2566 } 2567 2568 TEST_F(VideoChannelTest, SendSrtpToRtp) { 2569 Base::SendSrtpToSrtp(); 2570 } 2571 2572 TEST_F(VideoChannelTest, SendDtlsSrtpToSrtp) { 2573 MAYBE_SKIP_TEST(HaveDtlsSrtp); 2574 Base::SendSrtpToSrtp(DTLS, 0); 2575 } 2576 2577 TEST_F(VideoChannelTest, SendDtlsSrtpToDtlsSrtp) { 2578 MAYBE_SKIP_TEST(HaveDtlsSrtp); 2579 Base::SendSrtpToSrtp(DTLS, DTLS); 2580 } 2581 2582 TEST_F(VideoChannelTest, SendDtlsSrtpToDtlsSrtpRtcpMux) { 2583 MAYBE_SKIP_TEST(HaveDtlsSrtp); 2584 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX); 2585 } 2586 2587 TEST_F(VideoChannelTest, SendSrtcpMux) { 2588 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX); 2589 } 2590 2591 TEST_F(VideoChannelTest, SendEarlyMediaUsingRtcpMuxSrtp) { 2592 Base::SendEarlyMediaUsingRtcpMuxSrtp(); 2593 } 2594 2595 TEST_F(VideoChannelTest, SendRtpToRtpOnThread) { 2596 Base::SendRtpToRtpOnThread(); 2597 } 2598 2599 TEST_F(VideoChannelTest, SendSrtpToSrtpOnThread) { 2600 Base::SendSrtpToSrtpOnThread(); 2601 } 2602 2603 TEST_F(VideoChannelTest, SendWithWritabilityLoss) { 2604 Base::SendWithWritabilityLoss(); 2605 } 2606 2607 TEST_F(VideoChannelTest, TestMediaMonitor) { 2608 Base::TestMediaMonitor(); 2609 } 2610 2611 TEST_F(VideoChannelTest, TestMediaSinks) { 2612 Base::TestMediaSinks(); 2613 } 2614 2615 TEST_F(VideoChannelTest, TestSetContentFailure) { 2616 Base::TestSetContentFailure(); 2617 } 2618 2619 TEST_F(VideoChannelTest, TestSendTwoOffers) { 2620 Base::TestSendTwoOffers(); 2621 } 2622 2623 TEST_F(VideoChannelTest, TestReceiveTwoOffers) { 2624 Base::TestReceiveTwoOffers(); 2625 } 2626 2627 TEST_F(VideoChannelTest, TestSendPrAnswer) { 2628 Base::TestSendPrAnswer(); 2629 } 2630 2631 TEST_F(VideoChannelTest, TestReceivePrAnswer) { 2632 Base::TestReceivePrAnswer(); 2633 } 2634 2635 TEST_F(VideoChannelTest, TestFlushRtcp) { 2636 Base::TestFlushRtcp(); 2637 } 2638 2639 TEST_F(VideoChannelTest, SendBundleToBundle) { 2640 Base::SendBundleToBundle(kVideoPts, ARRAY_SIZE(kVideoPts), false, false); 2641 } 2642 2643 TEST_F(VideoChannelTest, SendBundleToBundleSecure) { 2644 Base::SendBundleToBundle(kVideoPts, ARRAY_SIZE(kVideoPts), false, true); 2645 } 2646 2647 TEST_F(VideoChannelTest, SendBundleToBundleWithRtcpMux) { 2648 Base::SendBundleToBundle( 2649 kVideoPts, ARRAY_SIZE(kVideoPts), true, false); 2650 } 2651 2652 TEST_F(VideoChannelTest, SendBundleToBundleWithRtcpMuxSecure) { 2653 Base::SendBundleToBundle( 2654 kVideoPts, ARRAY_SIZE(kVideoPts), true, true); 2655 } 2656 2657 // TODO(gangji): Add VideoChannelTest.TestChangeStateError. 2658 2659 TEST_F(VideoChannelTest, TestSrtpError) { 2660 Base::TestSrtpError(kVideoPts[0]); 2661 } 2662 2663 TEST_F(VideoChannelTest, TestOnReadyToSend) { 2664 Base::TestOnReadyToSend(); 2665 } 2666 2667 TEST_F(VideoChannelTest, TestOnReadyToSendWithRtcpMux) { 2668 Base::TestOnReadyToSendWithRtcpMux(); 2669 } 2670 2671 TEST_F(VideoChannelTest, TestApplyViewRequest) { 2672 CreateChannels(0, 0); 2673 cricket::StreamParams stream2; 2674 stream2.id = "stream2"; 2675 stream2.ssrcs.push_back(2222); 2676 local_media_content1_.AddStream(stream2); 2677 2678 EXPECT_TRUE(SendInitiate()); 2679 EXPECT_TRUE(SendAccept()); 2680 2681 cricket::VideoFormat send_format; 2682 EXPECT_TRUE(media_channel1_->GetSendStreamFormat(kSsrc1, &send_format)); 2683 EXPECT_EQ(640, send_format.width); 2684 EXPECT_EQ(400, send_format.height); 2685 EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), send_format.interval); 2686 2687 cricket::ViewRequest request; 2688 // stream1: 320x200x15; stream2: 0x0x0 2689 request.static_video_views.push_back(cricket::StaticVideoView( 2690 cricket::StreamSelector(kSsrc1), 320, 200, 15)); 2691 EXPECT_TRUE(channel1_->ApplyViewRequest(request)); 2692 EXPECT_TRUE(media_channel1_->GetSendStreamFormat(kSsrc1, &send_format)); 2693 EXPECT_EQ(320, send_format.width); 2694 EXPECT_EQ(200, send_format.height); 2695 EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), send_format.interval); 2696 EXPECT_TRUE(media_channel1_->GetSendStreamFormat(2222, &send_format)); 2697 EXPECT_EQ(0, send_format.width); 2698 EXPECT_EQ(0, send_format.height); 2699 2700 // stream1: 160x100x8; stream2: 0x0x0 2701 request.static_video_views.clear(); 2702 request.static_video_views.push_back(cricket::StaticVideoView( 2703 cricket::StreamSelector(kSsrc1), 160, 100, 8)); 2704 EXPECT_TRUE(channel1_->ApplyViewRequest(request)); 2705 EXPECT_TRUE(media_channel1_->GetSendStreamFormat(kSsrc1, &send_format)); 2706 EXPECT_EQ(160, send_format.width); 2707 EXPECT_EQ(100, send_format.height); 2708 EXPECT_EQ(cricket::VideoFormat::FpsToInterval(8), send_format.interval); 2709 2710 // stream1: 0x0x0; stream2: 640x400x30 2711 request.static_video_views.clear(); 2712 request.static_video_views.push_back(cricket::StaticVideoView( 2713 cricket::StreamSelector("", stream2.id), 640, 400, 30)); 2714 EXPECT_TRUE(channel1_->ApplyViewRequest(request)); 2715 EXPECT_TRUE(media_channel1_->GetSendStreamFormat(kSsrc1, &send_format)); 2716 EXPECT_EQ(0, send_format.width); 2717 EXPECT_EQ(0, send_format.height); 2718 EXPECT_TRUE(media_channel1_->GetSendStreamFormat(2222, &send_format)); 2719 EXPECT_EQ(640, send_format.width); 2720 EXPECT_EQ(400, send_format.height); 2721 EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), send_format.interval); 2722 2723 // stream1: 0x0x0; stream2: 0x0x0 2724 request.static_video_views.clear(); 2725 EXPECT_TRUE(channel1_->ApplyViewRequest(request)); 2726 EXPECT_TRUE(media_channel1_->GetSendStreamFormat(kSsrc1, &send_format)); 2727 EXPECT_EQ(0, send_format.width); 2728 EXPECT_EQ(0, send_format.height); 2729 } 2730 2731 TEST_F(VideoChannelTest, TestSetChannelOptions) { 2732 TestSetChannelOptions(); 2733 } 2734 2735 2736 // DataChannelTest 2737 2738 class DataChannelTest 2739 : public ChannelTest<DataTraits> { 2740 public: 2741 typedef ChannelTest<DataTraits> 2742 Base; 2743 DataChannelTest() : Base(kDataPacket, sizeof(kDataPacket), 2744 kRtcpReport, sizeof(kRtcpReport)) { 2745 } 2746 }; 2747 2748 // Override to avoid engine channel parameter. 2749 template<> 2750 cricket::DataChannel* ChannelTest<DataTraits>::CreateChannel( 2751 talk_base::Thread* thread, cricket::MediaEngineInterface* engine, 2752 cricket::FakeDataMediaChannel* ch, cricket::BaseSession* session, 2753 bool rtcp) { 2754 cricket::DataChannel* channel = new cricket::DataChannel( 2755 thread, ch, session, cricket::CN_DATA, rtcp); 2756 if (!channel->Init()) { 2757 delete channel; 2758 channel = NULL; 2759 } 2760 return channel; 2761 } 2762 2763 template<> 2764 void ChannelTest<DataTraits>::CreateContent( 2765 int flags, 2766 const cricket::AudioCodec& audio_codec, 2767 const cricket::VideoCodec& video_codec, 2768 cricket::DataContentDescription* data) { 2769 data->AddCodec(kGoogleDataCodec); 2770 data->set_rtcp_mux((flags & RTCP_MUX) != 0); 2771 if (flags & SECURE) { 2772 data->AddCrypto(cricket::CryptoParams( 2773 1, cricket::CS_AES_CM_128_HMAC_SHA1_32, 2774 "inline:" + talk_base::CreateRandomString(40), "")); 2775 } 2776 } 2777 2778 template<> 2779 void ChannelTest<DataTraits>::CopyContent( 2780 const cricket::DataContentDescription& source, 2781 cricket::DataContentDescription* data) { 2782 *data = source; 2783 } 2784 2785 template<> 2786 bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1, 2787 const cricket::DataCodec& c2) { 2788 return c1.name == c2.name; 2789 } 2790 2791 template<> 2792 void ChannelTest<DataTraits>::AddLegacyStreamInContent( 2793 uint32 ssrc, int flags, cricket::DataContentDescription* data) { 2794 data->AddLegacyStream(ssrc); 2795 } 2796 2797 TEST_F(DataChannelTest, TestInit) { 2798 Base::TestInit(); 2799 EXPECT_FALSE(media_channel1_->IsStreamMuted(0)); 2800 } 2801 2802 TEST_F(DataChannelTest, TestSetContents) { 2803 Base::TestSetContents(); 2804 } 2805 2806 TEST_F(DataChannelTest, TestSetContentsNullOffer) { 2807 Base::TestSetContentsNullOffer(); 2808 } 2809 2810 TEST_F(DataChannelTest, TestSetContentsRtcpMux) { 2811 Base::TestSetContentsRtcpMux(); 2812 } 2813 2814 TEST_F(DataChannelTest, TestSetRemoteContentUpdate) { 2815 Base::TestSetRemoteContentUpdate(); 2816 } 2817 2818 TEST_F(DataChannelTest, TestStreams) { 2819 Base::TestStreams(); 2820 } 2821 2822 TEST_F(DataChannelTest, TestUpdateStreamsInLocalContent) { 2823 Base::TestUpdateStreamsInLocalContent(); 2824 } 2825 2826 TEST_F(DataChannelTest, TestUpdateRemoteStreamsInContent) { 2827 Base::TestUpdateStreamsInRemoteContent(); 2828 } 2829 2830 TEST_F(DataChannelTest, TestChangeStreamParamsInContent) { 2831 Base::TestChangeStreamParamsInContent(); 2832 } 2833 2834 TEST_F(DataChannelTest, TestPlayoutAndSendingStates) { 2835 Base::TestPlayoutAndSendingStates(); 2836 } 2837 2838 TEST_F(DataChannelTest, TestMediaContentDirection) { 2839 Base::TestMediaContentDirection(); 2840 } 2841 2842 TEST_F(DataChannelTest, TestCallSetup) { 2843 Base::TestCallSetup(); 2844 } 2845 2846 TEST_F(DataChannelTest, TestCallTeardownRtcpMux) { 2847 Base::TestCallTeardownRtcpMux(); 2848 } 2849 2850 TEST_F(DataChannelTest, TestOnReadyToSend) { 2851 Base::TestOnReadyToSend(); 2852 } 2853 2854 TEST_F(DataChannelTest, TestOnReadyToSendWithRtcpMux) { 2855 Base::TestOnReadyToSendWithRtcpMux(); 2856 } 2857 2858 TEST_F(DataChannelTest, SendRtpToRtp) { 2859 Base::SendRtpToRtp(); 2860 } 2861 2862 TEST_F(DataChannelTest, SendNoRtcpToNoRtcp) { 2863 Base::SendNoRtcpToNoRtcp(); 2864 } 2865 2866 TEST_F(DataChannelTest, SendNoRtcpToRtcp) { 2867 Base::SendNoRtcpToRtcp(); 2868 } 2869 2870 TEST_F(DataChannelTest, SendRtcpToNoRtcp) { 2871 Base::SendRtcpToNoRtcp(); 2872 } 2873 2874 TEST_F(DataChannelTest, SendRtcpToRtcp) { 2875 Base::SendRtcpToRtcp(); 2876 } 2877 2878 TEST_F(DataChannelTest, SendRtcpMuxToRtcp) { 2879 Base::SendRtcpMuxToRtcp(); 2880 } 2881 2882 TEST_F(DataChannelTest, SendRtcpMuxToRtcpMux) { 2883 Base::SendRtcpMuxToRtcpMux(); 2884 } 2885 2886 TEST_F(DataChannelTest, SendEarlyRtcpMuxToRtcp) { 2887 Base::SendEarlyRtcpMuxToRtcp(); 2888 } 2889 2890 TEST_F(DataChannelTest, SendEarlyRtcpMuxToRtcpMux) { 2891 Base::SendEarlyRtcpMuxToRtcpMux(); 2892 } 2893 2894 TEST_F(DataChannelTest, SendSrtpToSrtp) { 2895 Base::SendSrtpToSrtp(); 2896 } 2897 2898 TEST_F(DataChannelTest, SendSrtpToRtp) { 2899 Base::SendSrtpToSrtp(); 2900 } 2901 2902 TEST_F(DataChannelTest, SendSrtcpMux) { 2903 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX); 2904 } 2905 2906 TEST_F(DataChannelTest, SendRtpToRtpOnThread) { 2907 Base::SendRtpToRtpOnThread(); 2908 } 2909 2910 TEST_F(DataChannelTest, SendSrtpToSrtpOnThread) { 2911 Base::SendSrtpToSrtpOnThread(); 2912 } 2913 2914 TEST_F(DataChannelTest, SendWithWritabilityLoss) { 2915 Base::SendWithWritabilityLoss(); 2916 } 2917 2918 TEST_F(DataChannelTest, TestMediaMonitor) { 2919 Base::TestMediaMonitor(); 2920 } 2921 2922 TEST_F(DataChannelTest, TestSendData) { 2923 CreateChannels(0, 0); 2924 EXPECT_TRUE(SendInitiate()); 2925 EXPECT_TRUE(SendAccept()); 2926 2927 cricket::SendDataParams params; 2928 params.ssrc = 42; 2929 unsigned char data[] = { 2930 'f', 'o', 'o' 2931 }; 2932 talk_base::Buffer payload(data, 3); 2933 cricket::SendDataResult result; 2934 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result)); 2935 EXPECT_EQ(params.ssrc, 2936 media_channel1_->last_sent_data_params().ssrc); 2937 EXPECT_EQ("foo", media_channel1_->last_sent_data()); 2938 } 2939 2940 // TODO(pthatcher): TestSetReceiver? 2941