Index: talk/app/webrtc/webrtcsession_unittest.cc |
diff --git a/talk/app/webrtc/webrtcsession_unittest.cc b/talk/app/webrtc/webrtcsession_unittest.cc |
index fa48fd3c1636aac457f8034f4f1cb4766baa91eb..6a38351cb5c29fa5941ab8e234e71a6cca124517 100644 |
--- a/talk/app/webrtc/webrtcsession_unittest.cc |
+++ b/talk/app/webrtc/webrtcsession_unittest.cc |
@@ -2806,10 +2806,9 @@ TEST_F(WebRtcSessionTest, TestSetRemoteDescriptionInvalidIceCredentials) { |
EXPECT_FALSE(session_->SetRemoteDescription(modified_offer, &error)); |
} |
-// Test that if the remote description indicates the peer requested ICE restart |
-// (via a new ufrag or pwd), the old ICE candidates are not copied, |
-// and vice versa. |
-TEST_F(WebRtcSessionTest, TestSetRemoteDescriptionWithIceRestart) { |
+// Test that if the remote offer indicates the peer requested ICE restart (via |
+// a new ufrag or pwd), the old ICE candidates are not copied, and vice versa. |
+TEST_F(WebRtcSessionTest, TestSetRemoteOfferWithIceRestart) { |
Init(); |
scoped_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer()); |
@@ -2863,6 +2862,64 @@ TEST_F(WebRtcSessionTest, TestSetRemoteDescriptionWithIceRestart) { |
EXPECT_EQ(0, session_->remote_description()->candidates(0)->count()); |
} |
+// Test that if the remote answer indicates the peer requested ICE restart (via |
+// a new ufrag or pwd), the old ICE candidates are not copied, and vice versa. |
+TEST_F(WebRtcSessionTest, TestSetRemoteAnswerWithIceRestart) { |
+ Init(); |
+ SessionDescriptionInterface* offer = CreateOffer(); |
+ SetLocalDescriptionWithoutError(offer); |
+ scoped_ptr<SessionDescriptionInterface> answer(CreateRemoteAnswer(offer)); |
+ |
+ // Create the first answer. |
+ std::string sdp; |
+ ModifyIceUfragPwdLines(answer.get(), "0123456789012345", |
+ "abcdefghijklmnopqrstuvwx", &sdp); |
+ SessionDescriptionInterface* answer1 = |
+ CreateSessionDescription(JsepSessionDescription::kPrAnswer, sdp, NULL); |
+ cricket::Candidate candidate1(1, "udp", rtc::SocketAddress("1.1.1.1", 5000), |
+ 0, "", "", "relay", 0, ""); |
+ JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0, |
+ candidate1); |
+ EXPECT_TRUE(answer1->AddCandidate(&ice_candidate1)); |
+ SetRemoteDescriptionWithoutError(answer1); |
+ EXPECT_EQ(1, session_->remote_description()->candidates(0)->count()); |
+ |
+ // The second answer has the same ufrag and pwd but different address. |
+ sdp.clear(); |
+ ModifyIceUfragPwdLines(answer.get(), "0123456789012345", |
+ "abcdefghijklmnopqrstuvwx", &sdp); |
+ SessionDescriptionInterface* answer2 = |
+ CreateSessionDescription(JsepSessionDescription::kPrAnswer, sdp, NULL); |
+ candidate1.set_address(rtc::SocketAddress("1.1.1.1", 6000)); |
+ JsepIceCandidate ice_candidate2(kMediaContentName0, kMediaContentIndex0, |
+ candidate1); |
+ EXPECT_TRUE(answer2->AddCandidate(&ice_candidate2)); |
+ SetRemoteDescriptionWithoutError(answer2); |
+ EXPECT_EQ(2, session_->remote_description()->candidates(0)->count()); |
+ |
+ // The third answer has a different ufrag and different address. |
+ sdp.clear(); |
+ ModifyIceUfragPwdLines(answer.get(), "0123456789012333", |
+ "abcdefghijklmnopqrstuvwx", &sdp); |
+ SessionDescriptionInterface* answer3 = |
+ CreateSessionDescription(JsepSessionDescription::kPrAnswer, sdp, NULL); |
+ candidate1.set_address(rtc::SocketAddress("1.1.1.1", 7000)); |
+ JsepIceCandidate ice_candidate3(kMediaContentName0, kMediaContentIndex0, |
+ candidate1); |
+ EXPECT_TRUE(answer3->AddCandidate(&ice_candidate3)); |
+ SetRemoteDescriptionWithoutError(answer3); |
+ EXPECT_EQ(1, session_->remote_description()->candidates(0)->count()); |
+ |
+ // The fourth answer has no candidate but a different ufrag/pwd. |
+ sdp.clear(); |
+ ModifyIceUfragPwdLines(answer.get(), "0123456789012444", |
+ "abcdefghijklmnopqrstuvyz", &sdp); |
+ SessionDescriptionInterface* offer4 = |
+ CreateSessionDescription(JsepSessionDescription::kPrAnswer, sdp, NULL); |
+ SetRemoteDescriptionWithoutError(offer4); |
+ EXPECT_EQ(0, session_->remote_description()->candidates(0)->count()); |
+} |
+ |
// Test that candidates sent to the "video" transport do not get pushed down to |
// the "audio" transport channel when bundling. |
TEST_F(WebRtcSessionTest, TestIgnoreCandidatesForUnusedTransportWhenBundling) { |