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