blob: b11100fe71d95d861a47970c98349c5a4d86aaeb [file] [log] [blame]
William A. Kennington III6a923632022-11-06 18:17:33 -08001#include "mock_network_manager.hpp"
2#include "mock_syscall.hpp"
3#include "rtnetlink_server.hpp"
4#include "types.hpp"
5
6#include <linux/rtnetlink.h>
7#include <net/if.h>
8
9#include <chrono>
10#include <functional>
11#include <sdbusplus/bus.hpp>
12#include <sdeventplus/event.hpp>
13#include <testutil.hpp>
14
15#include <gtest/gtest.h>
16
17namespace phosphor
18{
19
20namespace network
21{
22sdbusplus::bus_t bus(sdbusplus::bus::new_default());
23extern std::unique_ptr<MockManager> manager;
24extern std::unique_ptr<Timer> refreshObjectTimer;
25EventPtr eventPtr = nullptr;
26
27class TestRtNetlink : public TestWithTmp
28{
29
30 public:
31 std::optional<rtnetlink::Server> svr;
32
33 TestRtNetlink()
34 {
35 manager = std::make_unique<MockManager>(bus, "/xyz/openbmc_test/bcd",
36 CaseTmpDir());
37 sd_event* events;
38 sd_event_default(&events);
39 eventPtr.reset(events);
40 events = nullptr;
41 initializeTimers();
42 createNetLinkSocket();
43 bus.attach_event(eventPtr.get(), SD_EVENT_PRIORITY_NORMAL);
44 svr.emplace(eventPtr);
45 }
46
47 void createNetLinkSocket()
48 {
49 // RtnetLink socket
50 auto fd = socket(PF_NETLINK, SOCK_RAW | SOCK_NONBLOCK, NETLINK_ROUTE);
51 smartSock.set(fd);
52 }
53};
54
55TEST_F(TestRtNetlink, WithSingleInterface)
56{
57 using namespace std::chrono;
58 mock_clear();
59 // Adds the following ip in the getifaddrs list.
60 mock_addIF("igb5", /*idx=*/6);
61 mock_addIP("igb5", "127.0.0.1", "255.255.255.128");
62 constexpr auto BUFSIZE = 4096;
63 std::array<char, BUFSIZE> msgBuf = {0};
64
65 // point the header and the msg structure pointers into the buffer.
66 auto nlMsg = reinterpret_cast<nlmsghdr*>(msgBuf.data());
67 // Length of message
68 nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(rtmsg));
69 nlMsg->nlmsg_type = RTM_GETADDR;
70 nlMsg->nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST;
71 nlMsg->nlmsg_seq = 0;
72 nlMsg->nlmsg_pid = getpid();
73
74 EXPECT_EQ(false, manager->hasInterface("igb5"));
75 // Send the request
76 send(svr->getSock(), nlMsg, nlMsg->nlmsg_len, 0);
77
78 int i = 3;
79 while (i--)
80 {
81 // wait for timer to expire
82 std::this_thread::sleep_for(std::chrono::milliseconds(refreshTimeout));
83 sd_event_run(eventPtr.get(), 10);
84 };
85
86 EXPECT_EQ(true, manager->hasInterface("igb5"));
87}
88
89} // namespace network
90} // namespace phosphor