buffet: Pass TaskRunner to DeviceRegistrationInfo

To help with unit testing, pass TaskRunner to DeviceRegistrationInfo
instead of the latter using base::MessageLoop directly.

BUG=brillo:1202
TEST=`FEATURES=test emerge-link buffet`

Change-Id: Idc9f3751eba6463d6e6f7f48731ec026a03bd165
Reviewed-on: https://chromium-review.googlesource.com/282330
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/base_api_handler_unittest.cc b/buffet/base_api_handler_unittest.cc
index aa780be..c7df9bb 100644
--- a/buffet/base_api_handler_unittest.cc
+++ b/buffet/base_api_handler_unittest.cc
@@ -53,7 +53,7 @@
         command_manager_, state_manager_,
         std::unique_ptr<BuffetConfig>{new BuffetConfig{
             std::unique_ptr<StorageInterface>{new MemStorage}}},
-        transport_, true, nullptr));
+        transport_, nullptr, true, nullptr));
     handler_.reset(new BaseApiHandler{
         dev_reg_->AsWeakPtr(), state_manager_, command_manager_});
   }
diff --git a/buffet/device_registration_info.cc b/buffet/device_registration_info.cc
index 4b74d7a..74e4433 100644
--- a/buffet/device_registration_info.cc
+++ b/buffet/device_registration_info.cc
@@ -11,7 +11,6 @@
 
 #include <base/bind.h>
 #include <base/json/json_writer.h>
-#include <base/message_loop/message_loop.h>
 #include <base/values.h>
 #include <chromeos/bind_lambda.h>
 #include <chromeos/data_encoding.h>
@@ -114,9 +113,11 @@
     const std::shared_ptr<StateManager>& state_manager,
     std::unique_ptr<BuffetConfig> config,
     const std::shared_ptr<chromeos::http::Transport>& transport,
+    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
     bool notifications_enabled,
     privetd::ShillClient* shill_client)
     : transport_{transport},
+      task_runner_{task_runner},
       command_manager_{command_manager},
       state_manager_{state_manager},
       config_{std::move(config)},
@@ -183,8 +184,7 @@
 
 void DeviceRegistrationInfo::ScheduleStartDevice(const base::TimeDelta& later) {
   SetRegistrationStatus(RegistrationStatus::kConnecting);
-  base::MessageLoop* current = base::MessageLoop::current();
-  if (!current)
+  if (!task_runner_)
     return;  // Assume we're in unittests
   base::TimeDelta max_delay =
       base::TimeDelta::FromMinutes(kMaxStartDeviceRetryDelayMinutes);
@@ -193,7 +193,7 @@
   base::TimeDelta retry_delay = later * 2;
   if (retry_delay > max_delay) { retry_delay = max_delay; }
   if (retry_delay < min_delay) { retry_delay = min_delay; }
-  current->PostDelayedTask(
+  task_runner_->PostDelayedTask(
       FROM_HERE,
       base::Bind(&DeviceRegistrationInfo::StartDevice,
                  weak_factory_.GetWeakPtr(), nullptr,
@@ -327,14 +327,12 @@
 
   LOG(INFO) << "Starting notification channel";
 
-  // If no MessageLoop assume we're in unittests.
-  if (!base::MessageLoop::current()) {
-    LOG(INFO) << "No MessageLoop, not starting notification channel";
+  // If no TaskRunner assume we're in unittests.
+  if (!task_runner_) {
+    LOG(INFO) << "No TaskRunner, not starting notification channel";
     return;
   }
 
-  auto task_runner = base::MessageLoop::current()->task_runner();
-
   if (primary_notification_channel_) {
     primary_notification_channel_->Stop();
     primary_notification_channel_.reset();
@@ -348,7 +346,7 @@
   // poll mode.
   const base::TimeDelta pull_interval = config_->polling_period();
   if (!pull_channel_) {
-    pull_channel_.reset(new PullChannel{pull_interval, task_runner});
+    pull_channel_.reset(new PullChannel{pull_interval, task_runner_});
     pull_channel_->Start(this);
   } else {
     pull_channel_->UpdatePullInterval(pull_interval);
@@ -362,7 +360,7 @@
 
   notification_channel_starting_ = true;
   primary_notification_channel_.reset(new XmppChannel{
-      config_->robot_account(), access_token_, task_runner, shill_client_});
+      config_->robot_account(), access_token_, task_runner_, shill_client_});
   primary_notification_channel_->Start(this);
 }
 
@@ -554,7 +552,7 @@
     VLOG(1) << "Cloud request delayed for "
             << cloud_backoff_entry_->GetTimeUntilRelease()
             << " due to backoff policy";
-    base::MessageLoop::current()->PostDelayedTask(
+    task_runner_->PostDelayedTask(
         FROM_HERE,
         base::Bind(&DeviceRegistrationInfo::SendCloudRequest, AsWeakPtr(),
                    data),
@@ -785,7 +783,7 @@
 void DeviceRegistrationInfo::RetryNotifyCommandAborted(
     const std::string& command_id,
     chromeos::ErrorPtr error) {
-  base::MessageLoop::current()->PostDelayedTask(
+  task_runner_->PostDelayedTask(
       FROM_HERE,
       base::Bind(&DeviceRegistrationInfo::NotifyCommandAborted,
                  weak_factory_.GetWeakPtr(),
@@ -902,7 +900,7 @@
     LOG(INFO) << "New command '" << command_instance->GetName()
               << "' arrived, ID: " << command_instance->GetID();
     std::unique_ptr<CommandProxyInterface> cloud_proxy{
-        new CloudCommandProxy(command_instance.get(), this)};
+        new CloudCommandProxy{command_instance.get(), this}};
     command_instance->AddProxy(std::move(cloud_proxy));
     command_manager_->AddCommand(std::move(command_instance));
   }
diff --git a/buffet/device_registration_info.h b/buffet/device_registration_info.h
index bce8c6f..4f12724 100644
--- a/buffet/device_registration_info.h
+++ b/buffet/device_registration_info.h
@@ -13,7 +13,9 @@
 
 #include <base/callback.h>
 #include <base/macros.h>
+#include <base/memory/ref_counted.h>
 #include <base/memory/weak_ptr.h>
+#include <base/single_thread_task_runner.h>
 #include <base/time/time.h>
 #include <base/timer/timer.h>
 #include <chromeos/backoff_entry.h>
@@ -66,6 +68,7 @@
       const std::shared_ptr<StateManager>& state_manager,
       std::unique_ptr<BuffetConfig> config,
       const std::shared_ptr<chromeos::http::Transport>& transport,
+      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
       bool notifications_enabled,
       privetd::ShillClient* shill_client);
 
@@ -293,6 +296,7 @@
 
   // HTTP transport used for communications.
   std::shared_ptr<chromeos::http::Transport> transport_;
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
   // Global command manager.
   std::shared_ptr<CommandManager> command_manager_;
   // Device state manager.
diff --git a/buffet/device_registration_info_unittest.cc b/buffet/device_registration_info_unittest.cc
index c8130c3..7a2a281 100644
--- a/buffet/device_registration_info_unittest.cc
+++ b/buffet/device_registration_info_unittest.cc
@@ -176,7 +176,7 @@
     config_ = config.get();
     dev_reg_.reset(new DeviceRegistrationInfo{command_manager_, state_manager_,
                                               std::move(config), transport_,
-                                              true, nullptr});
+                                              nullptr, true, nullptr});
 
     ReloadConfig();
   }
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 88a0b16..ca0f0ab 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -12,6 +12,7 @@
 #include <base/bind_helpers.h>
 #include <base/json/json_reader.h>
 #include <base/json/json_writer.h>
+#include <base/message_loop/message_loop.h>
 #include <base/time/time.h>
 #include <chromeos/dbus/async_event_sequencer.h>
 #include <chromeos/dbus/exported_object_manager.h>
@@ -89,6 +90,7 @@
   // device info state data unencrypted.
   device_info_.reset(new DeviceRegistrationInfo(
       command_manager_, state_manager_, std::move(config), transport,
+      base::MessageLoop::current()->task_runner(),
       options.xmpp_enabled, shill_client_.get()));
   device_info_->AddOnRegistrationChangedCallback(base::Bind(
       &Manager::OnRegistrationChanged, weak_ptr_factory_.GetWeakPtr()));