128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/* 228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle 35f93d0a140515e3b8cdd1b9a4c6f5871144e5deejlmiller@webrtc.org * Copyright 2012 Google Inc. 428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer. 1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * and/or other materials provided with the distribution. 1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * derived from this software without specific prior written permission. 1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */ 2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <string> 290eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg#include <utility> 3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 31ab9b2d1516cad017c6e0236c468934582530c965deadbeef#include "talk/app/webrtc/audiotrack.h" 3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/jsepsessiondescription.h" 33ab9b2d1516cad017c6e0236c468934582530c965deadbeef#include "talk/app/webrtc/mediastream.h" 3428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/mediastreaminterface.h" 35ab9b2d1516cad017c6e0236c468934582530c965deadbeef#include "talk/app/webrtc/peerconnection.h" 3628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/peerconnectioninterface.h" 37ab9b2d1516cad017c6e0236c468934582530c965deadbeef#include "talk/app/webrtc/rtpreceiverinterface.h" 38ab9b2d1516cad017c6e0236c468934582530c965deadbeef#include "talk/app/webrtc/rtpsenderinterface.h" 39ab9b2d1516cad017c6e0236c468934582530c965deadbeef#include "talk/app/webrtc/streamcollection.h" 4037ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#ifdef WEBRTC_ANDROID 4137ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#include "talk/app/webrtc/test/androidtestinitializer.h" 4237ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#endif 4328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/test/fakeconstraints.h" 445e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström#include "talk/app/webrtc/test/fakedtlsidentitystore.h" 4528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/test/mockpeerconnectionobservers.h" 4628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/test/testsdpstrings.h" 47967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org#include "talk/app/webrtc/videosource.h" 48ab9b2d1516cad017c6e0236c468934582530c965deadbeef#include "talk/app/webrtc/videotrack.h" 49a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "talk/media/base/fakevideocapturer.h" 50a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "talk/media/sctp/sctpdataengine.h" 51a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "talk/session/media/mediasession.h" 52d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/gunit.h" 53d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/scoped_ptr.h" 54d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/ssladapter.h" 55d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/sslstreamadapter.h" 56d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/stringutils.h" 57d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/thread.h" 580c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter#include "webrtc/p2p/client/fakeportallocator.h" 5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStreamLabel1[] = "local_stream_1"; 6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStreamLabel2[] = "local_stream_2"; 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStreamLabel3[] = "local_stream_3"; 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const int kDefaultStunPort = 3478; 6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStunAddressOnly[] = "stun:address"; 6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStunInvalidPort[] = "stun:address:-1"; 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStunAddressPortAndMore1[] = "stun:address:port:more"; 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kStunAddressPortAndMore2[] = "stun:address:port more"; 6828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnIceServerUri[] = "turn:user@turn.example.org"; 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnUsername[] = "user"; 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnPassword[] = "password"; 7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const char kTurnHostname[] = "turn.example.org"; 720c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmstatic const uint32_t kTimeout = 10000U; 7328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 74ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kStreams[][8] = {"stream1", "stream2"}; 75ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kAudioTracks[][32] = {"audiotrack0", "audiotrack1"}; 76ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kVideoTracks[][32] = {"videotrack0", "videotrack1"}; 77ab9b2d1516cad017c6e0236c468934582530c965deadbeef 785e97fb5c996743a4c137a5279be6eb6485225b65deadbeefstatic const char kRecvonly[] = "recvonly"; 795e97fb5c996743a4c137a5279be6eb6485225b65deadbeefstatic const char kSendrecv[] = "sendrecv"; 805e97fb5c996743a4c137a5279be6eb6485225b65deadbeef 81ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Reference SDP with a MediaStream with label "stream1" and audio track with 82ab9b2d1516cad017c6e0236c468934582530c965deadbeef// id "audio_1" and a video track with id "video_1; 83ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringWithStream1[] = 84ab9b2d1516cad017c6e0236c468934582530c965deadbeef "v=0\r\n" 85ab9b2d1516cad017c6e0236c468934582530c965deadbeef "o=- 0 0 IN IP4 127.0.0.1\r\n" 86ab9b2d1516cad017c6e0236c468934582530c965deadbeef "s=-\r\n" 87ab9b2d1516cad017c6e0236c468934582530c965deadbeef "t=0 0\r\n" 88ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-ufrag:e5785931\r\n" 89ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 90ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 91ab9b2d1516cad017c6e0236c468934582530c965deadbeef "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 92ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=audio 1 RTP/AVPF 103\r\n" 93ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:audio\r\n" 945e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 95ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:103 ISAC/16000\r\n" 96ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:1 cname:stream1\r\n" 97ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:1 mslabel:stream1\r\n" 98ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:1 label:audiotrack0\r\n" 99ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=video 1 RTP/AVPF 120\r\n" 100ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:video\r\n" 1015e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 102ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:120 VP8/90000\r\n" 103ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:2 cname:stream1\r\n" 104ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:2 mslabel:stream1\r\n" 105ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:2 label:videotrack0\r\n"; 106ab9b2d1516cad017c6e0236c468934582530c965deadbeef 107ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Reference SDP with two MediaStreams with label "stream1" and "stream2. Each 108ab9b2d1516cad017c6e0236c468934582530c965deadbeef// MediaStreams have one audio track and one video track. 109ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This uses MSID. 110ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringWithStream1And2[] = 111ab9b2d1516cad017c6e0236c468934582530c965deadbeef "v=0\r\n" 112ab9b2d1516cad017c6e0236c468934582530c965deadbeef "o=- 0 0 IN IP4 127.0.0.1\r\n" 113ab9b2d1516cad017c6e0236c468934582530c965deadbeef "s=-\r\n" 114ab9b2d1516cad017c6e0236c468934582530c965deadbeef "t=0 0\r\n" 115ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-ufrag:e5785931\r\n" 116ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 117ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 118ab9b2d1516cad017c6e0236c468934582530c965deadbeef "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 119ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=msid-semantic: WMS stream1 stream2\r\n" 120ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=audio 1 RTP/AVPF 103\r\n" 121ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:audio\r\n" 1225e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 123ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:103 ISAC/16000\r\n" 124ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:1 cname:stream1\r\n" 125ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:1 msid:stream1 audiotrack0\r\n" 126ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:3 cname:stream2\r\n" 127ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:3 msid:stream2 audiotrack1\r\n" 128ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=video 1 RTP/AVPF 120\r\n" 129ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:video\r\n" 1305e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 131ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:120 VP8/0\r\n" 132ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:2 cname:stream1\r\n" 133ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:2 msid:stream1 videotrack0\r\n" 134ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:4 cname:stream2\r\n" 135ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:4 msid:stream2 videotrack1\r\n"; 136ab9b2d1516cad017c6e0236c468934582530c965deadbeef 137ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Reference SDP without MediaStreams. Msid is not supported. 138ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringWithoutStreams[] = 139ab9b2d1516cad017c6e0236c468934582530c965deadbeef "v=0\r\n" 140ab9b2d1516cad017c6e0236c468934582530c965deadbeef "o=- 0 0 IN IP4 127.0.0.1\r\n" 141ab9b2d1516cad017c6e0236c468934582530c965deadbeef "s=-\r\n" 142ab9b2d1516cad017c6e0236c468934582530c965deadbeef "t=0 0\r\n" 143ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-ufrag:e5785931\r\n" 144ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 145ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 146ab9b2d1516cad017c6e0236c468934582530c965deadbeef "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 147ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=audio 1 RTP/AVPF 103\r\n" 148ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:audio\r\n" 1495e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 150ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:103 ISAC/16000\r\n" 151ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=video 1 RTP/AVPF 120\r\n" 152ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:video\r\n" 1535e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 154ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:120 VP8/90000\r\n"; 155ab9b2d1516cad017c6e0236c468934582530c965deadbeef 156ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Reference SDP without MediaStreams. Msid is supported. 157ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringWithMsidWithoutStreams[] = 158ab9b2d1516cad017c6e0236c468934582530c965deadbeef "v=0\r\n" 159ab9b2d1516cad017c6e0236c468934582530c965deadbeef "o=- 0 0 IN IP4 127.0.0.1\r\n" 160ab9b2d1516cad017c6e0236c468934582530c965deadbeef "s=-\r\n" 161ab9b2d1516cad017c6e0236c468934582530c965deadbeef "t=0 0\r\n" 162ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-ufrag:e5785931\r\n" 163ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 164ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 165ab9b2d1516cad017c6e0236c468934582530c965deadbeef "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 166ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=msid-semantic: WMS\r\n" 167ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=audio 1 RTP/AVPF 103\r\n" 168ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:audio\r\n" 1695e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 170ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:103 ISAC/16000\r\n" 171ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=video 1 RTP/AVPF 120\r\n" 172ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:video\r\n" 1735e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 174ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:120 VP8/90000\r\n"; 175ab9b2d1516cad017c6e0236c468934582530c965deadbeef 176ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Reference SDP without MediaStreams and audio only. 177ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringWithoutStreamsAudioOnly[] = 178ab9b2d1516cad017c6e0236c468934582530c965deadbeef "v=0\r\n" 179ab9b2d1516cad017c6e0236c468934582530c965deadbeef "o=- 0 0 IN IP4 127.0.0.1\r\n" 180ab9b2d1516cad017c6e0236c468934582530c965deadbeef "s=-\r\n" 181ab9b2d1516cad017c6e0236c468934582530c965deadbeef "t=0 0\r\n" 182ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-ufrag:e5785931\r\n" 183ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 184ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 185ab9b2d1516cad017c6e0236c468934582530c965deadbeef "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 186ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=audio 1 RTP/AVPF 103\r\n" 187ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:audio\r\n" 1885e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 189ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:103 ISAC/16000\r\n"; 190ab9b2d1516cad017c6e0236c468934582530c965deadbeef 191ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Reference SENDONLY SDP without MediaStreams. Msid is not supported. 192ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringSendOnlyWithoutStreams[] = 193ab9b2d1516cad017c6e0236c468934582530c965deadbeef "v=0\r\n" 194ab9b2d1516cad017c6e0236c468934582530c965deadbeef "o=- 0 0 IN IP4 127.0.0.1\r\n" 195ab9b2d1516cad017c6e0236c468934582530c965deadbeef "s=-\r\n" 196ab9b2d1516cad017c6e0236c468934582530c965deadbeef "t=0 0\r\n" 197ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-ufrag:e5785931\r\n" 198ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 199ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 200ab9b2d1516cad017c6e0236c468934582530c965deadbeef "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 201ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=audio 1 RTP/AVPF 103\r\n" 202ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:audio\r\n" 2035e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 204ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=sendonly\r\n" 205ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:103 ISAC/16000\r\n" 206ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=video 1 RTP/AVPF 120\r\n" 207ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:video\r\n" 2085e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 209ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=sendonly\r\n" 210ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:120 VP8/90000\r\n"; 211ab9b2d1516cad017c6e0236c468934582530c965deadbeef 212ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringInit[] = 213ab9b2d1516cad017c6e0236c468934582530c965deadbeef "v=0\r\n" 214ab9b2d1516cad017c6e0236c468934582530c965deadbeef "o=- 0 0 IN IP4 127.0.0.1\r\n" 215ab9b2d1516cad017c6e0236c468934582530c965deadbeef "s=-\r\n" 216ab9b2d1516cad017c6e0236c468934582530c965deadbeef "t=0 0\r\n" 217ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-ufrag:e5785931\r\n" 218ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 219ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 220ab9b2d1516cad017c6e0236c468934582530c965deadbeef "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 221ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=msid-semantic: WMS\r\n"; 222ab9b2d1516cad017c6e0236c468934582530c965deadbeef 223ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringAudio[] = 224ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=audio 1 RTP/AVPF 103\r\n" 225ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:audio\r\n" 2265e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 227ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:103 ISAC/16000\r\n"; 228ab9b2d1516cad017c6e0236c468934582530c965deadbeef 229ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringVideo[] = 230ab9b2d1516cad017c6e0236c468934582530c965deadbeef "m=video 1 RTP/AVPF 120\r\n" 231ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=mid:video\r\n" 2325e97fb5c996743a4c137a5279be6eb6485225b65deadbeef "a=sendrecv\r\n" 233ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=rtpmap:120 VP8/90000\r\n"; 234ab9b2d1516cad017c6e0236c468934582530c965deadbeef 235ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringMs1Audio0[] = 236ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:1 cname:stream1\r\n" 237ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:1 msid:stream1 audiotrack0\r\n"; 238ab9b2d1516cad017c6e0236c468934582530c965deadbeef 239ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringMs1Video0[] = 240ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:2 cname:stream1\r\n" 241ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:2 msid:stream1 videotrack0\r\n"; 242ab9b2d1516cad017c6e0236c468934582530c965deadbeef 243ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringMs1Audio1[] = 244ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:3 cname:stream1\r\n" 245ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:3 msid:stream1 audiotrack1\r\n"; 246ab9b2d1516cad017c6e0236c468934582530c965deadbeef 247ab9b2d1516cad017c6e0236c468934582530c965deadbeefstatic const char kSdpStringMs1Video1[] = 248ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:4 cname:stream1\r\n" 249ab9b2d1516cad017c6e0236c468934582530c965deadbeef "a=ssrc:4 msid:stream1 videotrack1\r\n"; 250ab9b2d1516cad017c6e0236c468934582530c965deadbeef 25128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#define MAYBE_SKIP_TEST(feature) \ 25228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (!(feature())) { \ 25328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org LOG(LS_INFO) << "Feature disabled... skipping"; \ 25428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return; \ 25528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 25628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 257d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgusing rtc::scoped_ptr; 258d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgusing rtc::scoped_refptr; 25928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::AudioSourceInterface; 260ab9b2d1516cad017c6e0236c468934582530c965deadbeefusing webrtc::AudioTrack; 26128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::AudioTrackInterface; 26228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::DataBuffer; 26328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::DataChannelInterface; 26428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::FakeConstraints; 26528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::IceCandidateInterface; 266c80741f8957b537e968397ac54ff5b5df8a2c318deadbeefusing webrtc::MediaConstraintsInterface; 267ab9b2d1516cad017c6e0236c468934582530c965deadbeefusing webrtc::MediaStream; 26828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MediaStreamInterface; 26928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MediaStreamTrackInterface; 27028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MockCreateSessionDescriptionObserver; 27128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MockDataChannelObserver; 27228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MockSetSessionDescriptionObserver; 27328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::MockStatsObserver; 27428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::PeerConnectionInterface; 27528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::PeerConnectionObserver; 276ab9b2d1516cad017c6e0236c468934582530c965deadbeefusing webrtc::RtpReceiverInterface; 277ab9b2d1516cad017c6e0236c468934582530c965deadbeefusing webrtc::RtpSenderInterface; 27828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::SdpParseError; 27928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::SessionDescriptionInterface; 280ab9b2d1516cad017c6e0236c468934582530c965deadbeefusing webrtc::StreamCollection; 281ab9b2d1516cad017c6e0236c468934582530c965deadbeefusing webrtc::StreamCollectionInterface; 28228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::VideoSourceInterface; 283ab9b2d1516cad017c6e0236c468934582530c965deadbeefusing webrtc::VideoTrack; 28428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing webrtc::VideoTrackInterface; 28528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 286ab9b2d1516cad017c6e0236c468934582530c965deadbeeftypedef PeerConnectionInterface::RTCOfferAnswerOptions RTCOfferAnswerOptions; 287ab9b2d1516cad017c6e0236c468934582530c965deadbeef 28828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace { 28928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 29028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Gets the first ssrc of given content type from the ContentInfo. 29128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgbool GetFirstSsrc(const cricket::ContentInfo* content_info, int* ssrc) { 29228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (!content_info || !ssrc) { 29328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return false; 29428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 29528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const cricket::MediaContentDescription* media_desc = 29628654cbc2256230c978f41cbaf550bc2e9c2f2dbhenrike@webrtc.org static_cast<const cricket::MediaContentDescription*>( 29728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org content_info->description); 29828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (!media_desc || media_desc->streams().empty()) { 29928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return false; 30028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 30128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *ssrc = media_desc->streams().begin()->first_ssrc(); 30228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return true; 30328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 30428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 30528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgvoid SetSsrcToZero(std::string* sdp) { 30628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const char kSdpSsrcAtribute[] = "a=ssrc:"; 30728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const char kSdpSsrcAtributeZero[] = "a=ssrc:0"; 30828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org size_t ssrc_pos = 0; 30928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org while ((ssrc_pos = sdp->find(kSdpSsrcAtribute, ssrc_pos)) != 31028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string::npos) { 31128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org size_t end_ssrc = sdp->find(" ", ssrc_pos); 31228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp->replace(ssrc_pos, end_ssrc - ssrc_pos, kSdpSsrcAtributeZero); 31328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ssrc_pos = end_ssrc; 31428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 31528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 31628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 317ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Check if |streams| contains the specified track. 318ab9b2d1516cad017c6e0236c468934582530c965deadbeefbool ContainsTrack(const std::vector<cricket::StreamParams>& streams, 319ab9b2d1516cad017c6e0236c468934582530c965deadbeef const std::string& stream_label, 320ab9b2d1516cad017c6e0236c468934582530c965deadbeef const std::string& track_id) { 321ab9b2d1516cad017c6e0236c468934582530c965deadbeef for (const cricket::StreamParams& params : streams) { 322ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (params.sync_label == stream_label && params.id == track_id) { 323ab9b2d1516cad017c6e0236c468934582530c965deadbeef return true; 324ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 325ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 326ab9b2d1516cad017c6e0236c468934582530c965deadbeef return false; 327ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 328ab9b2d1516cad017c6e0236c468934582530c965deadbeef 329ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Check if |senders| contains the specified sender, by id. 330ab9b2d1516cad017c6e0236c468934582530c965deadbeefbool ContainsSender( 331ab9b2d1516cad017c6e0236c468934582530c965deadbeef const std::vector<rtc::scoped_refptr<RtpSenderInterface>>& senders, 332ab9b2d1516cad017c6e0236c468934582530c965deadbeef const std::string& id) { 333ab9b2d1516cad017c6e0236c468934582530c965deadbeef for (const auto& sender : senders) { 334ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (sender->id() == id) { 335ab9b2d1516cad017c6e0236c468934582530c965deadbeef return true; 336ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 337ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 338ab9b2d1516cad017c6e0236c468934582530c965deadbeef return false; 339ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 340ab9b2d1516cad017c6e0236c468934582530c965deadbeef 341ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Create a collection of streams. 342ab9b2d1516cad017c6e0236c468934582530c965deadbeef// CreateStreamCollection(1) creates a collection that 343ab9b2d1516cad017c6e0236c468934582530c965deadbeef// correspond to kSdpStringWithStream1. 344ab9b2d1516cad017c6e0236c468934582530c965deadbeef// CreateStreamCollection(2) correspond to kSdpStringWithStream1And2. 345ab9b2d1516cad017c6e0236c468934582530c965deadbeefrtc::scoped_refptr<StreamCollection> CreateStreamCollection( 346ab9b2d1516cad017c6e0236c468934582530c965deadbeef int number_of_streams) { 347ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<StreamCollection> local_collection( 348ab9b2d1516cad017c6e0236c468934582530c965deadbeef StreamCollection::Create()); 349ab9b2d1516cad017c6e0236c468934582530c965deadbeef 350ab9b2d1516cad017c6e0236c468934582530c965deadbeef for (int i = 0; i < number_of_streams; ++i) { 351ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<webrtc::MediaStreamInterface> stream( 352ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::MediaStream::Create(kStreams[i])); 353ab9b2d1516cad017c6e0236c468934582530c965deadbeef 354ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Add a local audio track. 355ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track( 356ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::AudioTrack::Create(kAudioTracks[i], nullptr)); 357ab9b2d1516cad017c6e0236c468934582530c965deadbeef stream->AddTrack(audio_track); 358ab9b2d1516cad017c6e0236c468934582530c965deadbeef 359ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Add a local video track. 360ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track( 361ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::VideoTrack::Create(kVideoTracks[i], nullptr)); 362ab9b2d1516cad017c6e0236c468934582530c965deadbeef stream->AddTrack(video_track); 363ab9b2d1516cad017c6e0236c468934582530c965deadbeef 364ab9b2d1516cad017c6e0236c468934582530c965deadbeef local_collection->AddStream(stream); 365ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 366ab9b2d1516cad017c6e0236c468934582530c965deadbeef return local_collection; 367ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 368ab9b2d1516cad017c6e0236c468934582530c965deadbeef 369ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Check equality of StreamCollections. 370ab9b2d1516cad017c6e0236c468934582530c965deadbeefbool CompareStreamCollections(StreamCollectionInterface* s1, 371ab9b2d1516cad017c6e0236c468934582530c965deadbeef StreamCollectionInterface* s2) { 372ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (s1 == nullptr || s2 == nullptr || s1->count() != s2->count()) { 373ab9b2d1516cad017c6e0236c468934582530c965deadbeef return false; 374ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 375ab9b2d1516cad017c6e0236c468934582530c965deadbeef 376ab9b2d1516cad017c6e0236c468934582530c965deadbeef for (size_t i = 0; i != s1->count(); ++i) { 377ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (s1->at(i)->label() != s2->at(i)->label()) { 378ab9b2d1516cad017c6e0236c468934582530c965deadbeef return false; 379ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 380ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::AudioTrackVector audio_tracks1 = s1->at(i)->GetAudioTracks(); 381ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::AudioTrackVector audio_tracks2 = s2->at(i)->GetAudioTracks(); 382ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::VideoTrackVector video_tracks1 = s1->at(i)->GetVideoTracks(); 383ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::VideoTrackVector video_tracks2 = s2->at(i)->GetVideoTracks(); 384ab9b2d1516cad017c6e0236c468934582530c965deadbeef 385ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (audio_tracks1.size() != audio_tracks2.size()) { 386ab9b2d1516cad017c6e0236c468934582530c965deadbeef return false; 387ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 388ab9b2d1516cad017c6e0236c468934582530c965deadbeef for (size_t j = 0; j != audio_tracks1.size(); ++j) { 389ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (audio_tracks1[j]->id() != audio_tracks2[j]->id()) { 390ab9b2d1516cad017c6e0236c468934582530c965deadbeef return false; 391ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 392ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 393ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (video_tracks1.size() != video_tracks2.size()) { 394ab9b2d1516cad017c6e0236c468934582530c965deadbeef return false; 395ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 396ab9b2d1516cad017c6e0236c468934582530c965deadbeef for (size_t j = 0; j != video_tracks1.size(); ++j) { 397ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (video_tracks1[j]->id() != video_tracks2[j]->id()) { 398ab9b2d1516cad017c6e0236c468934582530c965deadbeef return false; 399ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 400ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 401ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 402ab9b2d1516cad017c6e0236c468934582530c965deadbeef return true; 403ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 404ab9b2d1516cad017c6e0236c468934582530c965deadbeef 40528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockPeerConnectionObserver : public PeerConnectionObserver { 40628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 407ab9b2d1516cad017c6e0236c468934582530c965deadbeef MockPeerConnectionObserver() : remote_streams_(StreamCollection::Create()) {} 40828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ~MockPeerConnectionObserver() { 40928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 41028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void SetPeerConnectionInterface(PeerConnectionInterface* pc) { 41128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_ = pc; 41228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (pc) { 41328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org state_ = pc_->signaling_state(); 41428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 41528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 41628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnSignalingChange( 41728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::SignalingState new_state) { 41828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(pc_->signaling_state(), new_state); 41928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org state_ = new_state; 42028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 42128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // TODO(bemasc): Remove this once callers transition to OnIceGatheringChange. 42228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnStateChange(StateType state_changed) { 42328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (pc_.get() == NULL) 42428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return; 42528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org switch (state_changed) { 42628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org case kSignalingState: 42728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // OnSignalingChange and OnStateChange(kSignalingState) should always 42828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // be called approximately simultaneously. To ease testing, we require 42928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // that they always be called in that order. This check verifies 43028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // that OnSignalingChange has just been called. 43128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(pc_->signaling_state(), state_); 43228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org break; 43328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org case kIceState: 43428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ADD_FAILURE(); 43528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org break; 43628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org default: 43728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ADD_FAILURE(); 43828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org break; 43928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 44028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 441ab9b2d1516cad017c6e0236c468934582530c965deadbeef 442ab9b2d1516cad017c6e0236c468934582530c965deadbeef MediaStreamInterface* RemoteStream(const std::string& label) { 443ab9b2d1516cad017c6e0236c468934582530c965deadbeef return remote_streams_->find(label); 444ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 445ab9b2d1516cad017c6e0236c468934582530c965deadbeef StreamCollectionInterface* remote_streams() const { return remote_streams_; } 44628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnAddStream(MediaStreamInterface* stream) { 44728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org last_added_stream_ = stream; 448ab9b2d1516cad017c6e0236c468934582530c965deadbeef remote_streams_->AddStream(stream); 44928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 45028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnRemoveStream(MediaStreamInterface* stream) { 45128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org last_removed_stream_ = stream; 452ab9b2d1516cad017c6e0236c468934582530c965deadbeef remote_streams_->RemoveStream(stream); 45328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 45428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnRenegotiationNeeded() { 45528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org renegotiation_needed_ = true; 45628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 45728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnDataChannel(DataChannelInterface* data_channel) { 45828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org last_datachannel_ = data_channel; 45928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 46028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 46128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnIceConnectionChange( 46228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::IceConnectionState new_state) { 46328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(pc_->ice_connection_state(), new_state); 46428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 46528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnIceGatheringChange( 46628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::IceGatheringState new_state) { 46728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(pc_->ice_gathering_state(), new_state); 46828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 46928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) { 47028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, 47128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->ice_gathering_state()); 47228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 47328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 47428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(candidate->ToString(&sdp)); 47528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_LT(0u, sdp.size()); 47628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org last_candidate_.reset(webrtc::CreateIceCandidate(candidate->sdp_mid(), 47728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org candidate->sdp_mline_index(), sdp, NULL)); 47828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(last_candidate_.get() != NULL); 47928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 48028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // TODO(bemasc): Remove this once callers transition to OnSignalingChange. 48128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnIceComplete() { 48228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ice_complete_ = true; 48328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // OnIceGatheringChange(IceGatheringCompleted) and OnIceComplete() should 48428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // be called approximately simultaneously. For ease of testing, this 48528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // check additionally requires that they be called in the above order. 48628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringComplete, 48728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->ice_gathering_state()); 48828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 48928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 49028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Returns the label of the last added stream. 49128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Empty string if no stream have been added. 49228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string GetLastAddedStreamLabel() { 49328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (last_added_stream_.get()) 49428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return last_added_stream_->label(); 49528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ""; 49628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 49728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string GetLastRemovedStreamLabel() { 49828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (last_removed_stream_.get()) 49928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return last_removed_stream_->label(); 50028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ""; 50128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 50228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 50328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<PeerConnectionInterface> pc_; 50428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::SignalingState state_; 50528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_ptr<IceCandidateInterface> last_candidate_; 50628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> last_datachannel_; 507ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<StreamCollection> remote_streams_; 508ab9b2d1516cad017c6e0236c468934582530c965deadbeef bool renegotiation_needed_ = false; 509ab9b2d1516cad017c6e0236c468934582530c965deadbeef bool ice_complete_ = false; 51028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 51128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org private: 51228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> last_added_stream_; 51328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> last_removed_stream_; 51428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 51528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 51628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace 517ab9b2d1516cad017c6e0236c468934582530c965deadbeef 51828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass PeerConnectionInterfaceTest : public testing::Test { 51928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 52037ebcf0ce5ad1685bcf659ea75960beb96019647phoglund PeerConnectionInterfaceTest() { 52137ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#ifdef WEBRTC_ANDROID 52237ebcf0ce5ad1685bcf659ea75960beb96019647phoglund webrtc::InitializeAndroidObjects(); 52337ebcf0ce5ad1685bcf659ea75960beb96019647phoglund#endif 52437ebcf0ce5ad1685bcf659ea75960beb96019647phoglund } 52537ebcf0ce5ad1685bcf659ea75960beb96019647phoglund 52628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void SetUp() { 52728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_ = webrtc::CreatePeerConnectionFactory( 528d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::Current(), rtc::Thread::Current(), NULL, NULL, 52928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org NULL); 53028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_factory_.get() != NULL); 53128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 53228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 53328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreatePeerConnection() { 53428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection("", "", NULL); 53528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 53628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 53728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreatePeerConnection(webrtc::MediaConstraintsInterface* constraints) { 53828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection("", "", constraints); 53928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 54028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 54128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreatePeerConnection(const std::string& uri, 54228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& password, 54328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::MediaConstraintsInterface* constraints) { 5440c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter PeerConnectionInterface::RTCConfiguration config; 54528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PeerConnectionInterface::IceServer server; 5460a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef if (!uri.empty()) { 5470a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef server.uri = uri; 5480a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef server.password = password; 5490c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter config.servers.push_back(server); 5500a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef } 55128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5520c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter rtc::scoped_ptr<cricket::FakePortAllocator> port_allocator( 5530c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr)); 5540c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter port_allocator_ = port_allocator.get(); 555a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org 55661c1b8ea32d1801384151286ad8bd4eeccacf34bbuildbot@webrtc.org // DTLS does not work in a loopback call, so is disabled for most of the 55761c1b8ea32d1801384151286ad8bd4eeccacf34bbuildbot@webrtc.org // tests in this file. We only create a FakeIdentityService if the test 55861c1b8ea32d1801384151286ad8bd4eeccacf34bbuildbot@webrtc.org // explicitly sets the constraint. 55961e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org FakeConstraints default_constraints; 56061e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org if (!constraints) { 56161e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org constraints = &default_constraints; 56261e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org 56361e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org default_constraints.AddMandatory( 56461e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, false); 56561e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org } 56661e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org 5675e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström scoped_ptr<webrtc::DtlsIdentityStoreInterface> dtls_identity_store; 568a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org bool dtls; 569a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org if (FindConstraint(constraints, 570a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 571a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org &dtls, 5725e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström nullptr) && dtls) { 5735e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström dtls_identity_store.reset(new FakeDtlsIdentityStore()); 574a576faf82a692c9422dcdc3278394ed25e6ee4f7jiayl@webrtc.org } 5750eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg pc_ = pc_factory_->CreatePeerConnection( 5760c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter config, constraints, std::move(port_allocator), 5770eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg std::move(dtls_identity_store), &observer_); 57828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_.get() != NULL); 57928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org observer_.SetPeerConnectionInterface(pc_.get()); 58028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 58128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 58228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5830a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef void CreatePeerConnectionExpectFail(const std::string& uri) { 5840c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter PeerConnectionInterface::RTCConfiguration config; 5850a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef PeerConnectionInterface::IceServer server; 5860a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef server.uri = uri; 5870c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter config.servers.push_back(server); 5880a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef 5890a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef scoped_refptr<PeerConnectionInterface> pc; 5900c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter pc = pc_factory_->CreatePeerConnection(config, nullptr, nullptr, nullptr, 5910c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter &observer_); 5920c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(nullptr, pc); 5930a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef } 5940a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef 59528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreatePeerConnectionWithDifferentConfigurations() { 59628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(kStunAddressOnly, "", NULL); 5970c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(1u, port_allocator_->stun_servers().size()); 5980c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(0u, port_allocator_->turn_servers().size()); 5990c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ("address", port_allocator_->stun_servers().begin()->hostname()); 60028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kDefaultStunPort, 6010c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter port_allocator_->stun_servers().begin()->port()); 60228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6030a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef CreatePeerConnectionExpectFail(kStunInvalidPort); 6040a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef CreatePeerConnectionExpectFail(kStunAddressPortAndMore1); 6050a6c4ca942f3a25c15c7af64a9515d381c34cd9cdeadbeef CreatePeerConnectionExpectFail(kStunAddressPortAndMore2); 60628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 60728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(kTurnIceServerUri, kTurnPassword, NULL); 6080c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(0u, port_allocator_->stun_servers().size()); 6090c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(1u, port_allocator_->turn_servers().size()); 61028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTurnUsername, 6110c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter port_allocator_->turn_servers()[0].credentials.username); 61228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTurnPassword, 6130c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter port_allocator_->turn_servers()[0].credentials.password); 61428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTurnHostname, 6150c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter port_allocator_->turn_servers()[0].ports[0].address.hostname()); 61628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 61728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 61828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void ReleasePeerConnection() { 61928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_ = NULL; 62028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org observer_.SetPeerConnectionInterface(NULL); 62128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 62228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 623ab9b2d1516cad017c6e0236c468934582530c965deadbeef void AddVideoStream(const std::string& label) { 62428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream. 62528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 62628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(label)); 62728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<VideoSourceInterface> video_source( 62828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateVideoSource(new cricket::FakeVideoCapturer(), NULL)); 62928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<VideoTrackInterface> video_track( 63028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateVideoTrack(label + "v0", video_source)); 63128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(video_track.get()); 632c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.org EXPECT_TRUE(pc_->AddStream(stream)); 63328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout); 63428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org observer_.renegotiation_needed_ = false; 63528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 63628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 63728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void AddVoiceStream(const std::string& label) { 63828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream. 63928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 64028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(label)); 64128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<AudioTrackInterface> audio_track( 64228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateAudioTrack(label + "a0", NULL)); 64328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(audio_track.get()); 644c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.org EXPECT_TRUE(pc_->AddStream(stream)); 64528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout); 64628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org observer_.renegotiation_needed_ = false; 64728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 64828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 64928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void AddAudioVideoStream(const std::string& stream_label, 65028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& audio_track_label, 65128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& video_track_label) { 65228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream. 65328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 65428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(stream_label)); 65528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<AudioTrackInterface> audio_track( 65628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateAudioTrack( 65728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org audio_track_label, static_cast<AudioSourceInterface*>(NULL))); 65828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(audio_track.get()); 65928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<VideoTrackInterface> video_track( 66028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateVideoTrack(video_track_label, NULL)); 66128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(video_track.get()); 662c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.org EXPECT_TRUE(pc_->AddStream(stream)); 66328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout); 66428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org observer_.renegotiation_needed_ = false; 66528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 66628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 667c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef bool DoCreateOfferAnswer(SessionDescriptionInterface** desc, 668c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef bool offer, 669c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef MediaConstraintsInterface* constraints) { 670d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<MockCreateSessionDescriptionObserver> 671d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org observer(new rtc::RefCountedObject< 67228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockCreateSessionDescriptionObserver>()); 67328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (offer) { 674c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef pc_->CreateOffer(observer, constraints); 67528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } else { 676c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef pc_->CreateAnswer(observer, constraints); 67728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 67828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(true, observer->called(), kTimeout); 67928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *desc = observer->release_desc(); 68028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return observer->result(); 68128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 68228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 683c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef bool DoCreateOffer(SessionDescriptionInterface** desc, 684c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef MediaConstraintsInterface* constraints) { 685c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef return DoCreateOfferAnswer(desc, true, constraints); 68628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 68728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 688c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef bool DoCreateAnswer(SessionDescriptionInterface** desc, 689c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef MediaConstraintsInterface* constraints) { 690c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef return DoCreateOfferAnswer(desc, false, constraints); 69128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 69228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 69328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool DoSetSessionDescription(SessionDescriptionInterface* desc, bool local) { 694d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<MockSetSessionDescriptionObserver> 695d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org observer(new rtc::RefCountedObject< 69628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockSetSessionDescriptionObserver>()); 69728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (local) { 69828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->SetLocalDescription(observer, desc); 69928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } else { 70028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->SetRemoteDescription(observer, desc); 70128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 70228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(true, observer->called(), kTimeout); 70328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return observer->result(); 70428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 70528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 70628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool DoSetLocalDescription(SessionDescriptionInterface* desc) { 70728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return DoSetSessionDescription(desc, true); 70828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 70928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 71028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool DoSetRemoteDescription(SessionDescriptionInterface* desc) { 71128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return DoSetSessionDescription(desc, false); 71228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 71328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 71428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Calls PeerConnection::GetStats and check the return value. 71528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // It does not verify the values in the StatReports since a RTCP packet might 71628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // be required. 71728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool DoGetStats(MediaStreamTrackInterface* track) { 718d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<MockStatsObserver> observer( 719d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<MockStatsObserver>()); 720db41b4dbcdeb9a3b71b8de274db8654f3e51c99cjiayl@webrtc.org if (!pc_->GetStats( 721db41b4dbcdeb9a3b71b8de274db8654f3e51c99cjiayl@webrtc.org observer, track, PeerConnectionInterface::kStatsOutputLevelStandard)) 72228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return false; 72328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer->called(), kTimeout); 72428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return observer->called(); 72528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 72628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 72728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void InitiateCall() { 72828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 72928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream with audio&video tracks. 73028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 73128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 73228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 73328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 73428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verify that RTP Header extensions has been negotiated for audio and video. 73528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void VerifyRemoteRtpHeaderExtensions() { 73628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const cricket::MediaContentDescription* desc = 73728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::GetFirstAudioContentDescription( 73828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->remote_description()->description()); 73928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 74028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_GT(desc->rtp_header_extensions().size(), 0u); 74128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 74228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org desc = cricket::GetFirstVideoContentDescription( 74328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->remote_description()->description()); 74428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(desc != NULL); 74528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_GT(desc->rtp_header_extensions().size(), 0u); 74628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 74728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 74828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreateOfferAsRemoteDescription() { 749d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer; 750c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateOffer(offer.use(), nullptr)); 75128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 75228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(offer->ToString(&sdp)); 75328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* remote_offer = 75428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 75528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 75628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(remote_offer)); 75728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveRemoteOffer, observer_.state_); 75828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 75928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 760ab9b2d1516cad017c6e0236c468934582530c965deadbeef void CreateAndSetRemoteOffer(const std::string& sdp) { 761ab9b2d1516cad017c6e0236c468934582530c965deadbeef SessionDescriptionInterface* remote_offer = 762ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 763ab9b2d1516cad017c6e0236c468934582530c965deadbeef sdp, nullptr); 764ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetRemoteDescription(remote_offer)); 765ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(PeerConnectionInterface::kHaveRemoteOffer, observer_.state_); 766ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 767ab9b2d1516cad017c6e0236c468934582530c965deadbeef 76828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreateAnswerAsLocalDescription() { 76928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> answer; 770c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateAnswer(answer.use(), nullptr)); 77128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 77228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // TODO(perkj): Currently SetLocalDescription fails if any parameters in an 77328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // audio codec change, even if the parameter has nothing to do with 77428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // receiving. Not all parameters are serialized to SDP. 77528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Since CreatePrAnswerAsLocalDescription serialize/deserialize 77628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // the SessionDescription, it is necessary to do that here to in order to 77728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // get ReceiveOfferCreatePrAnswerAndAnswer and RenegotiateAudioOnly to pass. 77828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // https://code.google.com/p/webrtc/issues/detail?id=1356 77928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 78028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 78128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* new_answer = 78228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer, 78328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 78428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(new_answer)); 78528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 78628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 78728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 78828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreatePrAnswerAsLocalDescription() { 78928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> answer; 790c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateAnswer(answer.use(), nullptr)); 79128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 79228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 79328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(answer->ToString(&sdp)); 79428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* pr_answer = 79528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kPrAnswer, 79628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 79728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(pr_answer)); 79828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveLocalPrAnswer, observer_.state_); 79928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 80028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 80128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreateOfferReceiveAnswer() { 80228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 80328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 80428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 80528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsRemoteDescription(sdp); 80628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 80728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 80828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreateOfferAsLocalDescription() { 809d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer; 810c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateOffer(offer.use(), nullptr)); 81128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // TODO(perkj): Currently SetLocalDescription fails if any parameters in an 81228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // audio codec change, even if the parameter has nothing to do with 81328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // receiving. Not all parameters are serialized to SDP. 81428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Since CreatePrAnswerAsLocalDescription serialize/deserialize 81528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // the SessionDescription, it is necessary to do that here to in order to 81628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // get ReceiveOfferCreatePrAnswerAndAnswer and RenegotiateAudioOnly to pass. 81728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // https://code.google.com/p/webrtc/issues/detail?id=1356 81828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 81928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(offer->ToString(&sdp)); 82028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* new_offer = 82128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription( 82228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface::kOffer, 82328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 82428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 82528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(new_offer)); 82628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveLocalOffer, observer_.state_); 82768cbd012160535d2a8bb6453961b7eb066902b76mallinath@webrtc.org // Wait for the ice_complete message, so that SDP will have candidates. 82868cbd012160535d2a8bb6453961b7eb066902b76mallinath@webrtc.org EXPECT_TRUE_WAIT(observer_.ice_complete_, kTimeout); 82928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 83028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 831ab9b2d1516cad017c6e0236c468934582530c965deadbeef void CreateAnswerAsRemoteDescription(const std::string& sdp) { 83228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::JsepSessionDescription* answer = new webrtc::JsepSessionDescription( 83328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface::kAnswer); 834ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(answer->Initialize(sdp, NULL)); 83528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(answer)); 83628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 83728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 83828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 839ab9b2d1516cad017c6e0236c468934582530c965deadbeef void CreatePrAnswerAndAnswerAsRemoteDescription(const std::string& sdp) { 84028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::JsepSessionDescription* pr_answer = 84128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new webrtc::JsepSessionDescription( 84228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface::kPrAnswer); 843ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(pr_answer->Initialize(sdp, NULL)); 84428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(pr_answer)); 84528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kHaveRemotePrAnswer, observer_.state_); 84628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::JsepSessionDescription* answer = 84728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new webrtc::JsepSessionDescription( 84828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface::kAnswer); 849ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(answer->Initialize(sdp, NULL)); 85028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(answer)); 85128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_); 85228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 85328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 85428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Help function used for waiting until a the last signaled remote stream has 85528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // the same label as |stream_label|. In a few of the tests in this file we 85628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // answer with the same session description as we offer and thus we can 85728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // check if OnAddStream have been called with the same stream as we offer to 85828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // send. 85928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void WaitAndVerifyOnAddStream(const std::string& stream_label) { 86028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(stream_label, observer_.GetLastAddedStreamLabel(), kTimeout); 86128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 86228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 86328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Creates an offer and applies it as a local session description. 86428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Creates an answer with the same SDP an the offer but removes all lines 86528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // that start with a:ssrc" 86628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void CreateOfferReceiveAnswerWithoutSsrc() { 86728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 86828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 86928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 87028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SetSsrcToZero(&sdp); 87128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsRemoteDescription(sdp); 87228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 87328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 874ab9b2d1516cad017c6e0236c468934582530c965deadbeef // This function creates a MediaStream with label kStreams[0] and 875ab9b2d1516cad017c6e0236c468934582530c965deadbeef // |number_of_audio_tracks| and |number_of_video_tracks| tracks and the 876ab9b2d1516cad017c6e0236c468934582530c965deadbeef // corresponding SessionDescriptionInterface. The SessionDescriptionInterface 877ab9b2d1516cad017c6e0236c468934582530c965deadbeef // is returned in |desc| and the MediaStream is stored in 878ab9b2d1516cad017c6e0236c468934582530c965deadbeef // |reference_collection_| 879ab9b2d1516cad017c6e0236c468934582530c965deadbeef void CreateSessionDescriptionAndReference( 880ab9b2d1516cad017c6e0236c468934582530c965deadbeef size_t number_of_audio_tracks, 881ab9b2d1516cad017c6e0236c468934582530c965deadbeef size_t number_of_video_tracks, 882ab9b2d1516cad017c6e0236c468934582530c965deadbeef SessionDescriptionInterface** desc) { 883ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_TRUE(desc != nullptr); 884ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_LE(number_of_audio_tracks, 2u); 885ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_LE(number_of_video_tracks, 2u); 886ab9b2d1516cad017c6e0236c468934582530c965deadbeef 887ab9b2d1516cad017c6e0236c468934582530c965deadbeef reference_collection_ = StreamCollection::Create(); 888ab9b2d1516cad017c6e0236c468934582530c965deadbeef std::string sdp_ms1 = std::string(kSdpStringInit); 889ab9b2d1516cad017c6e0236c468934582530c965deadbeef 890ab9b2d1516cad017c6e0236c468934582530c965deadbeef std::string mediastream_label = kStreams[0]; 891ab9b2d1516cad017c6e0236c468934582530c965deadbeef 892ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<webrtc::MediaStreamInterface> stream( 893ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::MediaStream::Create(mediastream_label)); 894ab9b2d1516cad017c6e0236c468934582530c965deadbeef reference_collection_->AddStream(stream); 895ab9b2d1516cad017c6e0236c468934582530c965deadbeef 896ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (number_of_audio_tracks > 0) { 897ab9b2d1516cad017c6e0236c468934582530c965deadbeef sdp_ms1 += std::string(kSdpStringAudio); 898ab9b2d1516cad017c6e0236c468934582530c965deadbeef sdp_ms1 += std::string(kSdpStringMs1Audio0); 899ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddAudioTrack(kAudioTracks[0], stream); 900ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 901ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (number_of_audio_tracks > 1) { 902ab9b2d1516cad017c6e0236c468934582530c965deadbeef sdp_ms1 += kSdpStringMs1Audio1; 903ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddAudioTrack(kAudioTracks[1], stream); 904ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 905ab9b2d1516cad017c6e0236c468934582530c965deadbeef 906ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (number_of_video_tracks > 0) { 907ab9b2d1516cad017c6e0236c468934582530c965deadbeef sdp_ms1 += std::string(kSdpStringVideo); 908ab9b2d1516cad017c6e0236c468934582530c965deadbeef sdp_ms1 += std::string(kSdpStringMs1Video0); 909ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddVideoTrack(kVideoTracks[0], stream); 910ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 911ab9b2d1516cad017c6e0236c468934582530c965deadbeef if (number_of_video_tracks > 1) { 912ab9b2d1516cad017c6e0236c468934582530c965deadbeef sdp_ms1 += kSdpStringMs1Video1; 913ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddVideoTrack(kVideoTracks[1], stream); 914ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 915ab9b2d1516cad017c6e0236c468934582530c965deadbeef 916ab9b2d1516cad017c6e0236c468934582530c965deadbeef *desc = webrtc::CreateSessionDescription( 917ab9b2d1516cad017c6e0236c468934582530c965deadbeef SessionDescriptionInterface::kOffer, sdp_ms1, nullptr); 918ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 919ab9b2d1516cad017c6e0236c468934582530c965deadbeef 920ab9b2d1516cad017c6e0236c468934582530c965deadbeef void AddAudioTrack(const std::string& track_id, 921ab9b2d1516cad017c6e0236c468934582530c965deadbeef MediaStreamInterface* stream) { 922ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track( 923ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::AudioTrack::Create(track_id, nullptr)); 924ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_TRUE(stream->AddTrack(audio_track)); 925ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 926ab9b2d1516cad017c6e0236c468934582530c965deadbeef 927ab9b2d1516cad017c6e0236c468934582530c965deadbeef void AddVideoTrack(const std::string& track_id, 928ab9b2d1516cad017c6e0236c468934582530c965deadbeef MediaStreamInterface* stream) { 929ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track( 930ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::VideoTrack::Create(track_id, nullptr)); 931ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_TRUE(stream->AddTrack(video_track)); 932ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 933ab9b2d1516cad017c6e0236c468934582530c965deadbeef 9340c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter cricket::FakePortAllocator* port_allocator_ = nullptr; 93528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_; 93628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<PeerConnectionInterface> pc_; 93728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockPeerConnectionObserver observer_; 938ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<StreamCollection> reference_collection_; 93928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 94028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 94128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, 94228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnectionWithDifferentConfigurations) { 94328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnectionWithDifferentConfigurations(); 94428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 94528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 94628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, AddStreams) { 94728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 948ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddVideoStream(kStreamLabel1); 94928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddVoiceStream(kStreamLabel2); 95028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(2u, pc_->local_streams()->count()); 95128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9529dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org // Test we can add multiple local streams to one peerconnection. 95328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream( 95428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateLocalMediaStream(kStreamLabel3)); 95528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<AudioTrackInterface> audio_track( 95628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateAudioTrack( 95728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org kStreamLabel3, static_cast<AudioSourceInterface*>(NULL))); 95828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(audio_track.get()); 959c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.org EXPECT_TRUE(pc_->AddStream(stream)); 9609dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org EXPECT_EQ(3u, pc_->local_streams()->count()); 9619dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org 9629dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org // Remove the third stream. 9639dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(2)); 9649dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org EXPECT_EQ(2u, pc_->local_streams()->count()); 96528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9669dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org // Remove the second stream. 96728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(1)); 9689dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org EXPECT_EQ(1u, pc_->local_streams()->count()); 96928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9709dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org // Remove the first stream. 9719dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 9729dba52562725dbaced0d671982201ede753d72e8wu@webrtc.org EXPECT_EQ(0u, pc_->local_streams()->count()); 97328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 97428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 975ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Test that the created offer includes streams we added. 976ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, AddedStreamsPresentInOffer) { 977ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(); 978ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddAudioVideoStream(kStreamLabel1, "audio_track", "video_track"); 979ab9b2d1516cad017c6e0236c468934582530c965deadbeef scoped_ptr<SessionDescriptionInterface> offer; 980c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateOffer(offer.accept(), nullptr)); 981ab9b2d1516cad017c6e0236c468934582530c965deadbeef 982ab9b2d1516cad017c6e0236c468934582530c965deadbeef const cricket::ContentInfo* audio_content = 983ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::GetFirstAudioContent(offer->description()); 984ab9b2d1516cad017c6e0236c468934582530c965deadbeef const cricket::AudioContentDescription* audio_desc = 985ab9b2d1516cad017c6e0236c468934582530c965deadbeef static_cast<const cricket::AudioContentDescription*>( 986ab9b2d1516cad017c6e0236c468934582530c965deadbeef audio_content->description); 987ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE( 988ab9b2d1516cad017c6e0236c468934582530c965deadbeef ContainsTrack(audio_desc->streams(), kStreamLabel1, "audio_track")); 989ab9b2d1516cad017c6e0236c468934582530c965deadbeef 990ab9b2d1516cad017c6e0236c468934582530c965deadbeef const cricket::ContentInfo* video_content = 991ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::GetFirstVideoContent(offer->description()); 992ab9b2d1516cad017c6e0236c468934582530c965deadbeef const cricket::VideoContentDescription* video_desc = 993ab9b2d1516cad017c6e0236c468934582530c965deadbeef static_cast<const cricket::VideoContentDescription*>( 994ab9b2d1516cad017c6e0236c468934582530c965deadbeef video_content->description); 995ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE( 996ab9b2d1516cad017c6e0236c468934582530c965deadbeef ContainsTrack(video_desc->streams(), kStreamLabel1, "video_track")); 997ab9b2d1516cad017c6e0236c468934582530c965deadbeef 998ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Add another stream and ensure the offer includes both the old and new 999ab9b2d1516cad017c6e0236c468934582530c965deadbeef // streams. 1000ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddAudioVideoStream(kStreamLabel2, "audio_track2", "video_track2"); 1001c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateOffer(offer.accept(), nullptr)); 1002ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1003ab9b2d1516cad017c6e0236c468934582530c965deadbeef audio_content = cricket::GetFirstAudioContent(offer->description()); 1004ab9b2d1516cad017c6e0236c468934582530c965deadbeef audio_desc = static_cast<const cricket::AudioContentDescription*>( 1005ab9b2d1516cad017c6e0236c468934582530c965deadbeef audio_content->description); 1006ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE( 1007ab9b2d1516cad017c6e0236c468934582530c965deadbeef ContainsTrack(audio_desc->streams(), kStreamLabel1, "audio_track")); 1008ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE( 1009ab9b2d1516cad017c6e0236c468934582530c965deadbeef ContainsTrack(audio_desc->streams(), kStreamLabel2, "audio_track2")); 1010ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1011ab9b2d1516cad017c6e0236c468934582530c965deadbeef video_content = cricket::GetFirstVideoContent(offer->description()); 1012ab9b2d1516cad017c6e0236c468934582530c965deadbeef video_desc = static_cast<const cricket::VideoContentDescription*>( 1013ab9b2d1516cad017c6e0236c468934582530c965deadbeef video_content->description); 1014ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE( 1015ab9b2d1516cad017c6e0236c468934582530c965deadbeef ContainsTrack(video_desc->streams(), kStreamLabel1, "video_track")); 1016ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE( 1017ab9b2d1516cad017c6e0236c468934582530c965deadbeef ContainsTrack(video_desc->streams(), kStreamLabel2, "video_track2")); 1018ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 1019ab9b2d1516cad017c6e0236c468934582530c965deadbeef 102028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, RemoveStream) { 102128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 1022ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddVideoStream(kStreamLabel1); 102328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->local_streams()->count()); 102428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 102528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, pc_->local_streams()->count()); 102628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 102728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 102828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateOfferReceiveAnswer) { 102928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 103028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 103128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org VerifyRemoteRtpHeaderExtensions(); 103228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 103328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 103428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateOfferReceivePrAnswerAndAnswer) { 103528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 1036ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddVideoStream(kStreamLabel1); 103728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 103828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string offer; 103928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&offer)); 104028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePrAnswerAndAnswerAsRemoteDescription(offer); 104128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 104228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 104328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 104428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, ReceiveOfferCreateAnswer) { 104528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 1046ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddVideoStream(kStreamLabel1); 104728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 104828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsRemoteDescription(); 104928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 105028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 105128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 105228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 105328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 105428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, ReceiveOfferCreatePrAnswerAndAnswer) { 105528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 1056ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddVideoStream(kStreamLabel1); 105728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 105828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsRemoteDescription(); 105928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePrAnswerAsLocalDescription(); 106028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 106128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 106228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org WaitAndVerifyOnAddStream(kStreamLabel1); 106328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 106428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 106528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, Renegotiate) { 106628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 106728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->remote_streams()->count()); 106828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 106928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 107028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, pc_->remote_streams()->count()); 1071ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddVideoStream(kStreamLabel1); 107228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 107328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 107428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 107528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Tests that after negotiating an audio only call, the respondent can perform a 107628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// renegotiation that removes the audio stream. 107728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, RenegotiateAudioOnly) { 107828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 107928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddVoiceStream(kStreamLabel1); 108028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsRemoteDescription(); 108128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 108228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 108328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->remote_streams()->count()); 108428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 108528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 108628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(0u, pc_->remote_streams()->count()); 108728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 108828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 108928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that candidates are generated and that we can parse our own candidates. 109028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, IceCandidates) { 109128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 109228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 109328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(pc_->AddIceCandidate(observer_.last_candidate_.get())); 109428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // SetRemoteDescription takes ownership of offer. 109528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* offer = NULL; 1096ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddVideoStream(kStreamLabel1); 1097c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(DoCreateOffer(&offer, nullptr)); 109828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(offer)); 109928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 110028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // SetLocalDescription takes ownership of answer. 110128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* answer = NULL; 1102c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(DoCreateAnswer(&answer, nullptr)); 110328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetLocalDescription(answer)); 110428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 110528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.last_candidate_.get() != NULL, kTimeout); 110628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer_.ice_complete_, kTimeout); 110728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 110828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->AddIceCandidate(observer_.last_candidate_.get())); 110928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 111028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1111ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Test that CreateOffer and CreateAnswer will fail if the track labels are 111228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// not unique. 111328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateOfferAnswerWithInvalidStream) { 111428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 111528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a regular offer for the CreateAnswer test later. 111628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* offer = NULL; 1117c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(DoCreateOffer(&offer, nullptr)); 111828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(offer != NULL); 111928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org delete offer; 112028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org offer = NULL; 112128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 112228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream with audio&video tracks having same label. 112328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "track_label", "track_label"); 112428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 112528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Test CreateOffer 1126c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_FALSE(DoCreateOffer(&offer, nullptr)); 112728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 112828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Test CreateAnswer 112928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* answer = NULL; 1130c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_FALSE(DoCreateAnswer(&answer, nullptr)); 113128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 113228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 113328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we will get different SSRCs for each tracks in the offer and answer 113428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// we created. 113528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, SsrcInOfferAnswer) { 113628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 113728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create a local stream with audio&video tracks having different labels. 113828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 113928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 114028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Test CreateOffer 114128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> offer; 1142c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateOffer(offer.use(), nullptr)); 114328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int audio_ssrc = 0; 114428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int video_ssrc = 0; 114528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstAudioContent(offer->description()), 114628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org &audio_ssrc)); 114728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstVideoContent(offer->description()), 114828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org &video_ssrc)); 114928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_NE(audio_ssrc, video_ssrc); 115028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 115128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Test CreateAnswer 115228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetRemoteDescription(offer.release())); 115328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_ptr<SessionDescriptionInterface> answer; 1154c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateAnswer(answer.use(), nullptr)); 115528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org audio_ssrc = 0; 115628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_ssrc = 0; 115728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstAudioContent(answer->description()), 115828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org &audio_ssrc)); 115928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(GetFirstSsrc(GetFirstVideoContent(answer->description()), 116028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org &video_ssrc)); 116128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_NE(audio_ssrc, video_ssrc); 116228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 116328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1164eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef// Test that it's possible to call AddTrack on a MediaStream after adding 1165eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef// the stream to a PeerConnection. 1166eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef// TODO(deadbeef): Remove this test once this behavior is no longer supported. 1167eb45981165f982dd51425fad5ecb7ea9619063d3deadbeefTEST_F(PeerConnectionInterfaceTest, AddTrackAfterAddStream) { 1168eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef CreatePeerConnection(); 1169eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef // Create audio stream and add to PeerConnection. 1170eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef AddVoiceStream(kStreamLabel1); 1171eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef MediaStreamInterface* stream = pc_->local_streams()->at(0); 1172eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef 1173eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef // Add video track to the audio-only stream. 1174eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef scoped_refptr<VideoTrackInterface> video_track( 1175eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef pc_factory_->CreateVideoTrack("video_label", nullptr)); 1176eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef stream->AddTrack(video_track.get()); 1177eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef 1178eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef scoped_ptr<SessionDescriptionInterface> offer; 1179eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef ASSERT_TRUE(DoCreateOffer(offer.use(), nullptr)); 1180eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef 1181eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef const cricket::MediaContentDescription* video_desc = 1182eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef cricket::GetFirstVideoContentDescription(offer->description()); 1183eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef EXPECT_TRUE(video_desc != nullptr); 1184eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef} 1185eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef 1186eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef// Test that it's possible to call RemoveTrack on a MediaStream after adding 1187eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef// the stream to a PeerConnection. 1188eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef// TODO(deadbeef): Remove this test once this behavior is no longer supported. 1189eb45981165f982dd51425fad5ecb7ea9619063d3deadbeefTEST_F(PeerConnectionInterfaceTest, RemoveTrackAfterAddStream) { 1190eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef CreatePeerConnection(); 1191eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef // Create audio/video stream and add to PeerConnection. 1192eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 1193eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef MediaStreamInterface* stream = pc_->local_streams()->at(0); 1194eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef 1195eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef // Remove the video track. 1196eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef stream->RemoveTrack(stream->GetVideoTracks()[0]); 1197eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef 1198eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef scoped_ptr<SessionDescriptionInterface> offer; 1199eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef ASSERT_TRUE(DoCreateOffer(offer.use(), nullptr)); 1200eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef 1201eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef const cricket::MediaContentDescription* video_desc = 1202eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef cricket::GetFirstVideoContentDescription(offer->description()); 1203eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef EXPECT_TRUE(video_desc == nullptr); 1204eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef} 1205eb45981165f982dd51425fad5ecb7ea9619063d3deadbeef 1206bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef// Test creating a sender with a stream ID, and ensure the ID is populated 1207bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef// in the offer. 1208bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeefTEST_F(PeerConnectionInterfaceTest, CreateSenderWithStream) { 1209bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef CreatePeerConnection(); 1210bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef pc_->CreateSender("video", kStreamLabel1); 1211bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef 1212bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef scoped_ptr<SessionDescriptionInterface> offer; 1213bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef ASSERT_TRUE(DoCreateOffer(offer.use(), nullptr)); 1214bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef 1215bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef const cricket::MediaContentDescription* video_desc = 1216bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef cricket::GetFirstVideoContentDescription(offer->description()); 1217bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef ASSERT_TRUE(video_desc != nullptr); 1218bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef ASSERT_EQ(1u, video_desc->streams().size()); 1219bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef EXPECT_EQ(kStreamLabel1, video_desc->streams()[0].sync_label); 1220bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef} 1221bd7d8f7e2b824a887aa12236cb6185d446d7da61deadbeef 122228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we can specify a certain track that we want statistics about. 122328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, GetStatsForSpecificTrack) { 122428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 122528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->count()); 122628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->at(0)->GetAudioTracks().size()); 122728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamTrackInterface> remote_audio = 122828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->remote_streams()->at(0)->GetAudioTracks()[0]; 122928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoGetStats(remote_audio)); 123028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 123128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Remove the stream. Since we are sending to our selves the local 123228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // and the remote stream is the same. 123328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(pc_->local_streams()->at(0)); 123428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Do a re-negotiation. 123528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 123628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 123728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(0u, pc_->remote_streams()->count()); 123828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 123928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Test that we still can get statistics for the old track. Even if it is not 124028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // sent any longer. 124128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoGetStats(remote_audio)); 124228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 124328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 124428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we can get stats on a video track. 124528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, GetStatsForVideoTrack) { 124628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 124728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->count()); 124828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_LT(0u, pc_->remote_streams()->at(0)->GetVideoTracks().size()); 124928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamTrackInterface> remote_video = 125028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->remote_streams()->at(0)->GetVideoTracks()[0]; 125128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoGetStats(remote_video)); 125228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 125328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 125428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we don't get statistics for an invalid track. 1255908f57ed945d7b8b47ec4cb50435a484cd6edf18tommi@webrtc.org// TODO(tommi): Fix this test. DoGetStats will return true 1256908f57ed945d7b8b47ec4cb50435a484cd6edf18tommi@webrtc.org// for the unknown track (since GetStats is async), but no 1257908f57ed945d7b8b47ec4cb50435a484cd6edf18tommi@webrtc.org// data is returned for the track. 1258908f57ed945d7b8b47ec4cb50435a484cd6edf18tommi@webrtc.orgTEST_F(PeerConnectionInterfaceTest, DISABLED_GetStatsForInvalidTrack) { 125928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 126028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<AudioTrackInterface> unknown_audio_track( 126128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_factory_->CreateAudioTrack("unknown track", NULL)); 126228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(DoGetStats(unknown_audio_track)); 126328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 126428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 126528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test setup two RTP data channels in loop back. 126628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestDataChannel) { 126728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 126828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 126928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 127028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 127128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 127228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data2 = 127328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test2", NULL); 127428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(data1 != NULL); 1275d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 127628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data1)); 1277d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer2( 127828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data2)); 127928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 128028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data1->state()); 128128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data2->state()); 128228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string data_to_send1 = "testing testing"; 128328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string data_to_send2 = "testing something else"; 128428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(data1->Send(DataBuffer(data_to_send1))); 128528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 128628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 128728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 128828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout); 128928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 129028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data1->state()); 129128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data2->state()); 129228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(data1->Send(DataBuffer(data_to_send1))); 129328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(data2->Send(DataBuffer(data_to_send2))); 129428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 129528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(data_to_send1, observer1->last_message(), kTimeout); 129628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(data_to_send2, observer2->last_message(), kTimeout); 129728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 129828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org data1->Close(); 129928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosing, data1->state()); 130028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 130128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(observer1->IsOpen()); 130228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data1->state()); 130328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(observer2->IsOpen()); 130428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 130528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org data_to_send2 = "testing something else again"; 130628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(data2->Send(DataBuffer(data_to_send2))); 130728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 130828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(data_to_send2, observer2->last_message(), kTimeout); 130928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 131028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 131128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that sendnig binary data over RTP data channels should 131228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// fail. 131328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestSendBinaryOnRtpDataChannel) { 131428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 131528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 131628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 131728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 131828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 131928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data2 = 132028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test2", NULL); 132128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(data1 != NULL); 1322d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 132328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data1)); 1324d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer2( 132528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data2)); 132628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 132728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data1->state()); 132828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, data2->state()); 132928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 133028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 133128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 133228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout); 133328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 133428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data1->state()); 133528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kOpen, data2->state()); 133628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1337d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Buffer buffer("test", 4); 133828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(data1->Send(DataBuffer(buffer, true))); 133928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 134028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 134128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test setup a RTP data channels in loop back and test that a channel is 134228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// opened even if the remote end answer with a zero SSRC. 134328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestSendOnlyDataChannel) { 134428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 134528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 134628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 134728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 134828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 1349d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 135028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data1)); 135128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 135228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswerWithoutSsrc(); 135328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 135428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 135528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 135628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org data1->Close(); 135728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosing, data1->state()); 135828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswerWithoutSsrc(); 135928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data1->state()); 136028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(observer1->IsOpen()); 136128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 136228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 136328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test that if a data channel is added in an answer a receive only channel 136428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// channel is created. 136528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestReceiveOnlyDataChannel) { 136628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 136728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 136828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 136928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 137028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string offer_label = "offer_channel"; 137128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> offer_channel = 137228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel(offer_label, NULL); 137328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 137428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 137528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 137628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Replace the data channel label in the offer and apply it as an answer. 137728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string receive_label = "answer_channel"; 137828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 137928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 1380d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::replace_substrs(offer_label.c_str(), offer_label.length(), 138128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org receive_label.c_str(), receive_label.length(), 138228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org &sdp); 138328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsRemoteDescription(sdp); 138428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 138528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verify that a new incoming data channel has been created and that 138628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // it is open but can't we written to. 138728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(observer_.last_datachannel_ != NULL); 138828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DataChannelInterface* received_channel = observer_.last_datachannel_; 138928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kConnecting, received_channel->state()); 139028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(receive_label, received_channel->label()); 139128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(received_channel->Send(DataBuffer("something"))); 139228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 139328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verify that the channel we initially offered has been rejected. 139428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, offer_channel->state()); 139528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 139628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Do another offer / answer exchange and verify that the data channel is 139728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // opened. 139828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 139928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ_WAIT(DataChannelInterface::kOpen, received_channel->state(), 140028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org kTimeout); 140128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 140228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 140328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test that no data channel is returned if a reliable channel is 140428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// requested. 140528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// TODO(perkj): Remove this test once reliable channels are implemented. 140628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateReliableRtpDataChannelShouldFail) { 140728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 140828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 140928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 141028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 141128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string label = "test"; 141228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::DataChannelInit config; 141328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.reliable = true; 141428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> channel = 141528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel(label, &config); 141628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 141728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 141828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1419ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Verifies that duplicated label is not allowed for RTP data channel. 1420ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, RtpDuplicatedLabelNotAllowed) { 1421ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 1422ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.SetAllowRtpDataChannels(); 1423ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 1424ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1425ab9b2d1516cad017c6e0236c468934582530c965deadbeef std::string label = "test"; 1426ab9b2d1516cad017c6e0236c468934582530c965deadbeef scoped_refptr<DataChannelInterface> channel = 1427ab9b2d1516cad017c6e0236c468934582530c965deadbeef pc_->CreateDataChannel(label, nullptr); 1428ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_NE(channel, nullptr); 1429ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1430ab9b2d1516cad017c6e0236c468934582530c965deadbeef scoped_refptr<DataChannelInterface> dup_channel = 1431ab9b2d1516cad017c6e0236c468934582530c965deadbeef pc_->CreateDataChannel(label, nullptr); 1432ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(dup_channel, nullptr); 1433ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 1434ab9b2d1516cad017c6e0236c468934582530c965deadbeef 143528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This tests that a SCTP data channel is returned using different 143628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// DataChannelInit configurations. 143728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CreateSctpDataChannel) { 143828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 143928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowDtlsSctpDataChannels(); 144028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 144128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 144228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::DataChannelInit config; 144328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 144428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> channel = 144528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("1", &config); 144628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 144728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel->reliable()); 1448001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_TRUE(observer_.renegotiation_needed_); 1449001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org observer_.renegotiation_needed_ = false; 145028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 145128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.ordered = false; 145228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("2", &config); 145328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 145428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel->reliable()); 1455001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_FALSE(observer_.renegotiation_needed_); 145628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 145728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.ordered = true; 145828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.maxRetransmits = 0; 145928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("3", &config); 146028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 146128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(channel->reliable()); 1462001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_FALSE(observer_.renegotiation_needed_); 146328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 146428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.maxRetransmits = -1; 146528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.maxRetransmitTime = 0; 146628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("4", &config); 146728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 146828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(channel->reliable()); 1469001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_FALSE(observer_.renegotiation_needed_); 147028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 147128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 147228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This tests that no data channel is returned if both maxRetransmits and 147328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// maxRetransmitTime are set for SCTP data channels. 147428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, 147528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateSctpDataChannelShouldFailForInvalidConfig) { 147628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 147728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowDtlsSctpDataChannels(); 147828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 147928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 148028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string label = "test"; 148128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::DataChannelInit config; 148228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.maxRetransmits = 0; 148328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.maxRetransmitTime = 0; 148428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 148528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> channel = 148628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel(label, &config); 148728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 148828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 148928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 149028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// The test verifies that creating a SCTP data channel with an id already in use 149128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// or out of range should fail. 149228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, 149328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateSctpDataChannelWithInvalidIdShouldFail) { 149428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 149528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowDtlsSctpDataChannels(); 149628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 149728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 149828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::DataChannelInit config; 1499cecfd1832dc375225da3f5f18ecac63006ed06bfwu@webrtc.org scoped_refptr<DataChannelInterface> channel; 150028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1501cecfd1832dc375225da3f5f18ecac63006ed06bfwu@webrtc.org config.id = 1; 1502cecfd1832dc375225da3f5f18ecac63006ed06bfwu@webrtc.org channel = pc_->CreateDataChannel("1", &config); 150328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 150428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(1, channel->id()); 150528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 150628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("x", &config); 150728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 150828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 150928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.id = cricket::kMaxSctpSid; 151028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("max", &config); 151128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 151228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(config.id, channel->id()); 151328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 151428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org config.id = cricket::kMaxSctpSid + 1; 151528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel = pc_->CreateDataChannel("x", &config); 151628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(channel == NULL); 151728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 151828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1519ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Verifies that duplicated label is allowed for SCTP data channel. 1520ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, SctpDuplicatedLabelAllowed) { 1521ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 1522ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 1523ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 1524ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 1525ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1526ab9b2d1516cad017c6e0236c468934582530c965deadbeef std::string label = "test"; 1527ab9b2d1516cad017c6e0236c468934582530c965deadbeef scoped_refptr<DataChannelInterface> channel = 1528ab9b2d1516cad017c6e0236c468934582530c965deadbeef pc_->CreateDataChannel(label, nullptr); 1529ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_NE(channel, nullptr); 1530ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1531ab9b2d1516cad017c6e0236c468934582530c965deadbeef scoped_refptr<DataChannelInterface> dup_channel = 1532ab9b2d1516cad017c6e0236c468934582530c965deadbeef pc_->CreateDataChannel(label, nullptr); 1533ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_NE(dup_channel, nullptr); 1534ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 1535ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1536001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org// This test verifies that OnRenegotiationNeeded is fired for every new RTP 1537001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org// DataChannel. 1538001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.orgTEST_F(PeerConnectionInterfaceTest, RenegotiationNeededForNewRtpDataChannel) { 1539001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org FakeConstraints constraints; 1540001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org constraints.SetAllowRtpDataChannels(); 1541001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org CreatePeerConnection(&constraints); 1542001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org 1543001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org scoped_refptr<DataChannelInterface> dc1 = 1544001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org pc_->CreateDataChannel("test1", NULL); 1545001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_TRUE(observer_.renegotiation_needed_); 1546001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org observer_.renegotiation_needed_ = false; 1547001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org 1548001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org scoped_refptr<DataChannelInterface> dc2 = 1549001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org pc_->CreateDataChannel("test2", NULL); 1550001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org EXPECT_TRUE(observer_.renegotiation_needed_); 1551001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org} 1552001fd2d5037cca62b717619827cde675ee35f470jiayl@webrtc.org 155328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test that a data channel closes when a PeerConnection is deleted/closed. 155428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, DataChannelCloseWhenPeerConnectionClose) { 155528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 155628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 155728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 155828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 155928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data1 = 156028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test1", NULL); 156128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> data2 = 156228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("test2", NULL); 156328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(data1 != NULL); 1564d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer1( 156528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data1)); 1566d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<MockDataChannelObserver> observer2( 156728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new MockDataChannelObserver(data2)); 156828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 156928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferReceiveAnswer(); 157028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout); 157128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout); 157228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 157328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ReleasePeerConnection(); 157428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data1->state()); 157528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, data2->state()); 157628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 157728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 157828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test that data channels can be rejected in an answer. 157928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, TestRejectDataChannelInAnswer) { 158028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 158128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.SetAllowRtpDataChannels(); 158228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 158328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 158428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<DataChannelInterface> offer_channel( 158528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDataChannel("offer_channel", NULL)); 158628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 158728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 158828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 158928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Create an answer where the m-line for data channels are rejected. 159028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 159128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description()->ToString(&sdp)); 159228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::JsepSessionDescription* answer = new webrtc::JsepSessionDescription( 159328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface::kAnswer); 159428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(answer->Initialize(sdp, NULL)); 159528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::ContentInfo* data_info = 159628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org answer->description()->GetContentByName("data"); 159728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org data_info->rejected = true; 159828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 159928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DoSetRemoteDescription(answer); 160028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(DataChannelInterface::kClosed, offer_channel->state()); 160128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 160228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 160328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we can create a session description from an SDP string from 160428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// FireFox, use it as a remote session description, generate an answer and use 160528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// the answer as a local description. 1606a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.orgTEST_F(PeerConnectionInterfaceTest, ReceiveFireFoxOffer) { 1607d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); 160828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeConstraints constraints; 160928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 161028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org true); 161128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(&constraints); 161228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 161328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* desc = 161428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 1615fabe2c961f9cf86d519532a96e96fa7d6c4ca37djbauch webrtc::kFireFoxSdpOffer, nullptr); 161628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetSessionDescription(desc, false)); 161728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 161828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_->local_description() != NULL); 161928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_->remote_description() != NULL); 162028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 162128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const cricket::ContentInfo* content = 162228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::GetFirstAudioContent(pc_->local_description()->description()); 162328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(content != NULL); 162428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(content->rejected); 162528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 162628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org content = 162728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::GetFirstVideoContent(pc_->local_description()->description()); 162828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(content != NULL); 162928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(content->rejected); 1630a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org#ifdef HAVE_SCTP 163128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org content = 163228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::GetFirstDataContent(pc_->local_description()->description()); 163328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(content != NULL); 163428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(content->rejected); 1635a23f0ca4ba5105eb76b6fa30447c806812a8f3c2sergeyu@chromium.org#endif 163628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 163728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 163828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that we can create an audio only offer and receive an answer with a 163928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// limited set of audio codecs and receive an updated offer with more audio 164028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// codecs, where the added codecs are not supported. 164128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, ReceiveUpdatedAudioOfferWithBadCodecs) { 164228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 164328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddVoiceStream("audio_label"); 164428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsLocalDescription(); 164528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 164628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* answer = 164728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer, 1648fabe2c961f9cf86d519532a96e96fa7d6c4ca37djbauch webrtc::kAudioSdp, nullptr); 164928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetSessionDescription(answer, false)); 165028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 165128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* updated_offer = 165228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 1653fabe2c961f9cf86d519532a96e96fa7d6c4ca37djbauch webrtc::kAudioSdpWithUnsupportedCodecs, 1654fabe2c961f9cf86d519532a96e96fa7d6c4ca37djbauch nullptr); 165528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(DoSetSessionDescription(updated_offer, false)); 165628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 165728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 165828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1659c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// Test that if we're receiving (but not sending) a track, subsequent offers 1660c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// will have m-lines with a=recvonly. 1661c80741f8957b537e968397ac54ff5b5df8a2c318deadbeefTEST_F(PeerConnectionInterfaceTest, CreateSubsequentRecvOnlyOffer) { 1662c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef FakeConstraints constraints; 1663c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 1664c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef true); 1665c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef CreatePeerConnection(&constraints); 1666c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef CreateAndSetRemoteOffer(kSdpStringWithStream1); 1667c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef CreateAnswerAsLocalDescription(); 1668c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef 1669c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef // At this point we should be receiving stream 1, but not sending anything. 1670c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef // A new offer should be recvonly. 1671c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef SessionDescriptionInterface* offer; 1672c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef DoCreateOffer(&offer, nullptr); 1673c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef 1674c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef const cricket::ContentInfo* video_content = 1675c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef cricket::GetFirstVideoContent(offer->description()); 1676c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef const cricket::VideoContentDescription* video_desc = 1677c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef static_cast<const cricket::VideoContentDescription*>( 1678c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef video_content->description); 1679c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_EQ(cricket::MD_RECVONLY, video_desc->direction()); 1680c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef 1681c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef const cricket::ContentInfo* audio_content = 1682c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef cricket::GetFirstAudioContent(offer->description()); 1683c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef const cricket::AudioContentDescription* audio_desc = 1684c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef static_cast<const cricket::AudioContentDescription*>( 1685c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef audio_content->description); 1686c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_EQ(cricket::MD_RECVONLY, audio_desc->direction()); 1687c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef} 1688c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef 1689c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// Test that if we're receiving (but not sending) a track, and the 1690c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// offerToReceiveVideo/offerToReceiveAudio constraints are explicitly set to 1691c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// false, the generated m-lines will be a=inactive. 1692c80741f8957b537e968397ac54ff5b5df8a2c318deadbeefTEST_F(PeerConnectionInterfaceTest, CreateSubsequentInactiveOffer) { 1693c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef FakeConstraints constraints; 1694c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 1695c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef true); 1696c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef CreatePeerConnection(&constraints); 1697c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef CreateAndSetRemoteOffer(kSdpStringWithStream1); 1698c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef CreateAnswerAsLocalDescription(); 1699c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef 1700c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef // At this point we should be receiving stream 1, but not sending anything. 1701c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef // A new offer would be recvonly, but we'll set the "no receive" constraints 1702c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef // to make it inactive. 1703c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef SessionDescriptionInterface* offer; 1704c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef FakeConstraints offer_constraints; 1705c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef offer_constraints.AddMandatory( 1706c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef webrtc::MediaConstraintsInterface::kOfferToReceiveVideo, false); 1707c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef offer_constraints.AddMandatory( 1708c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef webrtc::MediaConstraintsInterface::kOfferToReceiveAudio, false); 1709c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef DoCreateOffer(&offer, &offer_constraints); 1710c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef 1711c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef const cricket::ContentInfo* video_content = 1712c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef cricket::GetFirstVideoContent(offer->description()); 1713c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef const cricket::VideoContentDescription* video_desc = 1714c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef static_cast<const cricket::VideoContentDescription*>( 1715c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef video_content->description); 1716c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_EQ(cricket::MD_INACTIVE, video_desc->direction()); 1717c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef 1718c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef const cricket::ContentInfo* audio_content = 1719c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef cricket::GetFirstAudioContent(offer->description()); 1720c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef const cricket::AudioContentDescription* audio_desc = 1721c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef static_cast<const cricket::AudioContentDescription*>( 1722c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef audio_content->description); 1723c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_EQ(cricket::MD_INACTIVE, audio_desc->direction()); 1724c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef} 1725c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef 1726653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef// Test that we can use SetConfiguration to change the ICE servers of the 1727653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef// PortAllocator. 1728653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeefTEST_F(PeerConnectionInterfaceTest, SetConfigurationChangesIceServers) { 1729653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef CreatePeerConnection(); 1730653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef 1731653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef PeerConnectionInterface::RTCConfiguration config; 1732653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef PeerConnectionInterface::IceServer server; 1733653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef server.uri = "stun:test_hostname"; 1734653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef config.servers.push_back(server); 1735653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef EXPECT_TRUE(pc_->SetConfiguration(config)); 1736653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef 17370c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ(1u, port_allocator_->stun_servers().size()); 17380c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter EXPECT_EQ("test_hostname", 17390c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter port_allocator_->stun_servers().begin()->hostname()); 1740653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef} 1741653b8e02f22c9b6ba38be1cf4c0fa101894a9407deadbeef 174228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that PeerConnection::Close changes the states to closed and all remote 174328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// tracks change state to ended. 174428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CloseAndTestStreamsAndStates) { 174528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Initialize a PeerConnection and negotiate local and remote session 174628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // description. 174728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 174828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->local_streams()->count()); 174928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->remote_streams()->count()); 175028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 175128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->Close(); 175228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 175328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kClosed, pc_->signaling_state()); 175428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceConnectionClosed, 175528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->ice_connection_state()); 175628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(PeerConnectionInterface::kIceGatheringComplete, 175728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->ice_gathering_state()); 175828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 175928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(1u, pc_->local_streams()->count()); 176028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(1u, pc_->remote_streams()->count()); 176128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 176228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> remote_stream = 176328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->remote_streams()->at(0); 176428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(MediaStreamTrackInterface::kEnded, 176528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org remote_stream->GetVideoTracks()[0]->state()); 176628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(MediaStreamTrackInterface::kEnded, 176728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org remote_stream->GetAudioTracks()[0]->state()); 176828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 176928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 177028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that PeerConnection methods fails gracefully after 177128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// PeerConnection::Close has been called. 177228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CloseAndTestMethods) { 177328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreatePeerConnection(); 177428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); 177528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateOfferAsRemoteDescription(); 177628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CreateAnswerAsLocalDescription(); 177728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 177828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_EQ(1u, pc_->local_streams()->count()); 177928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org scoped_refptr<MediaStreamInterface> local_stream = 178028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->local_streams()->at(0); 178128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 178228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->Close(); 178328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 178428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->RemoveStream(local_stream); 1785c2dd5ee2c05b466949fedae3fcfac63838104392perkj@webrtc.org EXPECT_FALSE(pc_->AddStream(local_stream)); 178628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 178728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(local_stream->GetAudioTracks().empty()); 1788d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::DtmfSenderInterface> dtmf_sender( 178928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->CreateDtmfSender(local_stream->GetAudioTracks()[0])); 17906603736038d8555078ebbaff951cc35b80a2d491wu@webrtc.org EXPECT_TRUE(NULL == dtmf_sender); // local stream has been removed. 179128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 179228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->CreateDataChannel("test", NULL) == NULL); 179328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 179428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->local_description() != NULL); 179528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_TRUE(pc_->remote_description() != NULL); 179628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1797d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> offer; 1798c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(DoCreateOffer(offer.use(), nullptr)); 1799d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<SessionDescriptionInterface> answer; 1800c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(DoCreateAnswer(answer.use(), nullptr)); 180128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 180228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string sdp; 180328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_->remote_description()->ToString(&sdp)); 180428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* remote_offer = 180528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 180628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 180728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(DoSetRemoteDescription(remote_offer)); 180828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 180928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_TRUE(pc_->local_description()->ToString(&sdp)); 181028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SessionDescriptionInterface* local_offer = 181128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, 181228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sdp, NULL); 181328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(DoSetLocalDescription(local_offer)); 181428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 181528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 181628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that GetStats can still be called after PeerConnection::Close. 181728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(PeerConnectionInterfaceTest, CloseAndGetStats) { 181828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitiateCall(); 181928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org pc_->Close(); 182028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DoGetStats(NULL); 182128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 1822ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1823ab9b2d1516cad017c6e0236c468934582530c965deadbeef// NOTE: The series of tests below come from what used to be 1824ab9b2d1516cad017c6e0236c468934582530c965deadbeef// mediastreamsignaling_unittest.cc, and are mostly aimed at testing that 1825ab9b2d1516cad017c6e0236c468934582530c965deadbeef// setting a remote or local description has the expected effects. 1826ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1827ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This test verifies that the remote MediaStreams corresponding to a received 1828ab9b2d1516cad017c6e0236c468934582530c965deadbeef// SDP string is created. In this test the two separate MediaStreams are 1829ab9b2d1516cad017c6e0236c468934582530c965deadbeef// signaled. 1830ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, UpdateRemoteStreams) { 1831ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 1832ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 1833ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 1834ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 1835ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithStream1); 1836ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1837ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<StreamCollection> reference(CreateStreamCollection(1)); 1838ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE( 1839ab9b2d1516cad017c6e0236c468934582530c965deadbeef CompareStreamCollections(observer_.remote_streams(), reference.get())); 1840ab9b2d1516cad017c6e0236c468934582530c965deadbeef MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0); 1841ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(remote_stream->GetVideoTracks()[0]->GetSource() != nullptr); 1842ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1843ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Create a session description based on another SDP with another 1844ab9b2d1516cad017c6e0236c468934582530c965deadbeef // MediaStream. 1845ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithStream1And2); 1846ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1847ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<StreamCollection> reference2(CreateStreamCollection(2)); 1848ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE( 1849ab9b2d1516cad017c6e0236c468934582530c965deadbeef CompareStreamCollections(observer_.remote_streams(), reference2.get())); 1850ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 1851ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1852ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This test verifies that when remote tracks are added/removed from SDP, the 1853ab9b2d1516cad017c6e0236c468934582530c965deadbeef// created remote streams are updated appropriately. 1854ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, 1855ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddRemoveTrackFromExistingRemoteMediaStream) { 1856ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 1857ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 1858ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 1859ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 1860ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> desc_ms1; 1861ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateSessionDescriptionAndReference(1, 1, desc_ms1.accept()); 1862ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetRemoteDescription(desc_ms1.release())); 1863ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(), 1864ab9b2d1516cad017c6e0236c468934582530c965deadbeef reference_collection_)); 1865ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1866ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Add extra audio and video tracks to the same MediaStream. 1867ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> desc_ms1_two_tracks; 1868ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateSessionDescriptionAndReference(2, 2, desc_ms1_two_tracks.accept()); 1869ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetRemoteDescription(desc_ms1_two_tracks.release())); 1870ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(), 1871ab9b2d1516cad017c6e0236c468934582530c965deadbeef reference_collection_)); 1872ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1873ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Remove the extra audio and video tracks. 1874ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> desc_ms2; 1875ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateSessionDescriptionAndReference(1, 1, desc_ms2.accept()); 1876ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetRemoteDescription(desc_ms2.release())); 1877ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(), 1878ab9b2d1516cad017c6e0236c468934582530c965deadbeef reference_collection_)); 1879ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 1880ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1881ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that remote tracks are ended if a local session description is set 1882ab9b2d1516cad017c6e0236c468934582530c965deadbeef// that rejects the media content type. 1883ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, RejectMediaContent) { 1884ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 1885ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 1886ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 1887ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 1888ab9b2d1516cad017c6e0236c468934582530c965deadbeef // First create and set a remote offer, then reject its video content in our 1889ab9b2d1516cad017c6e0236c468934582530c965deadbeef // answer. 1890ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithStream1); 1891ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_EQ(1u, observer_.remote_streams()->count()); 1892ab9b2d1516cad017c6e0236c468934582530c965deadbeef MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0); 1893ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_EQ(1u, remote_stream->GetVideoTracks().size()); 1894ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_EQ(1u, remote_stream->GetAudioTracks().size()); 1895ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1896ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<webrtc::VideoTrackInterface> remote_video = 1897ab9b2d1516cad017c6e0236c468934582530c965deadbeef remote_stream->GetVideoTracks()[0]; 1898ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, remote_video->state()); 1899ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<webrtc::AudioTrackInterface> remote_audio = 1900ab9b2d1516cad017c6e0236c468934582530c965deadbeef remote_stream->GetAudioTracks()[0]; 1901ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, remote_audio->state()); 1902ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1903ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> local_answer; 1904c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(DoCreateAnswer(local_answer.accept(), nullptr)); 1905ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::ContentInfo* video_info = 1906ab9b2d1516cad017c6e0236c468934582530c965deadbeef local_answer->description()->GetContentByName("video"); 1907ab9b2d1516cad017c6e0236c468934582530c965deadbeef video_info->rejected = true; 1908ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetLocalDescription(local_answer.release())); 1909ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, remote_video->state()); 1910ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, remote_audio->state()); 1911ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1912ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Now create an offer where we reject both video and audio. 1913ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> local_offer; 1914c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(DoCreateOffer(local_offer.accept(), nullptr)); 1915ab9b2d1516cad017c6e0236c468934582530c965deadbeef video_info = local_offer->description()->GetContentByName("video"); 1916ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_TRUE(video_info != nullptr); 1917ab9b2d1516cad017c6e0236c468934582530c965deadbeef video_info->rejected = true; 1918ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::ContentInfo* audio_info = 1919ab9b2d1516cad017c6e0236c468934582530c965deadbeef local_offer->description()->GetContentByName("audio"); 1920ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_TRUE(audio_info != nullptr); 1921ab9b2d1516cad017c6e0236c468934582530c965deadbeef audio_info->rejected = true; 1922ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetLocalDescription(local_offer.release())); 1923ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, remote_video->state()); 1924ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, remote_audio->state()); 1925ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 1926ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1927ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that we won't crash if the remote track has been removed outside 1928ab9b2d1516cad017c6e0236c468934582530c965deadbeef// of PeerConnection and then PeerConnection tries to reject the track. 1929ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, RemoveTrackThenRejectMediaContent) { 1930ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 1931ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 1932ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 1933ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 1934ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithStream1); 1935ab9b2d1516cad017c6e0236c468934582530c965deadbeef MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0); 1936ab9b2d1516cad017c6e0236c468934582530c965deadbeef remote_stream->RemoveTrack(remote_stream->GetVideoTracks()[0]); 1937ab9b2d1516cad017c6e0236c468934582530c965deadbeef remote_stream->RemoveTrack(remote_stream->GetAudioTracks()[0]); 1938ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1939ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> local_answer( 1940ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer, 1941ab9b2d1516cad017c6e0236c468934582530c965deadbeef kSdpStringWithStream1, nullptr)); 1942ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::ContentInfo* video_info = 1943ab9b2d1516cad017c6e0236c468934582530c965deadbeef local_answer->description()->GetContentByName("video"); 1944ab9b2d1516cad017c6e0236c468934582530c965deadbeef video_info->rejected = true; 1945ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::ContentInfo* audio_info = 1946ab9b2d1516cad017c6e0236c468934582530c965deadbeef local_answer->description()->GetContentByName("audio"); 1947ab9b2d1516cad017c6e0236c468934582530c965deadbeef audio_info->rejected = true; 1948ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetLocalDescription(local_answer.release())); 1949ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1950ab9b2d1516cad017c6e0236c468934582530c965deadbeef // No crash is a pass. 1951ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 1952ab9b2d1516cad017c6e0236c468934582530c965deadbeef 19535e97fb5c996743a4c137a5279be6eb6485225b65deadbeef// This tests that if a recvonly remote description is set, no remote streams 19545e97fb5c996743a4c137a5279be6eb6485225b65deadbeef// will be created, even if the description contains SSRCs/MSIDs. 19555e97fb5c996743a4c137a5279be6eb6485225b65deadbeef// See: https://code.google.com/p/webrtc/issues/detail?id=5054 19565e97fb5c996743a4c137a5279be6eb6485225b65deadbeefTEST_F(PeerConnectionInterfaceTest, RecvonlyDescriptionDoesntCreateStream) { 19575e97fb5c996743a4c137a5279be6eb6485225b65deadbeef FakeConstraints constraints; 19585e97fb5c996743a4c137a5279be6eb6485225b65deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 19595e97fb5c996743a4c137a5279be6eb6485225b65deadbeef true); 19605e97fb5c996743a4c137a5279be6eb6485225b65deadbeef CreatePeerConnection(&constraints); 19615e97fb5c996743a4c137a5279be6eb6485225b65deadbeef 19625e97fb5c996743a4c137a5279be6eb6485225b65deadbeef std::string recvonly_offer = kSdpStringWithStream1; 19635e97fb5c996743a4c137a5279be6eb6485225b65deadbeef rtc::replace_substrs(kSendrecv, strlen(kSendrecv), kRecvonly, 19645e97fb5c996743a4c137a5279be6eb6485225b65deadbeef strlen(kRecvonly), &recvonly_offer); 19655e97fb5c996743a4c137a5279be6eb6485225b65deadbeef CreateAndSetRemoteOffer(recvonly_offer); 19665e97fb5c996743a4c137a5279be6eb6485225b65deadbeef 19675e97fb5c996743a4c137a5279be6eb6485225b65deadbeef EXPECT_EQ(0u, observer_.remote_streams()->count()); 19685e97fb5c996743a4c137a5279be6eb6485225b65deadbeef} 19695e97fb5c996743a4c137a5279be6eb6485225b65deadbeef 1970ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that a default MediaStream is created if a remote session 1971ab9b2d1516cad017c6e0236c468934582530c965deadbeef// description doesn't contain any streams and no MSID support. 1972ab9b2d1516cad017c6e0236c468934582530c965deadbeef// It also tests that the default stream is updated if a video m-line is added 1973ab9b2d1516cad017c6e0236c468934582530c965deadbeef// in a subsequent session description. 1974ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, SdpWithoutMsidCreatesDefaultStream) { 1975ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 1976ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 1977ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 1978ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 1979ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithoutStreamsAudioOnly); 1980ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1981ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_EQ(1u, observer_.remote_streams()->count()); 1982ab9b2d1516cad017c6e0236c468934582530c965deadbeef MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0); 1983ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1984ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(1u, remote_stream->GetAudioTracks().size()); 1985ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(0u, remote_stream->GetVideoTracks().size()); 1986ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ("default", remote_stream->label()); 1987ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1988ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithoutStreams); 1989ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_EQ(1u, observer_.remote_streams()->count()); 1990ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_EQ(1u, remote_stream->GetAudioTracks().size()); 1991ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ("defaulta0", remote_stream->GetAudioTracks()[0]->id()); 1992ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_EQ(1u, remote_stream->GetVideoTracks().size()); 1993ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ("defaultv0", remote_stream->GetVideoTracks()[0]->id()); 1994ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 1995ab9b2d1516cad017c6e0236c468934582530c965deadbeef 1996ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that a default MediaStream is created if a remote session 1997ab9b2d1516cad017c6e0236c468934582530c965deadbeef// description doesn't contain any streams and media direction is send only. 1998ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, 1999ab9b2d1516cad017c6e0236c468934582530c965deadbeef SendOnlySdpWithoutMsidCreatesDefaultStream) { 2000ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 2001ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 2002ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 2003ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 2004ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringSendOnlyWithoutStreams); 2005ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2006ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_EQ(1u, observer_.remote_streams()->count()); 2007ab9b2d1516cad017c6e0236c468934582530c965deadbeef MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0); 2008ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2009ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(1u, remote_stream->GetAudioTracks().size()); 2010ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(1u, remote_stream->GetVideoTracks().size()); 2011ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ("default", remote_stream->label()); 2012ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2013ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2014ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that it won't crash when PeerConnection tries to remove 2015ab9b2d1516cad017c6e0236c468934582530c965deadbeef// a remote track that as already been removed from the MediaStream. 2016ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, RemoveAlreadyGoneRemoteStream) { 2017ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 2018ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 2019ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 2020ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 2021ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithStream1); 2022ab9b2d1516cad017c6e0236c468934582530c965deadbeef MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0); 2023ab9b2d1516cad017c6e0236c468934582530c965deadbeef remote_stream->RemoveTrack(remote_stream->GetAudioTracks()[0]); 2024ab9b2d1516cad017c6e0236c468934582530c965deadbeef remote_stream->RemoveTrack(remote_stream->GetVideoTracks()[0]); 2025ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2026ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithoutStreams); 2027ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2028ab9b2d1516cad017c6e0236c468934582530c965deadbeef // No crash is a pass. 2029ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2030ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2031ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that a default MediaStream is created if the remote session 2032ab9b2d1516cad017c6e0236c468934582530c965deadbeef// description doesn't contain any streams and don't contain an indication if 2033ab9b2d1516cad017c6e0236c468934582530c965deadbeef// MSID is supported. 2034ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, 2035ab9b2d1516cad017c6e0236c468934582530c965deadbeef SdpWithoutMsidAndStreamsCreatesDefaultStream) { 2036ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 2037ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 2038ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 2039ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 2040ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithoutStreams); 2041ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2042ab9b2d1516cad017c6e0236c468934582530c965deadbeef ASSERT_EQ(1u, observer_.remote_streams()->count()); 2043ab9b2d1516cad017c6e0236c468934582530c965deadbeef MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0); 2044ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(1u, remote_stream->GetAudioTracks().size()); 2045ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(1u, remote_stream->GetVideoTracks().size()); 2046ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2047ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2048ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that a default MediaStream is not created if the remote session 2049ab9b2d1516cad017c6e0236c468934582530c965deadbeef// description doesn't contain any streams but does support MSID. 2050ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, SdpWithMsidDontCreatesDefaultStream) { 2051ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 2052ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 2053ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 2054ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 2055ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithMsidWithoutStreams); 2056ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(0u, observer_.remote_streams()->count()); 2057ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2058ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2059bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef// This tests that when setting a new description, the old default tracks are 2060bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef// not destroyed and recreated. 2061bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5250 2062bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeefTEST_F(PeerConnectionInterfaceTest, DefaultTracksNotDestroyedAndRecreated) { 2063bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef FakeConstraints constraints; 2064bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 2065bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef true); 2066bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef CreatePeerConnection(&constraints); 2067bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef CreateAndSetRemoteOffer(kSdpStringWithoutStreamsAudioOnly); 2068bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef 2069bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef ASSERT_EQ(1u, observer_.remote_streams()->count()); 2070bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0); 2071bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef ASSERT_EQ(1u, remote_stream->GetAudioTracks().size()); 2072bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef 2073bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef // Set the track to "disabled", then set a new description and ensure the 2074bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef // track is still disabled, which ensures it hasn't been recreated. 2075bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef remote_stream->GetAudioTracks()[0]->set_enabled(false); 2076bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef CreateAndSetRemoteOffer(kSdpStringWithoutStreamsAudioOnly); 2077bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef ASSERT_EQ(1u, remote_stream->GetAudioTracks().size()); 2078bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef EXPECT_FALSE(remote_stream->GetAudioTracks()[0]->enabled()); 2079bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef} 2080bda7e0b932fc89598da95496efc8650bc0e2c86cdeadbeef 2081ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that a default MediaStream is not created if a remote session 2082ab9b2d1516cad017c6e0236c468934582530c965deadbeef// description is updated to not have any MediaStreams. 2083ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, VerifyDefaultStreamIsNotCreated) { 2084ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 2085ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 2086ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 2087ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 2088ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithStream1); 2089ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<StreamCollection> reference(CreateStreamCollection(1)); 2090ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE( 2091ab9b2d1516cad017c6e0236c468934582530c965deadbeef CompareStreamCollections(observer_.remote_streams(), reference.get())); 2092ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2093ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateAndSetRemoteOffer(kSdpStringWithoutStreams); 2094ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(0u, observer_.remote_streams()->count()); 2095ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2096ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2097ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that an RtpSender is created when the local description is set 2098ab9b2d1516cad017c6e0236c468934582530c965deadbeef// after adding a local stream. 2099ab9b2d1516cad017c6e0236c468934582530c965deadbeef// TODO(deadbeef): This test and the one below it need to be updated when 2100ab9b2d1516cad017c6e0236c468934582530c965deadbeef// an RtpSender's lifetime isn't determined by when a local description is set. 2101ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, LocalDescriptionChanged) { 2102ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 2103ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 2104ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 2105ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 2106ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Create an offer just to ensure we have an identity before we manually 2107ab9b2d1516cad017c6e0236c468934582530c965deadbeef // call SetLocalDescription. 2108ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> throwaway; 2109c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateOffer(throwaway.accept(), nullptr)); 2110ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2111ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> desc_1; 2112ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateSessionDescriptionAndReference(2, 2, desc_1.accept()); 2113ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2114ab9b2d1516cad017c6e0236c468934582530c965deadbeef pc_->AddStream(reference_collection_->at(0)); 2115ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetLocalDescription(desc_1.release())); 2116ab9b2d1516cad017c6e0236c468934582530c965deadbeef auto senders = pc_->GetSenders(); 2117ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(4u, senders.size()); 2118ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0])); 2119ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0])); 2120ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kAudioTracks[1])); 2121ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kVideoTracks[1])); 2122ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2123ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Remove an audio and video track. 2124fac0655fd7fe0b40ef50dc5b7f11ea44d72cec6cdeadbeef pc_->RemoveStream(reference_collection_->at(0)); 2125ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> desc_2; 2126ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateSessionDescriptionAndReference(1, 1, desc_2.accept()); 2127fac0655fd7fe0b40ef50dc5b7f11ea44d72cec6cdeadbeef pc_->AddStream(reference_collection_->at(0)); 2128ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetLocalDescription(desc_2.release())); 2129ab9b2d1516cad017c6e0236c468934582530c965deadbeef senders = pc_->GetSenders(); 2130ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(2u, senders.size()); 2131ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0])); 2132ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0])); 2133ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_FALSE(ContainsSender(senders, kAudioTracks[1])); 2134ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_FALSE(ContainsSender(senders, kVideoTracks[1])); 2135ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2136ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2137ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that an RtpSender is created when the local description is set 2138ab9b2d1516cad017c6e0236c468934582530c965deadbeef// before adding a local stream. 2139ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, 2140ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddLocalStreamAfterLocalDescriptionChanged) { 2141ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 2142ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 2143ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 2144ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 2145ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Create an offer just to ensure we have an identity before we manually 2146ab9b2d1516cad017c6e0236c468934582530c965deadbeef // call SetLocalDescription. 2147ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> throwaway; 2148c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateOffer(throwaway.accept(), nullptr)); 2149ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2150ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> desc_1; 2151ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateSessionDescriptionAndReference(2, 2, desc_1.accept()); 2152ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2153ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetLocalDescription(desc_1.release())); 2154ab9b2d1516cad017c6e0236c468934582530c965deadbeef auto senders = pc_->GetSenders(); 2155ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(0u, senders.size()); 2156ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2157ab9b2d1516cad017c6e0236c468934582530c965deadbeef pc_->AddStream(reference_collection_->at(0)); 2158ab9b2d1516cad017c6e0236c468934582530c965deadbeef senders = pc_->GetSenders(); 2159ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(4u, senders.size()); 2160ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0])); 2161ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0])); 2162ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kAudioTracks[1])); 2163ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kVideoTracks[1])); 2164ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2165ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2166ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that the expected behavior occurs if the SSRC on a local track is 2167ab9b2d1516cad017c6e0236c468934582530c965deadbeef// changed when SetLocalDescription is called. 2168ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, 2169ab9b2d1516cad017c6e0236c468934582530c965deadbeef ChangeSsrcOnTrackInLocalSessionDescription) { 2170ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 2171ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 2172ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 2173ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 2174ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Create an offer just to ensure we have an identity before we manually 2175ab9b2d1516cad017c6e0236c468934582530c965deadbeef // call SetLocalDescription. 2176ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> throwaway; 2177c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateOffer(throwaway.accept(), nullptr)); 2178ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2179ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> desc; 2180ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateSessionDescriptionAndReference(1, 1, desc.accept()); 2181ab9b2d1516cad017c6e0236c468934582530c965deadbeef std::string sdp; 2182ab9b2d1516cad017c6e0236c468934582530c965deadbeef desc->ToString(&sdp); 2183ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2184ab9b2d1516cad017c6e0236c468934582530c965deadbeef pc_->AddStream(reference_collection_->at(0)); 2185ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetLocalDescription(desc.release())); 2186ab9b2d1516cad017c6e0236c468934582530c965deadbeef auto senders = pc_->GetSenders(); 2187ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(2u, senders.size()); 2188ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0])); 2189ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0])); 2190ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2191ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Change the ssrc of the audio and video track. 2192ab9b2d1516cad017c6e0236c468934582530c965deadbeef std::string ssrc_org = "a=ssrc:1"; 2193ab9b2d1516cad017c6e0236c468934582530c965deadbeef std::string ssrc_to = "a=ssrc:97"; 2194ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::replace_substrs(ssrc_org.c_str(), ssrc_org.length(), ssrc_to.c_str(), 2195ab9b2d1516cad017c6e0236c468934582530c965deadbeef ssrc_to.length(), &sdp); 2196ab9b2d1516cad017c6e0236c468934582530c965deadbeef ssrc_org = "a=ssrc:2"; 2197ab9b2d1516cad017c6e0236c468934582530c965deadbeef ssrc_to = "a=ssrc:98"; 2198ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::replace_substrs(ssrc_org.c_str(), ssrc_org.length(), ssrc_to.c_str(), 2199ab9b2d1516cad017c6e0236c468934582530c965deadbeef ssrc_to.length(), &sdp); 2200ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> updated_desc( 2201ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, sdp, 2202ab9b2d1516cad017c6e0236c468934582530c965deadbeef nullptr)); 2203ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2204ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetLocalDescription(updated_desc.release())); 2205ab9b2d1516cad017c6e0236c468934582530c965deadbeef senders = pc_->GetSenders(); 2206ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(2u, senders.size()); 2207ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0])); 2208ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0])); 2209ab9b2d1516cad017c6e0236c468934582530c965deadbeef // TODO(deadbeef): Once RtpSenders expose parameters, check that the SSRC 2210ab9b2d1516cad017c6e0236c468934582530c965deadbeef // changed. 2211ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2212ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2213ab9b2d1516cad017c6e0236c468934582530c965deadbeef// This tests that the expected behavior occurs if a new session description is 2214ab9b2d1516cad017c6e0236c468934582530c965deadbeef// set with the same tracks, but on a different MediaStream. 2215ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST_F(PeerConnectionInterfaceTest, SignalSameTracksInSeparateMediaStream) { 2216ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints constraints; 2217ab9b2d1516cad017c6e0236c468934582530c965deadbeef constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 2218ab9b2d1516cad017c6e0236c468934582530c965deadbeef true); 2219ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreatePeerConnection(&constraints); 2220ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Create an offer just to ensure we have an identity before we manually 2221ab9b2d1516cad017c6e0236c468934582530c965deadbeef // call SetLocalDescription. 2222ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> throwaway; 2223c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef ASSERT_TRUE(DoCreateOffer(throwaway.accept(), nullptr)); 2224ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2225ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> desc; 2226ab9b2d1516cad017c6e0236c468934582530c965deadbeef CreateSessionDescriptionAndReference(1, 1, desc.accept()); 2227ab9b2d1516cad017c6e0236c468934582530c965deadbeef std::string sdp; 2228ab9b2d1516cad017c6e0236c468934582530c965deadbeef desc->ToString(&sdp); 2229ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2230ab9b2d1516cad017c6e0236c468934582530c965deadbeef pc_->AddStream(reference_collection_->at(0)); 2231ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetLocalDescription(desc.release())); 2232ab9b2d1516cad017c6e0236c468934582530c965deadbeef auto senders = pc_->GetSenders(); 2233ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(2u, senders.size()); 2234ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0])); 2235ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0])); 2236ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2237ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Add a new MediaStream but with the same tracks as in the first stream. 2238ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_refptr<webrtc::MediaStreamInterface> stream_1( 2239ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::MediaStream::Create(kStreams[1])); 2240ab9b2d1516cad017c6e0236c468934582530c965deadbeef stream_1->AddTrack(reference_collection_->at(0)->GetVideoTracks()[0]); 2241ab9b2d1516cad017c6e0236c468934582530c965deadbeef stream_1->AddTrack(reference_collection_->at(0)->GetAudioTracks()[0]); 2242ab9b2d1516cad017c6e0236c468934582530c965deadbeef pc_->AddStream(stream_1); 2243ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2244ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Replace msid in the original SDP. 2245ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::replace_substrs(kStreams[0], strlen(kStreams[0]), kStreams[1], 2246ab9b2d1516cad017c6e0236c468934582530c965deadbeef strlen(kStreams[1]), &sdp); 2247ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2248ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::scoped_ptr<SessionDescriptionInterface> updated_desc( 2249ab9b2d1516cad017c6e0236c468934582530c965deadbeef webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, sdp, 2250ab9b2d1516cad017c6e0236c468934582530c965deadbeef nullptr)); 2251ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2252ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(DoSetLocalDescription(updated_desc.release())); 2253ab9b2d1516cad017c6e0236c468934582530c965deadbeef senders = pc_->GetSenders(); 2254ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_EQ(2u, senders.size()); 2255ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0])); 2256ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0])); 2257ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2258ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2259ab9b2d1516cad017c6e0236c468934582530c965deadbeef// The following tests verify that session options are created correctly. 2260c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// TODO(deadbeef): Convert these tests to be more end-to-end. Instead of 2261c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// "verify options are converted correctly", should be "pass options into 2262c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// CreateOffer and verify the correct offer is produced." 2263ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2264ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST(CreateSessionOptionsTest, GetOptionsForOfferWithInvalidAudioOption) { 2265ab9b2d1516cad017c6e0236c468934582530c965deadbeef RTCOfferAnswerOptions rtc_options; 2266ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.offer_to_receive_audio = RTCOfferAnswerOptions::kUndefined - 1; 2267ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2268ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions options; 2269ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_FALSE(ConvertRtcOptionsForOffer(rtc_options, &options)); 2270ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2271ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.offer_to_receive_audio = 2272ab9b2d1516cad017c6e0236c468934582530c965deadbeef RTCOfferAnswerOptions::kMaxOfferToReceiveMedia + 1; 2273ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_FALSE(ConvertRtcOptionsForOffer(rtc_options, &options)); 2274ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2275ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2276ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST(CreateSessionOptionsTest, GetOptionsForOfferWithInvalidVideoOption) { 2277ab9b2d1516cad017c6e0236c468934582530c965deadbeef RTCOfferAnswerOptions rtc_options; 2278ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.offer_to_receive_video = RTCOfferAnswerOptions::kUndefined - 1; 2279ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2280ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions options; 2281ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_FALSE(ConvertRtcOptionsForOffer(rtc_options, &options)); 2282ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2283ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.offer_to_receive_video = 2284ab9b2d1516cad017c6e0236c468934582530c965deadbeef RTCOfferAnswerOptions::kMaxOfferToReceiveMedia + 1; 2285ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_FALSE(ConvertRtcOptionsForOffer(rtc_options, &options)); 2286ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2287ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2288ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Test that a MediaSessionOptions is created for an offer if 2289c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// OfferToReceiveAudio and OfferToReceiveVideo options are set. 2290ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST(CreateSessionOptionsTest, GetMediaSessionOptionsForOfferWithAudioVideo) { 2291ab9b2d1516cad017c6e0236c468934582530c965deadbeef RTCOfferAnswerOptions rtc_options; 2292ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.offer_to_receive_audio = 1; 2293ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.offer_to_receive_video = 1; 2294ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2295ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions options; 2296ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ConvertRtcOptionsForOffer(rtc_options, &options)); 2297ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(options.has_audio()); 2298ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(options.has_video()); 2299ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(options.bundle_enabled); 2300ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2301ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2302ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Test that a correct MediaSessionOptions is created for an offer if 2303c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// OfferToReceiveAudio is set. 2304ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST(CreateSessionOptionsTest, GetMediaSessionOptionsForOfferWithAudio) { 2305ab9b2d1516cad017c6e0236c468934582530c965deadbeef RTCOfferAnswerOptions rtc_options; 2306ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.offer_to_receive_audio = 1; 2307ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2308ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions options; 2309ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ConvertRtcOptionsForOffer(rtc_options, &options)); 2310ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(options.has_audio()); 2311ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_FALSE(options.has_video()); 2312ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(options.bundle_enabled); 2313ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2314ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2315ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Test that a correct MediaSessionOptions is created for an offer if 2316c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// the default OfferOptions are used. 2317ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST(CreateSessionOptionsTest, GetDefaultMediaSessionOptionsForOffer) { 2318ab9b2d1516cad017c6e0236c468934582530c965deadbeef RTCOfferAnswerOptions rtc_options; 2319ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2320ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions options; 2321ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ConvertRtcOptionsForOffer(rtc_options, &options)); 2322c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(options.has_audio()); 2323ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_FALSE(options.has_video()); 2324c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(options.bundle_enabled); 2325ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(options.vad_enabled); 2326f475d365a25036725c3f545f57de59d2cc902d17Taylor Brandstetter EXPECT_FALSE(options.audio_transport_options.ice_restart); 2327f475d365a25036725c3f545f57de59d2cc902d17Taylor Brandstetter EXPECT_FALSE(options.video_transport_options.ice_restart); 2328f475d365a25036725c3f545f57de59d2cc902d17Taylor Brandstetter EXPECT_FALSE(options.data_transport_options.ice_restart); 2329ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2330ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2331ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Test that a correct MediaSessionOptions is created for an offer if 2332c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef// OfferToReceiveVideo is set. 2333ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST(CreateSessionOptionsTest, GetMediaSessionOptionsForOfferWithVideo) { 2334ab9b2d1516cad017c6e0236c468934582530c965deadbeef RTCOfferAnswerOptions rtc_options; 2335ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.offer_to_receive_audio = 0; 2336ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.offer_to_receive_video = 1; 2337ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2338ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions options; 2339ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ConvertRtcOptionsForOffer(rtc_options, &options)); 2340ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_FALSE(options.has_audio()); 2341ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(options.has_video()); 2342ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(options.bundle_enabled); 2343ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2344ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2345ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Test that a correct MediaSessionOptions is created for an offer if 2346ab9b2d1516cad017c6e0236c468934582530c965deadbeef// UseRtpMux is set to false. 2347ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST(CreateSessionOptionsTest, 2348ab9b2d1516cad017c6e0236c468934582530c965deadbeef GetMediaSessionOptionsForOfferWithBundleDisabled) { 2349ab9b2d1516cad017c6e0236c468934582530c965deadbeef RTCOfferAnswerOptions rtc_options; 2350ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.offer_to_receive_audio = 1; 2351ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.offer_to_receive_video = 1; 2352ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.use_rtp_mux = false; 2353ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2354ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions options; 2355ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ConvertRtcOptionsForOffer(rtc_options, &options)); 2356ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(options.has_audio()); 2357ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(options.has_video()); 2358ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_FALSE(options.bundle_enabled); 2359ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2360ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2361ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Test that a correct MediaSessionOptions is created to restart ice if 2362ab9b2d1516cad017c6e0236c468934582530c965deadbeef// IceRestart is set. It also tests that subsequent MediaSessionOptions don't 2363f475d365a25036725c3f545f57de59d2cc902d17Taylor Brandstetter// have |audio_transport_options.ice_restart| etc. set. 2364ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST(CreateSessionOptionsTest, GetMediaSessionOptionsForOfferWithIceRestart) { 2365ab9b2d1516cad017c6e0236c468934582530c965deadbeef RTCOfferAnswerOptions rtc_options; 2366ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options.ice_restart = true; 2367ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2368ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions options; 2369ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ConvertRtcOptionsForOffer(rtc_options, &options)); 2370f475d365a25036725c3f545f57de59d2cc902d17Taylor Brandstetter EXPECT_TRUE(options.audio_transport_options.ice_restart); 2371f475d365a25036725c3f545f57de59d2cc902d17Taylor Brandstetter EXPECT_TRUE(options.video_transport_options.ice_restart); 2372f475d365a25036725c3f545f57de59d2cc902d17Taylor Brandstetter EXPECT_TRUE(options.data_transport_options.ice_restart); 2373ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2374ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc_options = RTCOfferAnswerOptions(); 2375ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ConvertRtcOptionsForOffer(rtc_options, &options)); 2376f475d365a25036725c3f545f57de59d2cc902d17Taylor Brandstetter EXPECT_FALSE(options.audio_transport_options.ice_restart); 2377f475d365a25036725c3f545f57de59d2cc902d17Taylor Brandstetter EXPECT_FALSE(options.video_transport_options.ice_restart); 2378f475d365a25036725c3f545f57de59d2cc902d17Taylor Brandstetter EXPECT_FALSE(options.data_transport_options.ice_restart); 2379ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2380ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2381ab9b2d1516cad017c6e0236c468934582530c965deadbeef// Test that the MediaConstraints in an answer don't affect if audio and video 2382ab9b2d1516cad017c6e0236c468934582530c965deadbeef// is offered in an offer but that if kOfferToReceiveAudio or 2383ab9b2d1516cad017c6e0236c468934582530c965deadbeef// kOfferToReceiveVideo constraints are true in an offer, the media type will be 2384ab9b2d1516cad017c6e0236c468934582530c965deadbeef// included in subsequent answers. 2385ab9b2d1516cad017c6e0236c468934582530c965deadbeefTEST(CreateSessionOptionsTest, MediaConstraintsInAnswer) { 2386ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints answer_c; 2387ab9b2d1516cad017c6e0236c468934582530c965deadbeef answer_c.SetMandatoryReceiveAudio(true); 2388ab9b2d1516cad017c6e0236c468934582530c965deadbeef answer_c.SetMandatoryReceiveVideo(true); 2389ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2390ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions answer_options; 2391ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(ParseConstraintsForAnswer(&answer_c, &answer_options)); 2392ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(answer_options.has_audio()); 2393ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(answer_options.has_video()); 2394ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2395c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef RTCOfferAnswerOptions rtc_offer_options; 2396ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2397ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions offer_options; 2398c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(ConvertRtcOptionsForOffer(rtc_offer_options, &offer_options)); 2399c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(offer_options.has_audio()); 2400ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_FALSE(offer_options.has_video()); 2401ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2402c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef RTCOfferAnswerOptions updated_rtc_offer_options; 2403c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef updated_rtc_offer_options.offer_to_receive_audio = 1; 2404c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef updated_rtc_offer_options.offer_to_receive_video = 1; 2405ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2406ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions updated_offer_options; 2407c80741f8957b537e968397ac54ff5b5df8a2c318deadbeef EXPECT_TRUE(ConvertRtcOptionsForOffer(updated_rtc_offer_options, 2408ab9b2d1516cad017c6e0236c468934582530c965deadbeef &updated_offer_options)); 2409ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(updated_offer_options.has_audio()); 2410ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(updated_offer_options.has_video()); 2411ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2412ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Since an offer has been created with both audio and video, subsequent 2413ab9b2d1516cad017c6e0236c468934582530c965deadbeef // offers and answers should contain both audio and video. 2414ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Answers will only contain the media types that exist in the offer 2415ab9b2d1516cad017c6e0236c468934582530c965deadbeef // regardless of the value of |updated_answer_options.has_audio| and 2416ab9b2d1516cad017c6e0236c468934582530c965deadbeef // |updated_answer_options.has_video|. 2417ab9b2d1516cad017c6e0236c468934582530c965deadbeef FakeConstraints updated_answer_c; 2418ab9b2d1516cad017c6e0236c468934582530c965deadbeef answer_c.SetMandatoryReceiveAudio(false); 2419ab9b2d1516cad017c6e0236c468934582530c965deadbeef answer_c.SetMandatoryReceiveVideo(false); 2420ab9b2d1516cad017c6e0236c468934582530c965deadbeef 2421ab9b2d1516cad017c6e0236c468934582530c965deadbeef cricket::MediaSessionOptions updated_answer_options; 2422ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE( 2423ab9b2d1516cad017c6e0236c468934582530c965deadbeef ParseConstraintsForAnswer(&updated_answer_c, &updated_answer_options)); 2424ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(updated_answer_options.has_audio()); 2425ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_TRUE(updated_answer_options.has_video()); 2426ab9b2d1516cad017c6e0236c468934582530c965deadbeef} 2427