OLD | NEW |
---|---|
1 /* | 1 /* |
2 * libjingle | 2 * libjingle |
3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
164 const PeerConnectionFactory::Options* options) { | 164 const PeerConnectionFactory::Options* options) { |
165 rtc::scoped_ptr<FakeDtlsIdentityStore> dtls_identity_store( | 165 rtc::scoped_ptr<FakeDtlsIdentityStore> dtls_identity_store( |
166 rtc::SSLStreamAdapter::HaveDtlsSrtp() ? new FakeDtlsIdentityStore() | 166 rtc::SSLStreamAdapter::HaveDtlsSrtp() ? new FakeDtlsIdentityStore() |
167 : nullptr); | 167 : nullptr); |
168 | 168 |
169 return CreateClientWithDtlsIdentityStore(id, constraints, options, | 169 return CreateClientWithDtlsIdentityStore(id, constraints, options, |
170 dtls_identity_store.Pass()); | 170 dtls_identity_store.Pass()); |
171 } | 171 } |
172 | 172 |
173 ~PeerConnectionTestClient() { | 173 ~PeerConnectionTestClient() { |
174 while (!fake_video_renderers_.empty()) { | |
175 RenderMap::iterator it = fake_video_renderers_.begin(); | |
176 delete it->second; | |
177 fake_video_renderers_.erase(it); | |
178 } | |
179 } | 174 } |
180 | 175 |
181 void Negotiate() { Negotiate(true, true); } | 176 void Negotiate() { Negotiate(true, true); } |
182 | 177 |
183 void Negotiate(bool audio, bool video) { | 178 void Negotiate(bool audio, bool video) { |
184 rtc::scoped_ptr<SessionDescriptionInterface> offer; | 179 rtc::scoped_ptr<SessionDescriptionInterface> offer; |
185 ASSERT_TRUE(DoCreateOffer(offer.use())); | 180 ASSERT_TRUE(DoCreateOffer(offer.use())); |
186 | 181 |
187 if (offer->description()->GetContentByName("audio")) { | 182 if (offer->description()->GetContentByName("audio")) { |
188 offer->description()->GetContentByName("audio")->rejected = !audio; | 183 offer->description()->GetContentByName("audio")->rejected = !audio; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
222 void OnSignalingChange( | 217 void OnSignalingChange( |
223 webrtc::PeerConnectionInterface::SignalingState new_state) override { | 218 webrtc::PeerConnectionInterface::SignalingState new_state) override { |
224 EXPECT_EQ(pc()->signaling_state(), new_state); | 219 EXPECT_EQ(pc()->signaling_state(), new_state); |
225 } | 220 } |
226 void OnAddStream(MediaStreamInterface* media_stream) override { | 221 void OnAddStream(MediaStreamInterface* media_stream) override { |
227 media_stream->RegisterObserver(this); | 222 media_stream->RegisterObserver(this); |
228 for (size_t i = 0; i < media_stream->GetVideoTracks().size(); ++i) { | 223 for (size_t i = 0; i < media_stream->GetVideoTracks().size(); ++i) { |
229 const std::string id = media_stream->GetVideoTracks()[i]->id(); | 224 const std::string id = media_stream->GetVideoTracks()[i]->id(); |
230 ASSERT_TRUE(fake_video_renderers_.find(id) == | 225 ASSERT_TRUE(fake_video_renderers_.find(id) == |
231 fake_video_renderers_.end()); | 226 fake_video_renderers_.end()); |
232 fake_video_renderers_[id] = | 227 fake_video_renderers_[id].reset(new webrtc::FakeVideoTrackRenderer( |
233 new webrtc::FakeVideoTrackRenderer(media_stream->GetVideoTracks()[i]); | 228 media_stream->GetVideoTracks()[i])); |
234 } | 229 } |
235 } | 230 } |
236 void OnRemoveStream(MediaStreamInterface* media_stream) override {} | 231 void OnRemoveStream(MediaStreamInterface* media_stream) override {} |
237 void OnRenegotiationNeeded() override {} | 232 void OnRenegotiationNeeded() override {} |
238 void OnIceConnectionChange( | 233 void OnIceConnectionChange( |
239 webrtc::PeerConnectionInterface::IceConnectionState new_state) override { | 234 webrtc::PeerConnectionInterface::IceConnectionState new_state) override { |
240 EXPECT_EQ(pc()->ice_connection_state(), new_state); | 235 EXPECT_EQ(pc()->ice_connection_state(), new_state); |
241 } | 236 } |
242 void OnIceGatheringChange( | 237 void OnIceGatheringChange( |
243 webrtc::PeerConnectionInterface::IceGatheringState new_state) override { | 238 webrtc::PeerConnectionInterface::IceGatheringState new_state) override { |
(...skipping 14 matching lines...) Expand all Loading... | |
258 | 253 |
259 // MediaStreamInterface callback | 254 // MediaStreamInterface callback |
260 void OnChanged() override { | 255 void OnChanged() override { |
261 // Track added or removed from MediaStream, so update our renderers. | 256 // Track added or removed from MediaStream, so update our renderers. |
262 rtc::scoped_refptr<StreamCollectionInterface> remote_streams = | 257 rtc::scoped_refptr<StreamCollectionInterface> remote_streams = |
263 pc()->remote_streams(); | 258 pc()->remote_streams(); |
264 // Remove renderers for tracks that were removed. | 259 // Remove renderers for tracks that were removed. |
265 for (auto it = fake_video_renderers_.begin(); | 260 for (auto it = fake_video_renderers_.begin(); |
266 it != fake_video_renderers_.end();) { | 261 it != fake_video_renderers_.end();) { |
267 if (remote_streams->FindVideoTrack(it->first) == nullptr) { | 262 if (remote_streams->FindVideoTrack(it->first) == nullptr) { |
268 auto to_delete = it++; | 263 auto to_remove = it++; |
269 delete to_delete->second; | 264 removed_fake_video_renderers_.push_back(std::move(to_remove->second)); |
270 fake_video_renderers_.erase(to_delete); | 265 fake_video_renderers_.erase(to_remove); |
271 } else { | 266 } else { |
272 ++it; | 267 ++it; |
273 } | 268 } |
274 } | 269 } |
275 // Create renderers for new video tracks. | 270 // Create renderers for new video tracks. |
276 for (size_t stream_index = 0; stream_index < remote_streams->count(); | 271 for (size_t stream_index = 0; stream_index < remote_streams->count(); |
277 ++stream_index) { | 272 ++stream_index) { |
278 MediaStreamInterface* remote_stream = remote_streams->at(stream_index); | 273 MediaStreamInterface* remote_stream = remote_streams->at(stream_index); |
279 for (size_t track_index = 0; | 274 for (size_t track_index = 0; |
280 track_index < remote_stream->GetVideoTracks().size(); | 275 track_index < remote_stream->GetVideoTracks().size(); |
281 ++track_index) { | 276 ++track_index) { |
282 const std::string id = | 277 const std::string id = |
283 remote_stream->GetVideoTracks()[track_index]->id(); | 278 remote_stream->GetVideoTracks()[track_index]->id(); |
284 if (fake_video_renderers_.find(id) != fake_video_renderers_.end()) { | 279 if (fake_video_renderers_.find(id) != fake_video_renderers_.end()) { |
285 continue; | 280 continue; |
286 } | 281 } |
287 fake_video_renderers_[id] = new webrtc::FakeVideoTrackRenderer( | 282 fake_video_renderers_[id].reset(new webrtc::FakeVideoTrackRenderer( |
288 remote_stream->GetVideoTracks()[track_index]); | 283 remote_stream->GetVideoTracks()[track_index])); |
289 } | 284 } |
290 } | 285 } |
291 } | 286 } |
292 | 287 |
293 void SetVideoConstraints(const webrtc::FakeConstraints& video_constraint) { | 288 void SetVideoConstraints(const webrtc::FakeConstraints& video_constraint) { |
294 video_constraints_ = video_constraint; | 289 video_constraints_ = video_constraint; |
295 } | 290 } |
296 | 291 |
297 void AddMediaStream(bool audio, bool video) { | 292 void AddMediaStream(bool audio, bool video) { |
298 std::string stream_label = | 293 std::string stream_label = |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
445 video_capturers_.begin(); | 440 video_capturers_.begin(); |
446 it != video_capturers_.end(); ++it) { | 441 it != video_capturers_.end(); ++it) { |
447 (*it)->Stop(); | 442 (*it)->Stop(); |
448 } | 443 } |
449 } | 444 } |
450 | 445 |
451 bool AudioFramesReceivedCheck(int number_of_frames) const { | 446 bool AudioFramesReceivedCheck(int number_of_frames) const { |
452 return number_of_frames <= fake_audio_capture_module_->frames_received(); | 447 return number_of_frames <= fake_audio_capture_module_->frames_received(); |
453 } | 448 } |
454 | 449 |
450 int TotalAudioFramesReceived() const { | |
pthatcher1
2015/12/11 02:10:13
I'd just call this audio_frames_received()
| |
451 return fake_audio_capture_module_->frames_received(); | |
452 } | |
453 | |
455 bool VideoFramesReceivedCheck(int number_of_frames) { | 454 bool VideoFramesReceivedCheck(int number_of_frames) { |
456 if (video_decoder_factory_enabled_) { | 455 if (video_decoder_factory_enabled_) { |
457 const std::vector<FakeWebRtcVideoDecoder*>& decoders | 456 const std::vector<FakeWebRtcVideoDecoder*>& decoders |
458 = fake_video_decoder_factory_->decoders(); | 457 = fake_video_decoder_factory_->decoders(); |
459 if (decoders.empty()) { | 458 if (decoders.empty()) { |
460 return number_of_frames <= 0; | 459 return number_of_frames <= 0; |
461 } | 460 } |
462 | 461 |
463 for (std::vector<FakeWebRtcVideoDecoder*>::const_iterator | 462 for (FakeWebRtcVideoDecoder* decoder : decoders) { |
464 it = decoders.begin(); it != decoders.end(); ++it) { | 463 if (number_of_frames > decoder->GetNumFramesReceived()) { |
465 if (number_of_frames > (*it)->GetNumFramesReceived()) { | |
466 return false; | 464 return false; |
467 } | 465 } |
468 } | 466 } |
469 return true; | 467 return true; |
470 } else { | 468 } else { |
471 if (fake_video_renderers_.empty()) { | 469 if (fake_video_renderers_.empty()) { |
472 return number_of_frames <= 0; | 470 return number_of_frames <= 0; |
473 } | 471 } |
474 | 472 |
475 for (RenderMap::const_iterator it = fake_video_renderers_.begin(); | 473 for (const auto& pair : fake_video_renderers_) { |
476 it != fake_video_renderers_.end(); ++it) { | 474 if (number_of_frames > pair.second->num_rendered_frames()) { |
477 if (number_of_frames > it->second->num_rendered_frames()) { | |
478 return false; | 475 return false; |
479 } | 476 } |
480 } | 477 } |
481 return true; | 478 return true; |
482 } | 479 } |
483 } | 480 } |
484 | 481 |
482 int TotalVideoFramesReceived() const { | |
pthatcher1
2015/12/11 02:10:13
Likewise, video_frames_received()
| |
483 int total = 0; | |
484 if (video_decoder_factory_enabled_) { | |
485 const std::vector<FakeWebRtcVideoDecoder*>& decoders = | |
486 fake_video_decoder_factory_->decoders(); | |
487 for (const FakeWebRtcVideoDecoder* decoder : decoders) { | |
488 total += decoder->GetNumFramesReceived(); | |
489 } | |
490 } else { | |
491 for (const auto& pair : fake_video_renderers_) { | |
492 total += pair.second->num_rendered_frames(); | |
493 } | |
494 for (const auto& renderer : removed_fake_video_renderers_) { | |
495 total += renderer->num_rendered_frames(); | |
496 } | |
497 } | |
498 return total; | |
499 } | |
500 | |
485 // Verify the CreateDtmfSender interface | 501 // Verify the CreateDtmfSender interface |
486 void VerifyDtmf() { | 502 void VerifyDtmf() { |
487 rtc::scoped_ptr<DummyDtmfObserver> observer(new DummyDtmfObserver()); | 503 rtc::scoped_ptr<DummyDtmfObserver> observer(new DummyDtmfObserver()); |
488 rtc::scoped_refptr<DtmfSenderInterface> dtmf_sender; | 504 rtc::scoped_refptr<DtmfSenderInterface> dtmf_sender; |
489 | 505 |
490 // We can't create a DTMF sender with an invalid audio track or a non local | 506 // We can't create a DTMF sender with an invalid audio track or a non local |
491 // track. | 507 // track. |
492 EXPECT_TRUE(peer_connection_->CreateDtmfSender(nullptr) == nullptr); | 508 EXPECT_TRUE(peer_connection_->CreateDtmfSender(nullptr) == nullptr); |
493 rtc::scoped_refptr<webrtc::AudioTrackInterface> non_localtrack( | 509 rtc::scoped_refptr<webrtc::AudioTrackInterface> non_localtrack( |
494 peer_connection_factory_->CreateAudioTrack("dummy_track", nullptr)); | 510 peer_connection_factory_->CreateAudioTrack("dummy_track", nullptr)); |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
871 rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_; | 887 rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_; |
872 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> | 888 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> |
873 peer_connection_factory_; | 889 peer_connection_factory_; |
874 | 890 |
875 bool auto_add_stream_ = true; | 891 bool auto_add_stream_ = true; |
876 | 892 |
877 typedef std::pair<std::string, std::string> IceUfragPwdPair; | 893 typedef std::pair<std::string, std::string> IceUfragPwdPair; |
878 std::map<int, IceUfragPwdPair> ice_ufrag_pwd_; | 894 std::map<int, IceUfragPwdPair> ice_ufrag_pwd_; |
879 bool expect_ice_restart_ = false; | 895 bool expect_ice_restart_ = false; |
880 | 896 |
881 // Needed to keep track of number of frames send. | 897 // Needed to keep track of number of frames sent. |
882 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_; | 898 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_; |
883 // Needed to keep track of number of frames received. | 899 // Needed to keep track of number of frames received. |
884 typedef std::map<std::string, webrtc::FakeVideoTrackRenderer*> RenderMap; | 900 std::map<std::string, rtc::scoped_ptr<webrtc::FakeVideoTrackRenderer>> |
885 RenderMap fake_video_renderers_; | 901 fake_video_renderers_; |
902 // Needed to ensure frames aren't received for removed tracks. | |
903 std::vector<rtc::scoped_ptr<webrtc::FakeVideoTrackRenderer>> | |
904 removed_fake_video_renderers_; | |
886 // Needed to keep track of number of frames received when external decoder | 905 // Needed to keep track of number of frames received when external decoder |
887 // used. | 906 // used. |
888 FakeWebRtcVideoDecoderFactory* fake_video_decoder_factory_ = nullptr; | 907 FakeWebRtcVideoDecoderFactory* fake_video_decoder_factory_ = nullptr; |
889 FakeWebRtcVideoEncoderFactory* fake_video_encoder_factory_ = nullptr; | 908 FakeWebRtcVideoEncoderFactory* fake_video_encoder_factory_ = nullptr; |
890 bool video_decoder_factory_enabled_ = false; | 909 bool video_decoder_factory_enabled_ = false; |
891 webrtc::FakeConstraints video_constraints_; | 910 webrtc::FakeConstraints video_constraints_; |
892 | 911 |
893 // For remote peer communication. | 912 // For remote peer communication. |
894 SignalingMessageReceiver* signaling_message_receiver_ = nullptr; | 913 SignalingMessageReceiver* signaling_message_receiver_ = nullptr; |
895 | 914 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
937 bool VideoFramesReceivedCheck(int frames_received) { | 956 bool VideoFramesReceivedCheck(int frames_received) { |
938 return initiating_client_->VideoFramesReceivedCheck(frames_received) && | 957 return initiating_client_->VideoFramesReceivedCheck(frames_received) && |
939 receiving_client_->VideoFramesReceivedCheck(frames_received); | 958 receiving_client_->VideoFramesReceivedCheck(frames_received); |
940 } | 959 } |
941 void VerifyDtmf() { | 960 void VerifyDtmf() { |
942 initiating_client_->VerifyDtmf(); | 961 initiating_client_->VerifyDtmf(); |
943 receiving_client_->VerifyDtmf(); | 962 receiving_client_->VerifyDtmf(); |
944 } | 963 } |
945 | 964 |
946 void TestUpdateOfferWithRejectedContent() { | 965 void TestUpdateOfferWithRejectedContent() { |
966 // Renegotiate, rejecting the video m-line. | |
947 initiating_client_->Negotiate(true, false); | 967 initiating_client_->Negotiate(true, false); |
948 EXPECT_TRUE_WAIT( | 968 ASSERT_TRUE_WAIT(SessionActive(), kMaxWaitForActivationMs); |
949 FramesNotPending(kEndAudioFrameCount * 2, kEndVideoFrameCount), | 969 |
950 kMaxWaitForFramesMs); | 970 int pc1_audio_received = initiating_client_->TotalAudioFramesReceived(); |
951 // There shouldn't be any more video frame after the new offer is | 971 int pc1_video_received = initiating_client_->TotalVideoFramesReceived(); |
952 // negotiated. | 972 int pc2_audio_received = receiving_client_->TotalAudioFramesReceived(); |
953 EXPECT_FALSE(VideoFramesReceivedCheck(kEndVideoFrameCount + 1)); | 973 int pc2_video_received = receiving_client_->TotalVideoFramesReceived(); |
974 | |
975 // Wait for some additional audio frames to be received. | |
976 EXPECT_TRUE_WAIT(initiating_client_->AudioFramesReceivedCheck( | |
977 pc1_audio_received + kEndAudioFrameCount) && | |
978 receiving_client_->AudioFramesReceivedCheck( | |
979 pc2_audio_received + kEndAudioFrameCount), | |
980 kMaxWaitForFramesMs); | |
981 | |
982 // During this time, we shouldn't have received any additional video frames | |
983 // for the rejected video tracks. | |
984 EXPECT_EQ(pc1_video_received, | |
985 initiating_client_->TotalVideoFramesReceived()); | |
986 EXPECT_EQ(pc2_video_received, | |
987 receiving_client_->TotalVideoFramesReceived()); | |
954 } | 988 } |
955 | 989 |
956 void VerifyRenderedSize(int width, int height) { | 990 void VerifyRenderedSize(int width, int height) { |
957 EXPECT_EQ(width, receiving_client()->rendered_width()); | 991 EXPECT_EQ(width, receiving_client()->rendered_width()); |
958 EXPECT_EQ(height, receiving_client()->rendered_height()); | 992 EXPECT_EQ(height, receiving_client()->rendered_height()); |
959 EXPECT_EQ(width, initializing_client()->rendered_width()); | 993 EXPECT_EQ(width, initializing_client()->rendered_width()); |
960 EXPECT_EQ(height, initializing_client()->rendered_height()); | 994 EXPECT_EQ(height, initializing_client()->rendered_height()); |
961 } | 995 } |
962 | 996 |
963 void VerifySessionDescriptions() { | 997 void VerifySessionDescriptions() { |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1287 TEST_F(JsepPeerConnectionP2PTestClient, LocalP2PTestAnswerNone) { | 1321 TEST_F(JsepPeerConnectionP2PTestClient, LocalP2PTestAnswerNone) { |
1288 ASSERT_TRUE(CreateTestClients()); | 1322 ASSERT_TRUE(CreateTestClients()); |
1289 receiving_client()->SetReceiveAudioVideo(false, false); | 1323 receiving_client()->SetReceiveAudioVideo(false, false); |
1290 LocalP2PTest(); | 1324 LocalP2PTest(); |
1291 } | 1325 } |
1292 | 1326 |
1293 // This test sets up an audio and video call between two parties. After the call | 1327 // This test sets up an audio and video call between two parties. After the call |
1294 // runs for a while (10 frames), the caller sends an update offer with video | 1328 // runs for a while (10 frames), the caller sends an update offer with video |
1295 // being rejected. Once the re-negotiation is done, the video flow should stop | 1329 // being rejected. Once the re-negotiation is done, the video flow should stop |
1296 // and the audio flow should continue. | 1330 // and the audio flow should continue. |
1297 // Disabled due to b/14955157. | 1331 TEST_F(JsepPeerConnectionP2PTestClient, UpdateOfferWithRejectedContent) { |
1298 TEST_F(JsepPeerConnectionP2PTestClient, | |
1299 DISABLED_UpdateOfferWithRejectedContent) { | |
1300 ASSERT_TRUE(CreateTestClients()); | 1332 ASSERT_TRUE(CreateTestClients()); |
1301 LocalP2PTest(); | 1333 LocalP2PTest(); |
1302 TestUpdateOfferWithRejectedContent(); | 1334 TestUpdateOfferWithRejectedContent(); |
1303 } | 1335 } |
1304 | 1336 |
1305 // This test sets up a Jsep call between two parties. The MSID is removed from | 1337 // This test sets up a Jsep call between two parties. The MSID is removed from |
1306 // the SDP strings from the caller. | 1338 // the SDP strings from the caller. |
1307 // Disabled due to b/14955157. | 1339 TEST_F(JsepPeerConnectionP2PTestClient, LocalP2PTestWithoutMsid) { |
1308 TEST_F(JsepPeerConnectionP2PTestClient, | |
1309 DISABLED_LocalP2PTestWithoutMsid) { | |
1310 ASSERT_TRUE(CreateTestClients()); | 1340 ASSERT_TRUE(CreateTestClients()); |
1311 receiving_client()->RemoveMsidFromReceivedSdp(true); | 1341 receiving_client()->RemoveMsidFromReceivedSdp(true); |
1312 // TODO(perkj): Currently there is a bug that cause audio to stop playing if | 1342 // TODO(perkj): Currently there is a bug that cause audio to stop playing if |
1313 // audio and video is muxed when MSID is disabled. Remove | 1343 // audio and video is muxed when MSID is disabled. Remove |
1314 // SetRemoveBundleFromSdp once | 1344 // SetRemoveBundleFromSdp once |
1315 // https://code.google.com/p/webrtc/issues/detail?id=1193 is fixed. | 1345 // https://code.google.com/p/webrtc/issues/detail?id=1193 is fixed. |
1316 receiving_client()->RemoveBundleFromReceivedSdp(true); | 1346 receiving_client()->RemoveBundleFromReceivedSdp(true); |
1317 LocalP2PTest(); | 1347 LocalP2PTest(); |
1318 } | 1348 } |
1319 | 1349 |
(...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1965 server.urls.push_back("stun:hostname"); | 1995 server.urls.push_back("stun:hostname"); |
1966 server.urls.push_back("turn:hostname"); | 1996 server.urls.push_back("turn:hostname"); |
1967 servers.push_back(server); | 1997 servers.push_back(server); |
1968 EXPECT_TRUE(webrtc::ParseIceServers(servers, &stun_configurations_, | 1998 EXPECT_TRUE(webrtc::ParseIceServers(servers, &stun_configurations_, |
1969 &turn_configurations_)); | 1999 &turn_configurations_)); |
1970 EXPECT_EQ(1U, stun_configurations_.size()); | 2000 EXPECT_EQ(1U, stun_configurations_.size()); |
1971 EXPECT_EQ(1U, turn_configurations_.size()); | 2001 EXPECT_EQ(1U, turn_configurations_.size()); |
1972 } | 2002 } |
1973 | 2003 |
1974 #endif // if !defined(THREAD_SANITIZER) | 2004 #endif // if !defined(THREAD_SANITIZER) |
OLD | NEW |