1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright 2012 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "api/jsep_session_description.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>
14*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
15*d9f75844SAndroid Build Coastguard Worker
16*d9f75844SAndroid Build Coastguard Worker #include <utility>
17*d9f75844SAndroid Build Coastguard Worker #include <vector>
18*d9f75844SAndroid Build Coastguard Worker
19*d9f75844SAndroid Build Coastguard Worker #include "api/candidate.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/jsep.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/jsep_ice_candidate.h"
22*d9f75844SAndroid Build Coastguard Worker #include "media/base/codec.h"
23*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/p2p_constants.h"
24*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/port.h"
25*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/transport_description.h"
26*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/transport_info.h"
27*d9f75844SAndroid Build Coastguard Worker #include "pc/session_description.h"
28*d9f75844SAndroid Build Coastguard Worker #include "pc/webrtc_sdp.h"
29*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/helpers.h"
30*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/net_helper.h"
31*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/socket_address.h"
32*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/string_encode.h"
33*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
34*d9f75844SAndroid Build Coastguard Worker
35*d9f75844SAndroid Build Coastguard Worker using cricket::MediaProtocolType;
36*d9f75844SAndroid Build Coastguard Worker using ::testing::Values;
37*d9f75844SAndroid Build Coastguard Worker using webrtc::IceCandidateCollection;
38*d9f75844SAndroid Build Coastguard Worker using webrtc::IceCandidateInterface;
39*d9f75844SAndroid Build Coastguard Worker using webrtc::JsepIceCandidate;
40*d9f75844SAndroid Build Coastguard Worker using webrtc::JsepSessionDescription;
41*d9f75844SAndroid Build Coastguard Worker using webrtc::SdpType;
42*d9f75844SAndroid Build Coastguard Worker using webrtc::SessionDescriptionInterface;
43*d9f75844SAndroid Build Coastguard Worker
44*d9f75844SAndroid Build Coastguard Worker static const char kCandidateUfrag[] = "ufrag";
45*d9f75844SAndroid Build Coastguard Worker static const char kCandidatePwd[] = "pwd";
46*d9f75844SAndroid Build Coastguard Worker static const char kCandidateUfragVoice[] = "ufrag_voice";
47*d9f75844SAndroid Build Coastguard Worker static const char kCandidatePwdVoice[] = "pwd_voice";
48*d9f75844SAndroid Build Coastguard Worker static const char kCandidateUfragVideo[] = "ufrag_video";
49*d9f75844SAndroid Build Coastguard Worker static const char kCandidatePwdVideo[] = "pwd_video";
50*d9f75844SAndroid Build Coastguard Worker static const char kCandidateFoundation[] = "a0+B/1";
51*d9f75844SAndroid Build Coastguard Worker static const uint32_t kCandidatePriority = 2130706432U; // pref = 1.0
52*d9f75844SAndroid Build Coastguard Worker static const uint32_t kCandidateGeneration = 2;
53*d9f75844SAndroid Build Coastguard Worker
54*d9f75844SAndroid Build Coastguard Worker // This creates a session description with both audio and video media contents.
55*d9f75844SAndroid Build Coastguard Worker // In SDP this is described by two m lines, one audio and one video.
56*d9f75844SAndroid Build Coastguard Worker static std::unique_ptr<cricket::SessionDescription>
CreateCricketSessionDescription()57*d9f75844SAndroid Build Coastguard Worker CreateCricketSessionDescription() {
58*d9f75844SAndroid Build Coastguard Worker auto desc = std::make_unique<cricket::SessionDescription>();
59*d9f75844SAndroid Build Coastguard Worker
60*d9f75844SAndroid Build Coastguard Worker // AudioContentDescription
61*d9f75844SAndroid Build Coastguard Worker auto audio = std::make_unique<cricket::AudioContentDescription>();
62*d9f75844SAndroid Build Coastguard Worker // VideoContentDescription
63*d9f75844SAndroid Build Coastguard Worker auto video = std::make_unique<cricket::VideoContentDescription>();
64*d9f75844SAndroid Build Coastguard Worker
65*d9f75844SAndroid Build Coastguard Worker audio->AddCodec(cricket::AudioCodec(103, "ISAC", 16000, 0, 0));
66*d9f75844SAndroid Build Coastguard Worker desc->AddContent(cricket::CN_AUDIO, MediaProtocolType::kRtp,
67*d9f75844SAndroid Build Coastguard Worker std::move(audio));
68*d9f75844SAndroid Build Coastguard Worker
69*d9f75844SAndroid Build Coastguard Worker video->AddCodec(cricket::VideoCodec(120, "VP8"));
70*d9f75844SAndroid Build Coastguard Worker desc->AddContent(cricket::CN_VIDEO, MediaProtocolType::kRtp,
71*d9f75844SAndroid Build Coastguard Worker std::move(video));
72*d9f75844SAndroid Build Coastguard Worker
73*d9f75844SAndroid Build Coastguard Worker desc->AddTransportInfo(cricket::TransportInfo(
74*d9f75844SAndroid Build Coastguard Worker cricket::CN_AUDIO,
75*d9f75844SAndroid Build Coastguard Worker cricket::TransportDescription(
76*d9f75844SAndroid Build Coastguard Worker std::vector<std::string>(), kCandidateUfragVoice, kCandidatePwdVoice,
77*d9f75844SAndroid Build Coastguard Worker cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_NONE, NULL)));
78*d9f75844SAndroid Build Coastguard Worker desc->AddTransportInfo(cricket::TransportInfo(
79*d9f75844SAndroid Build Coastguard Worker cricket::CN_VIDEO,
80*d9f75844SAndroid Build Coastguard Worker cricket::TransportDescription(
81*d9f75844SAndroid Build Coastguard Worker std::vector<std::string>(), kCandidateUfragVideo, kCandidatePwdVideo,
82*d9f75844SAndroid Build Coastguard Worker cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_NONE, NULL)));
83*d9f75844SAndroid Build Coastguard Worker return desc;
84*d9f75844SAndroid Build Coastguard Worker }
85*d9f75844SAndroid Build Coastguard Worker
86*d9f75844SAndroid Build Coastguard Worker class JsepSessionDescriptionTest : public ::testing::Test {
87*d9f75844SAndroid Build Coastguard Worker protected:
SetUp()88*d9f75844SAndroid Build Coastguard Worker virtual void SetUp() {
89*d9f75844SAndroid Build Coastguard Worker int port = 1234;
90*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress address("127.0.0.1", port++);
91*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate(cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
92*d9f75844SAndroid Build Coastguard Worker address, 1, "", "", "local", 0, "1");
93*d9f75844SAndroid Build Coastguard Worker candidate_ = candidate;
94*d9f75844SAndroid Build Coastguard Worker const std::string session_id = rtc::ToString(rtc::CreateRandomId64());
95*d9f75844SAndroid Build Coastguard Worker const std::string session_version = rtc::ToString(rtc::CreateRandomId());
96*d9f75844SAndroid Build Coastguard Worker jsep_desc_ = std::make_unique<JsepSessionDescription>(SdpType::kOffer);
97*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->Initialize(CreateCricketSessionDescription(),
98*d9f75844SAndroid Build Coastguard Worker session_id, session_version));
99*d9f75844SAndroid Build Coastguard Worker }
100*d9f75844SAndroid Build Coastguard Worker
Serialize(const SessionDescriptionInterface * desc)101*d9f75844SAndroid Build Coastguard Worker std::string Serialize(const SessionDescriptionInterface* desc) {
102*d9f75844SAndroid Build Coastguard Worker std::string sdp;
103*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(desc->ToString(&sdp));
104*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(sdp.empty());
105*d9f75844SAndroid Build Coastguard Worker return sdp;
106*d9f75844SAndroid Build Coastguard Worker }
107*d9f75844SAndroid Build Coastguard Worker
DeSerialize(const std::string & sdp)108*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<SessionDescriptionInterface> DeSerialize(
109*d9f75844SAndroid Build Coastguard Worker const std::string& sdp) {
110*d9f75844SAndroid Build Coastguard Worker auto jsep_desc = std::make_unique<JsepSessionDescription>(SdpType::kOffer);
111*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc::SdpDeserialize(sdp, jsep_desc.get(), nullptr));
112*d9f75844SAndroid Build Coastguard Worker return std::move(jsep_desc);
113*d9f75844SAndroid Build Coastguard Worker }
114*d9f75844SAndroid Build Coastguard Worker
115*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate_;
116*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<JsepSessionDescription> jsep_desc_;
117*d9f75844SAndroid Build Coastguard Worker };
118*d9f75844SAndroid Build Coastguard Worker
TEST_F(JsepSessionDescriptionTest,CloneDefault)119*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, CloneDefault) {
120*d9f75844SAndroid Build Coastguard Worker auto new_desc = jsep_desc_->Clone();
121*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(jsep_desc_->type(), new_desc->type());
122*d9f75844SAndroid Build Coastguard Worker std::string old_desc_string;
123*d9f75844SAndroid Build Coastguard Worker std::string new_desc_string;
124*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->ToString(&old_desc_string));
125*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(new_desc->ToString(&new_desc_string));
126*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(old_desc_string, new_desc_string);
127*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(jsep_desc_->session_id(), new_desc->session_id());
128*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(jsep_desc_->session_version(), new_desc->session_version());
129*d9f75844SAndroid Build Coastguard Worker }
130*d9f75844SAndroid Build Coastguard Worker
TEST_F(JsepSessionDescriptionTest,CloneRollback)131*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, CloneRollback) {
132*d9f75844SAndroid Build Coastguard Worker auto jsep_desc = std::make_unique<JsepSessionDescription>(SdpType::kRollback);
133*d9f75844SAndroid Build Coastguard Worker auto new_desc = jsep_desc->Clone();
134*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(jsep_desc->type(), new_desc->type());
135*d9f75844SAndroid Build Coastguard Worker }
136*d9f75844SAndroid Build Coastguard Worker
TEST_F(JsepSessionDescriptionTest,CloneWithCandidates)137*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, CloneWithCandidates) {
138*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate_v4(
139*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
140*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("192.168.1.5", 1234), kCandidatePriority, "", "",
141*d9f75844SAndroid Build Coastguard Worker cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
142*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate_v6(
143*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
144*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "",
145*d9f75844SAndroid Build Coastguard Worker cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
146*d9f75844SAndroid Build Coastguard Worker
147*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice_v4("audio", 0, candidate_v4);
148*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice_v6("audio", 0, candidate_v6);
149*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice_v4_video("video", 0, candidate_v4);
150*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice_v6_video("video", 0, candidate_v6);
151*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v4));
152*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v6));
153*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v4_video));
154*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v6_video));
155*d9f75844SAndroid Build Coastguard Worker auto new_desc = jsep_desc_->Clone();
156*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(jsep_desc_->type(), new_desc->type());
157*d9f75844SAndroid Build Coastguard Worker std::string old_desc_string;
158*d9f75844SAndroid Build Coastguard Worker std::string new_desc_string;
159*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->ToString(&old_desc_string));
160*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(new_desc->ToString(&new_desc_string));
161*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(old_desc_string, new_desc_string);
162*d9f75844SAndroid Build Coastguard Worker }
163*d9f75844SAndroid Build Coastguard Worker
164*d9f75844SAndroid Build Coastguard Worker // Test that number_of_mediasections() returns the number of media contents in
165*d9f75844SAndroid Build Coastguard Worker // a session description.
TEST_F(JsepSessionDescriptionTest,CheckSessionDescription)166*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, CheckSessionDescription) {
167*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(2u, jsep_desc_->number_of_mediasections());
168*d9f75844SAndroid Build Coastguard Worker }
169*d9f75844SAndroid Build Coastguard Worker
170*d9f75844SAndroid Build Coastguard Worker // Test that we can add a candidate to a session description without MID.
TEST_F(JsepSessionDescriptionTest,AddCandidateWithoutMid)171*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, AddCandidateWithoutMid) {
172*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jsep_candidate("", 0, candidate_);
173*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
174*d9f75844SAndroid Build Coastguard Worker const IceCandidateCollection* ice_candidates = jsep_desc_->candidates(0);
175*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(ice_candidates != NULL);
176*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, ice_candidates->count());
177*d9f75844SAndroid Build Coastguard Worker const IceCandidateInterface* ice_candidate = ice_candidates->at(0);
178*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(ice_candidate != NULL);
179*d9f75844SAndroid Build Coastguard Worker candidate_.set_username(kCandidateUfragVoice);
180*d9f75844SAndroid Build Coastguard Worker candidate_.set_password(kCandidatePwdVoice);
181*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(ice_candidate->candidate().IsEquivalent(candidate_));
182*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, ice_candidate->sdp_mline_index());
183*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, jsep_desc_->candidates(1)->count());
184*d9f75844SAndroid Build Coastguard Worker }
185*d9f75844SAndroid Build Coastguard Worker
186*d9f75844SAndroid Build Coastguard Worker // Test that we can add and remove candidates to a session description with
187*d9f75844SAndroid Build Coastguard Worker // MID. Removing candidates requires MID (transport_name).
TEST_F(JsepSessionDescriptionTest,AddAndRemoveCandidatesWithMid)188*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, AddAndRemoveCandidatesWithMid) {
189*d9f75844SAndroid Build Coastguard Worker // mid and m-line index don't match, in this case mid is preferred.
190*d9f75844SAndroid Build Coastguard Worker std::string mid = "video";
191*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jsep_candidate(mid, 0, candidate_);
192*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
193*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, jsep_desc_->candidates(0)->count());
194*d9f75844SAndroid Build Coastguard Worker const IceCandidateCollection* ice_candidates = jsep_desc_->candidates(1);
195*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(ice_candidates != NULL);
196*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, ice_candidates->count());
197*d9f75844SAndroid Build Coastguard Worker const IceCandidateInterface* ice_candidate = ice_candidates->at(0);
198*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(ice_candidate != NULL);
199*d9f75844SAndroid Build Coastguard Worker candidate_.set_username(kCandidateUfragVideo);
200*d9f75844SAndroid Build Coastguard Worker candidate_.set_password(kCandidatePwdVideo);
201*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(ice_candidate->candidate().IsEquivalent(candidate_));
202*d9f75844SAndroid Build Coastguard Worker // The mline index should have been updated according to mid.
203*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1, ice_candidate->sdp_mline_index());
204*d9f75844SAndroid Build Coastguard Worker
205*d9f75844SAndroid Build Coastguard Worker std::vector<cricket::Candidate> candidates(1, candidate_);
206*d9f75844SAndroid Build Coastguard Worker candidates[0].set_transport_name(mid);
207*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, jsep_desc_->RemoveCandidates(candidates));
208*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, jsep_desc_->candidates(0)->count());
209*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, jsep_desc_->candidates(1)->count());
210*d9f75844SAndroid Build Coastguard Worker }
211*d9f75844SAndroid Build Coastguard Worker
TEST_F(JsepSessionDescriptionTest,AddCandidateAlreadyHasUfrag)212*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, AddCandidateAlreadyHasUfrag) {
213*d9f75844SAndroid Build Coastguard Worker candidate_.set_username(kCandidateUfrag);
214*d9f75844SAndroid Build Coastguard Worker candidate_.set_password(kCandidatePwd);
215*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jsep_candidate("audio", 0, candidate_);
216*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
217*d9f75844SAndroid Build Coastguard Worker const IceCandidateCollection* ice_candidates = jsep_desc_->candidates(0);
218*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(ice_candidates != NULL);
219*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, ice_candidates->count());
220*d9f75844SAndroid Build Coastguard Worker const IceCandidateInterface* ice_candidate = ice_candidates->at(0);
221*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(ice_candidate != NULL);
222*d9f75844SAndroid Build Coastguard Worker candidate_.set_username(kCandidateUfrag);
223*d9f75844SAndroid Build Coastguard Worker candidate_.set_password(kCandidatePwd);
224*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(ice_candidate->candidate().IsEquivalent(candidate_));
225*d9f75844SAndroid Build Coastguard Worker
226*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, jsep_desc_->candidates(1)->count());
227*d9f75844SAndroid Build Coastguard Worker }
228*d9f75844SAndroid Build Coastguard Worker
229*d9f75844SAndroid Build Coastguard Worker // Test that we can not add a candidate if there is no corresponding media
230*d9f75844SAndroid Build Coastguard Worker // content in the session description.
TEST_F(JsepSessionDescriptionTest,AddBadCandidate)231*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, AddBadCandidate) {
232*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate bad_candidate1("", 55, candidate_);
233*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(jsep_desc_->AddCandidate(&bad_candidate1));
234*d9f75844SAndroid Build Coastguard Worker
235*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate bad_candidate2("some weird mid", 0, candidate_);
236*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(jsep_desc_->AddCandidate(&bad_candidate2));
237*d9f75844SAndroid Build Coastguard Worker }
238*d9f75844SAndroid Build Coastguard Worker
239*d9f75844SAndroid Build Coastguard Worker // Tests that repeatedly adding the same candidate, with or without credentials,
240*d9f75844SAndroid Build Coastguard Worker // does not increase the number of candidates in the description.
TEST_F(JsepSessionDescriptionTest,AddCandidateDuplicates)241*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, AddCandidateDuplicates) {
242*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jsep_candidate("", 0, candidate_);
243*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
244*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, jsep_desc_->candidates(0)->count());
245*d9f75844SAndroid Build Coastguard Worker
246*d9f75844SAndroid Build Coastguard Worker // Add the same candidate again. It should be ignored.
247*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
248*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, jsep_desc_->candidates(0)->count());
249*d9f75844SAndroid Build Coastguard Worker
250*d9f75844SAndroid Build Coastguard Worker // Create a new candidate, identical except that the ufrag and pwd are now
251*d9f75844SAndroid Build Coastguard Worker // populated.
252*d9f75844SAndroid Build Coastguard Worker candidate_.set_username(kCandidateUfragVoice);
253*d9f75844SAndroid Build Coastguard Worker candidate_.set_password(kCandidatePwdVoice);
254*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jsep_candidate_with_credentials("", 0, candidate_);
255*d9f75844SAndroid Build Coastguard Worker
256*d9f75844SAndroid Build Coastguard Worker // This should also be identified as redundant and ignored.
257*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate_with_credentials));
258*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, jsep_desc_->candidates(0)->count());
259*d9f75844SAndroid Build Coastguard Worker }
260*d9f75844SAndroid Build Coastguard Worker
261*d9f75844SAndroid Build Coastguard Worker // Test that the connection address is set to a hostname address after adding a
262*d9f75844SAndroid Build Coastguard Worker // hostname candidate.
TEST_F(JsepSessionDescriptionTest,AddHostnameCandidate)263*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, AddHostnameCandidate) {
264*d9f75844SAndroid Build Coastguard Worker cricket::Candidate c;
265*d9f75844SAndroid Build Coastguard Worker c.set_component(cricket::ICE_CANDIDATE_COMPONENT_RTP);
266*d9f75844SAndroid Build Coastguard Worker c.set_protocol(cricket::UDP_PROTOCOL_NAME);
267*d9f75844SAndroid Build Coastguard Worker c.set_address(rtc::SocketAddress("example.local", 1234));
268*d9f75844SAndroid Build Coastguard Worker c.set_type(cricket::LOCAL_PORT_TYPE);
269*d9f75844SAndroid Build Coastguard Worker const size_t audio_index = 0;
270*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate hostname_candidate("audio", audio_index, c);
271*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->AddCandidate(&hostname_candidate));
272*d9f75844SAndroid Build Coastguard Worker
273*d9f75844SAndroid Build Coastguard Worker ASSERT_NE(nullptr, jsep_desc_->description());
274*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(2u, jsep_desc_->description()->contents().size());
275*d9f75844SAndroid Build Coastguard Worker const auto& content = jsep_desc_->description()->contents()[audio_index];
276*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("0.0.0.0:9",
277*d9f75844SAndroid Build Coastguard Worker content.media_description()->connection_address().ToString());
278*d9f75844SAndroid Build Coastguard Worker }
279*d9f75844SAndroid Build Coastguard Worker
280*d9f75844SAndroid Build Coastguard Worker // Test that we can serialize a JsepSessionDescription and deserialize it again.
TEST_F(JsepSessionDescriptionTest,SerializeDeserialize)281*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, SerializeDeserialize) {
282*d9f75844SAndroid Build Coastguard Worker std::string sdp = Serialize(jsep_desc_.get());
283*d9f75844SAndroid Build Coastguard Worker
284*d9f75844SAndroid Build Coastguard Worker auto parsed_jsep_desc = DeSerialize(sdp);
285*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(2u, parsed_jsep_desc->number_of_mediasections());
286*d9f75844SAndroid Build Coastguard Worker
287*d9f75844SAndroid Build Coastguard Worker std::string parsed_sdp = Serialize(parsed_jsep_desc.get());
288*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(sdp, parsed_sdp);
289*d9f75844SAndroid Build Coastguard Worker }
290*d9f75844SAndroid Build Coastguard Worker
291*d9f75844SAndroid Build Coastguard Worker // Test that we can serialize a JsepSessionDescription when a hostname candidate
292*d9f75844SAndroid Build Coastguard Worker // is the default destination and deserialize it again. The connection address
293*d9f75844SAndroid Build Coastguard Worker // in the deserialized description should be the dummy address 0.0.0.0:9.
TEST_F(JsepSessionDescriptionTest,SerializeDeserializeWithHostnameCandidate)294*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, SerializeDeserializeWithHostnameCandidate) {
295*d9f75844SAndroid Build Coastguard Worker cricket::Candidate c;
296*d9f75844SAndroid Build Coastguard Worker c.set_component(cricket::ICE_CANDIDATE_COMPONENT_RTP);
297*d9f75844SAndroid Build Coastguard Worker c.set_protocol(cricket::UDP_PROTOCOL_NAME);
298*d9f75844SAndroid Build Coastguard Worker c.set_address(rtc::SocketAddress("example.local", 1234));
299*d9f75844SAndroid Build Coastguard Worker c.set_type(cricket::LOCAL_PORT_TYPE);
300*d9f75844SAndroid Build Coastguard Worker const size_t audio_index = 0;
301*d9f75844SAndroid Build Coastguard Worker const size_t video_index = 1;
302*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate hostname_candidate_audio("audio", audio_index, c);
303*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate hostname_candidate_video("video", video_index, c);
304*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->AddCandidate(&hostname_candidate_audio));
305*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->AddCandidate(&hostname_candidate_video));
306*d9f75844SAndroid Build Coastguard Worker
307*d9f75844SAndroid Build Coastguard Worker std::string sdp = Serialize(jsep_desc_.get());
308*d9f75844SAndroid Build Coastguard Worker
309*d9f75844SAndroid Build Coastguard Worker auto parsed_jsep_desc = DeSerialize(sdp);
310*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(2u, parsed_jsep_desc->number_of_mediasections());
311*d9f75844SAndroid Build Coastguard Worker
312*d9f75844SAndroid Build Coastguard Worker ASSERT_NE(nullptr, parsed_jsep_desc->description());
313*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(2u, parsed_jsep_desc->description()->contents().size());
314*d9f75844SAndroid Build Coastguard Worker const auto& audio_content =
315*d9f75844SAndroid Build Coastguard Worker parsed_jsep_desc->description()->contents()[audio_index];
316*d9f75844SAndroid Build Coastguard Worker const auto& video_content =
317*d9f75844SAndroid Build Coastguard Worker parsed_jsep_desc->description()->contents()[video_index];
318*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("0.0.0.0:9",
319*d9f75844SAndroid Build Coastguard Worker audio_content.media_description()->connection_address().ToString());
320*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("0.0.0.0:9",
321*d9f75844SAndroid Build Coastguard Worker video_content.media_description()->connection_address().ToString());
322*d9f75844SAndroid Build Coastguard Worker }
323*d9f75844SAndroid Build Coastguard Worker
324*d9f75844SAndroid Build Coastguard Worker // Tests that we can serialize and deserialize a JsepSesssionDescription
325*d9f75844SAndroid Build Coastguard Worker // with candidates.
TEST_F(JsepSessionDescriptionTest,SerializeDeserializeWithCandidates)326*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, SerializeDeserializeWithCandidates) {
327*d9f75844SAndroid Build Coastguard Worker std::string sdp = Serialize(jsep_desc_.get());
328*d9f75844SAndroid Build Coastguard Worker
329*d9f75844SAndroid Build Coastguard Worker // Add a candidate and check that the serialized result is different.
330*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jsep_candidate("audio", 0, candidate_);
331*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
332*d9f75844SAndroid Build Coastguard Worker std::string sdp_with_candidate = Serialize(jsep_desc_.get());
333*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(sdp, sdp_with_candidate);
334*d9f75844SAndroid Build Coastguard Worker
335*d9f75844SAndroid Build Coastguard Worker auto parsed_jsep_desc = DeSerialize(sdp_with_candidate);
336*d9f75844SAndroid Build Coastguard Worker std::string parsed_sdp_with_candidate = Serialize(parsed_jsep_desc.get());
337*d9f75844SAndroid Build Coastguard Worker
338*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(sdp_with_candidate, parsed_sdp_with_candidate);
339*d9f75844SAndroid Build Coastguard Worker }
340*d9f75844SAndroid Build Coastguard Worker
341*d9f75844SAndroid Build Coastguard Worker // TODO(zhihuang): Modify these tests. These are used to verify that after
342*d9f75844SAndroid Build Coastguard Worker // adding the candidates, the connection_address field is set correctly. Modify
343*d9f75844SAndroid Build Coastguard Worker // those so that the "connection address" is tested directly.
344*d9f75844SAndroid Build Coastguard Worker // Tests serialization of SDP with only IPv6 candidates and verifies that IPv6
345*d9f75844SAndroid Build Coastguard Worker // is used as default address in c line according to preference.
TEST_F(JsepSessionDescriptionTest,SerializeSessionDescriptionWithIPv6Only)346*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, SerializeSessionDescriptionWithIPv6Only) {
347*d9f75844SAndroid Build Coastguard Worker // Stun has a high preference than local host.
348*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate1(
349*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
350*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "",
351*d9f75844SAndroid Build Coastguard Worker cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
352*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate2(
353*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
354*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("::2", 1235), kCandidatePriority, "", "",
355*d9f75844SAndroid Build Coastguard Worker cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
356*d9f75844SAndroid Build Coastguard Worker
357*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice1("audio", 0, candidate1);
358*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice2("audio", 0, candidate2);
359*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice3("video", 0, candidate1);
360*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice4("video", 0, candidate2);
361*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice1));
362*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice2));
363*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice3));
364*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice4));
365*d9f75844SAndroid Build Coastguard Worker std::string message = Serialize(jsep_desc_.get());
366*d9f75844SAndroid Build Coastguard Worker
367*d9f75844SAndroid Build Coastguard Worker // Should have a c line like this one.
368*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(message.find("c=IN IP6 ::1"), std::string::npos);
369*d9f75844SAndroid Build Coastguard Worker // Shouldn't have a IP4 c line.
370*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(message.find("c=IN IP4"), std::string::npos);
371*d9f75844SAndroid Build Coastguard Worker }
372*d9f75844SAndroid Build Coastguard Worker
373*d9f75844SAndroid Build Coastguard Worker // Tests serialization of SDP with both IPv4 and IPv6 candidates and
374*d9f75844SAndroid Build Coastguard Worker // verifies that IPv4 is used as default address in c line even if the
375*d9f75844SAndroid Build Coastguard Worker // preference of IPv4 is lower.
TEST_F(JsepSessionDescriptionTest,SerializeSessionDescriptionWithBothIPFamilies)376*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest,
377*d9f75844SAndroid Build Coastguard Worker SerializeSessionDescriptionWithBothIPFamilies) {
378*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate_v4(
379*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
380*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("192.168.1.5", 1234), kCandidatePriority, "", "",
381*d9f75844SAndroid Build Coastguard Worker cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
382*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate_v6(
383*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
384*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "",
385*d9f75844SAndroid Build Coastguard Worker cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
386*d9f75844SAndroid Build Coastguard Worker
387*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice_v4("audio", 0, candidate_v4);
388*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice_v6("audio", 0, candidate_v6);
389*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice_v4_video("video", 0, candidate_v4);
390*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice_v6_video("video", 0, candidate_v6);
391*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v4));
392*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v6));
393*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v4_video));
394*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v6_video));
395*d9f75844SAndroid Build Coastguard Worker std::string message = Serialize(jsep_desc_.get());
396*d9f75844SAndroid Build Coastguard Worker
397*d9f75844SAndroid Build Coastguard Worker // Should have a c line like this one.
398*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(message.find("c=IN IP4 192.168.1.5"), std::string::npos);
399*d9f75844SAndroid Build Coastguard Worker // Shouldn't have a IP6 c line.
400*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(message.find("c=IN IP6"), std::string::npos);
401*d9f75844SAndroid Build Coastguard Worker }
402*d9f75844SAndroid Build Coastguard Worker
403*d9f75844SAndroid Build Coastguard Worker // Tests serialization of SDP with both UDP and TCP candidates and
404*d9f75844SAndroid Build Coastguard Worker // verifies that UDP is used as default address in c line even if the
405*d9f75844SAndroid Build Coastguard Worker // preference of UDP is lower.
TEST_F(JsepSessionDescriptionTest,SerializeSessionDescriptionWithBothProtocols)406*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest,
407*d9f75844SAndroid Build Coastguard Worker SerializeSessionDescriptionWithBothProtocols) {
408*d9f75844SAndroid Build Coastguard Worker // Stun has a high preference than local host.
409*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate1(
410*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp",
411*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "",
412*d9f75844SAndroid Build Coastguard Worker cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
413*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate2(
414*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
415*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("fe80::1234:5678:abcd:ef12", 1235), kCandidatePriority,
416*d9f75844SAndroid Build Coastguard Worker "", "", cricket::LOCAL_PORT_TYPE, kCandidateGeneration,
417*d9f75844SAndroid Build Coastguard Worker kCandidateFoundation);
418*d9f75844SAndroid Build Coastguard Worker
419*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice1("audio", 0, candidate1);
420*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice2("audio", 0, candidate2);
421*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice3("video", 0, candidate1);
422*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice4("video", 0, candidate2);
423*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice1));
424*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice2));
425*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice3));
426*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice4));
427*d9f75844SAndroid Build Coastguard Worker std::string message = Serialize(jsep_desc_.get());
428*d9f75844SAndroid Build Coastguard Worker
429*d9f75844SAndroid Build Coastguard Worker // Should have a c line like this one.
430*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(message.find("c=IN IP6 fe80::1234:5678:abcd:ef12"),
431*d9f75844SAndroid Build Coastguard Worker std::string::npos);
432*d9f75844SAndroid Build Coastguard Worker // Shouldn't have a IP4 c line.
433*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(message.find("c=IN IP4"), std::string::npos);
434*d9f75844SAndroid Build Coastguard Worker }
435*d9f75844SAndroid Build Coastguard Worker
436*d9f75844SAndroid Build Coastguard Worker // Tests serialization of SDP with only TCP candidates and verifies that
437*d9f75844SAndroid Build Coastguard Worker // null IPv4 is used as default address in c line.
TEST_F(JsepSessionDescriptionTest,SerializeSessionDescriptionWithTCPOnly)438*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, SerializeSessionDescriptionWithTCPOnly) {
439*d9f75844SAndroid Build Coastguard Worker // Stun has a high preference than local host.
440*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate1(
441*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp",
442*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "",
443*d9f75844SAndroid Build Coastguard Worker cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
444*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate2(
445*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp",
446*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("::2", 1235), kCandidatePriority, "", "",
447*d9f75844SAndroid Build Coastguard Worker cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
448*d9f75844SAndroid Build Coastguard Worker
449*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice1("audio", 0, candidate1);
450*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice2("audio", 0, candidate2);
451*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice3("video", 0, candidate1);
452*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice4("video", 0, candidate2);
453*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice1));
454*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice2));
455*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice3));
456*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice4));
457*d9f75844SAndroid Build Coastguard Worker
458*d9f75844SAndroid Build Coastguard Worker std::string message = Serialize(jsep_desc_.get());
459*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(message.find("c=IN IP6 ::3"), std::string::npos);
460*d9f75844SAndroid Build Coastguard Worker // Should have a c line like this one when no any default exists.
461*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(message.find("c=IN IP4 0.0.0.0"), std::string::npos);
462*d9f75844SAndroid Build Coastguard Worker }
463*d9f75844SAndroid Build Coastguard Worker
464*d9f75844SAndroid Build Coastguard Worker // Tests that the connection address will be correctly set when the Candidate is
465*d9f75844SAndroid Build Coastguard Worker // removed.
TEST_F(JsepSessionDescriptionTest,RemoveCandidateAndSetConnectionAddress)466*d9f75844SAndroid Build Coastguard Worker TEST_F(JsepSessionDescriptionTest, RemoveCandidateAndSetConnectionAddress) {
467*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate1(
468*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
469*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "",
470*d9f75844SAndroid Build Coastguard Worker cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
471*d9f75844SAndroid Build Coastguard Worker candidate1.set_transport_name("audio");
472*d9f75844SAndroid Build Coastguard Worker
473*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate2(
474*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp",
475*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("::2", 1235), kCandidatePriority, "", "",
476*d9f75844SAndroid Build Coastguard Worker cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
477*d9f75844SAndroid Build Coastguard Worker candidate2.set_transport_name("audio");
478*d9f75844SAndroid Build Coastguard Worker
479*d9f75844SAndroid Build Coastguard Worker cricket::Candidate candidate3(
480*d9f75844SAndroid Build Coastguard Worker cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
481*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress("192.168.1.1", 1236), kCandidatePriority, "", "",
482*d9f75844SAndroid Build Coastguard Worker cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
483*d9f75844SAndroid Build Coastguard Worker candidate3.set_transport_name("audio");
484*d9f75844SAndroid Build Coastguard Worker
485*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice1("audio", 0, candidate1);
486*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice2("audio", 0, candidate2);
487*d9f75844SAndroid Build Coastguard Worker JsepIceCandidate jice3("audio", 0, candidate3);
488*d9f75844SAndroid Build Coastguard Worker
489*d9f75844SAndroid Build Coastguard Worker size_t audio_index = 0;
490*d9f75844SAndroid Build Coastguard Worker auto media_desc =
491*d9f75844SAndroid Build Coastguard Worker jsep_desc_->description()->contents()[audio_index].media_description();
492*d9f75844SAndroid Build Coastguard Worker
493*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice1));
494*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice2));
495*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->AddCandidate(&jice3));
496*d9f75844SAndroid Build Coastguard Worker
497*d9f75844SAndroid Build Coastguard Worker std::vector<cricket::Candidate> candidates;
498*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("192.168.1.1:1236", media_desc->connection_address().ToString());
499*d9f75844SAndroid Build Coastguard Worker
500*d9f75844SAndroid Build Coastguard Worker candidates.push_back(candidate3);
501*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->RemoveCandidates(candidates));
502*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("[::1]:1234", media_desc->connection_address().ToString());
503*d9f75844SAndroid Build Coastguard Worker
504*d9f75844SAndroid Build Coastguard Worker candidates.clear();
505*d9f75844SAndroid Build Coastguard Worker candidates.push_back(candidate2);
506*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->RemoveCandidates(candidates));
507*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("[::1]:1234", media_desc->connection_address().ToString());
508*d9f75844SAndroid Build Coastguard Worker
509*d9f75844SAndroid Build Coastguard Worker candidates.clear();
510*d9f75844SAndroid Build Coastguard Worker candidates.push_back(candidate1);
511*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(jsep_desc_->RemoveCandidates(candidates));
512*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("0.0.0.0:9", media_desc->connection_address().ToString());
513*d9f75844SAndroid Build Coastguard Worker }
514*d9f75844SAndroid Build Coastguard Worker
515*d9f75844SAndroid Build Coastguard Worker class EnumerateAllSdpTypesTest : public ::testing::Test,
516*d9f75844SAndroid Build Coastguard Worker public ::testing::WithParamInterface<SdpType> {
517*d9f75844SAndroid Build Coastguard Worker };
518*d9f75844SAndroid Build Coastguard Worker
TEST_P(EnumerateAllSdpTypesTest,TestIdentity)519*d9f75844SAndroid Build Coastguard Worker TEST_P(EnumerateAllSdpTypesTest, TestIdentity) {
520*d9f75844SAndroid Build Coastguard Worker SdpType type = GetParam();
521*d9f75844SAndroid Build Coastguard Worker
522*d9f75844SAndroid Build Coastguard Worker const char* str = webrtc::SdpTypeToString(type);
523*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(type, webrtc::SdpTypeFromString(str));
524*d9f75844SAndroid Build Coastguard Worker }
525*d9f75844SAndroid Build Coastguard Worker
526*d9f75844SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(JsepSessionDescriptionTest,
527*d9f75844SAndroid Build Coastguard Worker EnumerateAllSdpTypesTest,
528*d9f75844SAndroid Build Coastguard Worker Values(SdpType::kOffer,
529*d9f75844SAndroid Build Coastguard Worker SdpType::kPrAnswer,
530*d9f75844SAndroid Build Coastguard Worker SdpType::kAnswer));
531