Index: webrtc/api/webrtcsession_unittest.cc |
diff --git a/webrtc/api/webrtcsession_unittest.cc b/webrtc/api/webrtcsession_unittest.cc |
index 2c9a99b5e08a247cea0eaf567f30a9e65b464899..c0fff5251301b58a09508ef03e31f96289f9c57d 100644 |
--- a/webrtc/api/webrtcsession_unittest.cc |
+++ b/webrtc/api/webrtcsession_unittest.cc |
@@ -189,11 +189,18 @@ class MockIceObserver : public webrtc::IceObserver { |
EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, ice_gathering_state_); |
} |
+ // Some local candidates are removed. |
+ void OnIceCandidatesRemoved( |
+ const std::vector<cricket::Candidate>& candidates) { |
+ num_candidates_removed_ += candidates.size(); |
+ } |
+ |
bool oncandidatesready_; |
std::vector<cricket::Candidate> mline_0_candidates_; |
std::vector<cricket::Candidate> mline_1_candidates_; |
PeerConnectionInterface::IceConnectionState ice_connection_state_; |
PeerConnectionInterface::IceGatheringState ice_gathering_state_; |
+ size_t num_candidates_removed_ = 0; |
}; |
class WebRtcSessionForTest : public webrtc::WebRtcSession { |
@@ -358,6 +365,9 @@ class WebRtcSessionTest |
void AddInterface(const SocketAddress& addr) { |
network_manager_.AddInterface(addr); |
} |
+ void RemoveInterface(const SocketAddress& addr) { |
+ network_manager_.RemoveInterface(addr); |
+ } |
// If |dtls_identity_store| != null or |rtc_configuration| contains |
// |certificates| then DTLS will be enabled unless explicitly disabled by |
@@ -2106,12 +2116,14 @@ TEST_F(WebRtcSessionTest, TestSetRemoteAnswerWithoutOffer) { |
"Called in wrong state: STATE_INIT", answer); |
} |
-TEST_F(WebRtcSessionTest, TestAddRemoteCandidate) { |
+// Tests that the remote candidates are added and removed successfully. |
+TEST_F(WebRtcSessionTest, TestAddAndRemoveRemoteCandidates) { |
Init(); |
SendAudioVideoStream1(); |
- cricket::Candidate candidate; |
- candidate.set_component(1); |
+ cricket::Candidate candidate(1, "udp", rtc::SocketAddress("1.1.1.1", 5000), 0, |
+ "", "", "host", 0, ""); |
+ candidate.set_transport_name("audio"); |
JsepIceCandidate ice_candidate1(kMediaContentName0, 0, candidate); |
// Fail since we have not set a remote description. |
@@ -2129,6 +2141,7 @@ TEST_F(WebRtcSessionTest, TestAddRemoteCandidate) { |
EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate1)); |
candidate.set_component(2); |
+ candidate.set_address(rtc::SocketAddress("2.2.2.2", 6000)); |
JsepIceCandidate ice_candidate2(kMediaContentName0, 0, candidate); |
EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2)); |
@@ -2154,9 +2167,16 @@ TEST_F(WebRtcSessionTest, TestAddRemoteCandidate) { |
JsepIceCandidate bad_ice_candidate("bad content name", 99, candidate); |
EXPECT_FALSE(session_->ProcessIceMessage(&bad_ice_candidate)); |
+ |
+ // Remove candidate1 and candidate2 |
+ std::vector<cricket::Candidate> remote_candidates; |
+ remote_candidates.push_back(ice_candidate1.candidate()); |
+ remote_candidates.push_back(ice_candidate2.candidate()); |
+ EXPECT_TRUE(session_->RemoveRemoteIceCandidates(remote_candidates)); |
+ EXPECT_EQ(0u, candidates->count()); |
} |
-// Test that a remote candidate is added to the remote session description and |
+// Tests that a remote candidate is added to the remote session description and |
// that it is retained if the remote session description is changed. |
TEST_F(WebRtcSessionTest, TestRemoteCandidatesAddedToSessionDescription) { |
Init(); |
@@ -2209,8 +2229,11 @@ TEST_F(WebRtcSessionTest, TestRemoteCandidatesAddedToSessionDescription) { |
} |
// Test that local candidates are added to the local session description and |
-// that they are retained if the local session description is changed. |
-TEST_F(WebRtcSessionTest, TestLocalCandidatesAddedToSessionDescription) { |
+// that they are retained if the local session description is changed. And if |
+// continual gathering is enabled, they are removed from the local session |
+// description when the network is down. |
+TEST_F(WebRtcSessionTest, |
+ TestLocalCandidatesAddedAndRemovedIfGatherContinually) { |
AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); |
Init(); |
SendAudioVideoStream1(); |
@@ -2243,6 +2266,43 @@ TEST_F(WebRtcSessionTest, TestLocalCandidatesAddedToSessionDescription) { |
candidates = local_desc->candidates(1); |
ASSERT_TRUE(candidates != NULL); |
EXPECT_EQ(0u, candidates->count()); |
+ |
+ candidates = local_desc->candidates(kMediaContentIndex0); |
+ size_t num_local_candidates = candidates->count(); |
+ // Enable Continual Gathering |
+ session_->SetIceConfig(cricket::IceConfig(-1, -1, true, false, -1)); |
+ // Bring down the network interface to trigger candidate removals. |
+ RemoveInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); |
+ // Verify that all local candidates are removed. |
+ EXPECT_EQ(0, observer_.num_candidates_removed_); |
+ EXPECT_EQ_WAIT(num_local_candidates, observer_.num_candidates_removed_, |
+ kIceCandidatesTimeout); |
+ EXPECT_EQ_WAIT(0u, candidates->count(), kIceCandidatesTimeout); |
+} |
+ |
+// Tests that if continual gathering is disabled, local candidates won't be |
+// removed when the interface is turned down. |
+TEST_F(WebRtcSessionTest, TestLocalCandidatesNotRemovedIfNotGatherContinually) { |
+ AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); |
+ Init(); |
+ SendAudioVideoStream1(); |
+ CreateAndSetRemoteOfferAndLocalAnswer(); |
+ |
+ const SessionDescriptionInterface* local_desc = session_->local_description(); |
+ const IceCandidateCollection* candidates = |
+ local_desc->candidates(kMediaContentIndex0); |
+ ASSERT_TRUE(candidates != NULL); |
+ EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); |
+ |
+ size_t num_local_candidates = candidates->count(); |
+ EXPECT_LT(0u, num_local_candidates); |
+ // By default, Continual Gathering is disabled. |
+ // Bring down the network interface. |
+ RemoveInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); |
+ // Verify that the local candidates are not removed. |
+ rtc::Thread::Current()->ProcessMessages(1000); |
+ EXPECT_EQ(0, observer_.num_candidates_removed_); |
+ EXPECT_EQ(num_local_candidates, candidates->count()); |
} |
// Test that we can set a remote session description with remote candidates. |