blob: dac43b3725b39770746312cf128d255cd4ef3348 [file] [log] [blame]
#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);
}