| #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); |
| } |