Add inotify watch support
Added code to register for inotify events on the needed
path and the user callback on events
Change-Id: I90529f8e96fcbecfe0a1b943c3c435dab79222c3
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/test/test_watch.cpp b/test/test_watch.cpp
new file mode 100644
index 0000000..dac43b3
--- /dev/null
+++ b/test/test_watch.cpp
@@ -0,0 +1,90 @@
+#include "watch.hpp"
+#include "types.hpp"
+
+#include <gtest/gtest.h>
+
+#include <fstream>
+#include <experimental/filesystem>
+
+static constexpr auto TRIGGER_FILE = "/tmp/netif_state";
+
+namespace fs = std::experimental::filesystem;
+
+class WatchTest : public ::testing::Test
+{
+ public:
+ // systemd event handler
+ sd_event* events;
+
+ // Need this so that events can be initialized.
+ int rc;
+
+ // Gets called as part of each TEST_F construction
+ WatchTest()
+ : rc(sd_event_default(&events)),
+ eventPtr(events)
+ {
+ // Create a file containing DNS entries like in netif/state
+ std::ofstream file(TRIGGER_FILE);
+ file << "";
+
+ // Check for successful creation of
+ // event handler
+ EXPECT_GE(rc, 0);
+ }
+
+ // Gets called as part of each TEST_F destruction
+ ~WatchTest()
+ {
+ if (fs::exists(TRIGGER_FILE))
+ {
+ fs::remove(TRIGGER_FILE);
+ }
+ }
+
+ // unique_ptr for sd_event
+ phosphor::network::EventPtr eventPtr;
+
+ // Count of callback invocation
+ int count = 0;
+
+ // This is supposed to get hit twice
+ // Once at the beginning to see if there is anything
+ // and the second time when the data is fired.
+ void callBackHandler(const fs::path& file)
+ {
+ count++;
+
+ // Expect that the file is what we wanted
+ EXPECT_EQ(file, TRIGGER_FILE);
+ }
+};
+
+/** @brief Makes sure that the inotify event is fired
+ */
+TEST_F(WatchTest, validateEventNotification)
+{
+ // Create a watch object and register the handler
+ phosphor::network::inotify::Watch watch(eventPtr, TRIGGER_FILE,
+ std::bind(&WatchTest::callBackHandler, this,
+ std::placeholders::_1));
+
+ // Reading the event post subscription
+ callBackHandler(TRIGGER_FILE);
+
+ // Callback function must have hit by now
+ EXPECT_EQ(1, count);
+
+ // Make a run and see that no changes
+ sd_event_run(eventPtr.get(), 10);
+ EXPECT_EQ(1, count);
+
+ // Pump the data and get notification
+ {
+ std::ofstream file(TRIGGER_FILE);
+ file <<"DNS=1.2.3.4\n";
+ }
+
+ sd_event_run(eventPtr.get(), 10);
+ EXPECT_EQ(2, count);
+}