metrics: Fix upload_service to work with base::MessageLoop

With an earlier change, metrics_daemon was switched from the glib message loop
to base::MessageLoop.  UploadService still is trying to interact with the
glib message loop, it needs to be switched to using base::MessageLoop.

BUG=chromium:452228
TEST=`FEATURES=test emerge-panther metrics`

Change-Id: I38eb52ca1995d75cfb7d0e69a434e649493e7c6f
Reviewed-on: https://chromium-review.googlesource.com/243429
Reviewed-by: Nathan Bullock <nathanbullock@google.com>
Reviewed-by: Bertrand Simonnet <bsimonnet@chromium.org>
Tested-by: Stephen Fung <stevefung@chromium.org>
Commit-Queue: Stephen Fung <stevefung@chromium.org>
Trybot-Ready: Stephen Fung <stevefung@chromium.org>
diff --git a/metrics/metrics.gyp b/metrics/metrics.gyp
index 60e2d1a..3130509 100644
--- a/metrics/metrics.gyp
+++ b/metrics/metrics.gyp
@@ -3,10 +3,6 @@
     'variables': {
       'deps': [
         'dbus-1',
-        'dbus-glib-1',
-        'glib-2.0',
-        'gobject-2.0',
-        'gthread-2.0',
         'libchrome-<(libbase_ver)',
         'libchromeos-<(libbase_ver)',
       ]
diff --git a/metrics/uploader/system_profile_cache.cc b/metrics/uploader/system_profile_cache.cc
index 28e0f09..d16b1dd 100644
--- a/metrics/uploader/system_profile_cache.cc
+++ b/metrics/uploader/system_profile_cache.cc
@@ -4,7 +4,6 @@
 
 #include "metrics/uploader/system_profile_cache.h"
 
-#include <glib.h>
 #include <string>
 #include <vector>
 
diff --git a/metrics/uploader/upload_service.cc b/metrics/uploader/upload_service.cc
index cdec91e..dd49d1f 100644
--- a/metrics/uploader/upload_service.cc
+++ b/metrics/uploader/upload_service.cc
@@ -4,11 +4,12 @@
 
 #include "metrics/uploader/upload_service.h"
 
-#include <glib.h>
 #include <string>
 
+#include <base/bind.h>
 #include <base/logging.h>
 #include <base/memory/scoped_vector.h>
+#include <base/message_loop/message_loop.h>
 #include <base/metrics/histogram.h>
 #include <base/metrics/histogram_base.h>
 #include <base/metrics/histogram_snapshot_manager.h>
@@ -28,14 +29,29 @@
                              const std::string& server)
     : system_profile_setter_(setter),
       histogram_snapshot_manager_(this),
-      sender_(new HttpSender(server)) {
+      sender_(new HttpSender(server)),
+      testing_(false) {
+}
+
+UploadService::UploadService(SystemProfileSetter* setter,
+                             const std::string& server,
+                             bool testing)
+    : UploadService(setter, server) {
+  testing_ = testing;
 }
 
 void UploadService::Init(const base::TimeDelta& upload_interval,
                          const std::string& metrics_file) {
   base::StatisticsRecorder::Initialize();
   metrics_file_ = metrics_file;
-  g_timeout_add_seconds(upload_interval.InSeconds(), &UploadEventStatic, this);
+
+  if (!testing_) {
+    base::MessageLoop::current()->PostDelayedTask(FROM_HERE,
+        base::Bind(&UploadService::UploadEventCallback,
+                   base::Unretained(this),
+                   upload_interval),
+        upload_interval);
+  }
 }
 
 void UploadService::StartNewLog() {
@@ -46,12 +62,14 @@
   current_log_.reset(log);
 }
 
-// static
-int UploadService::UploadEventStatic(void* uploader) {
-  CHECK(uploader);
-  // This is called by glib with a pointer to an UploadEvent object.
-  static_cast<UploadService*>(uploader)->UploadEvent();
-  return 1;
+void UploadService::UploadEventCallback(const base::TimeDelta& interval) {
+  UploadEvent();
+
+  base::MessageLoop::current()->PostDelayedTask(FROM_HERE,
+      base::Bind(&UploadService::UploadEventCallback,
+                 base::Unretained(this),
+                 interval),
+      interval);
 }
 
 void UploadService::UploadEvent() {
diff --git a/metrics/uploader/upload_service.h b/metrics/uploader/upload_service.h
index 3611794..0b087de 100644
--- a/metrics/uploader/upload_service.h
+++ b/metrics/uploader/upload_service.h
@@ -64,9 +64,8 @@
   // launch as it is destroyed when staging the log.
   void StartNewLog();
 
-  // Glib takes a function pointer and passes the object as a void*.
-  // Uploader is expected to be an UploaderService.
-  static int UploadEventStatic(void* uploader);
+  // Event callback for handling MessageLoop events.
+  void UploadEventCallback(const base::TimeDelta& interval);
 
   // Triggers an upload event.
   void UploadEvent();
@@ -98,6 +97,11 @@
   FRIEND_TEST(UploadServiceTest, UnknownCrashIgnored);
   FRIEND_TEST(UploadServiceTest, ValuesInConfigFileAreSent);
 
+  // Private constructor for use in unit testing.
+  UploadService(SystemProfileSetter* setter,
+                const std::string& server,
+                bool testing);
+
   // If a staged log fails to upload more than kMaxFailedUpload times, it
   // will be discarded.
   static const int kMaxFailedUpload;
@@ -137,6 +141,8 @@
   scoped_ptr<MetricsLog> staged_log_;
 
   std::string metrics_file_;
+
+  bool testing_;
 };
 
 #endif  // METRICS_UPLOADER_UPLOAD_SERVICE_H_
diff --git a/metrics/uploader/upload_service_test.cc b/metrics/uploader/upload_service_test.cc
index 363c8c1..ca90e85 100644
--- a/metrics/uploader/upload_service_test.cc
+++ b/metrics/uploader/upload_service_test.cc
@@ -26,7 +26,7 @@
  protected:
   UploadServiceTest()
       : cache_(true, "/"),
-        upload_service_(new MockSystemProfileSetter(), kMetricsServer),
+        upload_service_(new MockSystemProfileSetter(), kMetricsServer, true),
         exit_manager_(new base::AtExitManager()) {
     sender_ = new SenderMock;
     upload_service_.sender_.reset(sender_);