shill: switch over to ChromeosDBusDaemon

This removes the dependency for glib's io handler and message loop.
All the signal handling and message loop setup is handled by chromeos::Daemon.
And all the DBus related setup is handled by chromeos::DBusServiceDaemon.

Daemon/Manager resources initailization are deferred until the bus is intialized.

BUG=chromium:517680
TEST=USE="chromeos_dbus asan clang -cellular" FEATURES=test emerge-$BOARD shill
TEST=wifi_matfunc test

Change-Id: I88928c5c1290403053d6a5cec392e3d459f5a7af
Reviewed-on: https://chromium-review.googlesource.com/293557
Commit-Ready: Zeping Qiu <zqiu@chromium.org>
Tested-by: Zeping Qiu <zqiu@chromium.org>
Reviewed-by: Zeping Qiu <zqiu@chromium.org>
diff --git a/chromeos_daemon_unittest.cc b/chromeos_daemon_unittest.cc
index b92d6fe..6324c95 100644
--- a/chromeos_daemon_unittest.cc
+++ b/chromeos_daemon_unittest.cc
@@ -18,11 +18,13 @@
 #include "shill/mock_control.h"
 #include "shill/mock_manager.h"
 #include "shill/mock_metrics.h"
+#include "shill/mock_process_manager.h"
 #include "shill/mock_routing_table.h"
 #include "shill/net/io_handler.h"
 #include "shill/net/mock_rtnl_handler.h"
 #include "shill/net/ndisc.h"
 #include "shill/shill_test_config.h"
+#include "shill/test_event_dispatcher.h"
 
 #if !defined(DISABLE_WIFI)
 #include "shill/net/mock_netlink_manager.h"
@@ -43,40 +45,44 @@
 
 namespace shill {
 
-// TODO(zqiu): extend chromeos::Daemon for initializing the message loop once
-// we remove the message loop initialization in EventDispatcher.
-class TestChromeosDaemon : public ChromeosDaemon {
+class ChromeosDaemonForTest : public ChromeosDaemon {
  public:
-  TestChromeosDaemon(const Settings& setttings,
-                     Config* config,
-                     ControlInterface* control)
-      : ChromeosDaemon(Settings(), config, control) {}
-  virtual ~TestChromeosDaemon() {}
+  ChromeosDaemonForTest(const Settings& setttings,
+                        Config* config,
+                        EventDispatcher* dispatcher)
+      : ChromeosDaemon(Settings(), config) {
+    Init(new MockControl(), dispatcher);
+  }
+  virtual ~ChromeosDaemonForTest() {}
 
-  MOCK_METHOD0(RunMessageLoop, void());
+  void RunMessageLoop() override { dispatcher_->DispatchForever(); }
+
+  void Quit() override {
+    ChromeosDaemon::Quit();
+    dispatcher_->PostTask(base::MessageLoop::QuitClosure());
+  }
 };
 
 class ChromeosDaemonTest : public Test {
  public:
   ChromeosDaemonTest()
-      : daemon_(ChromeosDaemon::Settings(), &config_, new MockControl()),
-        metrics_(new MockMetrics(&daemon_.dispatcher_)),
+      : daemon_(ChromeosDaemon::Settings(), &config_, &dispatcher_),
+        metrics_(new MockMetrics(daemon_.dispatcher_)),
         manager_(new MockManager(daemon_.control_.get(),
-                                 &daemon_.dispatcher_,
+                                 daemon_.dispatcher_,
                                  metrics_,
                                  &daemon_.glib_)),
-        dispatcher_(&daemon_.dispatcher_),
-        device_info_(daemon_.control_.get(), dispatcher_, metrics_,
-                     daemon_.manager_.get()) {
+        device_info_(daemon_.control_.get(), daemon_.dispatcher_,
+                     metrics_, manager_) {
   }
   virtual ~ChromeosDaemonTest() {}
   virtual void SetUp() {
     // Tests initialization done by the daemon's constructor
     ASSERT_NE(nullptr, daemon_.config_);
-    ASSERT_NE(nullptr, daemon_.control_.get());
     daemon_.rtnl_handler_ = &rtnl_handler_;
     daemon_.routing_table_ = &routing_table_;
     daemon_.dhcp_provider_ = &dhcp_provider_;
+    daemon_.process_manager_ = &process_manager_;
     daemon_.metrics_.reset(metrics_);  // Passes ownership
     daemon_.manager_.reset(manager_);  // Passes ownership
 
@@ -95,30 +101,30 @@
     daemon_.Stop();
   }
 
-  // TODO(zqiu): temporary until we remove message loop initialization in
-  // EventDispatcher.
   void RunDaemon() {
-    dispatcher_->DispatchForever();
+    daemon_.RunMessageLoop();
   }
 
   void ApplySettings(const ChromeosDaemon::Settings& settings) {
-    daemon_.ApplySettings(settings);
+    daemon_.settings_ = settings;
+    daemon_.ApplySettings();
   }
 
   MOCK_METHOD0(TerminationAction, void());
 
  protected:
+  EventDispatcherForTest dispatcher_;
   TestConfig config_;
-  TestChromeosDaemon daemon_;
+  ChromeosDaemonForTest daemon_;
   MockRTNLHandler rtnl_handler_;
   MockRoutingTable routing_table_;
   MockDHCPProvider dhcp_provider_;
+  MockProcessManager process_manager_;
   MockMetrics* metrics_;
   MockManager* manager_;
 #if !defined(DISABLE_WIFI)
   MockNetlinkManager netlink_manager_;
 #endif  // DISABLE_WIFI
-  EventDispatcher* dispatcher_;
   DeviceInfo device_info_;
 };
 
@@ -136,7 +142,8 @@
       RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE |
       RTMGRP_IPV6_IFADDR | RTMGRP_IPV6_ROUTE | RTMGRP_ND_USEROPT));
   Expectation routing_table_started = EXPECT_CALL(routing_table_, Start());
-  EXPECT_CALL(dhcp_provider_, Init(_, _, _, _));
+  EXPECT_CALL(dhcp_provider_, Init(_,  _, _));
+  EXPECT_CALL(process_manager_, Init(_));
   EXPECT_CALL(*manager_, Start()).After(routing_table_started);
   StartDaemon();
   Mock::VerifyAndClearExpectations(metrics_);
@@ -161,7 +168,7 @@
                                       Unretained(this)));
 
   // Run Daemon::Quit() after the daemon starts running.
-  dispatcher_->PostTask(Bind(&ChromeosDaemon::Quit, Unretained(&daemon_)));
+  dispatcher_.PostTask(Bind(&ChromeosDaemon::Quit, Unretained(&daemon_)));
 
   RunDaemon();
 }