diff --git a/api/BUILD.gn b/api/BUILD.gn index 89f2b15f05..376c83f603 100644 --- a/api/BUILD.gn +++ b/api/BUILD.gn @@ -623,6 +623,7 @@ rtc_source_set("network_emulation_manager_api") { ] deps = [ ":array_view", + ":packet_socket_factory", ":simulated_network_api", ":time_controller", "../call:simulated_network", diff --git a/api/test/network_emulation_manager.h b/api/test/network_emulation_manager.h index 9fe4ad5eaf..61973ebfac 100644 --- a/api/test/network_emulation_manager.h +++ b/api/test/network_emulation_manager.h @@ -17,6 +17,7 @@ #include #include "api/array_view.h" +#include "api/packet_socket_factory.h" #include "api/test/network_emulation/cross_traffic.h" #include "api/test/network_emulation/network_emulation_interfaces.h" #include "api/test/simulated_network.h" @@ -125,6 +126,10 @@ class EmulatedNetworkManagerInterface { // WebRTC to properly setup network emulation. Returned manager is owned by // EmulatedNetworkManagerInterface implementation. virtual rtc::NetworkManager* network_manager() = 0; + // Returns non-null pointer to packet socket factory that have to be injected + // into WebRTC to properly setup network emulation. Returned factory is owned + // by EmulatedNetworkManagerInterface implementation. + virtual rtc::PacketSocketFactory* packet_socket_factory() = 0; // Returns list of endpoints that are associated with this instance. Pointers // are guaranteed to be non-null and are owned by NetworkEmulationManager. virtual std::vector endpoints() const = 0; diff --git a/test/DEPS b/test/DEPS index 0e51f003ab..2d45003a76 100644 --- a/test/DEPS +++ b/test/DEPS @@ -18,6 +18,7 @@ include_rules = [ "+modules/utility", "+modules/video_capture", "+modules/video_coding", + "+p2p/base/basic_packet_socket_factory.h", "+sdk", "+system_wrappers", "+third_party/libyuv", diff --git a/test/network/BUILD.gn b/test/network/BUILD.gn index 3836cc1263..fb0bc55ee1 100644 --- a/test/network/BUILD.gn +++ b/test/network/BUILD.gn @@ -54,6 +54,7 @@ rtc_library("emulated_network") { "../../api/units:timestamp", "../../call:simulated_network", "../../p2p:p2p_server_utils", + "../../p2p:rtc_p2p", "../../rtc_base", "../../rtc_base:ip_address", "../../rtc_base:network_constants", diff --git a/test/network/emulated_network_manager.cc b/test/network/emulated_network_manager.cc index ec8b2b3554..7b43a794c2 100644 --- a/test/network/emulated_network_manager.cc +++ b/test/network/emulated_network_manager.cc @@ -14,6 +14,7 @@ #include #include "absl/memory/memory.h" +#include "p2p/base/basic_packet_socket_factory.h" #include "test/network/fake_network_socket_server.h" namespace webrtc { @@ -25,11 +26,17 @@ EmulatedNetworkManager::EmulatedNetworkManager( EndpointsContainer* endpoints_container) : task_queue_(task_queue), endpoints_container_(endpoints_container), - network_thread_(time_controller->CreateThread( - "net_thread", - std::make_unique(endpoints_container))), sent_first_update_(false), - start_count_(0) {} + start_count_(0) { + auto socket_server = + std::make_unique(endpoints_container); + packet_socket_factory_ = + std::make_unique(socket_server.get()); + // Since we pass ownership of the socket server to `network_thread_`, we must + // arrange that it outlives `packet_socket_factory_` which refers to it. + network_thread_ = + time_controller->CreateThread("net_thread", std::move(socket_server)); +} void EmulatedNetworkManager::EnableEndpoint(EmulatedEndpointImpl* endpoint) { RTC_CHECK(endpoints_container_->HasEndpoint(endpoint)) diff --git a/test/network/emulated_network_manager.h b/test/network/emulated_network_manager.h index fd2bb5b665..4c679c3fdf 100644 --- a/test/network/emulated_network_manager.h +++ b/test/network/emulated_network_manager.h @@ -50,6 +50,9 @@ class EmulatedNetworkManager : public rtc::NetworkManagerBase, // EmulatedNetworkManagerInterface API rtc::Thread* network_thread() override { return network_thread_.get(); } rtc::NetworkManager* network_manager() override { return this; } + rtc::PacketSocketFactory* packet_socket_factory() override { + return packet_socket_factory_.get(); + } std::vector endpoints() const override { return endpoints_container_->GetEndpoints(); } @@ -62,8 +65,12 @@ class EmulatedNetworkManager : public rtc::NetworkManagerBase, TaskQueueForTest* const task_queue_; const EndpointsContainer* const endpoints_container_; + // The `network_thread_` must outlive `packet_socket_factory_`, because they + // both refer to a socket server that is owned by `network_thread_`. Both + // pointers are assigned only in the constructor, but the way they are + // initialized unfortunately doesn't work with const std::unique_ptr<...>. std::unique_ptr network_thread_; - + std::unique_ptr packet_socket_factory_; bool sent_first_update_ RTC_GUARDED_BY(network_thread_); int start_count_ RTC_GUARDED_BY(network_thread_); };