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