#include "types.hpp" #include "watch.hpp" #include #include #include static constexpr auto TRIGGER_FILE = "/tmp/" __BASE_FILE__ "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); }