Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(383)

Side by Side Diff: webrtc/api/webrtcsession_unittest.cc

Issue 1648813004: Remove candidates when doing continual gathering (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Address Alex's comments Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 break; 182 break;
183 default: 183 default:
184 ASSERT(false); 184 ASSERT(false);
185 } 185 }
186 186
187 // The ICE gathering state should always be Gathering when a candidate is 187 // The ICE gathering state should always be Gathering when a candidate is
188 // received (or possibly Completed in the case of the final candidate). 188 // received (or possibly Completed in the case of the final candidate).
189 EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, ice_gathering_state_); 189 EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, ice_gathering_state_);
190 } 190 }
191 191
192 // Some local candidates are removed.
193 void OnIceCandidatesRemoved(
194 const std::vector<cricket::Candidate>& candidates) {
195 num_candidates_removed_ += candidates.size();
196 }
197
192 bool oncandidatesready_; 198 bool oncandidatesready_;
193 std::vector<cricket::Candidate> mline_0_candidates_; 199 std::vector<cricket::Candidate> mline_0_candidates_;
194 std::vector<cricket::Candidate> mline_1_candidates_; 200 std::vector<cricket::Candidate> mline_1_candidates_;
195 PeerConnectionInterface::IceConnectionState ice_connection_state_; 201 PeerConnectionInterface::IceConnectionState ice_connection_state_;
196 PeerConnectionInterface::IceGatheringState ice_gathering_state_; 202 PeerConnectionInterface::IceGatheringState ice_gathering_state_;
203 size_t num_candidates_removed_ = 0;
197 }; 204 };
198 205
199 class WebRtcSessionForTest : public webrtc::WebRtcSession { 206 class WebRtcSessionForTest : public webrtc::WebRtcSession {
200 public: 207 public:
201 WebRtcSessionForTest(webrtc::MediaControllerInterface* media_controller, 208 WebRtcSessionForTest(webrtc::MediaControllerInterface* media_controller,
202 rtc::Thread* signaling_thread, 209 rtc::Thread* signaling_thread,
203 rtc::Thread* worker_thread, 210 rtc::Thread* worker_thread,
204 cricket::PortAllocator* port_allocator, 211 cricket::PortAllocator* port_allocator,
205 webrtc::IceObserver* ice_observer) 212 webrtc::IceObserver* ice_observer)
206 : WebRtcSession(media_controller, 213 : WebRtcSession(media_controller,
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP | 358 allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP |
352 cricket::PORTALLOCATOR_DISABLE_RELAY); 359 cricket::PORTALLOCATOR_DISABLE_RELAY);
353 EXPECT_TRUE(channel_manager_->Init()); 360 EXPECT_TRUE(channel_manager_->Init());
354 desc_factory_->set_add_legacy_streams(false); 361 desc_factory_->set_add_legacy_streams(false);
355 allocator_->set_step_delay(cricket::kMinimumStepDelay); 362 allocator_->set_step_delay(cricket::kMinimumStepDelay);
356 } 363 }
357 364
358 void AddInterface(const SocketAddress& addr) { 365 void AddInterface(const SocketAddress& addr) {
359 network_manager_.AddInterface(addr); 366 network_manager_.AddInterface(addr);
360 } 367 }
368 void RemoveInterface(const SocketAddress& addr) {
369 network_manager_.RemoveInterface(addr);
370 }
361 371
362 // If |dtls_identity_store| != null or |rtc_configuration| contains 372 // If |dtls_identity_store| != null or |rtc_configuration| contains
363 // |certificates| then DTLS will be enabled unless explicitly disabled by 373 // |certificates| then DTLS will be enabled unless explicitly disabled by
364 // |rtc_configuration| options. When DTLS is enabled a certificate will be 374 // |rtc_configuration| options. When DTLS is enabled a certificate will be
365 // used if provided, otherwise one will be generated using the 375 // used if provided, otherwise one will be generated using the
366 // |dtls_identity_store|. 376 // |dtls_identity_store|.
367 void Init( 377 void Init(
368 rtc::scoped_ptr<webrtc::DtlsIdentityStoreInterface> dtls_identity_store) { 378 rtc::scoped_ptr<webrtc::DtlsIdentityStoreInterface> dtls_identity_store) {
369 ASSERT_TRUE(session_.get() == NULL); 379 ASSERT_TRUE(session_.get() == NULL);
370 session_.reset(new WebRtcSessionForTest( 380 session_.reset(new WebRtcSessionForTest(
(...skipping 1728 matching lines...) Expand 10 before | Expand all | Expand 10 after
2099 Init(); 2109 Init();
2100 SendNothing(); 2110 SendNothing();
2101 rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); 2111 rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer());
2102 2112
2103 SessionDescriptionInterface* answer = 2113 SessionDescriptionInterface* answer =
2104 CreateRemoteAnswer(offer.get()); 2114 CreateRemoteAnswer(offer.get());
2105 SetRemoteDescriptionAnswerExpectError( 2115 SetRemoteDescriptionAnswerExpectError(
2106 "Called in wrong state: STATE_INIT", answer); 2116 "Called in wrong state: STATE_INIT", answer);
2107 } 2117 }
2108 2118
2109 TEST_F(WebRtcSessionTest, TestAddRemoteCandidate) { 2119 // Tests that the remote candidates are added and removed successfully.
2120 TEST_F(WebRtcSessionTest, TestAddAndRemoveRemoteCandidates) {
2110 Init(); 2121 Init();
2111 SendAudioVideoStream1(); 2122 SendAudioVideoStream1();
2112 2123
2113 cricket::Candidate candidate; 2124 cricket::Candidate candidate(1, "udp", rtc::SocketAddress("1.1.1.1", 5000), 0,
2114 candidate.set_component(1); 2125 "", "", "host", 0, "");
2126 candidate.set_transport_name("audio");
2115 JsepIceCandidate ice_candidate1(kMediaContentName0, 0, candidate); 2127 JsepIceCandidate ice_candidate1(kMediaContentName0, 0, candidate);
2116 2128
2117 // Fail since we have not set a remote description. 2129 // Fail since we have not set a remote description.
2118 EXPECT_FALSE(session_->ProcessIceMessage(&ice_candidate1)); 2130 EXPECT_FALSE(session_->ProcessIceMessage(&ice_candidate1));
2119 2131
2120 SessionDescriptionInterface* offer = CreateOffer(); 2132 SessionDescriptionInterface* offer = CreateOffer();
2121 SetLocalDescriptionWithoutError(offer); 2133 SetLocalDescriptionWithoutError(offer);
2122 2134
2123 // Fail since we have not set a remote description. 2135 // Fail since we have not set a remote description.
2124 EXPECT_FALSE(session_->ProcessIceMessage(&ice_candidate1)); 2136 EXPECT_FALSE(session_->ProcessIceMessage(&ice_candidate1));
2125 2137
2126 SessionDescriptionInterface* answer = CreateRemoteAnswer( 2138 SessionDescriptionInterface* answer = CreateRemoteAnswer(
2127 session_->local_description()); 2139 session_->local_description());
2128 SetRemoteDescriptionWithoutError(answer); 2140 SetRemoteDescriptionWithoutError(answer);
2129 2141
2130 EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate1)); 2142 EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate1));
2131 candidate.set_component(2); 2143 candidate.set_component(2);
2144 candidate.set_address(rtc::SocketAddress("2.2.2.2", 6000));
2132 JsepIceCandidate ice_candidate2(kMediaContentName0, 0, candidate); 2145 JsepIceCandidate ice_candidate2(kMediaContentName0, 0, candidate);
2133 EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2)); 2146 EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2));
2134 2147
2135 // Verifying the candidates are copied properly from internal vector. 2148 // Verifying the candidates are copied properly from internal vector.
2136 const SessionDescriptionInterface* remote_desc = 2149 const SessionDescriptionInterface* remote_desc =
2137 session_->remote_description(); 2150 session_->remote_description();
2138 ASSERT_TRUE(remote_desc != NULL); 2151 ASSERT_TRUE(remote_desc != NULL);
2139 ASSERT_EQ(2u, remote_desc->number_of_mediasections()); 2152 ASSERT_EQ(2u, remote_desc->number_of_mediasections());
2140 const IceCandidateCollection* candidates = 2153 const IceCandidateCollection* candidates =
2141 remote_desc->candidates(kMediaContentIndex0); 2154 remote_desc->candidates(kMediaContentIndex0);
2142 ASSERT_EQ(2u, candidates->count()); 2155 ASSERT_EQ(2u, candidates->count());
2143 EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index()); 2156 EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index());
2144 EXPECT_EQ(kMediaContentName0, candidates->at(0)->sdp_mid()); 2157 EXPECT_EQ(kMediaContentName0, candidates->at(0)->sdp_mid());
2145 EXPECT_EQ(1, candidates->at(0)->candidate().component()); 2158 EXPECT_EQ(1, candidates->at(0)->candidate().component());
2146 EXPECT_EQ(2, candidates->at(1)->candidate().component()); 2159 EXPECT_EQ(2, candidates->at(1)->candidate().component());
2147 2160
2148 // |ice_candidate3| is identical to |ice_candidate2|. It can be added 2161 // |ice_candidate3| is identical to |ice_candidate2|. It can be added
2149 // successfully, but the total count of candidates will not increase. 2162 // successfully, but the total count of candidates will not increase.
2150 candidate.set_component(2); 2163 candidate.set_component(2);
2151 JsepIceCandidate ice_candidate3(kMediaContentName0, 0, candidate); 2164 JsepIceCandidate ice_candidate3(kMediaContentName0, 0, candidate);
2152 EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate3)); 2165 EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate3));
2153 ASSERT_EQ(2u, candidates->count()); 2166 ASSERT_EQ(2u, candidates->count());
2154 2167
2155 JsepIceCandidate bad_ice_candidate("bad content name", 99, candidate); 2168 JsepIceCandidate bad_ice_candidate("bad content name", 99, candidate);
2156 EXPECT_FALSE(session_->ProcessIceMessage(&bad_ice_candidate)); 2169 EXPECT_FALSE(session_->ProcessIceMessage(&bad_ice_candidate));
2170
2171 // Remove candidate1 and candidate2
2172 std::vector<cricket::Candidate> remote_candidates;
2173 remote_candidates.push_back(ice_candidate1.candidate());
2174 remote_candidates.push_back(ice_candidate2.candidate());
2175 EXPECT_TRUE(session_->RemoveRemoteIceCandidates(remote_candidates));
2176 EXPECT_EQ(0u, candidates->count());
2157 } 2177 }
2158 2178
2159 // Test that a remote candidate is added to the remote session description and 2179 // Tests that a remote candidate is added to the remote session description and
2160 // that it is retained if the remote session description is changed. 2180 // that it is retained if the remote session description is changed.
2161 TEST_F(WebRtcSessionTest, TestRemoteCandidatesAddedToSessionDescription) { 2181 TEST_F(WebRtcSessionTest, TestRemoteCandidatesAddedToSessionDescription) {
2162 Init(); 2182 Init();
2163 cricket::Candidate candidate1; 2183 cricket::Candidate candidate1;
2164 candidate1.set_component(1); 2184 candidate1.set_component(1);
2165 JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0, 2185 JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0,
2166 candidate1); 2186 candidate1);
2167 SendAudioVideoStream1(); 2187 SendAudioVideoStream1();
2168 CreateAndSetRemoteOfferAndLocalAnswer(); 2188 CreateAndSetRemoteOfferAndLocalAnswer();
2169 2189
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2202 // No need to verify the username and password. 2222 // No need to verify the username and password.
2203 candidate1.set_username(candidates->at(1)->candidate().username()); 2223 candidate1.set_username(candidates->at(1)->candidate().username());
2204 candidate1.set_password(candidates->at(1)->candidate().password()); 2224 candidate1.set_password(candidates->at(1)->candidate().password());
2205 EXPECT_TRUE(candidate1.IsEquivalent(candidates->at(1)->candidate())); 2225 EXPECT_TRUE(candidate1.IsEquivalent(candidates->at(1)->candidate()));
2206 2226
2207 // Test that the candidate is ignored if we can add the same candidate again. 2227 // Test that the candidate is ignored if we can add the same candidate again.
2208 EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2)); 2228 EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2));
2209 } 2229 }
2210 2230
2211 // Test that local candidates are added to the local session description and 2231 // Test that local candidates are added to the local session description and
2212 // that they are retained if the local session description is changed. 2232 // that they are retained if the local session description is changed. And if
2213 TEST_F(WebRtcSessionTest, TestLocalCandidatesAddedToSessionDescription) { 2233 // continual gathering is enabled, they are removed from the local session
2234 // description when the network is down.
2235 TEST_F(WebRtcSessionTest,
2236 TestLocalCandidatesAddedAndRemovedIfGatherContinually) {
2214 AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); 2237 AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
2215 Init(); 2238 Init();
2216 SendAudioVideoStream1(); 2239 SendAudioVideoStream1();
2217 CreateAndSetRemoteOfferAndLocalAnswer(); 2240 CreateAndSetRemoteOfferAndLocalAnswer();
2218 2241
2219 const SessionDescriptionInterface* local_desc = session_->local_description(); 2242 const SessionDescriptionInterface* local_desc = session_->local_description();
2220 const IceCandidateCollection* candidates = 2243 const IceCandidateCollection* candidates =
2221 local_desc->candidates(kMediaContentIndex0); 2244 local_desc->candidates(kMediaContentIndex0);
2222 ASSERT_TRUE(candidates != NULL); 2245 ASSERT_TRUE(candidates != NULL);
2223 EXPECT_EQ(0u, candidates->count()); 2246 EXPECT_EQ(0u, candidates->count());
(...skipping 12 matching lines...) Expand all
2236 SendAudioVideoStream1(); 2259 SendAudioVideoStream1();
2237 CreateAndSetRemoteOfferAndLocalAnswer(); 2260 CreateAndSetRemoteOfferAndLocalAnswer();
2238 2261
2239 local_desc = session_->local_description(); 2262 local_desc = session_->local_description();
2240 candidates = local_desc->candidates(kMediaContentIndex0); 2263 candidates = local_desc->candidates(kMediaContentIndex0);
2241 ASSERT_TRUE(candidates != NULL); 2264 ASSERT_TRUE(candidates != NULL);
2242 EXPECT_LT(0u, candidates->count()); 2265 EXPECT_LT(0u, candidates->count());
2243 candidates = local_desc->candidates(1); 2266 candidates = local_desc->candidates(1);
2244 ASSERT_TRUE(candidates != NULL); 2267 ASSERT_TRUE(candidates != NULL);
2245 EXPECT_EQ(0u, candidates->count()); 2268 EXPECT_EQ(0u, candidates->count());
2269
2270 candidates = local_desc->candidates(kMediaContentIndex0);
2271 size_t num_local_candidates = candidates->count();
2272 // Enable Continual Gathering
2273 session_->SetIceConfig(cricket::IceConfig(-1, -1, true, false, -1));
2274 // Bring down the network interface to trigger candidate removals.
2275 RemoveInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
2276 // Verify that all local candidates are removed.
2277 EXPECT_EQ(0, observer_.num_candidates_removed_);
2278 EXPECT_EQ_WAIT(num_local_candidates, observer_.num_candidates_removed_,
2279 kIceCandidatesTimeout);
2280 EXPECT_EQ_WAIT(0u, candidates->count(), kIceCandidatesTimeout);
2281 }
2282
2283 // Tests that if continual gathering is disabled, local candidates won't be
2284 // removed when the interface is turned down.
2285 TEST_F(WebRtcSessionTest, TestLocalCandidatesNotRemovedIfNotGatherContinually) {
2286 AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
2287 Init();
2288 SendAudioVideoStream1();
2289 CreateAndSetRemoteOfferAndLocalAnswer();
2290
2291 const SessionDescriptionInterface* local_desc = session_->local_description();
2292 const IceCandidateCollection* candidates =
2293 local_desc->candidates(kMediaContentIndex0);
2294 ASSERT_TRUE(candidates != NULL);
2295 EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout);
2296
2297 size_t num_local_candidates = candidates->count();
2298 EXPECT_LT(0u, num_local_candidates);
2299 // By default, Continual Gathering is disabled.
2300 // Bring down the network interface.
2301 RemoveInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
2302 // Verify that the local candidates are not removed.
2303 rtc::Thread::Current()->ProcessMessages(1000);
2304 EXPECT_EQ(0, observer_.num_candidates_removed_);
2305 EXPECT_EQ(num_local_candidates, candidates->count());
2246 } 2306 }
2247 2307
2248 // Test that we can set a remote session description with remote candidates. 2308 // Test that we can set a remote session description with remote candidates.
2249 TEST_F(WebRtcSessionTest, TestSetRemoteSessionDescriptionWithCandidates) { 2309 TEST_F(WebRtcSessionTest, TestSetRemoteSessionDescriptionWithCandidates) {
2250 Init(); 2310 Init();
2251 2311
2252 cricket::Candidate candidate1; 2312 cricket::Candidate candidate1;
2253 candidate1.set_component(1); 2313 candidate1.set_component(1);
2254 JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0, 2314 JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0,
2255 candidate1); 2315 candidate1);
(...skipping 2031 matching lines...) Expand 10 before | Expand all | Expand 10 after
4287 } 4347 }
4288 4348
4289 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test 4349 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test
4290 // currently fails because upon disconnection and reconnection OnIceComplete is 4350 // currently fails because upon disconnection and reconnection OnIceComplete is
4291 // called more than once without returning to IceGatheringGathering. 4351 // called more than once without returning to IceGatheringGathering.
4292 4352
4293 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests, 4353 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests,
4294 WebRtcSessionTest, 4354 WebRtcSessionTest,
4295 testing::Values(ALREADY_GENERATED, 4355 testing::Values(ALREADY_GENERATED,
4296 DTLS_IDENTITY_STORE)); 4356 DTLS_IDENTITY_STORE));
OLDNEW
« no previous file with comments | « webrtc/api/webrtcsession.cc ('k') | webrtc/examples/androidapp/src/org/appspot/apprtc/AppRTCClient.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698