From dcb5a5814e7fb30dbce9ef928db984f1b5aabc09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Mon, 20 Jun 2022 15:33:59 +0200 Subject: [PATCH] Add NetworkManager to PeerConnectionFactoryDependencies Bug: webrtc:7447 Change-Id: I5abe1c4a15b52e9f15bb3ccbf1919c88000c9828 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/266361 Commit-Queue: Niels Moller Reviewed-by: Harald Alvestrand Cr-Commit-Position: refs/heads/main@{#37284} --- api/peer_connection_interface.h | 3 ++ pc/connection_context.cc | 15 ++++++--- pc/connection_context.h | 5 ++- pc/peer_connection_factory_unittest.cc | 44 ++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 8 deletions(-) diff --git a/api/peer_connection_interface.h b/api/peer_connection_interface.h index e5bbd9c41c..7d944f284d 100644 --- a/api/peer_connection_interface.h +++ b/api/peer_connection_interface.h @@ -1433,6 +1433,9 @@ struct RTC_EXPORT PeerConnectionFactoryDependencies final { // This will only be used if CreatePeerConnection is called without a // `port_allocator`, causing the default allocator and network manager to be // used. + std::unique_ptr network_manager; + // This will only be used if CreatePeerConnection is called without a + // `port_allocator`, and the above `network_manager' is null. std::unique_ptr network_monitor_factory; std::unique_ptr neteq_factory; std::unique_ptr sctp_factory; diff --git a/pc/connection_context.cc b/pc/connection_context.cc index 27bc822a4e..f89ca5fde5 100644 --- a/pc/connection_context.cc +++ b/pc/connection_context.cc @@ -102,12 +102,16 @@ ConnectionContext::ConnectionContext( media_engine_(std::move(dependencies->media_engine)), network_monitor_factory_( std::move(dependencies->network_monitor_factory)), + default_network_manager_(std::move(dependencies->network_manager)), call_factory_(std::move(dependencies->call_factory)), sctp_factory_( MaybeCreateSctpFactory(std::move(dependencies->sctp_factory), network_thread(), *trials_.get())) { RTC_DCHECK_RUN_ON(signaling_thread_); + RTC_DCHECK(!(default_network_manager_ && network_monitor_factory_)) + << "You can't set both network_manager and network_monitor_factory."; + signaling_thread_->AllowInvokesToThread(worker_thread()); signaling_thread_->AllowInvokesToThread(network_thread_); worker_thread_->AllowInvokesToThread(network_thread_); @@ -141,11 +145,12 @@ ConnectionContext::ConnectionContext( socket_factory = network_thread()->socketserver(); } } - // If network_monitor_factory_ is non-null, it will be used to create a - // network monitor while on the network thread. - default_network_manager_ = std::make_unique( - network_monitor_factory_.get(), socket_factory, &field_trials()); - + if (!default_network_manager_) { + // If network_monitor_factory_ is non-null, it will be used to create a + // network monitor while on the network thread. + default_network_manager_ = std::make_unique( + network_monitor_factory_.get(), socket_factory, &field_trials()); + } default_socket_factory_ = std::make_unique(socket_factory); diff --git a/pc/connection_context.h b/pc/connection_context.h index 3869164aaa..e8a109abff 100644 --- a/pc/connection_context.h +++ b/pc/connection_context.h @@ -37,7 +37,6 @@ class ChannelManager; } namespace rtc { -class BasicNetworkManager; class BasicPacketSocketFactory; class UniqueRandomIdGenerator; } // namespace rtc @@ -88,7 +87,7 @@ class ConnectionContext final const FieldTrialsView& field_trials() const { return *trials_.get(); } // Accessors only used from the PeerConnectionFactory class - rtc::BasicNetworkManager* default_network_manager() { + rtc::NetworkManager* default_network_manager() { RTC_DCHECK_RUN_ON(signaling_thread_); return default_network_manager_.get(); } @@ -136,7 +135,7 @@ class ConnectionContext final rtc::UniqueRandomIdGenerator ssrc_generator_; std::unique_ptr const network_monitor_factory_ RTC_GUARDED_BY(signaling_thread_); - std::unique_ptr default_network_manager_ + std::unique_ptr default_network_manager_ RTC_GUARDED_BY(signaling_thread_); std::unique_ptr const call_factory_ RTC_GUARDED_BY(worker_thread()); diff --git a/pc/peer_connection_factory_unittest.cc b/pc/peer_connection_factory_unittest.cc index 128f72c976..a2b7daa27e 100644 --- a/pc/peer_connection_factory_unittest.cc +++ b/pc/peer_connection_factory_unittest.cc @@ -34,6 +34,7 @@ #include "rtc_base/rtc_certificate_generator.h" #include "rtc_base/socket_address.h" #include "rtc_base/time_utils.h" +#include "test/gmock.h" #include "test/gtest.h" #ifdef WEBRTC_ANDROID @@ -51,6 +52,10 @@ using webrtc::PeerConnectionObserver; using webrtc::VideoTrackInterface; using webrtc::VideoTrackSourceInterface; +using ::testing::AtLeast; +using ::testing::InvokeWithoutArgs; +using ::testing::NiceMock; + namespace { static const char kStunIceServer[] = "stun:stun.l.google.com:19302"; @@ -93,6 +98,20 @@ class NullPeerConnectionObserver : public PeerConnectionObserver { } }; +class MockNetworkManager : public rtc::NetworkManager { + public: + MOCK_METHOD(void, StartUpdating, (), (override)); + MOCK_METHOD(void, StopUpdating, (), (override)); + MOCK_METHOD(std::vector, + GetNetworks, + (), + (const override)); + MOCK_METHOD(std::vector, + GetAnyAddressNetworks, + (), + (override)); +}; + } // namespace class PeerConnectionFactoryTest : public ::testing::Test { @@ -492,3 +511,28 @@ TEST_F(PeerConnectionFactoryTest, LocalRendering) { EXPECT_EQ(3, local_renderer.num_rendered_frames()); EXPECT_FALSE(local_renderer.black_frame()); } + +TEST(PeerConnectionFactoryDependenciesTest, UsesNetworkManager) { + constexpr int64_t kWaitTimeoutMs = 10000; + auto mock_network_manager = std::make_unique>(); + + rtc::Event called; + EXPECT_CALL(*mock_network_manager, StartUpdating()) + .Times(AtLeast(1)) + .WillRepeatedly(InvokeWithoutArgs([&] { called.Set(); })); + + webrtc::PeerConnectionFactoryDependencies pcf_dependencies; + pcf_dependencies.network_manager = std::move(mock_network_manager); + + rtc::scoped_refptr pcf = + CreateModularPeerConnectionFactory(std::move(pcf_dependencies)); + + PeerConnectionInterface::RTCConfiguration config; + config.ice_candidate_pool_size = 2; + NullPeerConnectionObserver observer; + auto pc = pcf->CreatePeerConnectionOrError( + config, webrtc::PeerConnectionDependencies(&observer)); + ASSERT_TRUE(pc.ok()); + + called.Wait(kWaitTimeoutMs); +}