Index: webrtc/pc/webrtcsdp_unittest.cc |
diff --git a/webrtc/pc/webrtcsdp_unittest.cc b/webrtc/pc/webrtcsdp_unittest.cc |
index f5cac8921f3a3fddadf0672f372ce9f2c4713d1d..fcfdd3893b9ec20b8e05069bf2539e19f3c4d9f4 100644 |
--- a/webrtc/pc/webrtcsdp_unittest.cc |
+++ b/webrtc/pc/webrtcsdp_unittest.cc |
@@ -195,7 +195,7 @@ static const char kSdpString[] = |
"t=0 0\r\n" |
"a=msid-semantic: WMS local_stream_1\r\n" |
"m=audio 9 RTP/SAVPF 111 103 104\r\n" |
- "c=IN IP4 0.0.0.0\r\n" |
+ "c=IN IP4 74.125.127.126\r\n" |
"a=rtcp:9 IN IP4 0.0.0.0\r\n" |
"a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n" |
"a=mid:audio_content_name\r\n" |
@@ -213,7 +213,7 @@ static const char kSdpString[] = |
"a=ssrc:1 mslabel:local_stream_1\r\n" |
"a=ssrc:1 label:audio_track_id_1\r\n" |
"m=video 9 RTP/SAVPF 120\r\n" |
- "c=IN IP4 0.0.0.0\r\n" |
+ "c=IN IP4 74.125.224.39\r\n" |
"a=rtcp:9 IN IP4 0.0.0.0\r\n" |
"a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n" |
"a=mid:video_content_name\r\n" |
@@ -376,7 +376,7 @@ static const char kBundleOnlySdpFullString[] = |
"a=ssrc:1 mslabel:local_stream_1\r\n" |
"a=ssrc:1 label:audio_track_id_1\r\n" |
"m=video 0 RTP/SAVPF 120\r\n" |
- "c=IN IP4 0.0.0.0\r\n" |
+ "c=IN IP4 74.125.224.39\r\n" |
"a=rtcp:9 IN IP4 0.0.0.0\r\n" |
"a=bundle-only\r\n" |
"a=mid:video_content_name\r\n" |
@@ -875,6 +875,9 @@ class WebRtcSdpTest : public testing::Test { |
audio_stream.sync_label = kStreamLabel1; |
audio_stream.ssrcs.push_back(kAudioTrack1Ssrc); |
audio_desc_->AddStream(audio_stream); |
+ rtc::SocketAddress audio_addr_; |
+ audio_addr_.SetIP("74.125.127.126"); |
+ audio_desc_->set_connection_addr(audio_addr_); |
desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_desc_); |
// VideoContentDescription |
@@ -888,6 +891,9 @@ class WebRtcSdpTest : public testing::Test { |
cricket::SsrcGroup ssrc_group(kFecSsrcGroupSemantics, video_stream.ssrcs); |
video_stream.ssrc_groups.push_back(ssrc_group); |
video_desc_->AddStream(video_stream); |
+ rtc::SocketAddress video_addr_; |
+ video_addr_.SetIP("74.125.224.39"); |
+ video_desc_->set_connection_addr(video_addr_); |
desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, video_desc_); |
// TransportInfo |
@@ -1087,6 +1093,9 @@ class WebRtcSdpTest : public testing::Test { |
audio_track_2.sync_label = kStreamLabel2; |
audio_track_2.ssrcs.push_back(kAudioTrack2Ssrc); |
audio_desc_2->AddStream(audio_track_2); |
+ rtc::SocketAddress addr; |
+ addr.SetIP("0.0.0.0"); |
+ audio_desc_2->set_connection_addr(addr); |
desc_.AddContent(kAudioContentName2, NS_JINGLE_RTP, audio_desc_2); |
EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
kAudioContentName2, TransportDescription(kUfragVoice2, kPwdVoice2)))); |
@@ -1099,6 +1108,7 @@ class WebRtcSdpTest : public testing::Test { |
video_track_2.sync_label = kStreamLabel2; |
video_track_2.ssrcs.push_back(kVideoTrack2Ssrc); |
video_desc_2->AddStream(video_track_2); |
+ video_desc_2->set_connection_addr(addr); |
desc_.AddContent(kVideoContentName2, NS_JINGLE_RTP, video_desc_2); |
EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
kVideoContentName2, TransportDescription(kUfragVideo2, kPwdVideo2)))); |
@@ -1111,6 +1121,7 @@ class WebRtcSdpTest : public testing::Test { |
video_track_3.sync_label = kStreamLabel2; |
video_track_3.ssrcs.push_back(kVideoTrack3Ssrc); |
video_desc_3->AddStream(video_track_3); |
+ video_desc_3->set_connection_addr(addr); |
desc_.AddContent(kVideoContentName3, NS_JINGLE_RTP, video_desc_3); |
EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
kVideoContentName3, TransportDescription(kUfragVideo3, kPwdVideo3)))); |
@@ -1211,6 +1222,9 @@ class WebRtcSdpTest : public testing::Test { |
EXPECT_EQ(ext1.uri, ext2.uri); |
EXPECT_EQ(ext1.id, ext2.id); |
} |
+ |
+ // connection address |
+ EXPECT_EQ(cd1->connection_addr(), cd2->connection_addr()); |
} |
void CompareDataContentDescription(const DataContentDescription* dcd1, |
@@ -1503,6 +1517,9 @@ class WebRtcSdpTest : public testing::Test { |
cricket::kGoogleSctpDataCodecName); |
codec.SetParam(cricket::kCodecParamPort, kDefaultSctpPort); |
data_desc_->AddCodec(codec); |
+ rtc::SocketAddress addr_; |
+ addr_.SetIP("0.0.0.0"); |
+ data_desc_->set_connection_addr(addr_); |
desc_.AddContent(kDataContentName, NS_JINGLE_DRAFT_SCTP, data.release()); |
EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
kDataContentName, TransportDescription(kUfragData, kPwdData)))); |
@@ -1523,6 +1540,9 @@ class WebRtcSdpTest : public testing::Test { |
1, "AES_CM_128_HMAC_SHA1_80", |
"inline:FvLcvU2P3ZWmQxgPAgcDu7Zl9vftYElFOjEzhWs5", "")); |
data_desc_->set_protocol(cricket::kMediaProtocolSavpf); |
+ rtc::SocketAddress addr_; |
+ addr_.SetIP("0.0.0.0"); |
+ data_desc_->set_connection_addr(addr_); |
desc_.AddContent(kDataContentName, NS_JINGLE_RTP, data.release()); |
EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
kDataContentName, TransportDescription(kUfragData, kPwdData)))); |
@@ -1801,28 +1821,18 @@ TEST_F(WebRtcSdpTest, SerializeSessionDescriptionEmpty) { |
EXPECT_EQ("", webrtc::SdpSerialize(jdesc_empty, false)); |
} |
-// This tests serialization of SDP with only IPv6 candidates and verifies that |
-// IPv6 is used as default address in c line according to preference. |
+// This tests serialization of SDP with only IPv6 address. |
TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithIPv6Only) { |
// Only test 1 m line. |
desc_.RemoveContentByName("video_content_name"); |
- // Stun has a high preference than local host. |
- cricket::Candidate candidate1( |
- cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp", |
- rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "", |
- cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); |
- cricket::Candidate candidate2( |
- cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp", |
- rtc::SocketAddress("::2", 1235), kCandidatePriority, "", "", |
- cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); |
JsepSessionDescription jdesc(kDummyString); |
+ auto content = static_cast<cricket::MediaContentDescription*>( |
+ desc_.FirstContent()->description); |
+ rtc::SocketAddress addr; |
+ addr.SetIP("0000:0000:0000:0000:0000:0000:0000:0001"); |
+ content->set_connection_addr(addr); |
ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); |
- // Only add the candidates to audio m line. |
- JsepIceCandidate jice1("audio_content_name", 0, candidate1); |
- JsepIceCandidate jice2("audio_content_name", 0, candidate2); |
- ASSERT_TRUE(jdesc.AddCandidate(&jice1)); |
- ASSERT_TRUE(jdesc.AddCandidate(&jice2)); |
std::string message = webrtc::SdpSerialize(jdesc, false); |
// Audio line should have a c line like this one. |
@@ -1831,97 +1841,6 @@ TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithIPv6Only) { |
EXPECT_EQ(message.find("c=IN IP4"), std::string::npos); |
} |
-// This tests serialization of SDP with both IPv4 and IPv6 candidates and |
-// verifies that IPv4 is used as default address in c line even if the |
-// preference of IPv4 is lower. |
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithBothIPFamilies) { |
- // Only test 1 m line. |
- desc_.RemoveContentByName("video_content_name"); |
- cricket::Candidate candidate_v4( |
- cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp", |
- rtc::SocketAddress("192.168.1.5", 1234), kCandidatePriority, "", "", |
- cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); |
- cricket::Candidate candidate_v6( |
- cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp", |
- rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "", |
- cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); |
- JsepSessionDescription jdesc(kDummyString); |
- ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); |
- |
- // Only add the candidates to audio m line. |
- JsepIceCandidate jice_v4("audio_content_name", 0, candidate_v4); |
- JsepIceCandidate jice_v6("audio_content_name", 0, candidate_v6); |
- ASSERT_TRUE(jdesc.AddCandidate(&jice_v4)); |
- ASSERT_TRUE(jdesc.AddCandidate(&jice_v6)); |
- std::string message = webrtc::SdpSerialize(jdesc, false); |
- |
- // Audio line should have a c line like this one. |
- EXPECT_NE(message.find("c=IN IP4 192.168.1.5"), std::string::npos); |
- // Shouldn't have a IP6 c line. |
- EXPECT_EQ(message.find("c=IN IP6"), std::string::npos); |
-} |
- |
-// This tests serialization of SDP with both UDP and TCP candidates and |
-// verifies that UDP is used as default address in c line even if the |
-// preference of UDP is lower. |
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithBothProtocols) { |
- // Only test 1 m line. |
- desc_.RemoveContentByName("video_content_name"); |
- // Stun has a high preference than local host. |
- cricket::Candidate candidate1( |
- cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp", |
- rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "", |
- cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); |
- cricket::Candidate candidate2( |
- cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp", |
- rtc::SocketAddress("fe80::1234:5678:abcd:ef12", 1235), kCandidatePriority, |
- "", "", cricket::LOCAL_PORT_TYPE, kCandidateGeneration, |
- kCandidateFoundation1); |
- JsepSessionDescription jdesc(kDummyString); |
- ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); |
- |
- // Only add the candidates to audio m line. |
- JsepIceCandidate jice1("audio_content_name", 0, candidate1); |
- JsepIceCandidate jice2("audio_content_name", 0, candidate2); |
- ASSERT_TRUE(jdesc.AddCandidate(&jice1)); |
- ASSERT_TRUE(jdesc.AddCandidate(&jice2)); |
- std::string message = webrtc::SdpSerialize(jdesc, false); |
- |
- // Audio line should have a c line like this one. |
- EXPECT_NE(message.find("c=IN IP6 fe80::1234:5678:abcd:ef12"), |
- std::string::npos); |
- // Shouldn't have a IP4 c line. |
- EXPECT_EQ(message.find("c=IN IP4"), std::string::npos); |
-} |
- |
-// This tests serialization of SDP with only TCP candidates and verifies that |
-// null IPv4 is used as default address in c line. |
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithTCPOnly) { |
- // Only test 1 m line. |
- desc_.RemoveContentByName("video_content_name"); |
- // Stun has a high preference than local host. |
- cricket::Candidate candidate1( |
- cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp", |
- rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "", |
- cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); |
- cricket::Candidate candidate2( |
- cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp", |
- rtc::SocketAddress("::2", 1235), kCandidatePriority, "", "", |
- cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); |
- JsepSessionDescription jdesc(kDummyString); |
- ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); |
- |
- // Only add the candidates to audio m line. |
- JsepIceCandidate jice1("audio_content_name", 0, candidate1); |
- JsepIceCandidate jice2("audio_content_name", 0, candidate2); |
- ASSERT_TRUE(jdesc.AddCandidate(&jice1)); |
- ASSERT_TRUE(jdesc.AddCandidate(&jice2)); |
- std::string message = webrtc::SdpSerialize(jdesc, false); |
- |
- // Audio line should have a c line like this one when no any default exists. |
- EXPECT_NE(message.find("c=IN IP4 0.0.0.0"), std::string::npos); |
-} |
- |
// This tests serialization of SDP with a=crypto and a=fingerprint, as would be |
// the case in a DTLS offer. |
TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithFingerprint) { |
@@ -3504,3 +3423,78 @@ TEST_F(WebRtcSdpTest, DeserializeMsidAttributeWithMissingStreamId) { |
JsepSessionDescription jdesc_output(kDummyString); |
EXPECT_FALSE(SdpDeserialize(kSdpWithMissingStreamId, &jdesc_output)); |
} |
+ |
+// Tests that the session level connection address will be used if the media |
+// level addresses are not specified. |
+TEST_F(WebRtcSdpTest, ParseConnectionData) { |
+ JsepSessionDescription jsep_desc(kDummyString); |
+ |
+ // Sesssion level address. |
+ std::string sdp = kSdpFullString; |
+ InjectAfter("s=-\r\n", "c=IN IP4 192.168.0.3\r\n", &sdp); |
+ Replace("c=IN IP4 74.125.127.126\r\n", "", &sdp); |
+ Replace("c=IN IP4 74.125.224.39\r\n", "", &sdp); |
+ EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc)); |
+ |
+ // Remove the media level addresses. |
+ // The port is expected to be the default value 0. |
+ const auto& content1 = jsep_desc.description()->contents()[0]; |
+ EXPECT_EQ("192.168.0.3:0", |
+ static_cast<cricket::MediaContentDescription*>(content1.description) |
+ ->connection_addr() |
+ .ToString()); |
+ const auto& content2 = jsep_desc.description()->contents()[1]; |
+ EXPECT_EQ("192.168.0.3:0", |
+ static_cast<cricket::MediaContentDescription*>(content2.description) |
+ ->connection_addr() |
+ .ToString()); |
+} |
+ |
+TEST_F(WebRtcSdpTest, ParseConnectionDataIPv6) { |
+ JsepSessionDescription jsep_desc(kDummyString); |
+ |
+ std::string sdp = kSdpFullString; |
+ EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc)); |
+ Replace("c=IN IP4 74.125.127.126\r\n", |
+ "c=IN IP6 2001:0db8:85a3:0000:0000:8a2e:0370:7335\r\n", &sdp); |
+ Replace("c=IN IP4 74.125.224.39\r\n", |
+ "c=IN IP6 2001:0db8:85a3:0000:0000:8a2e:0370:7336\r\n", &sdp); |
+ EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc)); |
+ const auto& content3 = jsep_desc.description()->contents()[0]; |
+ EXPECT_EQ("[2001:db8:85a3::8a2e:370:7335]:0", |
+ static_cast<cricket::MediaContentDescription*>(content3.description) |
+ ->connection_addr() |
+ .ToString()); |
+ const auto& content4 = jsep_desc.description()->contents()[1]; |
+ EXPECT_EQ("[2001:db8:85a3::8a2e:370:7336]:0", |
+ static_cast<cricket::MediaContentDescription*>(content4.description) |
+ ->connection_addr() |
+ .ToString()); |
+} |
+ |
+// Test that the invalid or unsupprted connection data cannot be parsed. |
+TEST_F(WebRtcSdpTest, ParseConnectionDataFailure) { |
+ JsepSessionDescription jsep_desc(kDummyString); |
+ std::string sdp = kSdpFullString; |
+ EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc)); |
+ |
+ // unsupported IPv4 address. |
+ sdp = kSdpFullString; |
+ Replace("c=IN IP4 74.125.224.39\r\n", "c=IN IP4 74.125.224.39/127\r\n", &sdp); |
+ EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc)); |
+ |
+ // unsupported IPv6 address. |
+ sdp = kSdpFullString; |
+ Replace("c=IN IP4 74.125.224.39\r\n", "c=IN IP6 a/3\r\n", &sdp); |
+ EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc)); |
+ |
+ // mismatched address type. |
+ sdp = kSdpFullString; |
+ Replace("c=IN IP4 74.125.224.39\r\n", "c=IN IP6 74.125.224.39\r\n", &sdp); |
+ EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc)); |
+ |
+ sdp = kSdpFullString; |
+ Replace("c=IN IP4 74.125.224.39\r\n", |
+ "c=IN IP4 2001:0db8:85a3:0000:0000:8a2e:0370:7334/3\r\n", &sdp); |
+ EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc)); |
+} |