Add tests for the D-Bus MessageFilter.

Review URL: http://codereview.chromium.org/1990001
diff --git a/metrics/metrics_daemon.h b/metrics/metrics_daemon.h
index 028525a..3ab857a 100644
--- a/metrics/metrics_daemon.h
+++ b/metrics/metrics_daemon.h
@@ -39,6 +39,7 @@
   FRIEND_TEST(MetricsDaemonTest, LookupPowerState);
   FRIEND_TEST(MetricsDaemonTest, LookupScreenSaverState);
   FRIEND_TEST(MetricsDaemonTest, LookupSessionState);
+  FRIEND_TEST(MetricsDaemonTest, MessageFilter);
   FRIEND_TEST(MetricsDaemonTest, NetStateChanged);
   FRIEND_TEST(MetricsDaemonTest, PowerStateChanged);
   FRIEND_TEST(MetricsDaemonTest, PublishMetric);
diff --git a/metrics/metrics_daemon_test.cc b/metrics/metrics_daemon_test.cc
index 043be72..25b0855 100644
--- a/metrics/metrics_daemon_test.cc
+++ b/metrics/metrics_daemon_test.cc
@@ -12,7 +12,7 @@
 #include <base/string_util.h>
 #include <gtest/gtest.h>
 
-static const char kTestDailyUseRecordFile[] = "/tmp/daily-usage-test";
+static const char kTestDailyUseRecordFile[] = "daily-usage-test";
 static const char kDoesNotExistFile[] = "/does/not/exist";
 
 static const int kSecondsPerDay = 24 * 60 * 60;
@@ -123,6 +123,8 @@
     return testing::AssertionSuccess();
   }
 
+  // Returns true if the daily use record file does not exist or is
+  // empty, false otherwise.
   bool NoOrEmptyUseRecordFile() {
     FilePath record_file(daemon_.daily_use_record_file_);
     int64 record_file_size;
@@ -131,6 +133,34 @@
          record_file_size == 0);
   }
 
+  // Creates a new DBus signal message with a single string
+  // argument. The message can be deallocated through
+  // DeleteDBusMessage.
+  //
+  // |path| is the object emitting the signal.
+  // |interface| is the interface the signal is emitted from.
+  // |name| is the name of the signal.
+  // |arg_value| is the value of the string argument.
+  DBusMessage* NewDBusSignalString(const std::string& path,
+                                   const std::string& interface,
+                                   const std::string& name,
+                                   const std::string& arg_value) {
+    DBusMessage* msg = dbus_message_new_signal(path.c_str(),
+                                               interface.c_str(),
+                                               name.c_str());
+    DBusMessageIter iter;
+    dbus_message_iter_init_append(msg, &iter);
+    const char* arg_value_c = arg_value.c_str();
+    dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &arg_value_c);
+    return msg;
+  }
+
+  // Deallocates the DBus message |msg| previously allocated through
+  // dbus_message_new*.
+  void DeleteDBusMessage(DBusMessage* msg) {
+    dbus_message_unref(msg);
+  }
+
   // Pointer to the current test fixture.
   static MetricsDaemonTest* daemon_test_;
 
@@ -232,6 +262,64 @@
             daemon_.LookupSessionState("somestate"));
 }
 
+TEST_F(MetricsDaemonTest, MessageFilter) {
+  DBusMessage* msg = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL);
+  DBusHandlerResult res =
+      MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_);
+  EXPECT_EQ(DBUS_HANDLER_RESULT_NOT_YET_HANDLED, res);
+  DeleteDBusMessage(msg);
+
+  msg = NewDBusSignalString("/",
+                            "org.moblin.connman.Manager",
+                            "StateChanged",
+                            "online");
+  EXPECT_EQ(MetricsDaemon::kUnknownNetworkState, daemon_.network_state_);
+  res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_);
+  EXPECT_EQ(MetricsDaemon::kNetworkStateOnline, daemon_.network_state_);
+  EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res);
+  DeleteDBusMessage(msg);
+
+  msg = NewDBusSignalString("/",
+                            "org.chromium.Power.Manager",
+                            "PowerStateChanged",
+                            "on");
+  EXPECT_EQ(MetricsDaemon::kUnknownPowerState, daemon_.power_state_);
+  res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_);
+  EXPECT_EQ(MetricsDaemon::kPowerStateOn, daemon_.power_state_);
+  EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res);
+  DeleteDBusMessage(msg);
+
+  msg = NewDBusSignalString("/",
+                            "org.chromium.ScreenSaver.Manager",
+                            "LockStateChanged",
+                            "unlocked");
+  EXPECT_EQ(MetricsDaemon::kUnknownScreenSaverState,
+            daemon_.screensaver_state_);
+  res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_);
+  EXPECT_EQ(MetricsDaemon::kScreenSaverStateUnlocked,
+            daemon_.screensaver_state_);
+  EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res);
+  DeleteDBusMessage(msg);
+
+  msg = NewDBusSignalString("/org/chromium/SessionManager",
+                            "org.chromium.SessionManagerInterface",
+                            "SessionStateChanged",
+                            "started");
+  EXPECT_EQ(MetricsDaemon::kUnknownSessionState, daemon_.session_state_);
+  res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_);
+  EXPECT_EQ(MetricsDaemon::kSessionStateStarted, daemon_.session_state_);
+  EXPECT_EQ(DBUS_HANDLER_RESULT_HANDLED, res);
+  DeleteDBusMessage(msg);
+
+  msg = NewDBusSignalString("/",
+                            "org.chromium.UnknownService.Manager",
+                            "StateChanged",
+                            "randomstate");
+  res = MetricsDaemon::MessageFilter(/* connection */ NULL, msg, &daemon_);
+  EXPECT_EQ(DBUS_HANDLER_RESULT_NOT_YET_HANDLED, res);
+  DeleteDBusMessage(msg);
+}
+
 TEST_F(MetricsDaemonTest, NetStateChanged) {
   EXPECT_EQ(MetricsDaemon::kUnknownNetworkState, daemon_.network_state_);
   EXPECT_EQ(0, daemon_.network_state_last_);