10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2011, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <set> 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector> 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/jsepsessiondescription.h" 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/webrtcsdp.h" 34cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/media/base/constants.h" 35cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/constants.h" 36cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/session/media/mediasession.h" 372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/gunit.h" 382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/logging.h" 392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/messagedigest.h" 402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/scoped_ptr.h" 412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/sslfingerprint.h" 422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/stringencode.h" 432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/stringutils.h" 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::AudioCodec; 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::AudioContentDescription; 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::Candidate; 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::ContentInfo; 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::CryptoParams; 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::ContentGroup; 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::DataCodec; 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::DataContentDescription; 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::ICE_CANDIDATE_COMPONENT_RTCP; 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::ICE_CANDIDATE_COMPONENT_RTP; 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::kFecSsrcGroupSemantics; 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::LOCAL_PORT_TYPE; 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::NS_JINGLE_DRAFT_SCTP; 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::NS_JINGLE_ICE_UDP; 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::NS_JINGLE_RTP; 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::RtpHeaderExtension; 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::RELAY_PORT_TYPE; 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::SessionDescription; 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::StreamParams; 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::STUN_PORT_TYPE; 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::TransportDescription; 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::TransportInfo; 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::VideoCodec; 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::VideoContentDescription; 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::IceCandidateCollection; 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::IceCandidateInterface; 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::JsepIceCandidate; 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::JsepSessionDescription; 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::SdpParseError; 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing webrtc::SessionDescriptionInterface; 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtypedef std::vector<AudioCodec> AudioCodecs; 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtypedef std::vector<Candidate> Candidates; 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 79861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.orgstatic const uint32 kDefaultSctpPort = 5000; 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSessionTime[] = "t=0 0\r\n"; 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kCandidatePriority = 2130706432U; // pref = 1.0 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kCandidateUfragVoice[] = "ufrag_voice"; 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kCandidatePwdVoice[] = "pwd_voice"; 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kAttributeIcePwdVoice[] = "a=ice-pwd:pwd_voice\r\n"; 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kCandidateUfragVideo[] = "ufrag_video"; 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kCandidatePwdVideo[] = "pwd_video"; 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kCandidateUfragData[] = "ufrag_data"; 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kCandidatePwdData[] = "pwd_data"; 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kAttributeIcePwdVideo[] = "a=ice-pwd:pwd_video\r\n"; 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kCandidateGeneration = 2; 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kCandidateFoundation1[] = "a0+B/1"; 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kCandidateFoundation2[] = "a0+B/2"; 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kCandidateFoundation3[] = "a0+B/3"; 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kCandidateFoundation4[] = "a0+B/4"; 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kAttributeCryptoVoice[] = 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=crypto:1 AES_CM_128_HMAC_SHA1_32 " 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 " 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "dummy_session_params\r\n"; 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kAttributeCryptoVideo[] = 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=crypto:1 AES_CM_128_HMAC_SHA1_80 " 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n"; 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kFingerprint[] = "a=fingerprint:sha-1 " 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB\r\n"; 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kExtmapId = 1; 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kExtmapUri[] = "http://example.com/082005/ext.htm#ttime"; 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kExtmap[] = 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=extmap:1 http://example.com/082005/ext.htm#ttime\r\n"; 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kExtmapWithDirectionAndAttribute[] = 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=extmap:1/sendrecv http://example.com/082005/ext.htm#ttime a1 a2\r\n"; 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint8 kIdentityDigest[] = {0x4A, 0xAD, 0xB9, 0xB1, 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x3F, 0x82, 0x18, 0x3B, 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x54, 0x02, 0x12, 0xDF, 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x3E, 0x5D, 0x49, 0x6B, 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x19, 0xE5, 0x7C, 0xAB}; 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct CodecParams { 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int max_ptime; 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int ptime; 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int min_ptime; 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int sprop_stereo; 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int stereo; 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int useinband; 1247162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org int maxaveragebitrate; 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Reference sdp string 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpFullString[] = 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=msid-semantic: WMS local_stream_1 local_stream_2\r\n" 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 2345 RTP/SAVPF 111 103 104\r\n" 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "c=IN IP4 74.125.127.126\r\n" 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtcp:2347 IN IP4 74.125.127.126\r\n" 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host " 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1235 typ host " 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host " 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/2 2 udp 2130706432 ::1 1239 typ host " 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx " 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "raddr 192.168.1.5 rport 2346 " 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/3 2 udp 2130706432 74.125.127.126 2347 typ srflx " 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "raddr 192.168.1.5 rport 2348 " 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n" 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:audio_content_name\r\n" 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=sendrecv\r\n" 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtcp-mux\r\n" 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=crypto:1 AES_CM_128_HMAC_SHA1_32 " 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 " 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "dummy_session_params\r\n" 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:111 opus/48000/2\r\n" 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n" 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:104 CELT/32000/2\r\n" 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 cname:stream_1_cname\r\n" 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n" 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 mslabel:local_stream_1\r\n" 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 label:audio_track_id_1\r\n" 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 cname:stream_2_cname\r\n" 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 msid:local_stream_2 audio_track_id_2\r\n" 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 mslabel:local_stream_2\r\n" 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 label:audio_track_id_2\r\n" 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=video 3457 RTP/SAVPF 120\r\n" 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "c=IN IP4 74.125.224.39\r\n" 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtcp:3456 IN IP4 74.125.224.39\r\n" 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1236 typ host " 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1237 typ host " 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/2 2 udp 2130706432 ::1 1240 typ host " 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/2 1 udp 2130706432 ::1 1241 typ host " 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/4 2 udp 2130706432 74.125.224.39 3456 typ relay " 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/4 1 udp 2130706432 74.125.224.39 3457 typ relay " 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n" 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:video_content_name\r\n" 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=sendrecv\r\n" 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=crypto:1 AES_CM_128_HMAC_SHA1_80 " 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n" 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:120 VP8/90000\r\n" 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 cname:stream_1_cname\r\n" 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n" 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 mslabel:local_stream_1\r\n" 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 label:video_track_id_1\r\n" 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 cname:stream_1_cname\r\n" 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 msid:local_stream_1 video_track_id_2\r\n" 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 mslabel:local_stream_1\r\n" 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 label:video_track_id_2\r\n" 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc-group:FEC 5 6\r\n" 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:5 cname:stream_2_cname\r\n" 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:5 msid:local_stream_2 video_track_id_3\r\n" 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:5 mslabel:local_stream_2\r\n" 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:5 label:video_track_id_3\r\n" 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:6 cname:stream_2_cname\r\n" 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:6 msid:local_stream_2 video_track_id_3\r\n" 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:6 mslabel:local_stream_2\r\n" 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:6 label:video_track_id_3\r\n"; 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SDP reference string without the candidates. 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpString[] = 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=msid-semantic: WMS local_stream_1 local_stream_2\r\n" 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 1 RTP/SAVPF 111 103 104\r\n" 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "c=IN IP4 0.0.0.0\r\n" 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtcp:1 IN IP4 0.0.0.0\r\n" 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n" 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:audio_content_name\r\n" 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=sendrecv\r\n" 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtcp-mux\r\n" 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=crypto:1 AES_CM_128_HMAC_SHA1_32 " 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 " 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "dummy_session_params\r\n" 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:111 opus/48000/2\r\n" 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n" 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:104 CELT/32000/2\r\n" 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 cname:stream_1_cname\r\n" 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n" 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 mslabel:local_stream_1\r\n" 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:1 label:audio_track_id_1\r\n" 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 cname:stream_2_cname\r\n" 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 msid:local_stream_2 audio_track_id_2\r\n" 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 mslabel:local_stream_2\r\n" 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:4 label:audio_track_id_2\r\n" 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=video 1 RTP/SAVPF 120\r\n" 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "c=IN IP4 0.0.0.0\r\n" 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtcp:1 IN IP4 0.0.0.0\r\n" 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n" 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:video_content_name\r\n" 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=sendrecv\r\n" 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=crypto:1 AES_CM_128_HMAC_SHA1_80 " 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n" 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:120 VP8/90000\r\n" 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 cname:stream_1_cname\r\n" 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n" 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 mslabel:local_stream_1\r\n" 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:2 label:video_track_id_1\r\n" 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 cname:stream_1_cname\r\n" 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 msid:local_stream_1 video_track_id_2\r\n" 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 mslabel:local_stream_1\r\n" 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:3 label:video_track_id_2\r\n" 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc-group:FEC 5 6\r\n" 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:5 cname:stream_2_cname\r\n" 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:5 msid:local_stream_2 video_track_id_3\r\n" 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:5 mslabel:local_stream_2\r\n" 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:5 label:video_track_id_3\r\n" 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:6 cname:stream_2_cname\r\n" 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:6 msid:local_stream_2 video_track_id_3\r\n" 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:6 mslabel:local_stream_2\r\n" 2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:6 label:video_track_id_3\r\n"; 2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpRtpDataChannelString[] = 2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=application 1 RTP/SAVPF 101\r\n" 2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "c=IN IP4 0.0.0.0\r\n" 2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtcp:1 IN IP4 0.0.0.0\r\n" 2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-ufrag:ufrag_data\r\n" 2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-pwd:pwd_data\r\n" 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:data_content_name\r\n" 2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=sendrecv\r\n" 2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=crypto:1 AES_CM_128_HMAC_SHA1_80 " 2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:FvLcvU2P3ZWmQxgPAgcDu7Zl9vftYElFOjEzhWs5\r\n" 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:101 google-data/90000\r\n" 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:10 cname:data_channel_cname\r\n" 2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:10 msid:data_channel data_channeld0\r\n" 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:10 mslabel:data_channel\r\n" 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ssrc:10 label:data_channeld0\r\n"; 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpSctpDataChannelString[] = 2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=application 1 DTLS/SCTP 5000\r\n" 2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "c=IN IP4 0.0.0.0\r\n" 2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-ufrag:ufrag_data\r\n" 2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-pwd:pwd_data\r\n" 2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:data_content_name\r\n" 2855c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org "a=sctpmap:5000 webrtc-datachannel 1024\r\n"; 2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2876ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org// draft-ietf-mmusic-sctp-sdp-07 2886ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.orgstatic const char kSdpSctpDataChannelStringWithSctpPort[] = 2896ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org "m=application 1 DTLS/SCTP webrtc-datachannel\r\n" 2906ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org "a=fmtp:webrtc-datachannel max-message-size=100000\r\n" 2916ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org "a=sctp-port 5000\r\n" 2926ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org "c=IN IP4 0.0.0.0\r\n" 2936ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org "a=ice-ufrag:ufrag_data\r\n" 2946ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org "a=ice-pwd:pwd_data\r\n" 2956ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org "a=mid:data_content_name\r\n"; 2966ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org 2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpSctpDataChannelWithCandidatesString[] = 2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=application 2345 DTLS/SCTP 5000\r\n" 2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "c=IN IP4 74.125.127.126\r\n" 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host " 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host " 3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx " 3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "raddr 192.168.1.5 rport 2346 " 3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n" 3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-ufrag:ufrag_data\r\n" 3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-pwd:pwd_data\r\n" 3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=mid:data_content_name\r\n" 3105c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org "a=sctpmap:5000 webrtc-datachannel 1024\r\n"; 3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 312e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.orgstatic const char kSdpConferenceString[] = 3137587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "v=0\r\n" 3147587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" 3157587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "s=-\r\n" 3167587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "t=0 0\r\n" 3177587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "a=msid-semantic: WMS\r\n" 3187587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "m=audio 1 RTP/SAVPF 111 103 104\r\n" 3197587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "c=IN IP4 0.0.0.0\r\n" 3207587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "a=x-google-flag:conference\r\n" 3217587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "m=video 1 RTP/SAVPF 120\r\n" 3227587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "c=IN IP4 0.0.0.0\r\n" 3237587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "a=x-google-flag:conference\r\n"; 3247587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 3250a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.orgstatic const char kSdpSessionString[] = 3260a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "v=0\r\n" 3270a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" 3280a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "s=-\r\n" 3290a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "t=0 0\r\n" 3300a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=msid-semantic: WMS local_stream\r\n"; 3310a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org 3320a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.orgstatic const char kSdpAudioString[] = 3330a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "m=audio 1 RTP/SAVPF 111\r\n" 3340a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "c=IN IP4 0.0.0.0\r\n" 3350a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=rtcp:1 IN IP4 0.0.0.0\r\n" 3360a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n" 3370a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=mid:audio_content_name\r\n" 3380a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=sendrecv\r\n" 3390a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=rtpmap:111 opus/48000/2\r\n" 3400a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=ssrc:1 cname:stream_1_cname\r\n" 3410a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=ssrc:1 msid:local_stream audio_track_id_1\r\n" 3420a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=ssrc:1 mslabel:local_stream\r\n" 3430a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=ssrc:1 label:audio_track_id_1\r\n"; 3440a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org 3450a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.orgstatic const char kSdpVideoString[] = 3460a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "m=video 1 RTP/SAVPF 120\r\n" 3470a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "c=IN IP4 0.0.0.0\r\n" 3480a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=rtcp:1 IN IP4 0.0.0.0\r\n" 3490a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n" 3500a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=mid:video_content_name\r\n" 3510a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=sendrecv\r\n" 3520a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=rtpmap:120 VP8/90000\r\n" 3530a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=ssrc:2 cname:stream_1_cname\r\n" 3540a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=ssrc:2 msid:local_stream video_track_id_1\r\n" 3550a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=ssrc:2 mslabel:local_stream\r\n" 3560a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org "a=ssrc:2 label:video_track_id_1\r\n"; 3570a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org 3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// One candidate reference string as per W3c spec. 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// candidate:<blah> not a=candidate:<blah>CRLF 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kRawCandidate[] = 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host generation 2"; 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// One candidate reference string. 3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpOneCandidate[] = 3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host " 3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "generation 2\r\n"; 367c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org 36858c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.orgstatic const char kSdpTcpActiveCandidate[] = 36958c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "candidate:a0+B/1 1 tcp 2130706432 192.168.1.5 9 typ host " 37058c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "tcptype active generation 2"; 37158c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.orgstatic const char kSdpTcpPassiveCandidate[] = 37258c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "candidate:a0+B/1 1 tcp 2130706432 192.168.1.5 9 typ host " 37358c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "tcptype passive generation 2"; 37458c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.orgstatic const char kSdpTcpSOCandidate[] = 37558c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "candidate:a0+B/1 1 tcp 2130706432 192.168.1.5 9 typ host " 37658c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "tcptype so generation 2"; 37758c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.orgstatic const char kSdpTcpInvalidCandidate[] = 37858c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "candidate:a0+B/1 1 tcp 2130706432 192.168.1.5 9 typ host " 37958c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "tcptype invalid generation 2"; 38058c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org 381c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org// One candidate reference string with IPV6 address. 382c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.orgstatic const char kRawIPV6Candidate[] = 383c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org "candidate:a0+B/1 1 udp 2130706432 " 384c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org "abcd::abcd::abcd::abcd::abcd::abcd::abcd::abcd 1234 typ host generation 2"; 3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// One candidate reference string. 3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSdpOneCandidateOldFormat[] = 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host network_name" 3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " eth0 username user_rtp password password_rtp generation 2\r\n"; 3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Session id and version 3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSessionId[] = "18446744069414584320"; 3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kSessionVersion[] = "18446462598732840960"; 3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Ice options 3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kIceOption1[] = "iceoption1"; 3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kIceOption2[] = "iceoption2"; 3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kIceOption3[] = "iceoption3"; 3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Content name 4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kAudioContentName[] = "audio_content_name"; 4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kVideoContentName[] = "video_content_name"; 4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kDataContentName[] = "data_content_name"; 4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// MediaStream 1 4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStreamLabel1[] = "local_stream_1"; 4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStream1Cname[] = "stream_1_cname"; 4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kAudioTrackId1[] = "audio_track_id_1"; 4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kAudioTrack1Ssrc = 1; 4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kVideoTrackId1[] = "video_track_id_1"; 4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kVideoTrack1Ssrc = 2; 4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kVideoTrackId2[] = "video_track_id_2"; 4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kVideoTrack2Ssrc = 3; 4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// MediaStream 2 4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStreamLabel2[] = "local_stream_2"; 4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStream2Cname[] = "stream_2_cname"; 4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kAudioTrackId2[] = "audio_track_id_2"; 4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kAudioTrack2Ssrc = 4; 4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kVideoTrackId3[] = "video_track_id_3"; 4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kVideoTrack3Ssrc = 5; 4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kVideoTrack4Ssrc = 6; 4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// DataChannel 4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kDataChannelLabel[] = "data_channel"; 4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kDataChannelMsid[] = "data_channeld0"; 4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kDataChannelCname[] = "data_channel_cname"; 4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kDataChannelSsrc = 10; 4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Candidate 4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kDummyMid[] = "dummy_mid"; 4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kDummyIndex = 123; 4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Misc 4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kDummyString[] = "dummy"; 4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Helper functions 4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic bool SdpDeserialize(const std::string& message, 4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* jdesc) { 4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return webrtc::SdpDeserialize(message, jdesc, NULL); 4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic bool SdpDeserializeCandidate(const std::string& message, 4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate* candidate) { 4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return webrtc::SdpDeserializeCandidate(message, candidate, NULL); 4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Add some extra |newlines| to the |message| after |line|. 4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void InjectAfter(const std::string& line, 4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& newlines, 4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string* message) { 4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string tmp = line + newlines; 4542a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(line.c_str(), line.length(), 4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org tmp.c_str(), tmp.length(), message); 4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void Replace(const std::string& line, 4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& newlines, 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string* message) { 4612a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(line.c_str(), line.length(), 4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org newlines.c_str(), newlines.length(), message); 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 465de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org// Expect fail to parase |bad_sdp| and expect |bad_part| be part of the error 466de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org// message. 467de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.orgstatic void ExpectParseFailure(const std::string& bad_sdp, 468de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org const std::string& bad_part) { 4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription desc(kDummyString); 4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SdpParseError error; 471de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org bool ret = webrtc::SdpDeserialize(bad_sdp, &desc, &error); 4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(ret); 473de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org EXPECT_NE(std::string::npos, error.line.find(bad_part.c_str())); 474de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org} 475de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org 476de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org// Expect fail to parse kSdpFullString if replace |good_part| with |bad_part|. 477de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.orgstatic void ExpectParseFailure(const char* good_part, const char* bad_part) { 478de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org std::string bad_sdp = kSdpFullString; 479de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org Replace(good_part, bad_part, &bad_sdp); 480de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure(bad_sdp, bad_part); 481de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org} 482de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org 483de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org// Expect fail to parse kSdpFullString if add |newlines| after |injectpoint|. 484de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.orgstatic void ExpectParseFailureWithNewLines(const std::string& injectpoint, 485de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org const std::string& newlines, 486de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org const std::string& bad_part) { 487de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org std::string bad_sdp = kSdpFullString; 488de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org InjectAfter(injectpoint, newlines, &bad_sdp); 489de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure(bad_sdp, bad_part); 4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void ReplaceDirection(cricket::MediaContentDirection direction, 4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string* message) { 4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string new_direction; 4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org switch (direction) { 4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org case cricket::MD_INACTIVE: 4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new_direction = "a=inactive"; 4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org case cricket::MD_SENDONLY: 5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new_direction = "a=sendonly"; 5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org case cricket::MD_RECVONLY: 5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new_direction = "a=recvonly"; 5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org case cricket::MD_SENDRECV: 5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org default: 5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new_direction = "a=sendrecv"; 5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace("a=sendrecv", new_direction, message); 5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void ReplaceRejected(bool audio_rejected, bool video_rejected, 5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string* message) { 5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (audio_rejected) { 5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace("m=audio 2345", "m=audio 0", message); 5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (video_rejected) { 5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace("m=video 3457", "m=video 0", message); 5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// WebRtcSdpTest 5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass WebRtcSdpTest : public testing::Test { 5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org WebRtcSdpTest() 5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : jdesc_(kDummyString) { 5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // AudioContentDescription 5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_ = CreateAudioContentDescription(); 5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioCodec opus(111, "opus", 48000, 0, 2, 3); 5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_->AddCodec(opus); 5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_->AddCodec(AudioCodec(103, "ISAC", 16000, 32000, 1, 2)); 5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_->AddCodec(AudioCodec(104, "CELT", 32000, 0, 2, 1)); 5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_desc_); 5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // VideoContentDescription 5382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<VideoContentDescription> video( 5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new VideoContentDescription()); 5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_ = video.get(); 5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamParams video_stream1; 5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream1.id = kVideoTrackId1; 5430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream1.cname = kStream1Cname; 5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream1.sync_label = kStreamLabel1; 5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream1.ssrcs.push_back(kVideoTrack1Ssrc); 5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video->AddStream(video_stream1); 5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamParams video_stream2; 5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream2.id = kVideoTrackId2; 5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream2.cname = kStream1Cname; 5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream2.sync_label = kStreamLabel1; 5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream2.ssrcs.push_back(kVideoTrack2Ssrc); 5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video->AddStream(video_stream2); 5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamParams video_stream3; 5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream3.id = kVideoTrackId3; 5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream3.cname = kStream2Cname; 5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream3.sync_label = kStreamLabel2; 5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream3.ssrcs.push_back(kVideoTrack3Ssrc); 5580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream3.ssrcs.push_back(kVideoTrack4Ssrc); 5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SsrcGroup ssrc_group(kFecSsrcGroupSemantics, video_stream3.ssrcs); 5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_stream3.ssrc_groups.push_back(ssrc_group); 5610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video->AddStream(video_stream3); 5620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video->AddCrypto(CryptoParams(1, "AES_CM_128_HMAC_SHA1_80", 5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32", "")); 5640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video->set_protocol(cricket::kMediaProtocolSavpf); 5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video->AddCodec(VideoCodec( 5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 120, 5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription::kDefaultVideoCodecName, 5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription::kMaxVideoCodecWidth, 5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription::kMaxVideoCodecHeight, 5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription::kDefaultVideoCodecFramerate, 5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription::kDefaultVideoCodecPreference)); 5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, 5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video.release()); 5750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TransportInfo 5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(desc_.AddTransportInfo( 5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportInfo(kAudioContentName, 5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportDescription(NS_JINGLE_ICE_UDP, 5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kCandidateUfragVoice, 581a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org kCandidatePwdVoice)))); 5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(desc_.AddTransportInfo( 5830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportInfo(kVideoContentName, 5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportDescription(NS_JINGLE_ICE_UDP, 5850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kCandidateUfragVideo, 586a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org kCandidatePwdVideo)))); 5870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // v4 host 5890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int port = 1234; 5902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress address("192.168.1.5", port++); 5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Candidate candidate1( 5920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", ICE_CANDIDATE_COMPONENT_RTP, "udp", address, kCandidatePriority, 5930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", LOCAL_PORT_TYPE, 5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", kCandidateGeneration, kCandidateFoundation1); 5950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org address.SetPort(port++); 5960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Candidate candidate2( 5970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", ICE_CANDIDATE_COMPONENT_RTCP, "udp", address, kCandidatePriority, 5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", LOCAL_PORT_TYPE, 5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", kCandidateGeneration, kCandidateFoundation1); 6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org address.SetPort(port++); 6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Candidate candidate3( 6020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", ICE_CANDIDATE_COMPONENT_RTCP, "udp", address, kCandidatePriority, 6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", LOCAL_PORT_TYPE, 6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", kCandidateGeneration, kCandidateFoundation1); 6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org address.SetPort(port++); 6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Candidate candidate4( 6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", ICE_CANDIDATE_COMPONENT_RTP, "udp", address, kCandidatePriority, 6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", LOCAL_PORT_TYPE, 6090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", kCandidateGeneration, kCandidateFoundation1); 6100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // v6 host 6122a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress v6_address("::1", port++); 6130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate5( 6140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", cricket::ICE_CANDIDATE_COMPONENT_RTP, 6150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "udp", v6_address, kCandidatePriority, 6160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", cricket::LOCAL_PORT_TYPE, 6170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", kCandidateGeneration, kCandidateFoundation2); 6180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org v6_address.SetPort(port++); 6190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate6( 6200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", cricket::ICE_CANDIDATE_COMPONENT_RTCP, 6210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "udp", v6_address, kCandidatePriority, 6220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", cricket::LOCAL_PORT_TYPE, 6230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", kCandidateGeneration, kCandidateFoundation2); 6240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org v6_address.SetPort(port++); 6250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate7( 6260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", cricket::ICE_CANDIDATE_COMPONENT_RTCP, 6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "udp", v6_address, kCandidatePriority, 6280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", cricket::LOCAL_PORT_TYPE, 6290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", kCandidateGeneration, kCandidateFoundation2); 6300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org v6_address.SetPort(port++); 6310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate8( 6320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", cricket::ICE_CANDIDATE_COMPONENT_RTP, 6330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "udp", v6_address, kCandidatePriority, 6340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", cricket::LOCAL_PORT_TYPE, 6350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", kCandidateGeneration, kCandidateFoundation2); 6360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // stun 6380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int port_stun = 2345; 6392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress address_stun("74.125.127.126", port_stun++); 6402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress rel_address_stun("192.168.1.5", port_stun++); 6410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate9 6420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ("", cricket::ICE_CANDIDATE_COMPONENT_RTP, 6430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "udp", address_stun, kCandidatePriority, 6440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", STUN_PORT_TYPE, 6450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", kCandidateGeneration, kCandidateFoundation3); 6460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate9.set_related_address(rel_address_stun); 6470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org address_stun.SetPort(port_stun++); 6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rel_address_stun.SetPort(port_stun++); 6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate10( 6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", cricket::ICE_CANDIDATE_COMPONENT_RTCP, 6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "udp", address_stun, kCandidatePriority, 6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", STUN_PORT_TYPE, 6540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", kCandidateGeneration, kCandidateFoundation3); 6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate10.set_related_address(rel_address_stun); 6560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // relay 6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int port_relay = 3456; 6592a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress address_relay("74.125.224.39", port_relay++); 6600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate11( 6610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", cricket::ICE_CANDIDATE_COMPONENT_RTCP, 6620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "udp", address_relay, kCandidatePriority, 6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", 6640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::RELAY_PORT_TYPE, "", 6650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kCandidateGeneration, kCandidateFoundation4); 6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org address_relay.SetPort(port_relay++); 6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Candidate candidate12( 6680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", cricket::ICE_CANDIDATE_COMPONENT_RTP, 6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "udp", address_relay, kCandidatePriority, 6700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "", "", 6710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RELAY_PORT_TYPE, "", 6720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kCandidateGeneration, kCandidateFoundation4); 6730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // voice 6750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate1); 6760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate2); 6770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate5); 6780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate6); 6790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate9); 6800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate10); 6810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // video 6830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate3); 6840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate4); 6850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate7); 6860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate8); 6870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate11); 6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.push_back(candidate12); 6890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jcandidate_.reset(new JsepIceCandidate(std::string("audio_content_name"), 6910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0, candidate1)); 6920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Set up JsepSessionDescription. 6940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.Initialize(desc_.Copy(), kSessionId, kSessionVersion); 6950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string mline_id; 6960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int mline_index = 0; 6970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i< candidates_.size(); ++i) { 6980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // In this test, the audio m line index will be 0, and the video m line 6990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // will be 1. 7000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool is_video = (i > 5); 7010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mline_id = is_video ? "video_content_name" : "audio_content_name"; 7020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mline_index = is_video ? 1 : 0; 7030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate jice(mline_id, 7040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mline_index, 7050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_.at(i)); 7060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.AddCandidate(&jice); 7070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioContentDescription* CreateAudioContentDescription() { 7110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioContentDescription* audio = new AudioContentDescription(); 7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio->set_rtcp_mux(true); 7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamParams audio_stream1; 7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream1.id = kAudioTrackId1; 7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream1.cname = kStream1Cname; 7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream1.sync_label = kStreamLabel1; 7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream1.ssrcs.push_back(kAudioTrack1Ssrc); 7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio->AddStream(audio_stream1); 7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamParams audio_stream2; 7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream2.id = kAudioTrackId2; 7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream2.cname = kStream2Cname; 7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream2.sync_label = kStreamLabel2; 7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream2.ssrcs.push_back(kAudioTrack2Ssrc); 7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio->AddStream(audio_stream2); 7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio->AddCrypto(CryptoParams(1, "AES_CM_128_HMAC_SHA1_32", 7260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32", 7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "dummy_session_params")); 7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio->set_protocol(cricket::kMediaProtocolSavpf); 7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return audio; 7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org template <class MCD> 7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CompareMediaContentDescription(const MCD* cd1, 7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const MCD* cd2) { 7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // type 7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cd1->type(), cd1->type()); 7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // content direction 7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cd1->direction(), cd2->direction()); 7400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // rtcp_mux 7420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cd1->rtcp_mux(), cd2->rtcp_mux()); 7430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // cryptos 7450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cd1->cryptos().size(), cd2->cryptos().size()); 7460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (cd1->cryptos().size() != cd2->cryptos().size()) { 7470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ADD_FAILURE(); 7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 7490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i< cd1->cryptos().size(); ++i) { 7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const CryptoParams c1 = cd1->cryptos().at(i); 7520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const CryptoParams c2 = cd2->cryptos().at(i); 7530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(c1.Matches(c2)); 7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(c1.key_params, c2.key_params); 7550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(c1.session_params, c2.session_params); 7560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // protocol 7580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cd1->protocol(), cd2->protocol()); 7590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // codecs 7610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cd1->codecs(), cd2->codecs()); 7620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // bandwidth 7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cd1->bandwidth(), cd2->bandwidth()); 7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // streams 7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cd1->streams(), cd2->streams()); 7680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // extmap 7700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(cd1->rtp_header_extensions().size(), 7710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cd2->rtp_header_extensions().size()); 7720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i< cd1->rtp_header_extensions().size(); ++i) { 7730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const RtpHeaderExtension ext1 = cd1->rtp_header_extensions().at(i); 7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const RtpHeaderExtension ext2 = cd2->rtp_header_extensions().at(i); 7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(ext1.uri, ext2.uri); 7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(ext1.id, ext2.id); 7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // buffered mode latency 7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cd1->buffered_mode_latency(), cd2->buffered_mode_latency()); 7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CompareSessionDescription(const SessionDescription& desc1, 7850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescription& desc2) { 7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Compare content descriptions. 7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (desc1.contents().size() != desc2.contents().size()) { 7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ADD_FAILURE(); 7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0 ; i < desc1.contents().size(); ++i) { 7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo& c1 = desc1.contents().at(i); 7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo& c2 = desc2.contents().at(i); 7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // content name 7950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(c1.name, c2.name); 7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // content type 7970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Note, ASSERT will return from the function, but will not stop the test. 7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(c1.type, c2.type); 7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(IsAudioContent(&c1), IsAudioContent(&c2)); 8010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (IsAudioContent(&c1)) { 8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const AudioContentDescription* acd1 = 8030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const AudioContentDescription*>(c1.description); 8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const AudioContentDescription* acd2 = 8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const AudioContentDescription*>(c2.description); 8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CompareMediaContentDescription<AudioContentDescription>(acd1, acd2); 8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(IsVideoContent(&c1), IsVideoContent(&c2)); 8100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (IsVideoContent(&c1)) { 8110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const VideoContentDescription* vcd1 = 8120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const VideoContentDescription*>(c1.description); 8130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const VideoContentDescription* vcd2 = 8140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const VideoContentDescription*>(c2.description); 8150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CompareMediaContentDescription<VideoContentDescription>(vcd1, vcd2); 8160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(IsDataContent(&c1), IsDataContent(&c2)); 8190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (IsDataContent(&c1)) { 8200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const DataContentDescription* dcd1 = 8210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const DataContentDescription*>(c1.description); 8220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const DataContentDescription* dcd2 = 8230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const DataContentDescription*>(c2.description); 8240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CompareMediaContentDescription<DataContentDescription>(dcd1, dcd2); 8250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // group 8290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentGroups groups1 = desc1.groups(); 8300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentGroups groups2 = desc2.groups(); 8310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(groups1.size(), groups1.size()); 8320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (groups1.size() != groups2.size()) { 8330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ADD_FAILURE(); 8340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 8350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < groups1.size(); ++i) { 8370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentGroup group1 = groups1.at(i); 8380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentGroup group2 = groups2.at(i); 8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(group1.semantics(), group2.semantics()); 8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentNames names1 = group1.content_names(); 8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentNames names2 = group2.content_names(); 8420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(names1.size(), names2.size()); 8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (names1.size() != names2.size()) { 8440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ADD_FAILURE(); 8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ContentNames::const_iterator iter1 = names1.begin(); 8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ContentNames::const_iterator iter2 = names2.begin(); 8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org while (iter1 != names1.end()) { 8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(*iter1++, *iter2++); 8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // transport info 8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::TransportInfos transports1 = desc1.transport_infos(); 8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::TransportInfos transports2 = desc2.transport_infos(); 8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(transports1.size(), transports2.size()); 8580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (transports1.size() != transports2.size()) { 8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ADD_FAILURE(); 8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < transports1.size(); ++i) { 8630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::TransportInfo transport1 = transports1.at(i); 8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::TransportInfo transport2 = transports2.at(i); 8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(transport1.content_name, transport2.content_name); 8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(transport1.description.transport_type, 8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport2.description.transport_type); 8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(transport1.description.ice_ufrag, 8690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport2.description.ice_ufrag); 8700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(transport1.description.ice_pwd, 8710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport2.description.ice_pwd); 8720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (transport1.description.identity_fingerprint) { 8730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(*transport1.description.identity_fingerprint, 8740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *transport2.description.identity_fingerprint); 8750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 8760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(transport1.description.identity_fingerprint.get(), 8770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport2.description.identity_fingerprint.get()); 8780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(transport1.description.transport_options, 8800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport2.description.transport_options); 8810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareCandidates(transport1.description.candidates, 8820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport2.description.candidates)); 8830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool CompareCandidates(const Candidates& cs1, const Candidates& cs2) { 8870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cs1.size(), cs2.size()); 8880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (cs1.size() != cs2.size()) 8890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 8900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i< cs1.size(); ++i) { 8910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const Candidate c1 = cs1.at(i); 8920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const Candidate c2 = cs2.at(i); 8930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(c1.IsEquivalent(c2)); 8940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 8960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool CompareSessionDescription( 8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const JsepSessionDescription& desc1, 9000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const JsepSessionDescription& desc2) { 9010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(desc1.session_id(), desc2.session_id()); 9020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(desc1.session_version(), desc2.session_version()); 9030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CompareSessionDescription(*desc1.description(), *desc2.description()); 9040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (desc1.number_of_mediasections() != desc2.number_of_mediasections()) 9050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 9060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < desc1.number_of_mediasections(); ++i) { 9070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const IceCandidateCollection* cc1 = desc1.candidates(i); 9080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const IceCandidateCollection* cc2 = desc2.candidates(i); 9090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (cc1->count() != cc2->count()) 9100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 9110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t j = 0; j < cc1->count(); ++j) { 9120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const IceCandidateInterface* c1 = cc1->at(j); 9130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const IceCandidateInterface* c2 = cc2->at(j); 9140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(c1->sdp_mid(), c2->sdp_mid()); 9150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(c1->sdp_mline_index(), c2->sdp_mline_index()); 9160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(c1->candidate().IsEquivalent(c2->candidate())); 9170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 9200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Disable the ice-ufrag and ice-pwd in given |sdp| message by replacing 9230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // them with invalid keywords so that the parser will just ignore them. 9240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool RemoveCandidateUfragPwd(std::string* sdp) { 9250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char ice_ufrag[] = "a=ice-ufrag"; 9260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char ice_ufragx[] = "a=xice-ufrag"; 9270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char ice_pwd[] = "a=ice-pwd"; 9280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char ice_pwdx[] = "a=xice-pwd"; 9292a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(ice_ufrag, strlen(ice_ufrag), 9300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_ufragx, strlen(ice_ufragx), sdp); 9312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(ice_pwd, strlen(ice_pwd), 9320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ice_pwdx, strlen(ice_pwdx), sdp); 9330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 9340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Update the candidates in |jdesc| to use the given |ufrag| and |pwd|. 9370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool UpdateCandidateUfragPwd(JsepSessionDescription* jdesc, int mline_index, 9380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& ufrag, const std::string& pwd) { 9390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string content_name; 9400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (mline_index == 0) { 9410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content_name = kAudioContentName; 9420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (mline_index == 1) { 9430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content_name = kVideoContentName; 9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 9450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(false); 9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportInfo transport_info( 9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org content_name, TransportDescription(NS_JINGLE_ICE_UDP, 949a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org ufrag, pwd)); 9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescription* desc = 9510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const_cast<SessionDescription*>(jdesc->description()); 9520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc->RemoveTransportInfoByName(content_name); 9530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(desc->AddTransportInfo(transport_info)); 9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < jdesc_.number_of_mediasections(); ++i) { 9550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const IceCandidateCollection* cc = jdesc_.candidates(i); 9560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t j = 0; j < cc->count(); ++j) { 9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (cc->at(j)->sdp_mline_index() == mline_index) { 9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const_cast<Candidate&>(cc->at(j)->candidate()).set_username( 9590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ufrag); 9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const_cast<Candidate&>(cc->at(j)->candidate()).set_password( 9610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pwd); 9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 9660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddIceOptions(const std::string& content_name, 9690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::vector<std::string>& transport_options) { 9700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(desc_.GetTransportInfoByName(content_name) != NULL); 9710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::TransportInfo transport_info = 9720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *(desc_.GetTransportInfoByName(content_name)); 9730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.RemoveTransportInfoByName(content_name); 9740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_info.description.transport_options = transport_options; 9750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddTransportInfo(transport_info); 9760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddFingerprint() { 9790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.RemoveTransportInfoByName(kAudioContentName); 9800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.RemoveTransportInfoByName(kVideoContentName); 9812a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SSLFingerprint fingerprint(rtc::DIGEST_SHA_1, 9820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kIdentityDigest, 9830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kIdentityDigest)); 9840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(desc_.AddTransportInfo( 9850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportInfo(kAudioContentName, 9860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportDescription(NS_JINGLE_ICE_UDP, 9870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<std::string>(), 9880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kCandidateUfragVoice, 9890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kCandidatePwdVoice, 990a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org cricket::ICEMODE_FULL, 991a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org cricket::CONNECTIONROLE_NONE, 992a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org &fingerprint, Candidates())))); 9930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(desc_.AddTransportInfo( 9940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportInfo(kVideoContentName, 9950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportDescription(NS_JINGLE_ICE_UDP, 9960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<std::string>(), 9970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kCandidateUfragVideo, 9980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kCandidatePwdVideo, 999a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org cricket::ICEMODE_FULL, 1000a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org cricket::CONNECTIONROLE_NONE, 1001a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org &fingerprint, Candidates())))); 10020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddExtmap() { 10050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_ = static_cast<AudioContentDescription*>( 10060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_->Copy()); 10070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_ = static_cast<VideoContentDescription*>( 10080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_->Copy()); 10090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_->AddRtpHeaderExtension( 10100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RtpHeaderExtension(kExtmapUri, kExtmapId)); 10110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_->AddRtpHeaderExtension( 10120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RtpHeaderExtension(kExtmapUri, kExtmapId)); 10130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.RemoveContentByName(kAudioContentName); 10140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.RemoveContentByName(kVideoContentName); 10150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_desc_); 10160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, video_desc_); 10170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void RemoveCryptos() { 10200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_->set_cryptos(std::vector<CryptoParams>()); 10210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_->set_cryptos(std::vector<CryptoParams>()); 10220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool TestSerializeDirection(cricket::MediaContentDirection direction) { 10250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_->set_direction(direction); 10260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_->set_direction(direction); 10270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string new_sdp = kSdpFullString; 10280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ReplaceDirection(direction, &new_sdp); 10290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!jdesc_.Initialize(desc_.Copy(), 10310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 10320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())) { 10330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 10340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc_); 10360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(new_sdp, message); 10370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 10380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool TestSerializeRejected(bool audio_rejected, bool video_rejected) { 10410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_ = static_cast<AudioContentDescription*>( 10420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_->Copy()); 10430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_ = static_cast<VideoContentDescription*>( 10440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_->Copy()); 10450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.RemoveContentByName(kAudioContentName); 10460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.RemoveContentByName(kVideoContentName); 10470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_rejected, 10480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_); 10490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, video_rejected, 10500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_); 10510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string new_sdp = kSdpFullString; 10520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ReplaceRejected(audio_rejected, video_rejected, &new_sdp); 10530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!jdesc_.Initialize(desc_.Copy(), 10550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 10560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())) { 10570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 10580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc_); 10600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(new_sdp, message); 10610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 10620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddSctpDataChannel() { 10652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<DataContentDescription> data( 10660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new DataContentDescription()); 10670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_desc_ = data.get(); 10680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_desc_->set_protocol(cricket::kMediaProtocolDtlsSctp); 1069861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org DataCodec codec(cricket::kGoogleSctpDataCodecId, 1070861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org cricket::kGoogleSctpDataCodecName, 0); 1071861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org codec.SetParam(cricket::kCodecParamPort, kDefaultSctpPort); 1072861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org data_desc_->AddCodec(codec); 10730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddContent(kDataContentName, NS_JINGLE_DRAFT_SCTP, data.release()); 10740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(desc_.AddTransportInfo( 10750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportInfo(kDataContentName, 10760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportDescription(NS_JINGLE_ICE_UDP, 10770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kCandidateUfragData, 1078a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org kCandidatePwdData)))); 10790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddRtpDataChannel() { 10822a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<DataContentDescription> data( 10830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new DataContentDescription()); 10840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_desc_ = data.get(); 10850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_desc_->AddCodec(DataCodec(101, "google-data", 1)); 10870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamParams data_stream; 10880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_stream.id = kDataChannelMsid; 10890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_stream.cname = kDataChannelCname; 10900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_stream.sync_label = kDataChannelLabel; 10910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_stream.ssrcs.push_back(kDataChannelSsrc); 10920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_desc_->AddStream(data_stream); 10930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_desc_->AddCrypto(CryptoParams( 10940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1, "AES_CM_128_HMAC_SHA1_80", 10950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:FvLcvU2P3ZWmQxgPAgcDu7Zl9vftYElFOjEzhWs5", "")); 10960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_desc_->set_protocol(cricket::kMediaProtocolSavpf); 10970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddContent(kDataContentName, NS_JINGLE_RTP, data.release()); 10980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(desc_.AddTransportInfo( 10990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportInfo(kDataContentName, 11000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportDescription(NS_JINGLE_ICE_UDP, 11010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kCandidateUfragData, 1102a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org kCandidatePwdData)))); 11030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 11040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool TestDeserializeDirection(cricket::MediaContentDirection direction) { 11060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string new_sdp = kSdpFullString; 11070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ReplaceDirection(direction, &new_sdp); 11080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription new_jdesc(kDummyString); 11090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(new_sdp, &new_jdesc)); 11110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_->set_direction(direction); 11130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_->set_direction(direction); 11140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!jdesc_.Initialize(desc_.Copy(), 11150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 11160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())) { 11170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 11180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 11190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_, new_jdesc)); 11200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 11210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 11220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool TestDeserializeRejected(bool audio_rejected, bool video_rejected) { 11240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string new_sdp = kSdpFullString; 11250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ReplaceRejected(audio_rejected, video_rejected, &new_sdp); 11260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription new_jdesc(JsepSessionDescription::kOffer); 11270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(new_sdp, &new_jdesc)); 11290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_ = static_cast<AudioContentDescription*>( 11300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_->Copy()); 11310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_ = static_cast<VideoContentDescription*>( 11320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_->Copy()); 11330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.RemoveContentByName(kAudioContentName); 11340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.RemoveContentByName(kVideoContentName); 11350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_rejected, 11360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_desc_); 11370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, video_rejected, 11380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_desc_); 11390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!jdesc_.Initialize(desc_.Copy(), 11400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 11410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())) { 11420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 11430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 11440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_, new_jdesc)); 11450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 11460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 11470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestDeserializeExtmap(bool session_level, bool media_level) { 11490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddExtmap(); 11500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription new_jdesc("dummy"); 11510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(new_jdesc.Initialize(desc_.Copy(), 11520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 11530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())); 11540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_with_extmap("dummy"); 11550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_extmap = kSdpString; 11560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (session_level) { 11570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kSessionTime, kExtmapWithDirectionAndAttribute, 11580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_extmap); 11590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 11600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (media_level) { 11610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVoice, kExtmapWithDirectionAndAttribute, 11620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_extmap); 11630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVideo, kExtmapWithDirectionAndAttribute, 11640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_extmap); 11650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 11660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The extmap can't be present at the same time in both session level and 11670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // media level. 11680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (session_level && media_level) { 11690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SdpParseError error; 11700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(webrtc::SdpDeserialize(sdp_with_extmap, 11710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &jdesc_with_extmap, &error)); 11720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(std::string::npos, error.description.find("a=extmap")); 11730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 11740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_extmap, &jdesc_with_extmap)); 11750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_with_extmap, new_jdesc)); 11760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 11770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 11780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void VerifyCodecParameter(const cricket::CodecParameterMap& params, 11800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& name, int expected_value) { 11810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::CodecParameterMap::const_iterator found = params.find(name); 11820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(found != params.end()); 11832a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_EQ(found->second, rtc::ToString<int>(expected_value)); 11840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 11850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestDeserializeCodecParams(const CodecParams& params, 11870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription* jdesc_output) { 11880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp = 11890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 11900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" 11910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 11920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 11930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Include semantics for WebRTC Media Streams since it is supported by 11940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // this parser, and will be added to the SDP when serializing a session 11950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // description. 11960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=msid-semantic: WMS\r\n" 11970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Pl type 111 preferred. 11980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 1 RTP/SAVPF 111 104 103 102\r\n" 11990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Pltype 111 listed before 103 and 104 in the map. 12000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:111 opus/48000/2\r\n" 12010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Pltype 103 listed before 104. 12020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n" 12030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:104 CELT/32000/2\r\n" 12040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:102 ISAC/32000/1\r\n" 1205e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org "a=fmtp:111 0-15,66,70\r\n" 1206e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org "a=fmtp:111 "; 12070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::ostringstream os; 1208e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org os << "minptime=" << params.min_ptime 1209e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org << "; stereo=" << params.stereo 1210e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org << "; sprop-stereo=" << params.sprop_stereo 1211e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org << "; useinbandfec=" << params.useinband 12127162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org << " maxaveragebitrate=" << params.maxaveragebitrate << "\r\n" 12130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << "a=ptime:" << params.ptime << "\r\n" 12140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << "a=maxptime:" << params.max_ptime << "\r\n"; 12150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp += os.str(); 12160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1217aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org os.clear(); 1218aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org os.str(""); 1219aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org // Pl type 100 preferred. 1220aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org os << "m=video 1 RTP/SAVPF 99 95\r\n" 1221aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org << "a=rtpmap:99 VP8/90000\r\n" 1222aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org << "a=rtpmap:95 RTX/90000\r\n" 1223aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org << "a=fmtp:95 apt=99;rtx-time=1000\r\n"; 1224aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org sdp += os.str(); 1225aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org 12260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Deserialize 12270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SdpParseError error; 12280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(webrtc::SdpDeserialize(sdp, jdesc_output, &error)); 12290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ContentInfo* ac = GetFirstAudioContent(jdesc_output->description()); 12310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(ac != NULL); 12320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const AudioContentDescription* acd = 12330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const AudioContentDescription*>(ac->description); 12340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_FALSE(acd->codecs().empty()); 12350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec opus = acd->codecs()[0]; 12360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("opus", opus.name); 12370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(111, opus.id); 12380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyCodecParameter(opus.params, "minptime", params.min_ptime); 12390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyCodecParameter(opus.params, "stereo", params.stereo); 12400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyCodecParameter(opus.params, "sprop-stereo", params.sprop_stereo); 12410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyCodecParameter(opus.params, "useinbandfec", params.useinband); 12427162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org VerifyCodecParameter(opus.params, "maxaveragebitrate", 12437162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org params.maxaveragebitrate); 12440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < acd->codecs().size(); ++i) { 12450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec codec = acd->codecs()[i]; 12460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyCodecParameter(codec.params, "ptime", params.ptime); 12470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VerifyCodecParameter(codec.params, "maxptime", params.max_ptime); 12480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (codec.name == "ISAC") { 12490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (codec.clockrate == 16000) { 12500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(32000, codec.bitrate); 12510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 12520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(56000, codec.bitrate); 12530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 12540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 12550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1256aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org 1257aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org const ContentInfo* vc = GetFirstVideoContent(jdesc_output->description()); 1258aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org ASSERT_TRUE(vc != NULL); 1259aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org const VideoContentDescription* vcd = 1260aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org static_cast<const VideoContentDescription*>(vc->description); 1261aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org ASSERT_FALSE(vcd->codecs().empty()); 1262aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org cricket::VideoCodec vp8 = vcd->codecs()[0]; 1263aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org EXPECT_EQ("VP8", vp8.name); 1264aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org EXPECT_EQ(99, vp8.id); 1265aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org cricket::VideoCodec rtx = vcd->codecs()[1]; 1266aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org EXPECT_EQ("RTX", rtx.name); 1267aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org EXPECT_EQ(95, rtx.id); 1268aa7cbe2cd8bd4b2461ab2b917df01bafb1dd2d11stefan@webrtc.org VerifyCodecParameter(rtx.params, "apt", vp8.id); 12690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 12700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 12710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestDeserializeRtcpFb(JsepSessionDescription* jdesc_output, 12720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool use_wildcard) { 12730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp = 12740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 12750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" 12760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 12770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 12780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Include semantics for WebRTC Media Streams since it is supported by 12790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // this parser, and will be added to the SDP when serializing a session 12800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // description. 12810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=msid-semantic: WMS\r\n" 12820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 1 RTP/SAVPF 111\r\n" 12830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:111 opus/48000/2\r\n" 12840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtcp-fb:111 nack\r\n" 12850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=video 3457 RTP/SAVPF 101\r\n" 12860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:101 VP8/90000\r\n" 12870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtcp-fb:101 nack\r\n" 12888485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org "a=rtcp-fb:101 nack pli\r\n" 12890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtcp-fb:101 goog-remb\r\n" 12900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtcp-fb:101 ccm fir\r\n"; 12910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::ostringstream os; 12920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org os << "a=rtcp-fb:" << (use_wildcard ? "*" : "101") << " ccm fir\r\n"; 12930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp += os.str(); 12940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Deserialize 12950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SdpParseError error; 12960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(webrtc::SdpDeserialize(sdp, jdesc_output, &error)); 12970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ContentInfo* ac = GetFirstAudioContent(jdesc_output->description()); 12980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(ac != NULL); 12990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const AudioContentDescription* acd = 13000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const AudioContentDescription*>(ac->description); 13010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_FALSE(acd->codecs().empty()); 13020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec opus = acd->codecs()[0]; 13030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(111, opus.id); 13040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(opus.HasFeedbackParam( 13050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FeedbackParam(cricket::kRtcpFbParamNack, 13060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kParamValueEmpty))); 13070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ContentInfo* vc = GetFirstVideoContent(jdesc_output->description()); 13090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(vc != NULL); 13100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const VideoContentDescription* vcd = 13110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const VideoContentDescription*>(vc->description); 13120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_FALSE(vcd->codecs().empty()); 13130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VideoCodec vp8 = vcd->codecs()[0]; 13140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ(webrtc::JsepSessionDescription::kDefaultVideoCodecName, 13150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org vp8.name.c_str()); 13160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(101, vp8.id); 13170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(vp8.HasFeedbackParam( 13180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FeedbackParam(cricket::kRtcpFbParamNack, 13190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kParamValueEmpty))); 13200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(vp8.HasFeedbackParam( 13218485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org cricket::FeedbackParam(cricket::kRtcpFbParamNack, 13228485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org cricket::kRtcpFbNackParamPli))); 13238485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org EXPECT_TRUE(vp8.HasFeedbackParam( 13240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FeedbackParam(cricket::kRtcpFbParamRemb, 13250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kParamValueEmpty))); 13260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(vp8.HasFeedbackParam( 13270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FeedbackParam(cricket::kRtcpFbParamCcm, 13280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kRtcpFbCcmParamFir))); 13290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 13300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Two SDP messages can mean the same thing but be different strings, e.g. 13320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // some of the lines can be serialized in different order. 13330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // However, a deserialized description can be compared field by field and has 13340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // no order. If deserializer has already been tested, serializing then 13350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // deserializing and comparing JsepSessionDescription will test 13360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // the serializer sufficiently. 13370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestSerialize(const JsepSessionDescription& jdesc) { 13380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc); 13390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_output_des(kDummyString); 13400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SdpParseError error; 13410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(webrtc::SdpDeserialize(message, &jdesc_output_des, &error)); 13420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output_des)); 13430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 13440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 13460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescription desc_; 13470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioContentDescription* audio_desc_; 13480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoContentDescription* video_desc_; 13490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DataContentDescription* data_desc_; 13500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Candidates candidates_; 13512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<IceCandidateInterface> jcandidate_; 13520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_; 13530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 13540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TestMismatch(const std::string& string1, const std::string& string2) { 13560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int position = 0; 13570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < string1.length() && i < string2.length(); ++i) { 13580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (string1.c_str()[i] != string2.c_str()[i]) { 13591a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org position = static_cast<int>(i); 13600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 13610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 13620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 13630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, position) << "Strings mismatch at the " << position 13640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << " character\n" 13650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << " 1: " << string1.substr(position, 20) << "\n" 13660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << " 2: " << string2.substr(position, 20) << "\n"; 13670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 13680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstd::string GetLine(const std::string& message, 13700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& session_description_name) { 13710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t start = message.find(session_description_name); 13720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (std::string::npos == start) { 13730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return ""; 13740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 13750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t stop = message.find("\r\n", start); 13760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (std::string::npos == stop) { 13770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return ""; 13780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 13790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (stop <= start) { 13800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return ""; 13810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 13820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return message.substr(start, stop - start); 13830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 13840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescription) { 13860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SessionDescription with desc and candidates. 13870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc_); 13880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestMismatch(std::string(kSdpFullString), message); 13890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 13900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionEmpty) { 13920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_empty(kDummyString); 13930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("", webrtc::SdpSerialize(jdesc_empty)); 13940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 13950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 13960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This tests serialization of SDP with a=crypto and a=fingerprint, as would be 13970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// the case in a DTLS offer. 13980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithFingerprint) { 13990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddFingerprint(); 14000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_with_fingerprint(kDummyString); 14010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc_with_fingerprint.Initialize(desc_.Copy(), 14020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSessionId, kSessionVersion)); 14030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc_with_fingerprint); 14040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_fingerprint = kSdpString; 14060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVoice, 14070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kFingerprint, &sdp_with_fingerprint); 14080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVideo, 14090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kFingerprint, &sdp_with_fingerprint); 14100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(sdp_with_fingerprint, message); 14120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This tests serialization of SDP with a=fingerprint with no a=crypto, as would 14150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// be the case in a DTLS answer. 14160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithFingerprintNoCryptos) { 14170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddFingerprint(); 14180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RemoveCryptos(); 14190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_with_fingerprint(kDummyString); 14200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc_with_fingerprint.Initialize(desc_.Copy(), 14210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSessionId, kSessionVersion)); 14220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc_with_fingerprint); 14230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_fingerprint = kSdpString; 14250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace(kAttributeCryptoVoice, "", &sdp_with_fingerprint); 14260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace(kAttributeCryptoVideo, "", &sdp_with_fingerprint); 14270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVoice, 14280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kFingerprint, &sdp_with_fingerprint); 14290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVideo, 14300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kFingerprint, &sdp_with_fingerprint); 14310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(sdp_with_fingerprint, message); 14330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithoutCandidates) { 14360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // JsepSessionDescription with desc but without candidates. 14370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_no_candidates(kDummyString); 14380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc_no_candidates.Initialize(desc_.Copy(), 14390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSessionId, kSessionVersion)); 14400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc_no_candidates); 14410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(std::string(kSdpString), message); 14420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithBundle) { 14450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ContentGroup group(cricket::GROUP_TYPE_BUNDLE); 14460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org group.AddContentName(kAudioContentName); 14470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org group.AddContentName(kVideoContentName); 14480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddGroup(group); 14490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), 14500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 14510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())); 14520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc_); 14530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_bundle = kSdpFullString; 14540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kSessionTime, 14550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=group:BUNDLE audio_content_name video_content_name\r\n", 14560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_bundle); 14570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(sdp_with_bundle, message); 14580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithBandwidth) { 14610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoContentDescription* vcd = static_cast<VideoContentDescription*>( 14620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org GetFirstVideoContent(&desc_)->description); 14630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org vcd->set_bandwidth(100 * 1000); 14640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioContentDescription* acd = static_cast<AudioContentDescription*>( 14650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org GetFirstAudioContent(&desc_)->description); 14660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org acd->set_bandwidth(50 * 1000); 14670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), 14680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 14690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())); 14700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc_); 14710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_bandwidth = kSdpFullString; 1472c7db5943563a06c37011670185bffde17b0bbdc9wu@webrtc.org InjectAfter("c=IN IP4 74.125.224.39\r\n", 14730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "b=AS:100\r\n", 14740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_bandwidth); 1475c7db5943563a06c37011670185bffde17b0bbdc9wu@webrtc.org InjectAfter("c=IN IP4 74.125.127.126\r\n", 14760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "b=AS:50\r\n", 14770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_bandwidth); 14780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(sdp_with_bandwidth, message); 14790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithIceOptions) { 14820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<std::string> transport_options; 14830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_options.push_back(kIceOption1); 14840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_options.push_back(kIceOption3); 14850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddIceOptions(kAudioContentName, transport_options); 14860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_options.clear(); 14870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_options.push_back(kIceOption2); 14880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_options.push_back(kIceOption3); 14890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddIceOptions(kVideoContentName, transport_options); 14900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), 14910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 14920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())); 14930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc_); 14940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_ice_options = kSdpFullString; 14950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVoice, 14960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-options:iceoption1 iceoption3\r\n", 14970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_ice_options); 14980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVideo, 14990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-options:iceoption2 iceoption3\r\n", 15000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_ice_options); 15010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(sdp_with_ice_options, message); 15020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 15030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithRecvOnlyContent) { 15050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestSerializeDirection(cricket::MD_RECVONLY)); 15060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 15070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithSendOnlyContent) { 15090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestSerializeDirection(cricket::MD_SENDONLY)); 15100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 15110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithInactiveContent) { 15130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestSerializeDirection(cricket::MD_INACTIVE)); 15140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 15150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithAudioRejected) { 15170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestSerializeRejected(true, false)); 15180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 15190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithVideoRejected) { 15210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestSerializeRejected(false, true)); 15220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 15230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithAudioVideoRejected) { 15250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestSerializeRejected(true, true)); 15260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 15270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithRtpDataChannel) { 15290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddRtpDataChannel(); 15300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jsep_desc(kDummyString); 15310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jsep_desc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); 15330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jsep_desc); 15340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string expected_sdp = kSdpString; 15360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_sdp.append(kSdpRtpDataChannelString); 15370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_sdp, message); 15380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 15390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithSctpDataChannel) { 15410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddSctpDataChannel(); 15420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jsep_desc(kDummyString); 15430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jsep_desc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); 15450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jsep_desc); 15460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 15470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string expected_sdp = kSdpString; 15480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_sdp.append(kSdpSctpDataChannelString); 15490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(message, expected_sdp); 15500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 15510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1552e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.orgTEST_F(WebRtcSdpTest, SerializeWithSctpDataChannelAndNewPort) { 1553e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org AddSctpDataChannel(); 1554e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org JsepSessionDescription jsep_desc(kDummyString); 1555e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org 1556e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org ASSERT_TRUE(jsep_desc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); 1557e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org DataContentDescription* dcdesc = static_cast<DataContentDescription*>( 1558e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org jsep_desc.description()->GetContentDescriptionByName(kDataContentName)); 1559e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org 1560e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org const int kNewPort = 1234; 1561e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org cricket::DataCodec codec( 1562e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org cricket::kGoogleSctpDataCodecId, cricket::kGoogleSctpDataCodecName, 0); 1563e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org codec.SetParam(cricket::kCodecParamPort, kNewPort); 1564e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org dcdesc->AddOrReplaceCodec(codec); 1565e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org 1566e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org std::string message = webrtc::SdpSerialize(jsep_desc); 1567e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org 1568e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org std::string expected_sdp = kSdpString; 1569e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org expected_sdp.append(kSdpSctpDataChannelString); 1570e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org 1571e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org char default_portstr[16]; 1572e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org char new_portstr[16]; 15732a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::sprintfn(default_portstr, sizeof(default_portstr), "%d", 1574e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org kDefaultSctpPort); 15752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::sprintfn(new_portstr, sizeof(new_portstr), "%d", kNewPort); 15762a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(default_portstr, strlen(default_portstr), 1577e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org new_portstr, strlen(new_portstr), 1578e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org &expected_sdp); 1579e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org 1580e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org EXPECT_EQ(expected_sdp, message); 1581e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org} 1582e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org 1583952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithDataChannelAndBandwidth) { 1584952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org AddRtpDataChannel(); 1585952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org data_desc_->set_bandwidth(100*1000); 1586952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org JsepSessionDescription jsep_desc(kDummyString); 1587952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 1588952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org ASSERT_TRUE(jsep_desc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); 1589952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org std::string message = webrtc::SdpSerialize(jsep_desc); 1590952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 1591952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org std::string expected_sdp = kSdpString; 1592952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org expected_sdp.append(kSdpRtpDataChannelString); 1593952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org // We want to test that serializing data content ignores bandwidth 1594952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org // settings (it should always be the default). Thus, we don't do 1595952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org // the following: 1596ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org // TODO(pthatcher): We need to temporarily allow the SDP to control 1597ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org // this for backwards-compatibility. Once we don't need that any 1598ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org // more, remove this. 1599c7db5943563a06c37011670185bffde17b0bbdc9wu@webrtc.org InjectAfter("m=application 1 RTP/SAVPF 101\r\nc=IN IP4 0.0.0.0\r\n", 1600ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org "b=AS:100\r\n", 1601ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org &expected_sdp); 1602ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org EXPECT_EQ(expected_sdp, message); 1603952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org} 1604952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 16050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithExtmap) { 16060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddExtmap(); 16070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription desc_with_extmap("dummy"); 16080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(desc_with_extmap.Initialize(desc_.Copy(), 16090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSessionId, kSessionVersion)); 16100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(desc_with_extmap); 16110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_extmap = kSdpString; 16130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter("a=mid:audio_content_name\r\n", 16140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kExtmap, &sdp_with_extmap); 16150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter("a=mid:video_content_name\r\n", 16160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kExtmap, &sdp_with_extmap); 16170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(sdp_with_extmap, message); 16190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16217587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithBufferLatency) { 16227587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org VideoContentDescription* vcd = static_cast<VideoContentDescription*>( 16237587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org GetFirstVideoContent(&desc_)->description); 16247587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org vcd->set_buffered_mode_latency(128); 16257587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 16267587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), 16277587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org jdesc_.session_id(), 16287587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org jdesc_.session_version())); 16297587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc_); 16307587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org std::string sdp_with_buffer_latency = kSdpFullString; 16317587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org InjectAfter("a=rtpmap:120 VP8/90000\r\n", 16327587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "a=x-google-buffer-latency:128\r\n", 16337587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org &sdp_with_buffer_latency); 16347587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(sdp_with_buffer_latency, message); 16357587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org} 16360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeCandidates) { 16380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerializeCandidate(*jcandidate_); 16396eff6e06a8e4876a430c9af7d0d5753ba31599d9wu@webrtc.org EXPECT_EQ(std::string(kRawCandidate), message); 16400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 164258c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org// TODO(mallinath) : Enable this test once WebRTCSdp capable of parsing 164358c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org// RFC 6544. 1644eea342ea2f4dba9a37e956a59e3a0643cedf8102mallinath@webrtc.orgTEST_F(WebRtcSdpTest, SerializeTcpCandidates) { 164558c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org Candidate candidate( 164658c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "", ICE_CANDIDATE_COMPONENT_RTP, "tcp", 164758c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org rtc::SocketAddress("192.168.1.5", 9), kCandidatePriority, 164858c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "", "", LOCAL_PORT_TYPE, 164958c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "", kCandidateGeneration, kCandidateFoundation1); 165058c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org candidate.set_tcptype(cricket::TCPTYPE_ACTIVE_STR); 165158c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org rtc::scoped_ptr<IceCandidateInterface> jcandidate( 165258c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org new JsepIceCandidate(std::string("audio_content_name"), 0, candidate)); 165358c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org 165458c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org std::string message = webrtc::SdpSerializeCandidate(*jcandidate); 165558c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org EXPECT_EQ(std::string(kSdpTcpActiveCandidate), message); 165658c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org} 165758c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org 16580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescription) { 16590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc(kDummyString); 16600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Deserialize 16610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(kSdpFullString, &jdesc)); 16620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify 16630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc)); 16640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1666d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutMline) { 1667d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org JsepSessionDescription jdesc(kDummyString); 1668d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org const char kSdpWithoutMline[] = 1669d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org "v=0\r\n" 1670d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" 1671d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org "s=-\r\n" 1672d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org "t=0 0\r\n" 1673d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org "a=msid-semantic: WMS local_stream_1 local_stream_2\r\n"; 1674d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // Deserialize 1675d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org EXPECT_TRUE(SdpDeserialize(kSdpWithoutMline, &jdesc)); 1676d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org EXPECT_EQ(0u, jdesc.description()->contents().size()); 1677d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org} 1678d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org 16790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutCarriageReturn) { 16800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc(kDummyString); 16810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_without_carriage_return = kSdpFullString; 16820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace("\r\n", "\n", &sdp_without_carriage_return); 16830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Deserialize 16840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_without_carriage_return, &jdesc)); 16850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify 16860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc)); 16870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutCandidates) { 16900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SessionDescription with desc but without candidates. 16910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_no_candidates(kDummyString); 16920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc_no_candidates.Initialize(desc_.Copy(), 16930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kSessionId, kSessionVersion)); 16940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription new_jdesc(kDummyString); 16950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(kSdpString, &new_jdesc)); 16960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_no_candidates, new_jdesc)); 16970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutRtpmap) { 17000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static const char kSdpNoRtpmapString[] = 17010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 17020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 11 22 IN IP4 127.0.0.1\r\n" 17030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 17040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 17050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 49232 RTP/AVP 0 18 103\r\n" 17060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Codec that doesn't appear in the m= line will be ignored. 17070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:104 CELT/32000/2\r\n" 17080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The rtpmap line for static payload codec is optional. 17090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:18 G729/16000\r\n" 17100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n"; 17110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc(kDummyString); 17130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(kSdpNoRtpmapString, &jdesc)); 17140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioContentDescription* audio = 17150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<AudioContentDescription*>( 17160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc.description()->GetContentDescriptionByName(cricket::CN_AUDIO)); 17170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioCodecs ref_codecs; 17180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The codecs in the AudioContentDescription will be sorted by preference. 17190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ref_codecs.push_back(AudioCodec(0, "PCMU", 8000, 0, 1, 3)); 17200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ref_codecs.push_back(AudioCodec(18, "G729", 16000, 0, 1, 2)); 17210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ref_codecs.push_back(AudioCodec(103, "ISAC", 16000, 32000, 1, 1)); 17220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(ref_codecs, audio->codecs()); 17230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17257587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutRtpmapButWithFmtp) { 17267587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org static const char kSdpNoRtpmapString[] = 17277587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "v=0\r\n" 17287587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "o=- 11 22 IN IP4 127.0.0.1\r\n" 17297587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "s=-\r\n" 17307587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "t=0 0\r\n" 17317587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "m=audio 49232 RTP/AVP 18 103\r\n" 17327587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "a=fmtp:18 annexb=yes\r\n" 17337587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n"; 17347587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 17357587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org JsepSessionDescription jdesc(kDummyString); 17367587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_TRUE(SdpDeserialize(kSdpNoRtpmapString, &jdesc)); 17377587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org cricket::AudioContentDescription* audio = 17387587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org static_cast<AudioContentDescription*>( 17397587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org jdesc.description()->GetContentDescriptionByName(cricket::CN_AUDIO)); 17407587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 17417587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org cricket::AudioCodec g729 = audio->codecs()[0]; 17427587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ("G729", g729.name); 17437587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(8000, g729.clockrate); 17447587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(18, g729.id); 17457587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org cricket::CodecParameterMap::iterator found = 17467587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org g729.params.find("annexb"); 17477587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org ASSERT_TRUE(found != g729.params.end()); 17487587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(found->second, "yes"); 17497587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 17507587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org cricket::AudioCodec isac = audio->codecs()[1]; 17517587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ("ISAC", isac.name); 17527587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(103, isac.id); 17537587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(16000, isac.clockrate); 17547587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org} 17557587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 17560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Ensure that we can deserialize SDP with a=fingerprint properly. 17570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeJsepSessionDescriptionWithFingerprint) { 17580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Add a DTLS a=fingerprint attribute to our session description. 17590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddFingerprint(); 17600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription new_jdesc(kDummyString); 17610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(new_jdesc.Initialize(desc_.Copy(), 17620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 17630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())); 17640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_with_fingerprint(kDummyString); 17660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_fingerprint = kSdpString; 17670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVoice, kFingerprint, &sdp_with_fingerprint); 17680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVideo, kFingerprint, &sdp_with_fingerprint); 17690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_fingerprint, &jdesc_with_fingerprint)); 17700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_with_fingerprint, new_jdesc)); 17710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithBundle) { 17740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_with_bundle(kDummyString); 17750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_bundle = kSdpFullString; 17760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kSessionTime, 17770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=group:BUNDLE audio_content_name video_content_name\r\n", 17780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_bundle); 17790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_bundle, &jdesc_with_bundle)); 17800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ContentGroup group(cricket::GROUP_TYPE_BUNDLE); 17810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org group.AddContentName(kAudioContentName); 17820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org group.AddContentName(kVideoContentName); 17830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_.AddGroup(group); 17840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), 17850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 17860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())); 17870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_bundle)); 17880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithBandwidth) { 17910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_with_bandwidth(kDummyString); 17920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_bandwidth = kSdpFullString; 17930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter("a=mid:video_content_name\r\na=sendrecv\r\n", 17940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "b=AS:100\r\n", 17950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_bandwidth); 17960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter("a=mid:audio_content_name\r\na=sendrecv\r\n", 17970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "b=AS:50\r\n", 17980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_bandwidth); 17990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE( 18000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SdpDeserialize(sdp_with_bandwidth, &jdesc_with_bandwidth)); 18010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoContentDescription* vcd = static_cast<VideoContentDescription*>( 18020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org GetFirstVideoContent(&desc_)->description); 18030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org vcd->set_bandwidth(100 * 1000); 18040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioContentDescription* acd = static_cast<AudioContentDescription*>( 18050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org GetFirstAudioContent(&desc_)->description); 18060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org acd->set_bandwidth(50 * 1000); 18070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), 18080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 18090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())); 18100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_bandwidth)); 18110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithIceOptions) { 18140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_with_ice_options(kDummyString); 18150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_ice_options = kSdpFullString; 18160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kSessionTime, 18170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-options:iceoption3\r\n", 18180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_ice_options); 18190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVoice, 18200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-options:iceoption1\r\n", 18210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_ice_options); 18220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kAttributeIcePwdVideo, 18230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-options:iceoption2\r\n", 18240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_ice_options); 18250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_ice_options, &jdesc_with_ice_options)); 18260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<std::string> transport_options; 18270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_options.push_back(kIceOption3); 18280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_options.push_back(kIceOption1); 18290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddIceOptions(kAudioContentName, transport_options); 18300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_options.clear(); 18310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_options.push_back(kIceOption3); 18320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org transport_options.push_back(kIceOption2); 18330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddIceOptions(kVideoContentName, transport_options); 18340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), 18350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 18360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())); 18370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_ice_options)); 18380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithUfragPwd) { 18410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Remove the original ice-ufrag and ice-pwd 18420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_with_ufrag_pwd(kDummyString); 18430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_ufrag_pwd = kSdpFullString; 18440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(RemoveCandidateUfragPwd(&sdp_with_ufrag_pwd)); 18450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Add session level ufrag and pwd 18460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kSessionTime, 18470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-pwd:session+level+icepwd\r\n" 18480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-ufrag:session+level+iceufrag\r\n", 18490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_ufrag_pwd); 18500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Add media level ufrag and pwd for audio 18510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter("a=mid:audio_content_name\r\n", 18520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-pwd:media+level+icepwd\r\na=ice-ufrag:media+level+iceufrag\r\n", 18530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_ufrag_pwd); 18540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Update the candidate ufrag and pwd to the expected ones. 18550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(UpdateCandidateUfragPwd(&jdesc_, 0, 18560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "media+level+iceufrag", "media+level+icepwd")); 18570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(UpdateCandidateUfragPwd(&jdesc_, 1, 18580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "session+level+iceufrag", "session+level+icepwd")); 18590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_ufrag_pwd, &jdesc_with_ufrag_pwd)); 18600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_ufrag_pwd)); 18610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18637587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithBufferLatency) { 18647587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org JsepSessionDescription jdesc_with_buffer_latency(kDummyString); 18657587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org std::string sdp_with_buffer_latency = kSdpFullString; 18667587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org InjectAfter("a=rtpmap:120 VP8/90000\r\n", 18677587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org "a=x-google-buffer-latency:128\r\n", 18687587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org &sdp_with_buffer_latency); 18697587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 18707587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_TRUE( 18717587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org SdpDeserialize(sdp_with_buffer_latency, &jdesc_with_buffer_latency)); 18727587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org VideoContentDescription* vcd = static_cast<VideoContentDescription*>( 18737587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org GetFirstVideoContent(&desc_)->description); 18747587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org vcd->set_buffered_mode_latency(128); 18757587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), 18767587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org jdesc_.session_id(), 18777587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org jdesc_.session_version())); 18787587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_buffer_latency)); 18797587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org} 18800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithRecvOnlyContent) { 18820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestDeserializeDirection(cricket::MD_RECVONLY)); 18830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithSendOnlyContent) { 18860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestDeserializeDirection(cricket::MD_SENDONLY)); 18870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithInactiveContent) { 18900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestDeserializeDirection(cricket::MD_INACTIVE)); 18910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithRejectedAudio) { 18940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestDeserializeRejected(true, false)); 18950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithRejectedVideo) { 18980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestDeserializeRejected(false, true)); 18990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 19000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithRejectedAudioVideo) { 19020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(TestDeserializeRejected(true, true)); 19030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 19040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that we can still handle the sdp uses mslabel and label instead of 19060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// msid for backward compatibility. 19070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutMsid) { 19080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc(kDummyString); 19090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_without_msid = kSdpFullString; 19100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace("msid", "xmsid", &sdp_without_msid); 19110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Deserialize 19120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_without_msid, &jdesc)); 19130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify 19140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc)); 19150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 19160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeCandidate) { 19180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate jcandidate(kDummyMid, kDummyIndex); 19190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp = kSdpOneCandidate; 19210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate)); 19220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyMid, jcandidate.sdp_mid()); 19230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index()); 19240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(jcandidate.candidate().IsEquivalent(jcandidate_->candidate())); 19250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Candidate line without generation extension. 19270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp = kSdpOneCandidate; 19280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace(" generation 2", "", &sdp); 19290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate)); 19300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyMid, jcandidate.sdp_mid()); 19310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index()); 19320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Candidate expected = jcandidate_->candidate(); 19330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected.set_generation(0); 19340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(jcandidate.candidate().IsEquivalent(expected)); 19350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 193658c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org sdp = kSdpTcpActiveCandidate; 193758c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate)); 193858c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org // Make a cricket::Candidate equivalent to kSdpTcpCandidate string. 193958c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org Candidate candidate( 194058c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "", ICE_CANDIDATE_COMPONENT_RTP, "tcp", 194158c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org rtc::SocketAddress("192.168.1.5", 9), kCandidatePriority, 194258c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "", "", LOCAL_PORT_TYPE, 194358c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org "", kCandidateGeneration, kCandidateFoundation1); 194458c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org rtc::scoped_ptr<IceCandidateInterface> jcandidate_template( 194558c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org new JsepIceCandidate(std::string("audio_content_name"), 0, candidate)); 194658c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org EXPECT_TRUE(jcandidate.candidate().IsEquivalent( 194758c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org jcandidate_template->candidate())); 194858c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org sdp = kSdpTcpPassiveCandidate; 194958c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate)); 195058c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org sdp = kSdpTcpSOCandidate; 195158c89b128d6e4dbe00a9a18bb3029f63bd43ce6dmallinath@webrtc.org EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate)); 19520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 19530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test verifies the deserialization of candidate-attribute 19550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// as per RFC 5245. Candiate-attribute will be of the format 19560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// candidate:<blah>. This format will be used when candidates 19570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// are trickled. 19580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeRawCandidateAttribute) { 19590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate jcandidate(kDummyMid, kDummyIndex); 19600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string candidate_attribute = kRawCandidate; 19620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserializeCandidate(candidate_attribute, &jcandidate)); 19630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyMid, jcandidate.sdp_mid()); 19640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index()); 19650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(jcandidate.candidate().IsEquivalent(jcandidate_->candidate())); 19660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2u, jcandidate.candidate().generation()); 19670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Candidate line without generation extension. 19690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate_attribute = kRawCandidate; 19700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace(" generation 2", "", &candidate_attribute); 19710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserializeCandidate(candidate_attribute, &jcandidate)); 19720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyMid, jcandidate.sdp_mid()); 19730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index()); 19740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Candidate expected = jcandidate_->candidate(); 19750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected.set_generation(0); 19760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(jcandidate.candidate().IsEquivalent(expected)); 19770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 19780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Candidate line without candidate: 19790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate_attribute = kRawCandidate; 19800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace("candidate:", "", &candidate_attribute); 19810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(SdpDeserializeCandidate(candidate_attribute, &jcandidate)); 19820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1983c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org // Candidate line with IPV6 address. 1984c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org EXPECT_TRUE(SdpDeserializeCandidate(kRawIPV6Candidate, &jcandidate)); 1985c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org} 1986c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org 1987c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org// This test verifies that the deserialization of an invalid candidate string 1988c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org// fails. 1989c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeInvalidCandidiate) { 1990c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org JsepIceCandidate jcandidate(kDummyMid, kDummyIndex); 1991c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org 1992c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org std::string candidate_attribute = kRawCandidate; 1993c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org candidate_attribute.replace(0, 1, "x"); 1994c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org EXPECT_FALSE(SdpDeserializeCandidate(candidate_attribute, &jcandidate)); 1995c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org 1996c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org candidate_attribute = kSdpOneCandidate; 1997c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org candidate_attribute.replace(0, 1, "x"); 1998c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org EXPECT_FALSE(SdpDeserializeCandidate(candidate_attribute, &jcandidate)); 1999c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org 20000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidate_attribute = kRawCandidate; 2001c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org candidate_attribute.append("\r\n"); 2002c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org candidate_attribute.append(kRawCandidate); 20030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(SdpDeserializeCandidate(candidate_attribute, &jcandidate)); 2004c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org 2005c639043513e5fc14994aaa32ad95da3c5bf33fdajiayl@webrtc.org EXPECT_FALSE(SdpDeserializeCandidate(kSdpTcpInvalidCandidate, &jcandidate)); 20060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 20070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSdpWithRtpDataChannels) { 20090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddRtpDataChannel(); 20100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc(kDummyString); 20110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); 20120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_data = kSdpString; 20140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp_with_data.append(kSdpRtpDataChannelString); 20150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 20160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Deserialize 20180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output)); 20190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify 20200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output)); 20210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 20220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSdpWithSctpDataChannels) { 20240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AddSctpDataChannel(); 20250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc(kDummyString); 20260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); 20270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_data = kSdpString; 20290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp_with_data.append(kSdpSctpDataChannelString); 20300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 20310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output)); 20330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output)); 20340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 20350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20366ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSdpWithSctpDataChannelsWithSctpPort) { 20376ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org AddSctpDataChannel(); 20386ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org JsepSessionDescription jdesc(kDummyString); 20396ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); 20406ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org 20416ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org std::string sdp_with_data = kSdpString; 20426ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org sdp_with_data.append(kSdpSctpDataChannelStringWithSctpPort); 20436ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 20446ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org 20456ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output)); 20466ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output)); 20476ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org} 20486ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org 20496ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org// Test to check the behaviour if sctp-port is specified 20506ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org// on the m= line and in a=sctp-port. 20516ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSdpWithMultiSctpPort) { 20526ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org AddSctpDataChannel(); 20536ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org JsepSessionDescription jdesc(kDummyString); 20546ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); 20556ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org 20566ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org std::string sdp_with_data = kSdpString; 20576ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org // Append m= attributes 20586ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org sdp_with_data.append(kSdpSctpDataChannelString); 20596ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org // Append a=sctp-port attribute 20606ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org sdp_with_data.append("a=sctp-port 5000\r\n"); 20616ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 20626ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org 20636ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org EXPECT_FALSE(SdpDeserialize(sdp_with_data, &jdesc_output)); 20646ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org} 20656ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org 20667d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.org// For crbug/344475. 20677d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSdpWithCorruptedSctpDataChannels) { 20687d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.org std::string sdp_with_data = kSdpString; 20697d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.org sdp_with_data.append(kSdpSctpDataChannelString); 20707d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.org // Remove the "\n" at the end. 20717d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.org sdp_with_data = sdp_with_data.substr(0, sdp_with_data.size() - 1); 20727d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 20737d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.org 20747d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.org EXPECT_FALSE(SdpDeserialize(sdp_with_data, &jdesc_output)); 20757d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.org // No crash is a pass. 20767d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.org} 20777d26043da4e02517e5d3eebb50d5e791e64c4f3chenrike@webrtc.org 2078861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSdpWithSctpDataChannelAndNewPort) { 2079861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org AddSctpDataChannel(); 2080861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org const uint16 kUnusualSctpPort = 9556; 2081861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org char default_portstr[16]; 2082861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org char unusual_portstr[16]; 20832a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::sprintfn(default_portstr, sizeof(default_portstr), "%d", 2084861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org kDefaultSctpPort); 20852a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::sprintfn(unusual_portstr, sizeof(unusual_portstr), "%d", 2086861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org kUnusualSctpPort); 2087861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org 2088e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org // First setup the expected JsepSessionDescription. 2089861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org JsepSessionDescription jdesc(kDummyString); 2090861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org // take our pre-built session description and change the SCTP port. 2091861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org cricket::SessionDescription* mutant = desc_.Copy(); 2092861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org DataContentDescription* dcdesc = static_cast<DataContentDescription*>( 2093861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org mutant->GetContentDescriptionByName(kDataContentName)); 2094861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org std::vector<cricket::DataCodec> codecs(dcdesc->codecs()); 2095861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_EQ(codecs.size(), 1UL); 2096861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_EQ(codecs[0].id, cricket::kGoogleSctpDataCodecId); 2097861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org codecs[0].SetParam(cricket::kCodecParamPort, kUnusualSctpPort); 2098e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org dcdesc->set_codecs(codecs); 2099861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org 2100861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org // note: mutant's owned by jdesc now. 2101861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org ASSERT_TRUE(jdesc.Initialize(mutant, kSessionId, kSessionVersion)); 2102861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org mutant = NULL; 2103861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org 2104e4b3e8d10bdf1e112408887533f57c2667f1f7aejiayl@webrtc.org // Then get the deserialized JsepSessionDescription. 2105861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org std::string sdp_with_data = kSdpString; 2106861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org sdp_with_data.append(kSdpSctpDataChannelString); 21072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::replace_substrs(default_portstr, strlen(default_portstr), 2108861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org unusual_portstr, strlen(unusual_portstr), 2109861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org &sdp_with_data); 2110861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 2111861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org 2112861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output)); 2113861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output)); 21146ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org 21156ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org // We need to test the deserialized JsepSessionDescription from 21166ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org // kSdpSctpDataChannelStringWithSctpPort for 21176ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org // draft-ietf-mmusic-sctp-sdp-07 21186ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org // a=sctp-port 21196ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org sdp_with_data = kSdpString; 21206ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org sdp_with_data.append(kSdpSctpDataChannelStringWithSctpPort); 21216ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org rtc::replace_substrs(default_portstr, strlen(default_portstr), 21226ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org unusual_portstr, strlen(unusual_portstr), 21236ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org &sdp_with_data); 21246ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org 21256ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output)); 21266ea7f028683dcb7195a2a12ca2105d90350f8e03jiayl@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output)); 2127861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org} 2128861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org 2129952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSdpWithRtpDataChannelsAndBandwidth) { 2130952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org AddRtpDataChannel(); 2131952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org JsepSessionDescription jdesc(kDummyString); 2132952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org // We want to test that deserializing data content ignores bandwidth 2133952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org // settings (it should always be the default). Thus, we don't do 2134952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org // the following: 2135ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org // TODO(pthatcher): We need to temporarily allow the SDP to control 2136ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org // this for backwards-compatibility. Once we don't need that any 2137ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org // more, remove this. 2138ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org DataContentDescription* dcd = static_cast<DataContentDescription*>( 2139ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org GetFirstDataContent(&desc_)->description); 2140ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org dcd->set_bandwidth(100 * 1000); 2141952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); 2142952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 2143952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org std::string sdp_with_bandwidth = kSdpString; 2144952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org sdp_with_bandwidth.append(kSdpRtpDataChannelString); 2145952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org InjectAfter("a=mid:data_content_name\r\n", 2146952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org "b=AS:100\r\n", 2147952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org &sdp_with_bandwidth); 2148952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org JsepSessionDescription jdesc_with_bandwidth(kDummyString); 2149952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 2150952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE( 2151952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org SdpDeserialize(sdp_with_bandwidth, &jdesc_with_bandwidth)); 2152952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_with_bandwidth)); 2153952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org} 2154952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 21550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithSessionLevelExtmap) { 21560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestDeserializeExtmap(true, false); 21570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithMediaLevelExtmap) { 21600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestDeserializeExtmap(false, true); 21610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithInvalidExtmap) { 21640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestDeserializeExtmap(true, true); 21650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 216797fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.orgTEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutEndLineBreak) { 216897fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org JsepSessionDescription jdesc(kDummyString); 216997fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org std::string sdp = kSdpFullString; 217097fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org sdp = sdp.substr(0, sdp.size() - 2); // Remove \r\n at the end. 217197fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org // Deserialize 217297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org SdpParseError error; 217397fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org EXPECT_FALSE(webrtc::SdpDeserialize(sdp, &jdesc, &error)); 217497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org const std::string lastline = "a=ssrc:6 label:video_track_id_3"; 217597fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org EXPECT_EQ(lastline, error.line); 217697fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org EXPECT_EQ("Invalid SDP line.", error.description); 217797fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org} 217897fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org 21790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeCandidateWithDifferentTransport) { 21800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate jcandidate(kDummyMid, kDummyIndex); 21810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string new_sdp = kSdpOneCandidate; 21820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace("udp", "unsupported_transport", &new_sdp); 21830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(SdpDeserializeCandidate(new_sdp, &jcandidate)); 21840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new_sdp = kSdpOneCandidate; 21850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Replace("udp", "uDP", &new_sdp); 21860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserializeCandidate(new_sdp, &jcandidate)); 21870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyMid, jcandidate.sdp_mid()); 21880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index()); 21890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(jcandidate.candidate().IsEquivalent(jcandidate_->candidate())); 21900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeCandidateOldFormat) { 21930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepIceCandidate jcandidate(kDummyMid, kDummyIndex); 21940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserializeCandidate(kSdpOneCandidateOldFormat,&jcandidate)); 21950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyMid, jcandidate.sdp_mid()); 21960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index()); 21970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Candidate ref_candidate = jcandidate_->candidate(); 21980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ref_candidate.set_username("user_rtp"); 21990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ref_candidate.set_password("password_rtp"); 22000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(jcandidate.candidate().IsEquivalent(ref_candidate)); 22010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 22020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22037587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSdpWithConferenceFlag) { 22047587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org JsepSessionDescription jdesc(kDummyString); 22057587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 22067587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org // Deserialize 22077587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_TRUE(SdpDeserialize(kSdpConferenceString, &jdesc)); 22087587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 22097587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org // Verify 22107587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org cricket::AudioContentDescription* audio = 22117587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org static_cast<AudioContentDescription*>( 22127587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org jdesc.description()->GetContentDescriptionByName(cricket::CN_AUDIO)); 22137587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_TRUE(audio->conference_mode()); 22147587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 22157587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org cricket::VideoContentDescription* video = 22167587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org static_cast<VideoContentDescription*>( 22177587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org jdesc.description()->GetContentDescriptionByName(cricket::CN_VIDEO)); 22187587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_TRUE(video->conference_mode()); 22197587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org} 22207587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 22210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeBrokenSdp) { 22220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char kSdpDestroyer[] = "!@#$%^&"; 22230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char kSdpInvalidLine1[] = " =candidate"; 22240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char kSdpInvalidLine2[] = "a+candidate"; 22250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char kSdpInvalidLine3[] = "a= candidate"; 22260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Broken fingerprint. 22270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char kSdpInvalidLine4[] = "a=fingerprint:sha-1 " 22280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "4AAD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB"; 22290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Extra field. 22300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char kSdpInvalidLine5[] = "a=fingerprint:sha-1 " 22310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB XXX"; 22320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Missing space. 22330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char kSdpInvalidLine6[] = "a=fingerprint:sha-1" 22340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB"; 22358485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org // MD5 is not allowed in fingerprints. 22368485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org const char kSdpInvalidLine7[] = "a=fingerprint:md5 " 22378485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B"; 22380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Broken session description 2240de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("v=", kSdpDestroyer); 2241de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("o=", kSdpDestroyer); 2242de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("s=-", kSdpDestroyer); 22430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Broken time description 2244de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("t=", kSdpDestroyer); 22450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Broken media description 2247de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("m=audio", "c=IN IP4 74.125.224.39"); 2248de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("m=video", kSdpDestroyer); 22490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Invalid lines 2251de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("a=candidate", kSdpInvalidLine1); 2252de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("a=candidate", kSdpInvalidLine2); 2253de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("a=candidate", kSdpInvalidLine3); 22540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Bogus fingerprint replacing a=sendrev. We selected this attribute 22560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // because it's orthogonal to what we are replacing and hence 22570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // safe. 2258de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("a=sendrecv", kSdpInvalidLine4); 2259de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("a=sendrecv", kSdpInvalidLine5); 2260de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("a=sendrecv", kSdpInvalidLine6); 2261de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("a=sendrecv", kSdpInvalidLine7); 2262de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org} 2263de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org 2264de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSdpWithInvalidAttributeValue) { 2265de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org // ssrc 2266de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("a=ssrc:1", "a=ssrc:badvalue"); 2267de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("a=ssrc-group:FEC 5 6", "a=ssrc-group:FEC badvalue 6"); 2268de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org // crypto 2269de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("a=crypto:1 ", "a=crypto:badvalue "); 2270de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org // rtpmap 2271de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("a=rtpmap:111 ", "a=rtpmap:badvalue "); 2272de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("opus/48000/2", "opus/badvalue/2"); 2273de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("opus/48000/2", "opus/48000/badvalue"); 2274de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org // candidate 2275de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("1 udp 2130706432", "badvalue udp 2130706432"); 2276de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("1 udp 2130706432", "1 udp badvalue"); 2277de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("192.168.1.5 1234", "192.168.1.5 badvalue"); 2278de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("rport 2346", "rport badvalue"); 2279de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("rport 2346 generation 2", 2280de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org "rport 2346 generation badvalue"); 2281de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org // m line 2282de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailure("m=audio 2345 RTP/SAVPF 111 103 104", 2283de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org "m=audio 2345 RTP/SAVPF 111 badvalue 104"); 2284de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org 2285de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org // bandwidth 2286de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailureWithNewLines("a=mid:video_content_name\r\n", 2287de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org "b=AS:badvalue\r\n", 2288de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org "b=AS:badvalue"); 2289de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org // rtcp-fb 2290de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailureWithNewLines("a=mid:video_content_name\r\n", 2291de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org "a=rtcp-fb:badvalue nack\r\n", 2292de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org "a=rtcp-fb:badvalue nack"); 2293de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org // extmap 2294de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailureWithNewLines("a=mid:video_content_name\r\n", 2295de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org "a=extmap:badvalue http://example.com\r\n", 2296de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org "a=extmap:badvalue http://example.com"); 2297de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org // x-google-buffer-latency 2298de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org ExpectParseFailureWithNewLines("a=mid:video_content_name\r\n", 2299de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org "a=x-google-buffer-latency:badvalue\r\n", 2300de1f65c1967ddaaaecf964e78b59bb929cd8dd2bwu@webrtc.org "a=x-google-buffer-latency:badvalue"); 23010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSdpWithReorderedPltypes) { 23040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 23050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char kSdpWithReorderedPlTypesString[] = 23070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 23080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" 23090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 23100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 23110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=audio 1 RTP/SAVPF 104 103\r\n" // Pl type 104 preferred. 23120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:111 opus/48000/2\r\n" // Pltype 111 listed before 103 and 104 23130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // in the map. 23140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:103 ISAC/16000\r\n" // Pltype 103 listed before 104 in the map. 23150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:104 CELT/32000/2\r\n"; 23160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Deserialize 23180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(kSdpWithReorderedPlTypesString, &jdesc_output)); 23190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ContentInfo* ac = GetFirstAudioContent(jdesc_output.description()); 23210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(ac != NULL); 23220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const AudioContentDescription* acd = 23230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const AudioContentDescription*>(ac->description); 23240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_FALSE(acd->codecs().empty()); 23250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("CELT", acd->codecs()[0].name); 23260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(104, acd->codecs()[0].id); 23270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSerializeCodecParams) { 23300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 23310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CodecParams params; 23320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org params.max_ptime = 40; 23330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org params.ptime = 30; 23340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org params.min_ptime = 10; 23350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org params.sprop_stereo = 1; 23360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org params.stereo = 1; 23370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org params.useinband = 1; 23387162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org params.maxaveragebitrate = 128000; 23390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestDeserializeCodecParams(params, &jdesc_output); 23400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestSerialize(jdesc_output); 23410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSerializeRtcpFb) { 23440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const bool kUseWildcard = false; 23450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 23460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestDeserializeRtcpFb(&jdesc_output, kUseWildcard); 23470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestSerialize(jdesc_output); 23480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSerializeRtcpFbWildcard) { 23510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const bool kUseWildcard = true; 23520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 23530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestDeserializeRtcpFb(&jdesc_output, kUseWildcard); 23540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestSerialize(jdesc_output); 23550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeVideoFmtp) { 23580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 23590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char kSdpWithFmtpString[] = 23610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "v=0\r\n" 23620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" 23630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "s=-\r\n" 23640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "t=0 0\r\n" 23650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "m=video 3457 RTP/SAVPF 120\r\n" 23660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=rtpmap:120 VP8/90000\r\n" 23670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=fmtp:120 x-google-min-bitrate=10; x-google-max-quantization=40\r\n"; 23680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Deserialize 23700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SdpParseError error; 23710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(webrtc::SdpDeserialize(kSdpWithFmtpString, &jdesc_output, 23720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &error)); 23730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ContentInfo* vc = GetFirstVideoContent(jdesc_output.description()); 23750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(vc != NULL); 23760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const VideoContentDescription* vcd = 23770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const VideoContentDescription*>(vc->description); 23780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_FALSE(vcd->codecs().empty()); 23790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VideoCodec vp8 = vcd->codecs()[0]; 23800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("VP8", vp8.name); 23810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(120, vp8.id); 23820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::CodecParameterMap::iterator found = 23830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org vp8.params.find("x-google-min-bitrate"); 23840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(found != vp8.params.end()); 23850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(found->second, "10"); 23860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org found = vp8.params.find("x-google-max-quantization"); 23870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(found != vp8.params.end()); 23880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(found->second, "40"); 23890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, SerializeVideoFmtp) { 23920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoContentDescription* vcd = static_cast<VideoContentDescription*>( 23930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org GetFirstVideoContent(&desc_)->description); 23940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VideoCodecs codecs = vcd->codecs(); 23960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params["x-google-min-bitrate"] = "10"; 23970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org vcd->set_codecs(codecs); 23980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), 24000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_id(), 24010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org jdesc_.session_version())); 24020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string message = webrtc::SdpSerialize(jdesc_); 24030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_fmtp = kSdpFullString; 24040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter("a=rtpmap:120 VP8/90000\r\n", 24050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=fmtp:120 x-google-min-bitrate=10\r\n", 24060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_fmtp); 24070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(sdp_with_fmtp, message); 24080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 24090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, DeserializeSdpWithIceLite) { 24110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_with_icelite(kDummyString); 24120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_icelite = kSdpFullString; 24130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_icelite, &jdesc_with_icelite)); 24140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SessionDescription* desc = jdesc_with_icelite.description(); 24150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::TransportInfo* tinfo1 = 24160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc->GetTransportInfoByName("audio_content_name"); 24170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::ICEMODE_FULL, tinfo1->description.ice_mode); 24180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::TransportInfo* tinfo2 = 24190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc->GetTransportInfoByName("video_content_name"); 24200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::ICEMODE_FULL, tinfo2->description.ice_mode); 24210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org InjectAfter(kSessionTime, 24220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "a=ice-lite\r\n", 24230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &sdp_with_icelite); 24240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_icelite, &jdesc_with_icelite)); 24250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc = jdesc_with_icelite.description(); 24260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::TransportInfo* atinfo = 24270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc->GetTransportInfoByName("audio_content_name"); 24280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::ICEMODE_LITE, atinfo->description.ice_mode); 24290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::TransportInfo* vtinfo = 24300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc->GetTransportInfoByName("video_content_name"); 24310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::ICEMODE_LITE, vtinfo->description.ice_mode); 24320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 24330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifies that the candidates in the input SDP are parsed and serialized 24350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// correctly in the output SDP. 24360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcSdpTest, RoundTripSdpWithSctpDataChannelsWithCandidates) { 24370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string sdp_with_data = kSdpString; 24380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sdp_with_data.append(kSdpSctpDataChannelWithCandidatesString); 24390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org JsepSessionDescription jdesc_output(kDummyString); 24400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output)); 24420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(sdp_with_data, webrtc::SdpSerialize(jdesc_output)); 24430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2444a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org 2445a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.orgTEST_F(WebRtcSdpTest, SerializeDtlsSetupAttribute) { 2446a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org AddFingerprint(); 2447a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org TransportInfo audio_transport_info = 2448a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org *(desc_.GetTransportInfoByName(kAudioContentName)); 2449a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org EXPECT_EQ(cricket::CONNECTIONROLE_NONE, 2450a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org audio_transport_info.description.connection_role); 2451a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org audio_transport_info.description.connection_role = 2452a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org cricket::CONNECTIONROLE_ACTIVE; 2453a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org 2454a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org TransportInfo video_transport_info = 2455a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org *(desc_.GetTransportInfoByName(kVideoContentName)); 2456a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org EXPECT_EQ(cricket::CONNECTIONROLE_NONE, 2457a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org video_transport_info.description.connection_role); 2458a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org video_transport_info.description.connection_role = 2459a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org cricket::CONNECTIONROLE_ACTIVE; 2460a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org 2461a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org desc_.RemoveTransportInfoByName(kAudioContentName); 2462a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org desc_.RemoveTransportInfoByName(kVideoContentName); 2463a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org 2464a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org desc_.AddTransportInfo(audio_transport_info); 2465a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org desc_.AddTransportInfo(video_transport_info); 2466a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org 2467a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), 2468a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org jdesc_.session_id(), 2469a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org jdesc_.session_version())); 2470a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org std::string message = webrtc::SdpSerialize(jdesc_); 2471a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org std::string sdp_with_dtlssetup = kSdpFullString; 2472a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org 2473a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org // Fingerprint attribute is necessary to add DTLS setup attribute. 2474a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org InjectAfter(kAttributeIcePwdVoice, 2475a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org kFingerprint, &sdp_with_dtlssetup); 2476a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org InjectAfter(kAttributeIcePwdVideo, 2477a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org kFingerprint, &sdp_with_dtlssetup); 2478a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org // Now adding |setup| attribute. 2479a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org InjectAfter(kFingerprint, 2480a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org "a=setup:active\r\n", &sdp_with_dtlssetup); 2481a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org EXPECT_EQ(sdp_with_dtlssetup, message); 2482a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org} 2483a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org 2484a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.orgTEST_F(WebRtcSdpTest, DeserializeDtlsSetupAttribute) { 2485a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org JsepSessionDescription jdesc_with_dtlssetup(kDummyString); 2486a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org std::string sdp_with_dtlssetup = kSdpFullString; 2487a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org InjectAfter(kSessionTime, 2488a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org "a=setup:actpass\r\n", 2489a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org &sdp_with_dtlssetup); 2490a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org EXPECT_TRUE(SdpDeserialize(sdp_with_dtlssetup, &jdesc_with_dtlssetup)); 2491a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org cricket::SessionDescription* desc = jdesc_with_dtlssetup.description(); 2492a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org const cricket::TransportInfo* atinfo = 2493a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org desc->GetTransportInfoByName("audio_content_name"); 2494a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org EXPECT_EQ(cricket::CONNECTIONROLE_ACTPASS, 2495a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org atinfo->description.connection_role); 2496a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org const cricket::TransportInfo* vtinfo = 2497a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org desc->GetTransportInfoByName("video_content_name"); 2498a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org EXPECT_EQ(cricket::CONNECTIONROLE_ACTPASS, 2499a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org vtinfo->description.connection_role); 2500a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org} 25010a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org 25020a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org// Verifies that the order of the serialized m-lines follows the order of the 25030a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org// ContentInfo in SessionDescription, and vise versa for deserialization. 25040a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.orgTEST_F(WebRtcSdpTest, MediaContentOrderMaintainedRoundTrip) { 25050a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org JsepSessionDescription jdesc(kDummyString); 25060a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org const std::string media_content_sdps[3] = { 25070a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org kSdpAudioString, 25080a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org kSdpVideoString, 25090a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org kSdpSctpDataChannelString 25100a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org }; 25110a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org const cricket::MediaType media_types[3] = { 25120a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org cricket::MEDIA_TYPE_AUDIO, 25130a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org cricket::MEDIA_TYPE_VIDEO, 25140a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org cricket::MEDIA_TYPE_DATA 25150a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org }; 25160a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org 25170a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org // Verifies all 6 permutations. 25180a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org for (size_t i = 0; i < 6; ++i) { 25190a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org size_t media_content_in_sdp[3]; 25200a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org // The index of the first media content. 25210a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org media_content_in_sdp[0] = i / 2; 25220a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org // The index of the second media content. 25230a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org media_content_in_sdp[1] = (media_content_in_sdp[0] + i % 2 + 1) % 3; 25240a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org // The index of the third media content. 25250a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org media_content_in_sdp[2] = (media_content_in_sdp[0] + (i + 1) % 2 + 1) % 3; 25260a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org 25270a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org std::string sdp_string = kSdpSessionString; 25280a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org for (size_t i = 0; i < 3; ++i) 25290a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org sdp_string += media_content_sdps[media_content_in_sdp[i]]; 25300a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org 25310a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org EXPECT_TRUE(SdpDeserialize(sdp_string, &jdesc)); 25320a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org cricket::SessionDescription* desc = jdesc.description(); 25330a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org EXPECT_EQ(3u, desc->contents().size()); 25340a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org 25350a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org for (size_t i = 0; i < 3; ++i) { 25360a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org const cricket::MediaContentDescription* mdesc = 25370a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org static_cast<const cricket::MediaContentDescription*>( 25380a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org desc->contents()[i].description); 25390a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org EXPECT_EQ(media_types[media_content_in_sdp[i]], mdesc->type()); 25400a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org } 25410a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org 25420a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org std::string serialized_sdp = webrtc::SdpSerialize(jdesc); 25430a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org EXPECT_EQ(sdp_string, serialized_sdp); 25440a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org } 25450a4294d6d1ba13e6fc38e42d8646b115644570cfjiayl@webrtc.org} 2546