10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2012, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 291b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org#include <vector> 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/audiotrack.h" 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/mediastream.h" 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/mediastreamsignaling.h" 348485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org#include "talk/app/webrtc/sctputils.h" 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/streamcollection.h" 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/test/fakeconstraints.h" 37d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org#include "talk/app/webrtc/test/fakedatachannelprovider.h" 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/videotrack.h" 394ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org#include "talk/media/base/fakemediaengine.h" 404ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org#include "talk/media/devices/fakedevicemanager.h" 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/constants.h" 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/sessiondescription.h" 434ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org#include "talk/session/media/channelmanager.h" 44cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/gunit.h" 45cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/scoped_ptr.h" 46cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/stringutils.h" 47cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/thread.h" 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStreams[][8] = {"stream1", "stream2"}; 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kAudioTracks[][32] = {"audiotrack0", "audiotrack1"}; 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kVideoTracks[][32] = {"videotrack0", "videotrack1"}; 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::AudioTrack; 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::AudioTrackInterface; 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::AudioTrackVector; 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::VideoTrack; 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::VideoTrackInterface; 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::VideoTrackVector; 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::DataChannelInterface; 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::FakeConstraints; 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::IceCandidateInterface; 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::MediaConstraintsInterface; 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::MediaStreamInterface; 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::MediaStreamTrackInterface; 654fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.orgusing webrtc::PeerConnectionInterface; 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::SdpParseError; 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::SessionDescriptionInterface; 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::StreamCollection; 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::StreamCollectionInterface; 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 714fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.orgtypedef PeerConnectionInterface::RTCOfferAnswerOptions RTCOfferAnswerOptions; 724fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Reference SDP with a MediaStream with label "stream1" and audio track with 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// id "audio_1" and a video track with id "video_1; 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringWithStream1[] = 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 0 0 IN IP4 127.0.0.1\r\n" 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 1 RTP/AVPF 103\r\n" 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:audio\r\n" 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n" 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 cname:stream1\r\n" 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 mslabel:stream1\r\n" 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 label:audiotrack0\r\n" 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=video 1 RTP/AVPF 120\r\n" 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:video\r\n" 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:120 VP8/90000\r\n" 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 cname:stream1\r\n" 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 mslabel:stream1\r\n" 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 label:videotrack0\r\n"; 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Reference SDP with two MediaStreams with label "stream1" and "stream2. Each 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// MediaStreams have one audio track and one video track. 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This uses MSID. 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringWith2Stream[] = 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 0 0 IN IP4 127.0.0.1\r\n" 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=msid-semantic: WMS stream1 stream2\r\n" 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 1 RTP/AVPF 103\r\n" 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:audio\r\n" 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n" 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 cname:stream1\r\n" 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 msid:stream1 audiotrack0\r\n" 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 cname:stream2\r\n" 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 msid:stream2 audiotrack1\r\n" 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=video 1 RTP/AVPF 120\r\n" 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:video\r\n" 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:120 VP8/0\r\n" 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 cname:stream1\r\n" 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 msid:stream1 videotrack0\r\n" 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 cname:stream2\r\n" 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 msid:stream2 videotrack1\r\n"; 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Reference SDP without MediaStreams. Msid is not supported. 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringWithoutStreams[] = 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 0 0 IN IP4 127.0.0.1\r\n" 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 1 RTP/AVPF 103\r\n" 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:audio\r\n" 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n" 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=video 1 RTP/AVPF 120\r\n" 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:video\r\n" 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:120 VP8/90000\r\n"; 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Reference SDP without MediaStreams. Msid is supported. 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringWithMsidWithoutStreams[] = 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 0 0 IN IP4 127.0.0.1\r\n" 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 136d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org "a=msid-semantic: WMS\r\n" 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 1 RTP/AVPF 103\r\n" 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:audio\r\n" 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n" 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=video 1 RTP/AVPF 120\r\n" 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:video\r\n" 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:120 VP8/90000\r\n"; 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Reference SDP without MediaStreams and audio only. 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringWithoutStreamsAudioOnly[] = 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 0 0 IN IP4 127.0.0.1\r\n" 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 1 RTP/AVPF 103\r\n" 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:audio\r\n" 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n"; 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 154bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org// Reference SENDONLY SDP without MediaStreams. Msid is not supported. 155bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.orgstatic const char kSdpStringSendOnlyWithWithoutStreams[] = 156bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "v=0\r\n" 157bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "o=- 0 0 IN IP4 127.0.0.1\r\n" 158bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "s=-\r\n" 159bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "t=0 0\r\n" 160bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "m=audio 1 RTP/AVPF 103\r\n" 161bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "a=mid:audio\r\n" 162bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "a=sendonly" 163bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "a=rtpmap:103 ISAC/16000\r\n" 164bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "m=video 1 RTP/AVPF 120\r\n" 165bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "a=mid:video\r\n" 166bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "a=sendonly" 167bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org "a=rtpmap:120 VP8/90000\r\n"; 168bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringInit[] = 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 0 0 IN IP4 127.0.0.1\r\n" 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=msid-semantic: WMS\r\n"; 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringAudio[] = 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 1 RTP/AVPF 103\r\n" 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:audio\r\n" 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n"; 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringVideo[] = 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=video 1 RTP/AVPF 120\r\n" 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:video\r\n" 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:120 VP8/90000\r\n"; 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringMs1Audio0[] = 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 cname:stream1\r\n" 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 msid:stream1 audiotrack0\r\n"; 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringMs1Video0[] = 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 cname:stream1\r\n" 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 msid:stream1 videotrack0\r\n"; 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringMs1Audio1[] = 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 cname:stream1\r\n" 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 msid:stream1 audiotrack1\r\n"; 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpStringMs1Video1[] = 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 cname:stream1\r\n" 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 msid:stream1 videotrack1\r\n"; 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifies that |options| contain all tracks in |collection| and that 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// the |options| has set the the has_audio and has_video flags correct. 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void VerifyMediaOptions(StreamCollectionInterface* collection, 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::MediaSessionOptions& options) { 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!collection) { 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t stream_index = 0; 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < collection->count(); ++i) { 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream = collection->at(i); 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackVector audio_tracks = stream->GetAudioTracks(); 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_GE(options.streams.size(), stream_index + audio_tracks.size()); 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t j = 0; j < audio_tracks.size(); ++j) { 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AudioTrackInterface* audio = audio_tracks[j]; 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(options.streams[stream_index].sync_label, stream->label()); 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(options.streams[stream_index++].id, audio->id()); 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.has_audio); 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackVector video_tracks = stream->GetVideoTracks(); 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_GE(options.streams.size(), stream_index + video_tracks.size()); 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t j = 0; j < video_tracks.size(); ++j) { 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::VideoTrackInterface* video = video_tracks[j]; 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(options.streams[stream_index].sync_label, stream->label()); 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(options.streams[stream_index++].id, video->id()); 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.has_video); 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic bool CompareStreamCollections(StreamCollectionInterface* s1, 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamCollectionInterface* s2) { 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (s1 == NULL || s2 == NULL || s1->count() != s2->count()) 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i != s1->count(); ++i) { 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (s1->at(i)->label() != s2->at(i)->label()) 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AudioTrackVector audio_tracks1 = s1->at(i)->GetAudioTracks(); 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AudioTrackVector audio_tracks2 = s2->at(i)->GetAudioTracks(); 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::VideoTrackVector video_tracks1 = s1->at(i)->GetVideoTracks(); 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::VideoTrackVector video_tracks2 = s2->at(i)->GetVideoTracks(); 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (audio_tracks1.size() != audio_tracks2.size()) 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t j = 0; j != audio_tracks1.size(); ++j) { 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (audio_tracks1[j]->id() != audio_tracks2[j]->id()) 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (video_tracks1.size() != video_tracks2.size()) 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t j = 0; j != video_tracks1.size(); ++j) { 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (video_tracks1[j]->id() != video_tracks2[j]->id()) 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.orgclass FakeDataChannelFactory : public webrtc::DataChannelFactory { 26219da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org public: 26319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org FakeDataChannelFactory(FakeDataChannelProvider* provider, 2640d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org cricket::DataChannelType dct, 2650d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org webrtc::MediaStreamSignaling* media_stream_signaling) 2660d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org : provider_(provider), 2670d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org type_(dct), 2680d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org media_stream_signaling_(media_stream_signaling) {} 26919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org 2702a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual rtc::scoped_refptr<webrtc::DataChannel> CreateDataChannel( 27119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org const std::string& label, 2728485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org const webrtc::InternalDataChannelInit* config) { 2738485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org last_init_ = *config; 2740d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org rtc::scoped_refptr<webrtc::DataChannel> data_channel = 2750d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org webrtc::DataChannel::Create(provider_, type_, label, *config); 2760d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org media_stream_signaling_->AddDataChannel(data_channel); 2770d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org return data_channel; 2788485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org } 2798485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org 2808485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org const webrtc::InternalDataChannelInit& last_init() const { 2818485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org return last_init_; 28219da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org } 28319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org 28419da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org private: 28519da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org FakeDataChannelProvider* provider_; 28619da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org cricket::DataChannelType type_; 2870d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org webrtc::MediaStreamSignaling* media_stream_signaling_; 2888485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org webrtc::InternalDataChannelInit last_init_; 28919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org}; 29019da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org 2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MockSignalingObserver : public webrtc::MediaStreamSignalingObserver { 2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MockSignalingObserver() 2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : remote_media_streams_(StreamCollection::Create()) { 2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual ~MockSignalingObserver() { 2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // New remote stream have been discovered. 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnAddRemoteStream(MediaStreamInterface* remote_stream) { 3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_media_streams_->AddStream(remote_stream); 3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Remote stream is no longer available. 3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnRemoveRemoteStream(MediaStreamInterface* remote_stream) { 3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_media_streams_->RemoveStream(remote_stream); 3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnAddDataChannel(DataChannelInterface* data_channel) { 3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnAddLocalAudioTrack(MediaStreamInterface* stream, 3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackInterface* audio_track, 3150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddTrack(&local_audio_tracks_, stream, audio_track, ssrc); 3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnAddLocalVideoTrack(MediaStreamInterface* stream, 3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* video_track, 3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddTrack(&local_video_tracks_, stream, video_track, ssrc); 3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnRemoveLocalAudioTrack(MediaStreamInterface* stream, 326c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org AudioTrackInterface* audio_track, 327c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org uint32 ssrc) { 3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RemoveTrack(&local_audio_tracks_, stream, audio_track); 3290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnRemoveLocalVideoTrack(MediaStreamInterface* stream, 3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* video_track) { 3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RemoveTrack(&local_video_tracks_, stream, video_track); 3340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnAddRemoteAudioTrack(MediaStreamInterface* stream, 3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackInterface* audio_track, 3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddTrack(&remote_audio_tracks_, stream, audio_track, ssrc); 3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnAddRemoteVideoTrack(MediaStreamInterface* stream, 3434ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org VideoTrackInterface* video_track, 3444ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org uint32 ssrc) { 3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddTrack(&remote_video_tracks_, stream, video_track, ssrc); 3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnRemoveRemoteAudioTrack(MediaStreamInterface* stream, 3494ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org AudioTrackInterface* audio_track) { 3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RemoveTrack(&remote_audio_tracks_, stream, audio_track); 3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnRemoveRemoteVideoTrack(MediaStreamInterface* stream, 3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* video_track) { 3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RemoveTrack(&remote_video_tracks_, stream, video_track); 3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnRemoveLocalStream(MediaStreamInterface* stream) { 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* RemoteStream(const std::string& label) { 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return remote_media_streams_->find(label); 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamCollectionInterface* remote_streams() const { 3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return remote_media_streams_; 3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t NumberOfRemoteAudioTracks() { return remote_audio_tracks_.size(); } 3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyRemoteAudioTrack(const std::string& stream_label, 3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id, 3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTrack(remote_audio_tracks_, stream_label, track_id, ssrc); 3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t NumberOfRemoteVideoTracks() { return remote_video_tracks_.size(); } 3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyRemoteVideoTrack(const std::string& stream_label, 3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id, 3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTrack(remote_video_tracks_, stream_label, track_id, ssrc); 3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t NumberOfLocalAudioTracks() { return local_audio_tracks_.size(); } 3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyLocalAudioTrack(const std::string& stream_label, 3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id, 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTrack(local_audio_tracks_, stream_label, track_id, ssrc); 3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t NumberOfLocalVideoTracks() { return local_video_tracks_.size(); } 3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyLocalVideoTrack(const std::string& stream_label, 3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id, 3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyTrack(local_video_tracks_, stream_label, track_id, ssrc); 3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org struct TrackInfo { 4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackInfo() {} 4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackInfo(const std::string& stream_label, const std::string track_id, 4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) 4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : stream_label(stream_label), 4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track_id(track_id), 4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc(ssrc) { 4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string stream_label; 4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string track_id; 4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc; 4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org }; 4131b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org typedef std::vector<TrackInfo> TrackInfos; 4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddTrack(TrackInfos* track_infos, MediaStreamInterface* stream, 4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamTrackInterface* track, 4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 4181b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org (*track_infos).push_back(TrackInfo(stream->label(), track->id(), 4191b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org ssrc)); 4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void RemoveTrack(TrackInfos* track_infos, MediaStreamInterface* stream, 4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamTrackInterface* track) { 4241b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org for (TrackInfos::iterator it = track_infos->begin(); 4251b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org it != track_infos->end(); ++it) { 4261b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org if (it->stream_label == stream->label() && it->track_id == track->id()) { 4271b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org track_infos->erase(it); 4281b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org return; 4291b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org } 4301b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org } 4311b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org ADD_FAILURE(); 4321b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org } 4331b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 4341b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const TrackInfo* FindTrackInfo(const TrackInfos& infos, 4351b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const std::string& stream_label, 4361b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const std::string track_id) const { 4371b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org for (TrackInfos::const_iterator it = infos.begin(); 4381b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org it != infos.end(); ++it) { 4391b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org if (it->stream_label == stream_label && it->track_id == track_id) 4401b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org return &*it; 4411b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org } 4421b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org return NULL; 4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4451b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyTrack(const TrackInfos& track_infos, 4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& stream_label, 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id, 4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 4501b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const TrackInfo* track_info = FindTrackInfo(track_infos, 4511b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org stream_label, 4521b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org track_id); 4531b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org ASSERT_TRUE(track_info != NULL); 4541b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org EXPECT_EQ(ssrc, track_info->ssrc); 4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackInfos remote_audio_tracks_; 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackInfos remote_video_tracks_; 4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackInfos local_audio_tracks_; 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackInfos local_video_tracks_; 4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4622a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<StreamCollection> remote_media_streams_; 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MediaStreamSignalingForTest : public webrtc::MediaStreamSignaling { 4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 4674ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org MediaStreamSignalingForTest(MockSignalingObserver* observer, 4684ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org cricket::ChannelManager* channel_manager) 4692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org : webrtc::MediaStreamSignaling(rtc::Thread::Current(), observer, 4704ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org channel_manager) { 4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org }; 4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using webrtc::MediaStreamSignaling::GetOptionsForOffer; 4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using webrtc::MediaStreamSignaling::GetOptionsForAnswer; 4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using webrtc::MediaStreamSignaling::OnRemoteDescriptionChanged; 4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org using webrtc::MediaStreamSignaling::remote_streams; 4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MediaStreamSignalingTest: public testing::Test { 4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void SetUp() { 4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_.reset(new MockSignalingObserver()); 4834ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org channel_manager_.reset( 4844ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org new cricket::ChannelManager(new cricket::FakeMediaEngine(), 4854ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org new cricket::FakeDeviceManager(), 4862a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current())); 4874ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org signaling_.reset(new MediaStreamSignalingForTest(observer_.get(), 4884ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org channel_manager_.get())); 48919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org data_channel_provider_.reset(new FakeDataChannelProvider()); 4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a collection of streams. 4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // CreateStreamCollection(1) creates a collection that 4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // correspond to kSdpString1. 4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // CreateStreamCollection(2) correspond to kSdpString2. 4962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<StreamCollection> 4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateStreamCollection(int number_of_streams) { 4982a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<StreamCollection> local_collection( 4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamCollection::Create()); 5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (int i = 0; i < number_of_streams; ++i) { 5022a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStreamInterface> stream( 5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::MediaStream::Create(kStreams[i])); 5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Add a local audio track. 5062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track( 5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AudioTrack::Create(kAudioTracks[i], NULL)); 5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream->AddTrack(audio_track); 5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Add a local video track. 5112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track( 5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::VideoTrack::Create(kVideoTracks[i], NULL)); 5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream->AddTrack(video_track); 5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org local_collection->AddStream(stream); 5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return local_collection; 5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This functions Creates a MediaStream with label kStreams[0] and 5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // |number_of_audio_tracks| and |number_of_video_tracks| tracks and the 5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // corresponding SessionDescriptionInterface. The SessionDescriptionInterface 5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // is returned in |desc| and the MediaStream is stored in 5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // |reference_collection_| 5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreateSessionDescriptionAndReference( 5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t number_of_audio_tracks, 5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t number_of_video_tracks, 5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface** desc) { 5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_LE(number_of_audio_tracks, 2u); 5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_LE(number_of_video_tracks, 2u); 5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference_collection_ = StreamCollection::Create(); 5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_ms1 = std::string(kSdpStringInit); 5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string mediastream_label = kStreams[0]; 5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStreamInterface> stream( 5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::MediaStream::Create(mediastream_label)); 5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference_collection_->AddStream(stream); 5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (number_of_audio_tracks > 0) { 5430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp_ms1 += std::string(kSdpStringAudio); 5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp_ms1 += std::string(kSdpStringMs1Audio0); 5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddAudioTrack(kAudioTracks[0], stream); 5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (number_of_audio_tracks > 1) { 5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp_ms1 += kSdpStringMs1Audio1; 5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddAudioTrack(kAudioTracks[1], stream); 5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (number_of_video_tracks > 0) { 5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp_ms1 += std::string(kSdpStringVideo); 5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp_ms1 += std::string(kSdpStringMs1Video0); 5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddVideoTrack(kVideoTracks[0], stream); 5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (number_of_video_tracks > 1) { 5580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp_ms1 += kSdpStringMs1Video1; 5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddVideoTrack(kVideoTracks[1], stream); 5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *desc = webrtc::CreateSessionDescription( 5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescriptionInterface::kOffer, sdp_ms1, NULL); 5640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddAudioTrack(const std::string& track_id, 5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream) { 5682a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track( 5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AudioTrack::Create(track_id, NULL)); 5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(stream->AddTrack(audio_track)); 5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddVideoTrack(const std::string& track_id, 5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream) { 5752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track( 5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::VideoTrack::Create(track_id, NULL)); 5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(stream->AddTrack(video_track)); 5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5802a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::DataChannel> AddDataChannel( 58119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org cricket::DataChannelType type, const std::string& label, int id) { 5828485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org webrtc::InternalDataChannelInit config; 58319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org config.id = id; 5842a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::DataChannel> data_channel( 58519da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org webrtc::DataChannel::Create( 5868485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org data_channel_provider_.get(), type, label, config)); 58719da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org EXPECT_TRUE(data_channel.get() != NULL); 58819da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org EXPECT_TRUE(signaling_->AddDataChannel(data_channel.get())); 58919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org return data_channel; 59019da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org } 59119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org 5924ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org // ChannelManager is used by VideoSource, so it should be released after all 5934ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org // the video tracks. Put it as the first private variable should ensure that. 5942a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<cricket::ChannelManager> channel_manager_; 5952a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<StreamCollection> reference_collection_; 5962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<MockSignalingObserver> observer_; 5972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<MediaStreamSignalingForTest> signaling_; 5982a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<FakeDataChannelProvider> data_channel_provider_; 5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6014fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.orgTEST_F(MediaStreamSignalingTest, GetOptionsForOfferWithInvalidAudioOption) { 6024fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions rtc_options; 6034fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.offer_to_receive_audio = RTCOfferAnswerOptions::kUndefined - 1; 6044fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6054fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org cricket::MediaSessionOptions options; 6064fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_FALSE(signaling_->GetOptionsForOffer(rtc_options, &options)); 6074fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6084fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.offer_to_receive_audio = 6094fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions::kMaxOfferToReceiveMedia + 1; 6104fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_FALSE(signaling_->GetOptionsForOffer(rtc_options, &options)); 6114fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org} 6124fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6134fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6144fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.orgTEST_F(MediaStreamSignalingTest, GetOptionsForOfferWithInvalidVideoOption) { 6154fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions rtc_options; 6164fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.offer_to_receive_video = 6174fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions::kUndefined - 1; 6184fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6194fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org cricket::MediaSessionOptions options; 6204fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_FALSE(signaling_->GetOptionsForOffer(rtc_options, &options)); 6214fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6224fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.offer_to_receive_video = 6234fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions::kMaxOfferToReceiveMedia + 1; 6244fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_FALSE(signaling_->GetOptionsForOffer(rtc_options, &options)); 6254fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org} 6264fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that a MediaSessionOptions is created for an offer if 6284fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org// OfferToReceiveAudio and OfferToReceiveVideo options are set but no 6290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// MediaStreams are sent. 6300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, GetMediaSessionOptionsForOfferWithAudioVideo) { 6314fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions rtc_options; 6324fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.offer_to_receive_audio = 1; 6334fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.offer_to_receive_video = 1; 6344fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 6364fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForOffer(rtc_options, &options)); 6370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.has_audio); 6380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.has_video); 6390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.bundle_enabled); 6400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that a correct MediaSessionOptions is created for an offer if 6434fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org// OfferToReceiveAudio is set but no MediaStreams are sent. 6440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, GetMediaSessionOptionsForOfferWithAudio) { 6454fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions rtc_options; 6464fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.offer_to_receive_audio = 1; 6474fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 6494fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForOffer(rtc_options, &options)); 6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.has_audio); 6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(options.has_video); 6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.bundle_enabled); 6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that a correct MediaSessionOptions is created for an offer if 6564fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org// the default OfferOptons is used or MediaStreams are sent. 6570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, GetDefaultMediaSessionOptionsForOffer) { 6584fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions rtc_options; 6594fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 6614fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForOffer(rtc_options, &options)); 6624fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_FALSE(options.has_audio); 6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(options.has_video); 6644fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_FALSE(options.bundle_enabled); 6654fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(options.vad_enabled); 6664fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_FALSE(options.transport_options.ice_restart); 6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that a correct MediaSessionOptions is created for an offer if 6704fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org// OfferToReceiveVideo is set but no MediaStreams are sent. 6710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, GetMediaSessionOptionsForOfferWithVideo) { 6724fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions rtc_options; 6734fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.offer_to_receive_audio = 0; 6744fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.offer_to_receive_video = 1; 6754fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 6774fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForOffer(rtc_options, &options)); 6780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(options.has_audio); 6790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.has_video); 6800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.bundle_enabled); 6810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that a correct MediaSessionOptions is created for an offer if 6844fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org// UseRtpMux is set to false. 6850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, 6860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org GetMediaSessionOptionsForOfferWithBundleDisabled) { 6874fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions rtc_options; 6884fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.offer_to_receive_audio = 1; 6894fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.offer_to_receive_video = 1; 6904fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.use_rtp_mux = false; 6914fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 6920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 6934fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForOffer(rtc_options, &options)); 6940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.has_audio); 6950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.has_video); 6960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(options.bundle_enabled); 6970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that a correct MediaSessionOptions is created to restart ice if 7004fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org// IceRestart is set. It also tests that subsequent MediaSessionOptions don't 7014fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org// have |transport_options.ice_restart| set. 7020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, 7030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org GetMediaSessionOptionsForOfferWithIceRestart) { 7044fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions rtc_options; 7054fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options.ice_restart = true; 7064fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 7070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 7084fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForOffer(rtc_options, &options)); 7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(options.transport_options.ice_restart); 7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7114fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org rtc_options = RTCOfferAnswerOptions(); 7124fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForOffer(rtc_options, &options)); 7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(options.transport_options.ice_restart); 7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that a correct MediaSessionOptions are created for an offer if 7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// a MediaStream is sent and later updated with a new track. 7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// MediaConstraints are not used. 7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, AddTrackToLocalMediaStream) { 7204fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions rtc_options; 7212a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<StreamCollection> local_streams( 7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateStreamCollection(1)); 7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* local_stream = local_streams->at(0); 7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(signaling_->AddLocalStream(local_stream)); 7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions options; 7264fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForOffer(rtc_options, &options)); 7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyMediaOptions(local_streams, options); 7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions updated_options; 7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org local_stream->AddTrack(AudioTrack::Create(kAudioTracks[1], NULL)); 7314fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForOffer(rtc_options, &options)); 7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyMediaOptions(local_streams, options); 7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that the MediaConstraints in an answer don't affect if audio and video 7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// is offered in an offer but that if kOfferToReceiveAudio or 7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// kOfferToReceiveVideo constraints are true in an offer, the media type will be 7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// included in subsequent answers. 7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, MediaConstraintsInAnswer) { 7400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints answer_c; 7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer_c.SetMandatoryReceiveAudio(true); 7420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer_c.SetMandatoryReceiveVideo(true); 7430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions answer_options; 7450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForAnswer(&answer_c, &answer_options)); 7460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(answer_options.has_audio); 7470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(answer_options.has_video); 7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7494fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions rtc_offer_optoins; 7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions offer_options; 7524fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE( 7534fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org signaling_->GetOptionsForOffer(rtc_offer_optoins, &offer_options)); 7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(offer_options.has_audio); 7550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(offer_options.has_video); 7560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7574fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions updated_rtc_offer_optoins; 7584fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org updated_rtc_offer_optoins.offer_to_receive_audio = 1; 7594fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org updated_rtc_offer_optoins.offer_to_receive_video = 1; 7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions updated_offer_options; 7624fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForOffer(updated_rtc_offer_optoins, 7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &updated_offer_options)); 7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(updated_offer_options.has_audio); 7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(updated_offer_options.has_video); 7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Since an offer has been created with both audio and video, subsequent 7680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // offers and answers should contain both audio and video. 7690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Answers will only contain the media types that exist in the offer 7700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // regardless of the value of |updated_answer_options.has_audio| and 7710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // |updated_answer_options.has_video|. 7720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FakeConstraints updated_answer_c; 7730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer_c.SetMandatoryReceiveAudio(false); 7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer_c.SetMandatoryReceiveVideo(false); 7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions updated_answer_options; 7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForAnswer(&updated_answer_c, 7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &updated_answer_options)); 7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(updated_answer_options.has_audio); 7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(updated_answer_options.has_video); 7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7824fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org RTCOfferAnswerOptions default_rtc_options; 7834fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org EXPECT_TRUE(signaling_->GetOptionsForOffer(default_rtc_options, 7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &updated_offer_options)); 785966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // By default, |has_audio| or |has_video| are false if there is no media 786966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // track. 787966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org EXPECT_FALSE(updated_offer_options.has_audio); 788966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org EXPECT_FALSE(updated_offer_options.has_video); 7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies that the remote MediaStreams corresponding to a received 7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SDP string is created. In this test the two separate MediaStreams are 7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// signaled. 7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, UpdateRemoteStreams) { 7952a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc( 7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 7970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSdpStringWithStream1, NULL)); 7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(desc != NULL); 7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc.get()); 8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8012a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<StreamCollection> reference( 8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateStreamCollection(1)); 8030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareStreamCollections(signaling_->remote_streams(), 8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference.get())); 8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareStreamCollections(observer_->remote_streams(), 8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference.get())); 8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, observer_->NumberOfRemoteAudioTracks()); 8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyRemoteAudioTrack(kStreams[0], kAudioTracks[0], 1); 8090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, observer_->NumberOfRemoteVideoTracks()); 8100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyRemoteVideoTrack(kStreams[0], kVideoTracks[0], 2); 8114ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org ASSERT_EQ(1u, observer_->remote_streams()->count()); 8124ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org MediaStreamInterface* remote_stream = observer_->remote_streams()->at(0); 8134ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org EXPECT_TRUE(remote_stream->GetVideoTracks()[0]->GetSource() != NULL); 8140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create a session description based on another SDP with another 8160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // MediaStream. 8172a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> update_desc( 8180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 8190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSdpStringWith2Stream, NULL)); 8200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(update_desc != NULL); 8210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(update_desc.get()); 8220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8232a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<StreamCollection> reference2( 8240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateStreamCollection(2)); 8250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareStreamCollections(signaling_->remote_streams(), 8260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference2.get())); 8270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareStreamCollections(observer_->remote_streams(), 8280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference2.get())); 8290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2u, observer_->NumberOfRemoteAudioTracks()); 8310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyRemoteAudioTrack(kStreams[0], kAudioTracks[0], 1); 8320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyRemoteAudioTrack(kStreams[1], kAudioTracks[1], 3); 8330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2u, observer_->NumberOfRemoteVideoTracks()); 8340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyRemoteVideoTrack(kStreams[0], kVideoTracks[0], 2); 8350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyRemoteVideoTrack(kStreams[1], kVideoTracks[1], 4); 8360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies that the remote MediaStreams corresponding to a received 8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SDP string is created. In this test the same remote MediaStream is signaled 8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// but MediaStream tracks are added and removed. 8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, AddRemoveTrackFromExistingRemoteMediaStream) { 8422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc_ms1; 8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescriptionAndReference(1, 1, desc_ms1.use()); 8440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc_ms1.get()); 8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareStreamCollections(signaling_->remote_streams(), 8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference_collection_)); 8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Add extra audio and video tracks to the same MediaStream. 8492a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc_ms1_two_tracks; 8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescriptionAndReference(2, 2, desc_ms1_two_tracks.use()); 8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc_ms1_two_tracks.get()); 8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareStreamCollections(signaling_->remote_streams(), 8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference_collection_)); 8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareStreamCollections(observer_->remote_streams(), 8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference_collection_)); 8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Remove the extra audio and video tracks again. 8582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc_ms2; 859a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org CreateSessionDescriptionAndReference(1, 1, desc_ms2.use()); 860a113c08d77afcecf042d96eacc23a0ed512ec122henrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc_ms2.get()); 8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareStreamCollections(signaling_->remote_streams(), 8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference_collection_)); 8630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareStreamCollections(observer_->remote_streams(), 8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference_collection_)); 8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test that remote tracks are ended if a 8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// local session description is set that rejects the media content type. 8690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, RejectMediaContent) { 8702a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc( 8710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 8720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSdpStringWithStream1, NULL)); 8730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(desc != NULL); 8740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc.get()); 8750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, observer_->remote_streams()->count()); 8770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* remote_stream = observer_->remote_streams()->at(0); 8780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, remote_stream->GetVideoTracks().size()); 8790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, remote_stream->GetAudioTracks().size()); 8800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8812a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoTrackInterface> remote_video = 8820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_stream->GetVideoTracks()[0]; 8830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, remote_video->state()); 8842a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::AudioTrackInterface> remote_audio = 8850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_stream->GetAudioTracks()[0]; 8860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, remote_audio->state()); 8870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ContentInfo* video_info = 8890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc->description()->GetContentByName("video"); 8900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(video_info != NULL); 8910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_info->rejected = true; 8920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnLocalDescriptionChanged(desc.get()); 8930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, remote_video->state()); 8940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, remote_audio->state()); 8950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ContentInfo* audio_info = 8970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc->description()->GetContentByName("audio"); 8980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(audio_info != NULL); 8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_info->rejected = true; 9000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnLocalDescriptionChanged(desc.get()); 9010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, remote_audio->state()); 9020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 904c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org// This test that it won't crash if the remote track as been removed outside 905c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org// of MediaStreamSignaling and then MediaStreamSignaling tries to reject 906c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org// this track. 907c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, RemoveTrackThenRejectMediaContent) { 9082a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc( 909c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 910c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org kSdpStringWithStream1, NULL)); 911c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org EXPECT_TRUE(desc != NULL); 912c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc.get()); 913c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org 914c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org MediaStreamInterface* remote_stream = observer_->remote_streams()->at(0); 915c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org remote_stream->RemoveTrack(remote_stream->GetVideoTracks()[0]); 916c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org remote_stream->RemoveTrack(remote_stream->GetAudioTracks()[0]); 917c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org 918c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org cricket::ContentInfo* video_info = 919c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org desc->description()->GetContentByName("video"); 920c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org video_info->rejected = true; 921c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org signaling_->OnLocalDescriptionChanged(desc.get()); 922c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org 923c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org cricket::ContentInfo* audio_info = 924c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org desc->description()->GetContentByName("audio"); 925c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org audio_info->rejected = true; 926c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org signaling_->OnLocalDescriptionChanged(desc.get()); 927c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org 928c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org // No crash is a pass. 929c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org} 930c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org 9310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This tests that a default MediaStream is created if a remote session 9320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// description doesn't contain any streams and no MSID support. 9330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// It also tests that the default stream is updated if a video m-line is added 9340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// in a subsequent session description. 9350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, SdpWithoutMsidCreatesDefaultStream) { 9362a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc_audio_only( 9370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 9380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSdpStringWithoutStreamsAudioOnly, 9390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org NULL)); 9400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(desc_audio_only != NULL); 9410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc_audio_only.get()); 9420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, signaling_->remote_streams()->count()); 9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, observer_->remote_streams()->count()); 9450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* remote_stream = observer_->remote_streams()->at(0); 9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, remote_stream->GetAudioTracks().size()); 9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, remote_stream->GetVideoTracks().size()); 9490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("default", remote_stream->label()); 9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc( 9520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 9530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSdpStringWithoutStreams, NULL)); 9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 9550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc.get()); 9560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, signaling_->remote_streams()->count()); 9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, remote_stream->GetAudioTracks().size()); 9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("defaulta0", remote_stream->GetAudioTracks()[0]->id()); 9590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, remote_stream->GetVideoTracks().size()); 9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("defaultv0", remote_stream->GetVideoTracks()[0]->id()); 9610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyRemoteAudioTrack("default", "defaulta0", 0); 9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyRemoteVideoTrack("default", "defaultv0", 0); 9630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 965bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org// This tests that a default MediaStream is created if a remote session 966bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org// description doesn't contain any streams and media direction is send only. 967bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.orgTEST_F(MediaStreamSignalingTest, RecvOnlySdpWithoutMsidCreatesDefaultStream) { 9682a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc( 969bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 970bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org kSdpStringSendOnlyWithWithoutStreams, 971bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org NULL)); 972bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org ASSERT_TRUE(desc != NULL); 973bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org signaling_->OnRemoteDescriptionChanged(desc.get()); 974bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org 975bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org EXPECT_EQ(1u, signaling_->remote_streams()->count()); 976bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org ASSERT_EQ(1u, observer_->remote_streams()->count()); 977bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org MediaStreamInterface* remote_stream = observer_->remote_streams()->at(0); 978bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org 979bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org EXPECT_EQ(1u, remote_stream->GetAudioTracks().size()); 980bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org EXPECT_EQ(1u, remote_stream->GetVideoTracks().size()); 981bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org EXPECT_EQ("default", remote_stream->label()); 982bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org} 983bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org 984c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org// This tests that it won't crash when MediaStreamSignaling tries to remove 985c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org// a remote track that as already been removed from the mediastream. 986c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, RemoveAlreadyGoneRemoteStream) { 9872a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc_audio_only( 988c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 989c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org kSdpStringWithoutStreams, 990c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org NULL)); 991c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org ASSERT_TRUE(desc_audio_only != NULL); 992c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc_audio_only.get()); 993c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org MediaStreamInterface* remote_stream = observer_->remote_streams()->at(0); 994c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org remote_stream->RemoveTrack(remote_stream->GetAudioTracks()[0]); 995c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org remote_stream->RemoveTrack(remote_stream->GetVideoTracks()[0]); 996c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org 9972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc( 998c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 999c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org kSdpStringWithoutStreams, NULL)); 1000c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 1001c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc.get()); 1002c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org 1003c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org // No crash is a pass. 1004c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org} 1005c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org 10060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This tests that a default MediaStream is created if the remote session 10070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// description doesn't contain any streams and don't contain an indication if 10080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// MSID is supported. 10090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, 10100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SdpWithoutMsidAndStreamsCreatesDefaultStream) { 10112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc( 10120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 10130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSdpStringWithoutStreams, 10140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org NULL)); 10150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 10160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc.get()); 10170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, observer_->remote_streams()->count()); 10190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* remote_stream = observer_->remote_streams()->at(0); 10200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, remote_stream->GetAudioTracks().size()); 10210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, remote_stream->GetVideoTracks().size()); 10220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 10230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This tests that a default MediaStream is not created if the remote session 10250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// description doesn't contain any streams but does support MSID. 10260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, SdpWitMsidDontCreatesDefaultStream) { 10272a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc_msid_without_streams( 10280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 10290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSdpStringWithMsidWithoutStreams, 10300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org NULL)); 10310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc_msid_without_streams.get()); 10320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, observer_->remote_streams()->count()); 10330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 10340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test that a default MediaStream is not created if a remote session 10360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// description is updated to not have any MediaStreams. 10370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, VerifyDefaultStreamIsNotCreated) { 10382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc( 10390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 10400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSdpStringWithStream1, 10410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org NULL)); 10420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 10430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc.get()); 10442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<StreamCollection> reference( 10450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateStreamCollection(1)); 10460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareStreamCollections(observer_->remote_streams(), 10470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org reference.get())); 10480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10492a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc_without_streams( 10500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 10510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSdpStringWithoutStreams, 10520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org NULL)); 10530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnRemoteDescriptionChanged(desc_without_streams.get()); 10540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, observer_->remote_streams()->count()); 10550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 10560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test that the correct MediaStreamSignalingObserver methods are called 10580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// when MediaStreamSignaling::OnLocalDescriptionChanged is called with an 10590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// updated local session description. 10600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, LocalDescriptionChanged) { 10612a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc_1; 10620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescriptionAndReference(2, 2, desc_1.use()); 10630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->AddLocalStream(reference_collection_->at(0)); 10650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnLocalDescriptionChanged(desc_1.get()); 10660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2u, observer_->NumberOfLocalAudioTracks()); 10670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2u, observer_->NumberOfLocalVideoTracks()); 10680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalAudioTrack(kStreams[0], kAudioTracks[0], 1); 10690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalVideoTrack(kStreams[0], kVideoTracks[0], 2); 10700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalAudioTrack(kStreams[0], kAudioTracks[1], 3); 10710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalVideoTrack(kStreams[0], kVideoTracks[1], 4); 10720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Remove an audio and video track. 10742a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc_2; 10750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescriptionAndReference(1, 1, desc_2.use()); 10760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnLocalDescriptionChanged(desc_2.get()); 10770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, observer_->NumberOfLocalAudioTracks()); 10780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, observer_->NumberOfLocalVideoTracks()); 10790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalAudioTrack(kStreams[0], kAudioTracks[0], 1); 10800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalVideoTrack(kStreams[0], kVideoTracks[0], 2); 10810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 10820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test that the correct MediaStreamSignalingObserver methods are called 10840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// when MediaStreamSignaling::AddLocalStream is called after 10850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// MediaStreamSignaling::OnLocalDescriptionChanged is called. 10860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, AddLocalStreamAfterLocalDescriptionChanged) { 10872a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc_1; 10880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescriptionAndReference(2, 2, desc_1.use()); 10890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnLocalDescriptionChanged(desc_1.get()); 10910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, observer_->NumberOfLocalAudioTracks()); 10920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, observer_->NumberOfLocalVideoTracks()); 10930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->AddLocalStream(reference_collection_->at(0)); 10950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2u, observer_->NumberOfLocalAudioTracks()); 10960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2u, observer_->NumberOfLocalVideoTracks()); 10970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalAudioTrack(kStreams[0], kAudioTracks[0], 1); 10980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalVideoTrack(kStreams[0], kVideoTracks[0], 2); 10990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalAudioTrack(kStreams[0], kAudioTracks[1], 3); 11000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalVideoTrack(kStreams[0], kVideoTracks[1], 4); 11010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test that the correct MediaStreamSignalingObserver methods are called 11040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// if the ssrc on a local track is changed when 11050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// MediaStreamSignaling::OnLocalDescriptionChanged is called. 11060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamSignalingTest, ChangeSsrcOnTrackInLocalSessionDescription) { 11072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc; 11080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSessionDescriptionAndReference(1, 1, desc.use()); 11090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->AddLocalStream(reference_collection_->at(0)); 11110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnLocalDescriptionChanged(desc.get()); 11120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, observer_->NumberOfLocalAudioTracks()); 11130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, observer_->NumberOfLocalVideoTracks()); 11140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalAudioTrack(kStreams[0], kAudioTracks[0], 1); 11150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalVideoTrack(kStreams[0], kVideoTracks[0], 2); 11160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Change the ssrc of the audio and video track. 11180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp; 11190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc->ToString(&sdp); 11200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string ssrc_org = "a=ssrc:1"; 11210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string ssrc_to = "a=ssrc:97"; 11222a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(ssrc_org.c_str(), ssrc_org.length(), 11230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc_to.c_str(), ssrc_to.length(), 11240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp); 11250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc_org = "a=ssrc:2"; 11260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc_to = "a=ssrc:98"; 11272a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(ssrc_org.c_str(), ssrc_org.length(), 11280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc_to.c_str(), ssrc_to.length(), 11290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp); 11302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> updated_desc( 11310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 11320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp, NULL)); 11330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_->OnLocalDescriptionChanged(updated_desc.get()); 11350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, observer_->NumberOfLocalAudioTracks()); 11360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, observer_->NumberOfLocalVideoTracks()); 11370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalAudioTrack(kStreams[0], kAudioTracks[0], 97); 11380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org observer_->VerifyLocalVideoTrack(kStreams[0], kVideoTracks[0], 98); 11390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11411b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org// This test that the correct MediaStreamSignalingObserver methods are called 11421b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org// if a new session description is set with the same tracks but they are now 11431b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org// sent on a another MediaStream. 11441b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.orgTEST_F(MediaStreamSignalingTest, SignalSameTracksInSeparateMediaStream) { 11452a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> desc; 11461b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org CreateSessionDescriptionAndReference(1, 1, desc.use()); 11471b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 11481b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org signaling_->AddLocalStream(reference_collection_->at(0)); 11491b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org signaling_->OnLocalDescriptionChanged(desc.get()); 11501b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org EXPECT_EQ(1u, observer_->NumberOfLocalAudioTracks()); 11511b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org EXPECT_EQ(1u, observer_->NumberOfLocalVideoTracks()); 11521b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 11531b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org std::string stream_label_0 = kStreams[0]; 11541b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org observer_->VerifyLocalAudioTrack(stream_label_0, kAudioTracks[0], 1); 11551b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org observer_->VerifyLocalVideoTrack(stream_label_0, kVideoTracks[0], 2); 11561b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 11571b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org // Add a new MediaStream but with the same tracks as in the first stream. 11581b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org std::string stream_label_1 = kStreams[1]; 11592a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStreamInterface> stream_1( 11601b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org webrtc::MediaStream::Create(kStreams[1])); 11611b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org stream_1->AddTrack(reference_collection_->at(0)->GetVideoTracks()[0]); 11621b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org stream_1->AddTrack(reference_collection_->at(0)->GetAudioTracks()[0]); 11631b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org signaling_->AddLocalStream(stream_1); 11641b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 11651b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org // Replace msid in the original SDP. 11661b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org std::string sdp; 11671b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org desc->ToString(&sdp); 11682a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs( 11691b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org kStreams[0], strlen(kStreams[0]), kStreams[1], strlen(kStreams[1]), &sdp); 11701b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 11712a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> updated_desc( 11721b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 11731b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org sdp, NULL)); 11741b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 11751b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org signaling_->OnLocalDescriptionChanged(updated_desc.get()); 11761b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org observer_->VerifyLocalAudioTrack(kStreams[1], kAudioTracks[0], 1); 11771b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org observer_->VerifyLocalVideoTrack(kStreams[1], kVideoTracks[0], 2); 11781b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org EXPECT_EQ(1u, observer_->NumberOfLocalAudioTracks()); 11791b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org EXPECT_EQ(1u, observer_->NumberOfLocalVideoTracks()); 11801b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org} 11811b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 1182d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// Verifies that an even SCTP id is allocated for SSL_CLIENT and an odd id for 1183d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// SSL_SERVER. 1184d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.orgTEST_F(MediaStreamSignalingTest, SctpIdAllocationBasedOnRole) { 1185d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org int id; 11862a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_SERVER, &id)); 1187d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org EXPECT_EQ(1, id); 11882a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_CLIENT, &id)); 1189d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org EXPECT_EQ(0, id); 11902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_SERVER, &id)); 1191d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org EXPECT_EQ(3, id); 11922a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_CLIENT, &id)); 1193d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org EXPECT_EQ(2, id); 1194d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org} 11950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1196d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// Verifies that SCTP ids of existing DataChannels are not reused. 1197d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.orgTEST_F(MediaStreamSignalingTest, SctpIdAllocationNoReuse) { 119819da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org int old_id = 1; 119919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org AddDataChannel(cricket::DCT_SCTP, "a", old_id); 1200d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org 1201d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org int new_id; 12022a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_SERVER, &new_id)); 120319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org EXPECT_NE(old_id, new_id); 1204d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org 1205d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // Creates a DataChannel with id 0. 120619da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org old_id = 0; 120719da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org AddDataChannel(cricket::DCT_SCTP, "a", old_id); 12082a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_CLIENT, &new_id)); 120919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org EXPECT_NE(old_id, new_id); 121019da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org} 121119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org 121281f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org// Verifies that SCTP ids of removed DataChannels can be reused. 121381f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.orgTEST_F(MediaStreamSignalingTest, SctpIdReusedForRemovedDataChannel) { 121481f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org int odd_id = 1; 121581f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org int even_id = 0; 121681f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org AddDataChannel(cricket::DCT_SCTP, "a", odd_id); 121781f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org AddDataChannel(cricket::DCT_SCTP, "a", even_id); 121881f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 121981f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org int allocated_id = -1; 12202a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_SERVER, 122181f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org &allocated_id)); 122281f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org EXPECT_EQ(odd_id + 2, allocated_id); 122381f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org AddDataChannel(cricket::DCT_SCTP, "a", allocated_id); 122481f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 12252a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_CLIENT, 122681f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org &allocated_id)); 122781f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org EXPECT_EQ(even_id + 2, allocated_id); 122881f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org AddDataChannel(cricket::DCT_SCTP, "a", allocated_id); 122981f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 123081f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org signaling_->RemoveSctpDataChannel(odd_id); 123181f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org signaling_->RemoveSctpDataChannel(even_id); 123281f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 123381f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org // Verifies that removed DataChannel ids are reused. 12342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_SERVER, 123581f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org &allocated_id)); 123681f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org EXPECT_EQ(odd_id, allocated_id); 123781f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 12382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_CLIENT, 123981f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org &allocated_id)); 124081f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org EXPECT_EQ(even_id, allocated_id); 124181f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 124281f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org // Verifies that used higher DataChannel ids are not reused. 12432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_SERVER, 124481f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org &allocated_id)); 124581f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org EXPECT_NE(odd_id + 2, allocated_id); 124681f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 12472a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT_TRUE(signaling_->AllocateSctpSid(rtc::SSL_CLIENT, 124881f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org &allocated_id)); 124981f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org EXPECT_NE(even_id + 2, allocated_id); 125081f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 125181f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org} 125281f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 125319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org// Verifies that duplicated label is not allowed for RTP data channel. 125419da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.orgTEST_F(MediaStreamSignalingTest, RtpDuplicatedLabelNotAllowed) { 125519da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org AddDataChannel(cricket::DCT_RTP, "a", -1); 125619da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org 12578485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org webrtc::InternalDataChannelInit config; 12582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::DataChannel> data_channel = 125919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org webrtc::DataChannel::Create( 12608485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org data_channel_provider_.get(), cricket::DCT_RTP, "a", config); 126119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org ASSERT_TRUE(data_channel.get() != NULL); 126219da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org EXPECT_FALSE(signaling_->AddDataChannel(data_channel.get())); 126319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org} 126419da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org 126519da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org// Verifies that duplicated label is allowed for SCTP data channel. 126619da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.orgTEST_F(MediaStreamSignalingTest, SctpDuplicatedLabelAllowed) { 126719da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org AddDataChannel(cricket::DCT_SCTP, "a", -1); 126819da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org AddDataChannel(cricket::DCT_SCTP, "a", -1); 126919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org} 127019da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org 12718485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org// Verifies the correct configuration is used to create DataChannel from an OPEN 12728485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org// message. 12738485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.orgTEST_F(MediaStreamSignalingTest, CreateDataChannelFromOpenMessage) { 12748485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org FakeDataChannelFactory fake_factory(data_channel_provider_.get(), 12750d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org cricket::DCT_SCTP, 12760d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org signaling_.get()); 12778485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org signaling_->SetDataChannelFactory(&fake_factory); 12788485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org webrtc::DataChannelInit config; 12798485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org config.id = 1; 12802a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Buffer payload; 12818485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org webrtc::WriteDataChannelOpenMessage("a", config, &payload); 12828485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org cricket::ReceiveDataParams params; 12838485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org params.ssrc = config.id; 12848485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org EXPECT_TRUE(signaling_->AddDataChannelFromOpenMessage(params, payload)); 12858485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org EXPECT_EQ(config.id, fake_factory.last_init().id); 12868485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org EXPECT_FALSE(fake_factory.last_init().negotiated); 12878485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org EXPECT_EQ(webrtc::InternalDataChannelInit::kAcker, 12888485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org fake_factory.last_init().open_handshake_role); 12898485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org} 12908485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org 129119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org// Verifies that duplicated label from OPEN message is allowed. 129219da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.orgTEST_F(MediaStreamSignalingTest, DuplicatedLabelFromOpenMessageAllowed) { 129319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org AddDataChannel(cricket::DCT_SCTP, "a", -1); 129419da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org 129519da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org FakeDataChannelFactory fake_factory(data_channel_provider_.get(), 12960d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org cricket::DCT_SCTP, 12970d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org signaling_.get()); 129819da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org signaling_->SetDataChannelFactory(&fake_factory); 129919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org webrtc::DataChannelInit config; 130019da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org config.id = 0; 13012a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Buffer payload; 13028485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org webrtc::WriteDataChannelOpenMessage("a", config, &payload); 13038485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org cricket::ReceiveDataParams params; 13048485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org params.ssrc = config.id; 13058485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org EXPECT_TRUE(signaling_->AddDataChannelFromOpenMessage(params, payload)); 1306d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org} 1307f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org 1308f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org// Verifies that a DataChannel closed remotely is closed locally. 1309f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.orgTEST_F(MediaStreamSignalingTest, 1310f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org SctpDataChannelClosedLocallyWhenClosedRemotely) { 1311f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org webrtc::InternalDataChannelInit config; 1312f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org config.id = 0; 1313f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org 13142a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<webrtc::DataChannel> data_channel = 1315f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org webrtc::DataChannel::Create( 1316f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org data_channel_provider_.get(), cricket::DCT_SCTP, "a", config); 1317f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org ASSERT_TRUE(data_channel.get() != NULL); 1318f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, 1319f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org data_channel->state()); 1320f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org 1321f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org EXPECT_TRUE(signaling_->AddDataChannel(data_channel.get())); 1322f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org 1323f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org signaling_->OnRemoteSctpDataChannelClosed(config.id); 1324f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org EXPECT_EQ(webrtc::DataChannelInterface::kClosed, data_channel->state()); 1325f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org} 13260d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org 13270d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org// Verifies that DataChannel added from OPEN message is added to 13280d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org// MediaStreamSignaling only once (webrtc issue 3778). 13290d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.orgTEST_F(MediaStreamSignalingTest, DataChannelFromOpenMessageAddedOnce) { 13300d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org FakeDataChannelFactory fake_factory(data_channel_provider_.get(), 13310d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org cricket::DCT_SCTP, 13320d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org signaling_.get()); 13330d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org signaling_->SetDataChannelFactory(&fake_factory); 13340d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org webrtc::DataChannelInit config; 13350d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org config.id = 1; 13360d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org rtc::Buffer payload; 13370d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org webrtc::WriteDataChannelOpenMessage("a", config, &payload); 13380d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org cricket::ReceiveDataParams params; 13390d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org params.ssrc = config.id; 13400d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org EXPECT_TRUE(signaling_->AddDataChannelFromOpenMessage(params, payload)); 13410d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org EXPECT_TRUE(signaling_->HasDataChannels()); 13420d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org 13430d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org // Removes the DataChannel and verifies that no DataChannel is left. 13440d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org signaling_->RemoveSctpDataChannel(config.id); 13450d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org EXPECT_FALSE(signaling_->HasDataChannels()); 13460d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org} 1347