rtnetlink: Migrate IP functions
Change-Id: I4c87b59306911df4c5a73e441b2b962fbaab072c
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/test/test_rtnetlink_server.cpp b/test/test_rtnetlink_server.cpp
new file mode 100644
index 0000000..b11100f
--- /dev/null
+++ b/test/test_rtnetlink_server.cpp
@@ -0,0 +1,90 @@
+#include "mock_network_manager.hpp"
+#include "mock_syscall.hpp"
+#include "rtnetlink_server.hpp"
+#include "types.hpp"
+
+#include <linux/rtnetlink.h>
+#include <net/if.h>
+
+#include <chrono>
+#include <functional>
+#include <sdbusplus/bus.hpp>
+#include <sdeventplus/event.hpp>
+#include <testutil.hpp>
+
+#include <gtest/gtest.h>
+
+namespace phosphor
+{
+
+namespace network
+{
+sdbusplus::bus_t bus(sdbusplus::bus::new_default());
+extern std::unique_ptr<MockManager> manager;
+extern std::unique_ptr<Timer> refreshObjectTimer;
+EventPtr eventPtr = nullptr;
+
+class TestRtNetlink : public TestWithTmp
+{
+
+ public:
+ std::optional<rtnetlink::Server> svr;
+
+ TestRtNetlink()
+ {
+ manager = std::make_unique<MockManager>(bus, "/xyz/openbmc_test/bcd",
+ CaseTmpDir());
+ sd_event* events;
+ sd_event_default(&events);
+ eventPtr.reset(events);
+ events = nullptr;
+ initializeTimers();
+ createNetLinkSocket();
+ bus.attach_event(eventPtr.get(), SD_EVENT_PRIORITY_NORMAL);
+ svr.emplace(eventPtr);
+ }
+
+ void createNetLinkSocket()
+ {
+ // RtnetLink socket
+ auto fd = socket(PF_NETLINK, SOCK_RAW | SOCK_NONBLOCK, NETLINK_ROUTE);
+ smartSock.set(fd);
+ }
+};
+
+TEST_F(TestRtNetlink, WithSingleInterface)
+{
+ using namespace std::chrono;
+ mock_clear();
+ // Adds the following ip in the getifaddrs list.
+ mock_addIF("igb5", /*idx=*/6);
+ mock_addIP("igb5", "127.0.0.1", "255.255.255.128");
+ constexpr auto BUFSIZE = 4096;
+ std::array<char, BUFSIZE> msgBuf = {0};
+
+ // point the header and the msg structure pointers into the buffer.
+ auto nlMsg = reinterpret_cast<nlmsghdr*>(msgBuf.data());
+ // Length of message
+ nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(rtmsg));
+ nlMsg->nlmsg_type = RTM_GETADDR;
+ nlMsg->nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST;
+ nlMsg->nlmsg_seq = 0;
+ nlMsg->nlmsg_pid = getpid();
+
+ EXPECT_EQ(false, manager->hasInterface("igb5"));
+ // Send the request
+ send(svr->getSock(), nlMsg, nlMsg->nlmsg_len, 0);
+
+ int i = 3;
+ while (i--)
+ {
+ // wait for timer to expire
+ std::this_thread::sleep_for(std::chrono::milliseconds(refreshTimeout));
+ sd_event_run(eventPtr.get(), 10);
+ };
+
+ EXPECT_EQ(true, manager->hasInterface("igb5"));
+}
+
+} // namespace network
+} // namespace phosphor