diff --git a/webrtc/api/peerconnection_unittest.cc b/webrtc/api/peerconnection_unittest.cc index 67b4efbc73..99be22f459 100644 --- a/webrtc/api/peerconnection_unittest.cc +++ b/webrtc/api/peerconnection_unittest.cc @@ -155,10 +155,11 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, const MediaConstraintsInterface* constraints, const PeerConnectionFactory::Options* options, rtc::scoped_ptr dtls_identity_store, - bool prefer_constraint_apis) { + bool prefer_constraint_apis, + rtc::Thread* worker_thread) { PeerConnectionTestClient* client(new PeerConnectionTestClient(id)); if (!client->Init(constraints, options, std::move(dtls_identity_store), - prefer_constraint_apis)) { + prefer_constraint_apis, worker_thread)) { delete client; return nullptr; } @@ -168,24 +169,28 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, static PeerConnectionTestClient* CreateClient( const std::string& id, const MediaConstraintsInterface* constraints, - const PeerConnectionFactory::Options* options) { + const PeerConnectionFactory::Options* options, + rtc::Thread* worker_thread) { rtc::scoped_ptr dtls_identity_store( rtc::SSLStreamAdapter::HaveDtlsSrtp() ? new FakeDtlsIdentityStore() : nullptr); - return CreateClientWithDtlsIdentityStore( - id, constraints, options, std::move(dtls_identity_store), true); + return CreateClientWithDtlsIdentityStore(id, constraints, options, + std::move(dtls_identity_store), + true, worker_thread); } static PeerConnectionTestClient* CreateClientPreferNoConstraints( const std::string& id, - const PeerConnectionFactory::Options* options) { + const PeerConnectionFactory::Options* options, + rtc::Thread* worker_thread) { rtc::scoped_ptr dtls_identity_store( rtc::SSLStreamAdapter::HaveDtlsSrtp() ? new FakeDtlsIdentityStore() : nullptr); - return CreateClientWithDtlsIdentityStore( - id, nullptr, options, std::move(dtls_identity_store), false); + return CreateClientWithDtlsIdentityStore(id, nullptr, options, + std::move(dtls_identity_store), + false, worker_thread); } ~PeerConnectionTestClient() { @@ -800,7 +805,8 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, const MediaConstraintsInterface* constraints, const PeerConnectionFactory::Options* options, rtc::scoped_ptr dtls_identity_store, - bool prefer_constraint_apis) { + bool prefer_constraint_apis, + rtc::Thread* worker_thread) { EXPECT_TRUE(!peer_connection_); EXPECT_TRUE(!peer_connection_factory_); if (!prefer_constraint_apis) { @@ -809,7 +815,7 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, prefer_constraint_apis_ = prefer_constraint_apis; rtc::scoped_ptr port_allocator( - new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr)); + new cricket::FakePortAllocator(worker_thread, nullptr)); fake_audio_capture_module_ = FakeAudioCaptureModule::Create(); if (fake_audio_capture_module_ == nullptr) { @@ -818,9 +824,8 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, fake_video_decoder_factory_ = new FakeWebRtcVideoDecoderFactory(); fake_video_encoder_factory_ = new FakeWebRtcVideoEncoderFactory(); peer_connection_factory_ = webrtc::CreatePeerConnectionFactory( - rtc::Thread::Current(), rtc::Thread::Current(), - fake_audio_capture_module_, fake_video_encoder_factory_, - fake_video_decoder_factory_); + worker_thread, rtc::Thread::Current(), fake_audio_capture_module_, + fake_video_encoder_factory_, fake_video_decoder_factory_); if (!peer_connection_factory_) { return false; } @@ -1019,7 +1024,9 @@ class P2PTestConductor : public testing::Test { P2PTestConductor() : pss_(new rtc::PhysicalSocketServer), ss_(new rtc::VirtualSocketServer(pss_.get())), - ss_scope_(ss_.get()) {} + ss_scope_(ss_.get()) { + RTC_CHECK(worker_thread_.Start()); + } bool SessionActive() { return initiating_client_->SessionActive() && @@ -1127,11 +1134,11 @@ class P2PTestConductor : public testing::Test { bool CreateTestClientsThatPreferNoConstraints() { initiating_client_.reset( - PeerConnectionTestClient::CreateClientPreferNoConstraints("Caller: ", - nullptr)); + PeerConnectionTestClient::CreateClientPreferNoConstraints( + "Caller: ", nullptr, &worker_thread_)); receiving_client_.reset( - PeerConnectionTestClient::CreateClientPreferNoConstraints("Callee: ", - nullptr)); + PeerConnectionTestClient::CreateClientPreferNoConstraints( + "Callee: ", nullptr, &worker_thread_)); if (!initiating_client_ || !receiving_client_) { return false; } @@ -1151,9 +1158,9 @@ class P2PTestConductor : public testing::Test { MediaConstraintsInterface* recv_constraints, PeerConnectionFactory::Options* recv_options) { initiating_client_.reset(PeerConnectionTestClient::CreateClient( - "Caller: ", init_constraints, init_options)); + "Caller: ", init_constraints, init_options, &worker_thread_)); receiving_client_.reset(PeerConnectionTestClient::CreateClient( - "Callee: ", recv_constraints, recv_options)); + "Callee: ", recv_constraints, recv_options, &worker_thread_)); if (!initiating_client_ || !receiving_client_) { return false; } @@ -1254,7 +1261,8 @@ class P2PTestConductor : public testing::Test { // Make sure the new client is using a different certificate. return PeerConnectionTestClient::CreateClientWithDtlsIdentityStore( "New Peer: ", &setup_constraints, nullptr, - std::move(dtls_identity_store), prefer_constraint_apis_); + std::move(dtls_identity_store), prefer_constraint_apis_, + &worker_thread_); } void SendRtpData(webrtc::DataChannelInterface* dc, const std::string& data) { @@ -1294,6 +1302,9 @@ class P2PTestConductor : public testing::Test { } private: + // |worker_thread_| is used by both |initiating_client_| and + // |receiving_client_|. Must be destroyed last. + rtc::Thread worker_thread_; rtc::scoped_ptr pss_; rtc::scoped_ptr ss_; rtc::SocketServerScope ss_scope_;