Use gmock on property_change_listener

1. Mock property_change_listener;
2. Make unit test link against gmock
3. Update TestManager to use mocked property change listener.
4. Fix an issue found by the updated test case, that when the properties
are changed during host is on, and changed back to the same as before,
when host becomes off, the properties shall remain the same and listeners
shall not be notified.

Change-Id: I815b59cb23edfcac910c2a8c26ea5a71e872d92f
Signed-off-by: Lei YU <mine260309@gmail.com>
diff --git a/manager.cpp b/manager.cpp
index 56e0d0b..bcc581c 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -134,20 +134,12 @@
         if (key == PROPERTY_TIME_MODE)
         {
             setCurrentTimeMode(value);
-            for (const auto listener : listeners)
-            {
-                listener->onModeChanged(timeMode);
-            }
-            // When time_mode is updated, update the NTP setting
-            updateNtpSetting(value);
+            onTimeModeChanged(value);
         }
         else if (key == PROPERTY_TIME_OWNER)
         {
             setCurrentTimeOwner(value);
-            for (const auto listener : listeners)
-            {
-                listener->onOwnerChanged(timeOwner);
-            }
+            onTimeOwnerChanged();
         }
     }
 }
@@ -259,20 +251,17 @@
     }
     if (!requestedMode.empty())
     {
-        setCurrentTimeMode(requestedMode);
-        for (const auto& listener : listeners)
+        if (setCurrentTimeMode(requestedMode))
         {
-            listener->onModeChanged(timeMode);
+            onTimeModeChanged(requestedMode);
         }
-        updateNtpSetting(requestedMode);
         setRequestedMode({}); // Clear requested mode
     }
     if (!requestedOwner.empty())
     {
-        setCurrentTimeOwner(requestedOwner);
-        for (const auto& listener : listeners)
+        if (setCurrentTimeOwner(requestedOwner))
         {
-            listener->onOwnerChanged(timeOwner);
+            onTimeOwnerChanged();
         }
         setRequestedOwner({}); // Clear requested owner
     }
@@ -300,20 +289,56 @@
     return 0;
 }
 
-void Manager::setCurrentTimeMode(const std::string& mode)
+bool Manager::setCurrentTimeMode(const std::string& mode)
 {
-    log<level::INFO>("Time mode is changed",
-                     entry("MODE=%s", mode.c_str()));
-    timeMode = convertToMode(mode);
-    utils::writeData(modeFile, mode);
+    auto newMode = convertToMode(mode);
+    if (newMode != timeMode)
+    {
+        log<level::INFO>("Time mode is changed",
+                         entry("MODE=%s", mode.c_str()));
+        timeMode = newMode;
+        utils::writeData(modeFile, mode);
+        return true;
+    }
+    else
+    {
+        return false;
+    }
 }
 
-void Manager::setCurrentTimeOwner(const std::string& owner)
+bool Manager::setCurrentTimeOwner(const std::string& owner)
 {
-    log<level::INFO>("Time owner is changed",
-                     entry("OWNER=%s", owner.c_str()));
-    timeOwner = convertToOwner(owner);
-    utils::writeData(ownerFile, owner);
+    auto newOwner = convertToOwner(owner);
+    if (newOwner != timeOwner)
+    {
+        log<level::INFO>("Time owner is changed",
+                         entry("OWNER=%s", owner.c_str()));
+        timeOwner = newOwner;
+        utils::writeData(ownerFile, owner);
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+void Manager::onTimeModeChanged(const std::string& mode)
+{
+    for (const auto listener : listeners)
+    {
+        listener->onModeChanged(timeMode);
+    }
+    // When time_mode is updated, update the NTP setting
+    updateNtpSetting(mode);
+}
+
+void Manager::onTimeOwnerChanged()
+{
+    for (const auto& listener : listeners)
+    {
+        listener->onOwnerChanged(timeOwner);
+    }
 }
 
 std::string Manager::getSettings(const char* value) const