Save properties to persistent storage when host is on
1. When host is on, set properties as requested properties instead
of notify listeners;
2. When host becomes off, and requested properties are not empty, notify
the listners and reset the requested properties.
Add unit tests.
Change-Id: I9359c801c698df0c6e5eab43e12427bb5a6da611
Signed-off-by: Lei YU <mine260309@gmail.com>
diff --git a/test/TestHostEpoch.cpp b/test/TestHostEpoch.cpp
index ec8ecf1..0ff8a11 100644
--- a/test/TestHostEpoch.cpp
+++ b/test/TestHostEpoch.cpp
@@ -2,6 +2,7 @@
#include <gtest/gtest.h>
#include "host_epoch.hpp"
+#include "utils.hpp"
#include "config.h"
#include "types.hpp"
@@ -45,16 +46,6 @@
{
return hostEpoch.timeOwner;
}
- template <typename T>
- T readData(const char* fileName)
- {
- return HostEpoch::readData<T>(fileName);
- }
- template <typename T>
- void writeData(const char* fileName, T&& data)
- {
- HostEpoch::writeData<T>(fileName, std::forward<T>(data));
- }
microseconds getOffset()
{
return hostEpoch.offset;
@@ -75,7 +66,7 @@
{
// When file does not exist, the default offset shall be 0
microseconds offset(0);
- auto value = readData<decltype(offset)::rep>(FILE_NOT_EXIST);
+ auto value = utils::readData<decltype(offset)::rep>(FILE_NOT_EXIST);
EXPECT_EQ(0, value);
}
@@ -83,12 +74,13 @@
{
// Write offset to file
microseconds offsetToWrite(1234567);
- writeData<decltype(offsetToWrite)::rep>(FILE_OFFSET, offsetToWrite.count());
+ utils::writeData<decltype(offsetToWrite)::rep>(
+ FILE_OFFSET, offsetToWrite.count());
// Read it back
microseconds offsetToRead;
offsetToRead = microseconds(
- readData<decltype(offsetToRead)::rep>(FILE_OFFSET));
+ utils::readData<decltype(offsetToRead)::rep>(FILE_OFFSET));
EXPECT_EQ(offsetToWrite, offsetToRead);
}
diff --git a/test/TestManager.cpp b/test/TestManager.cpp
index 4d9ae73..935590e 100644
--- a/test/TestManager.cpp
+++ b/test/TestManager.cpp
@@ -39,10 +39,34 @@
{
return Manager::convertToOwner(owner);
}
+ bool hostOn()
+ {
+ return manager.hostOn;
+ }
+ std::string getRequestedMode()
+ {
+ return manager.requestedMode;
+ }
+ std::string getRequestedOwner()
+ {
+ return manager.requestedOwner;
+ }
+ void notifyPropertyChanged(const std::string& key,
+ const std::string& value)
+ {
+ manager.onPropertyChanged(key, value);
+ }
+ void notifyPgoodChanged(bool pgood)
+ {
+ manager.onPgoodChanged(pgood);
+ }
};
TEST_F(TestManager, empty)
{
+ EXPECT_FALSE(hostOn());
+ EXPECT_EQ("", getRequestedMode());
+ EXPECT_EQ("", getRequestedOwner());
EXPECT_EQ(Mode::NTP, getTimeMode());
EXPECT_EQ(Owner::BMC, getTimeOwner());
}
@@ -72,5 +96,44 @@
EXPECT_EQ(Owner::BMC, convertToOwner("xyz"));
}
+TEST_F(TestManager, pgoodChange)
+{
+ notifyPgoodChanged(true);
+ EXPECT_TRUE(hostOn());
+ notifyPgoodChanged(false);
+ EXPECT_FALSE(hostOn());
+}
+
+TEST_F(TestManager, propertyChange)
+{
+ // When host is off, property change will be notified to listners
+ EXPECT_FALSE(hostOn());
+ notifyPropertyChanged("time_mode", "MANUAL");
+ notifyPropertyChanged("time_owner", "HOST");
+ EXPECT_EQ("", getRequestedMode());
+ EXPECT_EQ("", getRequestedOwner());
+ // TODO: if gmock is ready, check mocked listners shall receive notifies
+
+ notifyPgoodChanged(true);
+ // When host is on, property changes are saved as requested ones
+ notifyPropertyChanged("time_mode", "MANUAL");
+ notifyPropertyChanged("time_owner", "HOST");
+ EXPECT_EQ("MANUAL", getRequestedMode());
+ EXPECT_EQ("HOST", getRequestedOwner());
+
+
+ // When host becomes off, the requested mode/owner shall be notified
+ // to listners, and be cleared
+ notifyPgoodChanged(false);
+ // TODO: if gmock is ready, check mocked listners shall receive notifies
+ EXPECT_EQ("", getRequestedMode());
+ EXPECT_EQ("", getRequestedOwner());
+
+ // When host is on, and invalid property is changed,
+ // verify the code asserts because it shall never occur
+ notifyPgoodChanged(true);
+ ASSERT_DEATH(notifyPropertyChanged("invalid property", "whatever"), "");
+}
+
}
}