Deprecate AsyncResolver config fields and remove internal usage.

Bug: webrtc:12598
Change-Id: Ic43cbcd13e4de44b02351c89da12844606368623
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/317604
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40627}
diff --git a/api/async_resolver_factory.h b/api/async_resolver_factory.h
index 93d3f79..ffa9582 100644
--- a/api/async_resolver_factory.h
+++ b/api/async_resolver_factory.h
@@ -18,6 +18,7 @@
 // An abstract factory for creating AsyncResolverInterfaces. This allows
 // client applications to provide WebRTC with their own mechanism for
 // performing DNS resolution.
+// TODO(bugs.webrtc.org/12598): Deprecate and remove.
 class AsyncResolverFactory {
  public:
   AsyncResolverFactory() = default;
diff --git a/api/ice_transport_interface.h b/api/ice_transport_interface.h
index 6aae38f..431f333 100644
--- a/api/ice_transport_interface.h
+++ b/api/ice_transport_interface.h
@@ -64,7 +64,8 @@
     RTC_DCHECK(!async_resolver_factory_);
     async_dns_resolver_factory_ = async_dns_resolver_factory;
   }
-  AsyncResolverFactory* async_resolver_factory() {
+  [[deprecated("Use async_dns_resolver_factory")]] AsyncResolverFactory*
+  async_resolver_factory() {
     return async_resolver_factory_;
   }
   ABSL_DEPRECATED("bugs.webrtc.org/12598")
diff --git a/api/peer_connection_interface.cc b/api/peer_connection_interface.cc
index d01d58d..050b61d 100644
--- a/api/peer_connection_interface.cc
+++ b/api/peer_connection_interface.cc
@@ -45,8 +45,13 @@
     PeerConnectionObserver* observer_in)
     : observer(observer_in) {}
 
+// TODO(bugs.webrtc.org/12598: remove pragma once async_resolver_factory
+// is removed from PeerConnectionDependencies
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
 PeerConnectionDependencies::PeerConnectionDependencies(
     PeerConnectionDependencies&&) = default;
+#pragma clang diagnostic pop
 
 PeerConnectionDependencies::~PeerConnectionDependencies() = default;
 
diff --git a/api/peer_connection_interface.h b/api/peer_connection_interface.h
index e80550c..37dcfbb 100644
--- a/api/peer_connection_interface.h
+++ b/api/peer_connection_interface.h
@@ -1386,6 +1386,9 @@
   std::unique_ptr<webrtc::AsyncDnsResolverFactoryInterface>
       async_dns_resolver_factory;
   // Deprecated - use async_dns_resolver_factory
+  // Deprecation is in abeyance until Chromium is updated.
+  // TODO(crbug.com/1475925): Deprecate once Chromium is updated
+  // [[deprecated("Use async_dns_resolver_factory")]]
   std::unique_ptr<webrtc::AsyncResolverFactory> async_resolver_factory;
   std::unique_ptr<webrtc::IceTransportFactory> ice_transport_factory;
   std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator;
diff --git a/api/test/pclf/BUILD.gn b/api/test/pclf/BUILD.gn
index 0526478..f3d7837 100644
--- a/api/test/pclf/BUILD.gn
+++ b/api/test/pclf/BUILD.gn
@@ -65,6 +65,7 @@
 
   deps = [
     ":media_configuration",
+    "../..:async_dns_resolver",
     "../../../api:callfactory_api",
     "../../../api:fec_controller_api",
     "../../../api:field_trials_view",
@@ -94,6 +95,7 @@
   deps = [
     ":media_configuration",
     ":media_quality_test_params",
+    "../..:async_dns_resolver",
     "../../../api:callfactory_api",
     "../../../api:create_peer_connection_quality_test_frame_generator",
     "../../../api:fec_controller_api",
diff --git a/api/test/pclf/media_quality_test_params.h b/api/test/pclf/media_quality_test_params.h
index 2485cfc..a247f34 100644
--- a/api/test/pclf/media_quality_test_params.h
+++ b/api/test/pclf/media_quality_test_params.h
@@ -15,7 +15,7 @@
 #include <string>
 #include <vector>
 
-#include "api/async_resolver_factory.h"
+#include "api/async_dns_resolver.h"
 #include "api/audio/audio_mixer.h"
 #include "api/call/call_factory_interface.h"
 #include "api/fec_controller.h"
@@ -85,7 +85,8 @@
 
   rtc::NetworkManager* const network_manager;
   rtc::PacketSocketFactory* const packet_socket_factory;
-  std::unique_ptr<webrtc::AsyncResolverFactory> async_resolver_factory;
+  std::unique_ptr<webrtc::AsyncDnsResolverFactoryInterface>
+      async_dns_resolver_factory;
   std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator;
   std::unique_ptr<rtc::SSLCertificateVerifier> tls_cert_verifier;
   std::unique_ptr<IceTransportFactory> ice_transport_factory;
diff --git a/api/test/pclf/peer_configurer.cc b/api/test/pclf/peer_configurer.cc
index 7acadda..b614940 100644
--- a/api/test/pclf/peer_configurer.cc
+++ b/api/test/pclf/peer_configurer.cc
@@ -86,10 +86,11 @@
   components_->pcf_dependencies->audio_decoder_factory = audio_decoder_factory;
   return this;
 }
-PeerConfigurer* PeerConfigurer::SetAsyncResolverFactory(
-    std::unique_ptr<webrtc::AsyncResolverFactory> async_resolver_factory) {
-  components_->pc_dependencies->async_resolver_factory =
-      std::move(async_resolver_factory);
+PeerConfigurer* PeerConfigurer::SetAsyncDnsResolverFactory(
+    std::unique_ptr<webrtc::AsyncDnsResolverFactoryInterface>
+        async_dns_resolver_factory) {
+  components_->pc_dependencies->async_dns_resolver_factory =
+      std::move(async_dns_resolver_factory);
   return this;
 }
 PeerConfigurer* PeerConfigurer::SetRTCCertificateGenerator(
diff --git a/api/test/pclf/peer_configurer.h b/api/test/pclf/peer_configurer.h
index 3596bb6..d10b53f 100644
--- a/api/test/pclf/peer_configurer.h
+++ b/api/test/pclf/peer_configurer.h
@@ -16,7 +16,7 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/async_resolver_factory.h"
+#include "api/async_dns_resolver.h"
 #include "api/audio/audio_mixer.h"
 #include "api/call/call_factory_interface.h"
 #include "api/fec_controller.h"
@@ -88,8 +88,9 @@
   // The parameters of the following 4 methods will be passed to the
   // PeerConnectionInterface implementation that will be created for this
   // peer.
-  PeerConfigurer* SetAsyncResolverFactory(
-      std::unique_ptr<webrtc::AsyncResolverFactory> async_resolver_factory);
+  PeerConfigurer* SetAsyncDnsResolverFactory(
+      std::unique_ptr<webrtc::AsyncDnsResolverFactoryInterface>
+          async_resolver_factory);
   PeerConfigurer* SetRTCCertificateGenerator(
       std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator);
   PeerConfigurer* SetSSLCertificateVerifier(
diff --git a/p2p/base/p2p_transport_channel.cc b/p2p/base/p2p_transport_channel.cc
index d916983..17b5968 100644
--- a/p2p/base/p2p_transport_channel.cc
+++ b/p2p/base/p2p_transport_channel.cc
@@ -118,6 +118,10 @@
     absl::string_view transport_name,
     int component,
     webrtc::IceTransportInit init) {
+  // TODO(bugs.webrtc.org/12598): Remove pragma and fallback once
+  // async_resolver_factory is gone
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
   if (init.async_resolver_factory()) {
     return absl::WrapUnique(new P2PTransportChannel(
         transport_name, component, init.port_allocator(), nullptr,
@@ -125,6 +129,7 @@
             init.async_resolver_factory()),
         init.event_log(), init.ice_controller_factory(),
         init.active_ice_controller_factory(), init.field_trials()));
+#pragma clang diagnostic pop
   } else {
     return absl::WrapUnique(new P2PTransportChannel(
         transport_name, component, init.port_allocator(),
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 60006c4..1f83007 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -2413,6 +2413,7 @@
       "../api:libjingle_peerconnection_api",
       "../api:make_ref_counted",
       "../api:media_stream_interface",
+      "../api:mock_async_dns_resolver",
       "../api:mock_encoder_selector",
       "../api:mock_packet_socket_factory",
       "../api:mock_video_track",
@@ -2636,6 +2637,7 @@
       "../api:libjingle_logging_api",
       "../api:libjingle_peerconnection_api",
       "../api:media_stream_interface",
+      "../api:mock_async_dns_resolver",
       "../api:mock_rtp",
       "../api:packet_socket_factory",
       "../api:rtc_error",
diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc
index 767e5a4..cde3d91 100644
--- a/pc/peer_connection.cc
+++ b/pc/peer_connection.cc
@@ -464,6 +464,8 @@
   // If neither is given, create a BasicAsyncDnsResolverFactory.
   // TODO(bugs.webrtc.org/12598): Remove code once all callers pass a
   // AsyncDnsResolverFactory.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
   if (dependencies.async_dns_resolver_factory &&
       dependencies.async_resolver_factory) {
     RTC_LOG(LS_ERROR)
@@ -471,14 +473,17 @@
     return RTCError(RTCErrorType::INVALID_PARAMETER,
                     "Both old and new type of DNS resolver given");
   }
-  if (dependencies.async_resolver_factory) {
-    dependencies.async_dns_resolver_factory =
-        std::make_unique<WrappingAsyncDnsResolverFactory>(
-            std::move(dependencies.async_resolver_factory));
-  } else {
-    dependencies.async_dns_resolver_factory =
-        std::make_unique<BasicAsyncDnsResolverFactory>();
+  if (!dependencies.async_dns_resolver_factory) {
+    if (dependencies.async_resolver_factory) {
+      dependencies.async_dns_resolver_factory =
+          std::make_unique<WrappingAsyncDnsResolverFactory>(
+              std::move(dependencies.async_resolver_factory));
+    } else {
+      dependencies.async_dns_resolver_factory =
+          std::make_unique<BasicAsyncDnsResolverFactory>();
+    }
   }
+#pragma clang diagnostic pop
 
   // The PeerConnection constructor consumes some, but not all, dependencies.
   auto pc = rtc::make_ref_counted<PeerConnection>(
diff --git a/pc/peer_connection_factory.cc b/pc/peer_connection_factory.cc
index 54fabce..d933ba6 100644
--- a/pc/peer_connection_factory.cc
+++ b/pc/peer_connection_factory.cc
@@ -224,11 +224,6 @@
         configuration.port_allocator_config.flags);
   }
 
-  if (!dependencies.async_resolver_factory) {
-    dependencies.async_resolver_factory =
-        std::make_unique<webrtc::BasicAsyncResolverFactory>();
-  }
-
   if (!dependencies.ice_transport_factory) {
     dependencies.ice_transport_factory =
         std::make_unique<DefaultIceTransportFactory>();
diff --git a/pc/peer_connection_histogram_unittest.cc b/pc/peer_connection_histogram_unittest.cc
index 656b022..0efc1c5 100644
--- a/pc/peer_connection_histogram_unittest.cc
+++ b/pc/peer_connection_histogram_unittest.cc
@@ -24,6 +24,7 @@
 #include "api/scoped_refptr.h"
 #include "api/task_queue/default_task_queue_factory.h"
 #include "api/task_queue/task_queue_factory.h"
+#include "api/test/mock_async_dns_resolver.h"
 #include "media/base/fake_media_engine.h"
 #include "media/base/media_engine.h"
 #include "p2p/base/mock_async_resolver.h"
@@ -259,7 +260,7 @@
 
   WrapperPtr CreatePeerConnectionWithMdns(const RTCConfiguration& config) {
     auto resolver_factory =
-        std::make_unique<NiceMock<webrtc::MockAsyncResolverFactory>>();
+        std::make_unique<NiceMock<webrtc::MockAsyncDnsResolverFactory>>();
 
     webrtc::PeerConnectionDependencies deps(nullptr /* observer_in */);
 
@@ -273,7 +274,7 @@
             fake_network,
             std::make_unique<rtc::BasicPacketSocketFactory>(vss_.get())));
 
-    deps.async_resolver_factory = std::move(resolver_factory);
+    deps.async_dns_resolver_factory = std::move(resolver_factory);
     deps.allocator = std::move(port_allocator);
 
     return CreatePeerConnection(
diff --git a/pc/peer_connection_integrationtest.cc b/pc/peer_connection_integrationtest.cc
index 58d3c97..d76e5e27 100644
--- a/pc/peer_connection_integrationtest.cc
+++ b/pc/peer_connection_integrationtest.cc
@@ -50,6 +50,7 @@
 #include "api/stats/rtc_stats.h"
 #include "api/stats/rtc_stats_report.h"
 #include "api/stats/rtcstats_objects.h"
+#include "api/test/mock_async_dns_resolver.h"
 #include "api/test/mock_encoder_selector.h"
 #include "api/transport/rtp/rtp_source.h"
 #include "api/uma_metrics.h"
@@ -1678,23 +1679,29 @@
 TEST_P(PeerConnectionIntegrationTest,
        IceStatesReachCompletionWithRemoteHostname) {
   auto caller_resolver_factory =
-      std::make_unique<NiceMock<webrtc::MockAsyncResolverFactory>>();
+      std::make_unique<NiceMock<webrtc::MockAsyncDnsResolverFactory>>();
   auto callee_resolver_factory =
-      std::make_unique<NiceMock<webrtc::MockAsyncResolverFactory>>();
-  NiceMock<rtc::MockAsyncResolver> callee_async_resolver;
-  NiceMock<rtc::MockAsyncResolver> caller_async_resolver;
+      std::make_unique<NiceMock<webrtc::MockAsyncDnsResolverFactory>>();
+  auto callee_async_resolver =
+      std::make_unique<NiceMock<MockAsyncDnsResolver>>();
+  auto caller_async_resolver =
+      std::make_unique<NiceMock<MockAsyncDnsResolver>>();
+  // Keep raw pointers to the mock resolvers, for use after init,
+  // where the std::unique_ptr values have been moved away.
+  auto* callee_resolver_ptr = callee_async_resolver.get();
+  auto* caller_resolver_ptr = caller_async_resolver.get();
 
   // This also verifies that the injected AsyncResolverFactory is used by
   // P2PTransportChannel.
   EXPECT_CALL(*caller_resolver_factory, Create())
-      .WillOnce(Return(&caller_async_resolver));
+      .WillOnce(Return(ByMove(std::move(caller_async_resolver))));
   webrtc::PeerConnectionDependencies caller_deps(nullptr);
-  caller_deps.async_resolver_factory = std::move(caller_resolver_factory);
+  caller_deps.async_dns_resolver_factory = std::move(caller_resolver_factory);
 
   EXPECT_CALL(*callee_resolver_factory, Create())
-      .WillOnce(Return(&callee_async_resolver));
+      .WillOnce(Return(ByMove(std::move(callee_async_resolver))));
   webrtc::PeerConnectionDependencies callee_deps(nullptr);
-  callee_deps.async_resolver_factory = std::move(callee_resolver_factory);
+  callee_deps.async_dns_resolver_factory = std::move(callee_resolver_factory);
 
   PeerConnectionInterface::RTCConfiguration config;
   config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
@@ -1703,8 +1710,12 @@
   ASSERT_TRUE(CreatePeerConnectionWrappersWithConfigAndDeps(
       config, std::move(caller_deps), config, std::move(callee_deps)));
 
-  caller()->SetRemoteAsyncResolver(&callee_async_resolver);
-  callee()->SetRemoteAsyncResolver(&caller_async_resolver);
+  // TEMP NOTE - this is probably bogus since the resolvers have been
+  // moved out of their slots prior to these code lines.
+  RTC_LOG(LS_ERROR) << "callee async resolver is "
+                    << callee_async_resolver.get();
+  caller()->SetRemoteAsyncResolver(callee_resolver_ptr);
+  callee()->SetRemoteAsyncResolver(caller_resolver_ptr);
 
   // Enable hostname candidates with mDNS names.
   caller()->SetMdnsResponder(
diff --git a/pc/test/integration_test_helpers.h b/pc/test/integration_test_helpers.h
index 889161e..740e063 100644
--- a/pc/test/integration_test_helpers.h
+++ b/pc/test/integration_test_helpers.h
@@ -55,6 +55,7 @@
 #include "api/task_queue/default_task_queue_factory.h"
 #include "api/task_queue/pending_task_safety_flag.h"
 #include "api/task_queue/task_queue_factory.h"
+#include "api/test/mock_async_dns_resolver.h"
 #include "api/transport/field_trial_based_config.h"
 #include "api/uma_metrics.h"
 #include "api/units/time_delta.h"
@@ -134,6 +135,7 @@
 using ::testing::Contains;
 using ::testing::DoAll;
 using ::testing::ElementsAre;
+using ::testing::InvokeArgument;
 using ::testing::NiceMock;
 using ::testing::Return;
 using ::testing::SetArgPointee;
@@ -279,8 +281,8 @@
     remote_offer_handler_ = std::move(handler);
   }
 
-  void SetRemoteAsyncResolver(rtc::MockAsyncResolver* resolver) {
-    remote_async_resolver_ = resolver;
+  void SetRemoteAsyncResolver(MockAsyncDnsResolver* resolver) {
+    remote_async_dns_resolver_ = resolver;
   }
 
   // Every ICE connection state in order that has been seen by the observer.
@@ -1120,18 +1122,22 @@
   void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override {
     RTC_LOG(LS_INFO) << debug_name_ << ": OnIceCandidate";
 
-    if (remote_async_resolver_) {
+    if (remote_async_dns_resolver_) {
       const auto& local_candidate = candidate->candidate();
       if (local_candidate.address().IsUnresolvedIP()) {
         RTC_DCHECK(local_candidate.type() == cricket::LOCAL_PORT_TYPE);
-        rtc::SocketAddress resolved_addr(local_candidate.address());
         const auto resolved_ip = mdns_responder_->GetMappedAddressForName(
             local_candidate.address().hostname());
         RTC_DCHECK(!resolved_ip.IsNil());
-        resolved_addr.SetResolvedIP(resolved_ip);
-        EXPECT_CALL(*remote_async_resolver_, GetResolvedAddress(_, _))
-            .WillOnce(DoAll(SetArgPointee<1>(resolved_addr), Return(true)));
-        EXPECT_CALL(*remote_async_resolver_, Destroy(_));
+        remote_async_dns_resolved_addr_ = local_candidate.address();
+        remote_async_dns_resolved_addr_.SetResolvedIP(resolved_ip);
+        EXPECT_CALL(*remote_async_dns_resolver_, Start(_, _))
+            .WillOnce(InvokeArgument<1>());
+        EXPECT_CALL(*remote_async_dns_resolver_, result())
+            .WillOnce(ReturnRef(remote_async_dns_resolver_result_));
+        EXPECT_CALL(remote_async_dns_resolver_result_, GetResolvedAddress(_, _))
+            .WillOnce(DoAll(SetArgPointee<1>(remote_async_dns_resolved_addr_),
+                            Return(true)));
       }
     }
 
@@ -1202,7 +1208,11 @@
   std::function<void(cricket::SessionDescription*)> received_sdp_munger_;
   std::function<void(cricket::SessionDescription*)> generated_sdp_munger_;
   std::function<void()> remote_offer_handler_;
-  rtc::MockAsyncResolver* remote_async_resolver_ = nullptr;
+  MockAsyncDnsResolver* remote_async_dns_resolver_ = nullptr;
+  // Result variables for the mock DNS resolver
+  NiceMock<MockAsyncDnsResolverResult> remote_async_dns_resolver_result_;
+  rtc::SocketAddress remote_async_dns_resolved_addr_;
+
   // All data channels either created or observed on this peerconnection
   std::vector<rtc::scoped_refptr<DataChannelInterface>> data_channels_;
   std::vector<std::unique_ptr<MockDataChannelObserver>> data_observers_;
diff --git a/rtc_base/async_resolver_interface.h b/rtc_base/async_resolver_interface.h
index 829dc7e..851fa38 100644
--- a/rtc_base/async_resolver_interface.h
+++ b/rtc_base/async_resolver_interface.h
@@ -19,6 +19,7 @@
 namespace rtc {
 
 // This interface defines the methods to resolve the address asynchronously.
+// TODO(bugs.webrtc.org/12598): Deprecate and remove.
 class RTC_EXPORT AsyncResolverInterface {
  public:
   AsyncResolverInterface();
diff --git a/test/pc/e2e/test_peer_factory.cc b/test/pc/e2e/test_peer_factory.cc
index 858676f..9b2f2d6 100644
--- a/test/pc/e2e/test_peer_factory.cc
+++ b/test/pc/e2e/test_peer_factory.cc
@@ -261,9 +261,9 @@
 
   pc_deps.allocator = std::move(port_allocator);
 
-  if (pc_dependencies->async_resolver_factory != nullptr) {
-    pc_deps.async_resolver_factory =
-        std::move(pc_dependencies->async_resolver_factory);
+  if (pc_dependencies->async_dns_resolver_factory != nullptr) {
+    pc_deps.async_dns_resolver_factory =
+        std::move(pc_dependencies->async_dns_resolver_factory);
   }
   if (pc_dependencies->cert_generator != nullptr) {
     pc_deps.cert_generator = std::move(pc_dependencies->cert_generator);