Port GCM's RegistrationRequest to SimpleURLLoader

URLFetcher will stop working with advent of Network Service, and
SimpleURLLoader is the replacement API for most clients.

(Other request types will follow; they were not done for now to keep CL size down, since there is a
 lot of wiring of pointers through and test infra stuff).

Bug: 844987
Cq-Include-Trybots: luci.chromium.try:ios-simulator-full-configs;luci.chromium.try:linux_mojo;master.tryserver.chromium.mac:ios-simulator-cronet
Change-Id: I1dc5efda6d239509d060f154cedf57ecf73edff2
Reviewed-on: https://chromium-review.googlesource.com/1110705
Reviewed-by: Scott Violet <[email protected]>
Reviewed-by: Peter Beverloo <[email protected]>
Reviewed-by: Reilly Grant <[email protected]>
Commit-Queue: Maks Orlovich <[email protected]>
Cr-Commit-Position: refs/heads/master@{#574468}
diff --git a/components/gcm_driver/gcm_client_impl_unittest.cc b/components/gcm_driver/gcm_client_impl_unittest.cc
index df7f5e4..b9a3411 100644
--- a/components/gcm_driver/gcm_client_impl_unittest.cc
+++ b/components/gcm_driver/gcm_client_impl_unittest.cc
@@ -21,7 +21,6 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_mock_time_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
 #include "base/time/clock.h"
 #include "base/timer/timer.h"
 #include "components/gcm_driver/features.h"
@@ -40,6 +39,9 @@
 #include "net/url_request/test_url_fetcher_factory.h"
 #include "net/url_request/url_fetcher_delegate.h"
 #include "net/url_request/url_request_test_util.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
+#include "services/network/test/test_utils.h"
 #include "testing/gtest/include/gtest/gtest-spi.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/leveldatabase/leveldb_chrome.h"
@@ -81,6 +83,8 @@
 const char kGroupName[] = "Enabled";
 const char kInvalidateTokenTrialName[] = "InvalidateTokenTrial";
 
+const char kRegisterUrl[] = "https://android.clients.google.com/c2dm/register3";
+
 // Helper for building arbitrary data messages.
 MCSMessage BuildDownstreamMessage(
     const std::string& project_id,
@@ -301,7 +305,6 @@
                            net::HttpStatusCode response_code);
   void CompleteRegistration(const std::string& registration_id);
   void CompleteUnregistration(const std::string& app_id);
-  void VerifyPendingRequestFetcherDeleted();
 
   bool ExistsRegistration(const std::string& app_id) const;
   void AddRegistration(const std::string& app_id,
@@ -402,6 +405,9 @@
   net::TestURLFetcherFactory* url_fetcher_factory() {
     return &url_fetcher_factory_;
   }
+  network::TestURLLoaderFactory* url_loader_factory() {
+    return &test_url_loader_factory_;
+  }
   base::TestMockTimeTaskRunner* task_runner() {
     return task_runner_.get();
   }
@@ -427,10 +433,10 @@
   net::TestURLFetcherFactory url_fetcher_factory_;
 
   scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
-  base::ThreadTaskRunnerHandle task_runner_handle_;
 
   // Injected to GCM client.
   scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_;
+  network::TestURLLoaderFactory test_url_loader_factory_;
   base::test::ScopedFeatureList scoped_feature_list_;
   base::FieldTrialList field_trial_list_;
   std::map<std::string, base::FieldTrial*> trials_;
@@ -439,8 +445,8 @@
 GCMClientImplTest::GCMClientImplTest()
     : last_event_(NONE),
       last_result_(GCMClient::UNKNOWN_ERROR),
-      task_runner_(new base::TestMockTimeTaskRunner),
-      task_runner_handle_(task_runner_),
+      task_runner_(new base::TestMockTimeTaskRunner(
+          base::TestMockTimeTaskRunner::Type::kBoundToThread)),
       url_request_context_getter_(
           new net::TestURLRequestContextGetter(task_runner_)),
       field_trial_list_(nullptr) {}
@@ -573,11 +579,11 @@
     const std::string& registration_id) {
   std::string response(kRegistrationResponsePrefix);
   response.append(registration_id);
-  net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
-  ASSERT_TRUE(fetcher);
-  fetcher->set_response_code(net::HTTP_OK);
-  fetcher->SetResponseString(response);
-  fetcher->delegate()->OnURLFetchComplete(fetcher);
+
+  EXPECT_TRUE(url_loader_factory()->SimulateResponseForPendingRequest(
+      GURL(kRegisterUrl), network::URLLoaderCompletionStatus(net::OK),
+      network::CreateResourceResponseHead(net::HTTP_OK), response));
+
   // Give a chance for GCMStoreImpl::Backend to finish persisting data.
   PumpLoopUntilIdle();
 }
@@ -595,11 +601,6 @@
   PumpLoopUntilIdle();
 }
 
-void GCMClientImplTest::VerifyPendingRequestFetcherDeleted() {
-  net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
-  EXPECT_FALSE(fetcher);
-}
-
 bool GCMClientImplTest::ExistsRegistration(const std::string& app_id) const {
   return ExistsGCMRegistrationInMap(gcm_client_->registrations_, app_id);
 }
@@ -621,9 +622,12 @@
   GCMClient::ChromeBuildInfo chrome_build_info;
   chrome_build_info.version = kChromeVersion;
   chrome_build_info.product_category_for_subtypes = kProductCategoryForSubtypes;
-  gcm_client_->Initialize(chrome_build_info, gcm_store_path(), task_runner_,
-                          url_request_context_getter_,
-                          base::WrapUnique<Encryptor>(new FakeEncryptor), this);
+  gcm_client_->Initialize(
+      chrome_build_info, gcm_store_path(), task_runner_,
+      url_request_context_getter_,
+      base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+          &test_url_loader_factory_),
+      base::WrapUnique<Encryptor>(new FakeEncryptor), this);
 }
 
 void GCMClientImplTest::StartGCMClient() {
@@ -1044,7 +1048,7 @@
 
   gcm_client()->Stop();
   PumpLoopUntilIdle();
-  VerifyPendingRequestFetcherDeleted();
+  EXPECT_EQ(0, url_loader_factory()->NumPending());
 }
 
 TEST_F(GCMClientImplTest, DispatchDownstreamMessage) {