Provide Environment for AsyncUDPSocket for StunServer

Bug: webrtc:42223992
Change-Id: I3abaffa9ea0d94ab37bab10ca4c44b2fc06801de
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/409220
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45666}
diff --git a/examples/BUILD.gn b/examples/BUILD.gn
index 7cb844d..2fa1b29 100644
--- a/examples/BUILD.gn
+++ b/examples/BUILD.gn
@@ -831,6 +831,7 @@
     testonly = true
     sources = [ "stunserver/stunserver_main.cc" ]
     deps = [
+      "../api/environment:environment_factory",
       "../p2p:p2p_server_utils",
       "../pc:rtc_pc",
       "../rtc_base:async_udp_socket",
diff --git a/examples/stunserver/stunserver_main.cc b/examples/stunserver/stunserver_main.cc
index f1655f5..189cdfe 100644
--- a/examples/stunserver/stunserver_main.cc
+++ b/examples/stunserver/stunserver_main.cc
@@ -8,7 +8,10 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 #include <iostream>
+#include <memory>
+#include <utility>
 
+#include "api/environment/environment_factory.h"
 #include "p2p/test/stun_server.h"
 #include "rtc_base/async_udp_socket.h"
 #include "rtc_base/checks.h"
@@ -34,19 +37,19 @@
       webrtc::ThreadManager::Instance()->WrapCurrentThread();
   RTC_DCHECK(pthMain);
 
-  webrtc::AsyncUDPSocket* server_socket =
-      webrtc::AsyncUDPSocket::Create(pthMain->socketserver(), server_addr);
+  std::unique_ptr<webrtc::AsyncUDPSocket> server_socket =
+      webrtc::AsyncUDPSocket::Create(webrtc::CreateEnvironment(), server_addr,
+                                     *pthMain->socketserver());
   if (!server_socket) {
     std::cerr << "Failed to create a UDP socket" << std::endl;
     return 1;
   }
 
-  StunServer* server = new StunServer(server_socket);
+  StunServer server(std::move(server_socket));
 
   std::cout << "Listening at " << server_addr.ToString() << std::endl;
 
   pthMain->Run();
 
-  delete server;
   return 0;
 }
diff --git a/p2p/BUILD.gn b/p2p/BUILD.gn
index 7eba278..b285778 100644
--- a/p2p/BUILD.gn
+++ b/p2p/BUILD.gn
@@ -1169,6 +1169,7 @@
       "../rtc_base/synchronization:mutex",
       "../rtc_base/third_party/sigslot",
       "../test:test_support",
+      "//third_party/abseil-cpp/absl/base:core_headers",
       "//third_party/abseil-cpp/absl/memory",
       "//third_party/abseil-cpp/absl/strings:string_view",
     ]
@@ -1364,6 +1365,7 @@
     "../rtc_base/network:received_packet",
     "../rtc_base/third_party/sigslot",
     "//third_party/abseil-cpp/absl/algorithm:container",
+    "//third_party/abseil-cpp/absl/base:nullability",
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/strings:string_view",
   ]
diff --git a/p2p/base/local_network_access_port_unittest.cc b/p2p/base/local_network_access_port_unittest.cc
index cb842e1..1091f87 100644
--- a/p2p/base/local_network_access_port_unittest.cc
+++ b/p2p/base/local_network_access_port_unittest.cc
@@ -71,9 +71,8 @@
 
 // Class to test LocalNetworkAccess integration with STUN and TURN ports.
 class LocalNetworkAccessPortTest
-    : public ::testing::Test,
-      public sigslot::has_slots<>,
-      public ::testing::WithParamInterface<
+    : public sigslot::has_slots<>,
+      public ::testing::TestWithParam<
           std::tuple<ServerType, absl::string_view, LnaFakeResult>> {
  public:
   LocalNetworkAccessPortTest() {
@@ -81,8 +80,8 @@
 
     switch (server_type()) {
       case kStun:
-        stun_server_ =
-            TestStunServer::Create(&ss_, {server_address(), 5000}, thread_);
+        stun_server_ = TestStunServer::Create(env_, {server_address(), 5000},
+                                              ss_, thread_);
         break;
       case kTurn:
         turn_server_.AddInternalSocket({server_address(), 5000}, PROTO_UDP);
diff --git a/p2p/base/p2p_transport_channel_unittest.cc b/p2p/base/p2p_transport_channel_unittest.cc
index dc632e4..5ed2113 100644
--- a/p2p/base/p2p_transport_channel_unittest.cc
+++ b/p2p/base/p2p_transport_channel_unittest.cc
@@ -310,7 +310,6 @@
         ss_(new FirewallSocketServer(nss_.get())),
         socket_factory_(new BasicPacketSocketFactory(ss_.get())),
         main_(ss_.get()),
-        stun_server_(TestStunServer::Create(ss_.get(), kStunAddr, main_)),
         force_relay_(false) {
     ep1_.role_ = ICEROLE_CONTROLLING;
     ep2_.role_ = ICEROLE_CONTROLLED;
@@ -319,6 +318,7 @@
   }
 
   void CreatePortAllocators(const Environment& env) {
+    stun_server_ = TestStunServer::Create(env, kStunAddr, *ss_, main_);
     turn_server_.emplace(env, &main_, ss_.get(), kTurnUdpIntAddr,
                          kTurnUdpExtAddr);
     ServerAddresses stun_servers = {kStunAddr};
diff --git a/p2p/base/port_unittest.cc b/p2p/base/port_unittest.cc
index a0ce9d4..9be0622 100644
--- a/p2p/base/port_unittest.cc
+++ b/p2p/base/port_unittest.cc
@@ -426,7 +426,7 @@
         nat_factory2_(ss_.get(), kNatAddr2, SocketAddress()),
         nat_socket_factory1_(&nat_factory1_),
         nat_socket_factory2_(&nat_factory2_),
-        stun_server_(TestStunServer::Create(ss_.get(), kStunAddr, main_)),
+        stun_server_(TestStunServer::Create(env_, kStunAddr, *ss_, main_)),
         turn_server_(env_, &main_, ss_.get(), kTurnUdpIntAddr, kTurnUdpExtAddr),
         username_(CreateRandomString(ICE_UFRAG_LENGTH)),
         password_(CreateRandomString(ICE_PWD_LENGTH)),
diff --git a/p2p/base/stun_port_unittest.cc b/p2p/base/stun_port_unittest.cc
index 5231bdc..8783232 100644
--- a/p2p/base/stun_port_unittest.cc
+++ b/p2p/base/stun_port_unittest.cc
@@ -164,7 +164,7 @@
     for (const auto& addr : stun_server_addresses) {
       RTC_CHECK(addr.family() == address.family());
       stun_servers_.push_back(
-          webrtc::TestStunServer::Create(ss_.get(), addr, thread_));
+          webrtc::TestStunServer::Create(env_, addr, *ss_, thread_));
     }
   }
 
diff --git a/p2p/client/basic_port_allocator_unittest.cc b/p2p/client/basic_port_allocator_unittest.cc
index e35ce7e..74776d9 100644
--- a/p2p/client/basic_port_allocator_unittest.cc
+++ b/p2p/client/basic_port_allocator_unittest.cc
@@ -166,7 +166,7 @@
         // must be called.
         nat_factory_(vss_.get(), kNatUdpAddr, kNatTcpAddr),
         nat_socket_factory_(new BasicPacketSocketFactory(&nat_factory_)),
-        stun_server_(TestStunServer::Create(fss_.get(), kStunAddr, thread_)),
+        stun_server_(TestStunServer::Create(env_, kStunAddr, *fss_, thread_)),
         turn_server_(env_,
                      Thread::Current(),
                      fss_.get(),
diff --git a/p2p/test/stun_server.cc b/p2p/test/stun_server.cc
index c1bba69..9b56a5f 100644
--- a/p2p/test/stun_server.cc
+++ b/p2p/test/stun_server.cc
@@ -27,7 +27,8 @@
 
 namespace webrtc {
 
-StunServer::StunServer(AsyncUDPSocket* socket) : socket_(socket) {
+StunServer::StunServer(std::unique_ptr<AsyncUDPSocket> socket)
+    : socket_(std::move(socket)) {
   socket_->RegisterReceivedPacketCallback(
       [&](AsyncPacketSocket* socket, const ReceivedIpPacket& packet) {
         OnPacket(socket, packet);
diff --git a/p2p/test/stun_server.h b/p2p/test/stun_server.h
index a44c595..6602988 100644
--- a/p2p/test/stun_server.h
+++ b/p2p/test/stun_server.h
@@ -13,6 +13,7 @@
 
 #include <memory>
 
+#include "absl/base/nullability.h"
 #include "absl/strings/string_view.h"
 #include "api/sequence_checker.h"
 #include "api/transport/stun.h"
@@ -28,7 +29,7 @@
 class StunServer {
  public:
   // Creates a STUN server, which will listen on the given socket.
-  explicit StunServer(AsyncUDPSocket* socket);
+  explicit StunServer(absl_nonnull std::unique_ptr<AsyncUDPSocket> socket);
   // Removes the STUN server from the socket and deletes the socket.
   virtual ~StunServer();
 
diff --git a/p2p/test/stun_server_unittest.cc b/p2p/test/stun_server_unittest.cc
index 8baa8b7..95f5298 100644
--- a/p2p/test/stun_server_unittest.cc
+++ b/p2p/test/stun_server_unittest.cc
@@ -14,7 +14,7 @@
 #include <memory>
 #include <string>
 
-#include "absl/memory/memory.h"
+#include "api/environment/environment.h"
 #include "api/transport/stun.h"
 #include "rtc_base/async_udp_socket.h"
 #include "rtc_base/byte_buffer.h"
@@ -22,6 +22,7 @@
 #include "rtc_base/test_client.h"
 #include "rtc_base/thread.h"
 #include "rtc_base/virtual_socket_server.h"
+#include "test/create_test_environment.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -33,28 +34,18 @@
 
 class StunServerTest : public ::testing::Test {
  public:
-  StunServerTest() : ss_(new VirtualSocketServer()) {
-    ss_->SetMessageQueue(&main_thread);
-    server_.reset(
-        new StunServer(AsyncUDPSocket::Create(ss_.get(), server_addr)));
-    client_.reset(new TestClient(
-        absl::WrapUnique(AsyncUDPSocket::Create(ss_.get(), client_addr))));
-  }
-
   void Send(const StunMessage& msg) {
     ByteBufferWriter buf;
     msg.Write(&buf);
     Send(reinterpret_cast<const char*>(buf.Data()),
          static_cast<int>(buf.Length()));
   }
-  void Send(const char* buf, int len) {
-    client_->SendTo(buf, len, server_addr);
-  }
-  bool ReceiveFails() { return (client_->CheckNoPacket()); }
+  void Send(const char* buf, int len) { client_.SendTo(buf, len, server_addr); }
+  bool ReceiveFails() { return client_.CheckNoPacket(); }
   StunMessage* Receive() {
     StunMessage* msg = nullptr;
     std::unique_ptr<TestClient::Packet> packet =
-        client_->NextPacket(TestClient::kTimeoutMs);
+        client_.NextPacket(TestClient::kTimeoutMs);
     if (packet) {
       ByteBufferReader buf(packet->buf);
       msg = new StunMessage();
@@ -64,10 +55,11 @@
   }
 
  private:
-  AutoThread main_thread;
-  std::unique_ptr<VirtualSocketServer> ss_;
-  std::unique_ptr<StunServer> server_;
-  std::unique_ptr<TestClient> client_;
+  const Environment env_ = CreateTestEnvironment();
+  VirtualSocketServer ss_;
+  AutoSocketServerThread main_thread_{&ss_};
+  StunServer server_{AsyncUDPSocket::Create(env_, server_addr, ss_)};
+  TestClient client_{AsyncUDPSocket::Create(env_, client_addr, ss_)};
 };
 
 TEST_F(StunServerTest, TestGood) {
diff --git a/p2p/test/test_stun_server.cc b/p2p/test/test_stun_server.cc
index 404dcf0..47d24fe 100644
--- a/p2p/test/test_stun_server.cc
+++ b/p2p/test/test_stun_server.cc
@@ -12,34 +12,33 @@
 
 #include <functional>
 #include <memory>
+#include <utility>
 
+#include "api/environment/environment.h"
 #include "api/sequence_checker.h"
 #include "api/transport/stun.h"
 #include "p2p/test/stun_server.h"
 #include "rtc_base/async_udp_socket.h"
 #include "rtc_base/checks.h"
-#include "rtc_base/socket.h"
 #include "rtc_base/socket_address.h"
 #include "rtc_base/socket_server.h"
 
 namespace webrtc {
 
-std::unique_ptr<TestStunServer, std::function<void(TestStunServer*)>>
-TestStunServer::Create(SocketServer* ss,
-                       const SocketAddress& addr,
-                       Thread& network_thread) {
-  Socket* socket = ss->CreateSocket(addr.family(), SOCK_DGRAM);
-  RTC_CHECK(socket != nullptr) << "Failed to create socket";
-  AsyncUDPSocket* udp_socket = AsyncUDPSocket::Create(socket, addr);
+TestStunServer::StunServerPtr TestStunServer::Create(const Environment& env,
+                                                     const SocketAddress& addr,
+                                                     SocketServer& ss,
+                                                     Thread& network_thread) {
+  std::unique_ptr<AsyncUDPSocket> udp_socket =
+      AsyncUDPSocket::Create(env, addr, ss);
   RTC_CHECK(udp_socket != nullptr) << "Failed to create AsyncUDPSocket";
   TestStunServer* server = nullptr;
-  network_thread.BlockingCall(
-      [&]() { server = new TestStunServer(udp_socket, network_thread); });
-  std::unique_ptr<TestStunServer, std::function<void(TestStunServer*)>> result(
-      server, [&](TestStunServer* server) {
-        network_thread.BlockingCall([server]() { delete server; });
-      });
-  return result;
+  network_thread.BlockingCall([&]() {
+    server = new TestStunServer(std::move(udp_socket), network_thread);
+  });
+  return StunServerPtr(server, [&network_thread](TestStunServer* server) {
+    network_thread.BlockingCall([server]() { delete server; });
+  });
 }
 
 void TestStunServer::OnBindingRequest(StunMessage* msg,
diff --git a/p2p/test/test_stun_server.h b/p2p/test/test_stun_server.h
index 5a9f5be..b951f08 100644
--- a/p2p/test/test_stun_server.h
+++ b/p2p/test/test_stun_server.h
@@ -13,7 +13,10 @@
 
 #include <functional>
 #include <memory>
+#include <utility>
 
+#include "absl/base/attributes.h"
+#include "api/environment/environment.h"
 #include "api/transport/stun.h"
 #include "p2p/test/stun_server.h"
 #include "rtc_base/async_udp_socket.h"
@@ -28,9 +31,11 @@
  public:
   using StunServerPtr =
       std::unique_ptr<TestStunServer, std::function<void(TestStunServer*)>>;
-  static StunServerPtr Create(SocketServer* ss,
+  static StunServerPtr Create(const Environment& env,
                               const SocketAddress& addr,
-                              Thread& network_thread);
+                              SocketServer& ss,
+                              Thread& network_thread
+                                  ABSL_ATTRIBUTE_LIFETIME_BOUND);
 
   // Set a fake STUN address to return to the client.
   void set_fake_stun_addr(const SocketAddress& addr) { fake_stun_addr_ = addr; }
@@ -38,8 +43,8 @@
  private:
   static void DeleteOnNetworkThread(TestStunServer* server);
 
-  TestStunServer(AsyncUDPSocket* socket, Thread& network_thread)
-      : StunServer(socket), network_thread_(network_thread) {}
+  TestStunServer(std::unique_ptr<AsyncUDPSocket> socket, Thread& network_thread)
+      : StunServer(std::move(socket)), network_thread_(network_thread) {}
 
   void OnBindingRequest(StunMessage* msg,
                         const SocketAddress& remote_addr) override;
diff --git a/pc/peer_connection_integrationtest.cc b/pc/peer_connection_integrationtest.cc
index 8d4b54c..e3d3c21 100644
--- a/pc/peer_connection_integrationtest.cc
+++ b/pc/peer_connection_integrationtest.cc
@@ -2005,8 +2005,8 @@
   }
 
   void StartStunServer(const SocketAddress& server_address) {
-    stun_server_ =
-        TestStunServer::Create(firewall(), server_address, *network_thread());
+    stun_server_ = TestStunServer::Create(env_, server_address, *firewall(),
+                                          *network_thread());
   }
 
   bool TestIPv6() {
diff --git a/pc/slow_peer_connection_integration_test.cc b/pc/slow_peer_connection_integration_test.cc
index ffbff22..ee73857 100644
--- a/pc/slow_peer_connection_integration_test.cc
+++ b/pc/slow_peer_connection_integration_test.cc
@@ -277,8 +277,8 @@
   }
 
   void StartStunServer(const SocketAddress& server_address) {
-    stun_server_ =
-        TestStunServer::Create(firewall(), server_address, *network_thread());
+    stun_server_ = TestStunServer::Create(env_, server_address, *firewall(),
+                                          *network_thread());
   }
 
   bool TestIPv6() {