blob: 4be3743cf06de71d10cdd4c4e4d9cb71c1d1146c [file] [log] [blame]
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -06001#include "mock_syscall.hpp"
Gunnar Mills57d9c502018-09-14 14:42:34 -05002#include "network_manager.hpp"
3#include "rtnetlink_server.hpp"
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -06004#include "timer.hpp"
5#include "types.hpp"
6
Gunnar Mills57d9c502018-09-14 14:42:34 -05007#include <linux/rtnetlink.h>
8#include <net/if.h>
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -06009
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060010#include <sdbusplus/bus.hpp>
11
Gunnar Mills57d9c502018-09-14 14:42:34 -050012#include <gtest/gtest.h>
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060013
14namespace phosphor
15{
16
17namespace network
18{
Andrew Jeffery4aa13782018-03-07 14:04:50 +103019sdbusplus::bus::bus bus(sdbusplus::bus::new_default());
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060020std::unique_ptr<Manager> manager = nullptr;
21std::unique_ptr<Timer> refreshObjectTimer = nullptr;
22std::unique_ptr<Timer> restartTimer = nullptr;
23EventPtr eventPtr = nullptr;
24
25/** @brief refresh the network objects. */
26void refreshObjects()
27{
28
29 if (manager)
30 {
31 manager->createChildObjects();
32 }
33}
34
35void initializeTimers()
36{
Gunnar Mills57d9c502018-09-14 14:42:34 -050037 std::function<void()> refreshFunc(std::bind(&refreshObjects));
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060038
Gunnar Mills57d9c502018-09-14 14:42:34 -050039 refreshObjectTimer = std::make_unique<Timer>(refreshFunc);
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060040}
41
42class TestRtNetlink : public testing::Test
43{
44
Gunnar Mills57d9c502018-09-14 14:42:34 -050045 public:
46 std::string confDir;
47 phosphor::Descriptor smartSock;
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060048
Gunnar Mills57d9c502018-09-14 14:42:34 -050049 TestRtNetlink()
50 {
51 manager =
52 std::make_unique<Manager>(bus, "/xyz/openbmc_test/bcd", "/tmp");
53 sd_event* events;
54 sd_event_default(&events);
55 eventPtr.reset(events);
56 events = nullptr;
57 setConfDir();
58 initializeTimers();
59 createNetLinkSocket();
60 bus.attach_event(eventPtr.get(), SD_EVENT_PRIORITY_NORMAL);
61 rtnetlink::Server svr(eventPtr, smartSock);
62 }
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060063
Gunnar Mills57d9c502018-09-14 14:42:34 -050064 ~TestRtNetlink()
65 {
66 if (confDir.empty())
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060067 {
Gunnar Mills57d9c502018-09-14 14:42:34 -050068 fs::remove_all(confDir);
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060069 }
Gunnar Mills57d9c502018-09-14 14:42:34 -050070 }
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060071
Gunnar Mills57d9c502018-09-14 14:42:34 -050072 void setConfDir()
73 {
74 char tmp[] = "/tmp/NetworkManager.XXXXXX";
75 confDir = mkdtemp(tmp);
76 manager->setConfDir(confDir);
77 }
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060078
Gunnar Mills57d9c502018-09-14 14:42:34 -050079 bool isInterfaceAdded(std::string intf)
80 {
81 return manager->interfaces.find(intf) != manager->interfaces.end()
82 ? true
83 : false;
84 }
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060085
Gunnar Mills57d9c502018-09-14 14:42:34 -050086 void createNetLinkSocket()
87 {
88 // RtnetLink socket
89 auto fd = socket(PF_NETLINK, SOCK_RAW | SOCK_NONBLOCK, NETLINK_ROUTE);
90 smartSock.set(fd);
91 }
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060092};
93
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060094TEST_F(TestRtNetlink, WithSingleInterface)
95{
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060096 using namespace std::chrono;
Andrew Jeffery96281222018-03-06 21:48:11 +103097 // Adds the following ip in the getifaddrs list.
Gunnar Mills57d9c502018-09-14 14:42:34 -050098 mock_addIP("igb5", "127.0.0.1", "255.255.255.128", IFF_UP | IFF_RUNNING);
Andrew Jeffery96281222018-03-06 21:48:11 +103099 constexpr auto BUFSIZE = 4096;
100 std::array<char, BUFSIZE> msgBuf = {0};
101
102 // point the header and the msg structure pointers into the buffer.
103 auto nlMsg = reinterpret_cast<nlmsghdr*>(msgBuf.data());
104 // Length of message
105 nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(rtmsg));
106 nlMsg->nlmsg_type = RTM_GETADDR;
107 nlMsg->nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST;
108 nlMsg->nlmsg_seq = 0;
109 nlMsg->nlmsg_pid = getpid();
110
111 EXPECT_EQ(false, isInterfaceAdded("igb5"));
112 // Send the request
113 send(smartSock(), nlMsg, nlMsg->nlmsg_len, 0);
114
Andrew Jefferyc5ae81e2018-03-07 15:06:14 +1030115 int i = 3;
Andrew Jeffery96281222018-03-06 21:48:11 +1030116 while (i--)
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600117 {
Gunnar Mills57d9c502018-09-14 14:42:34 -0500118 // wait for timer to expire
119 std::this_thread::sleep_for(std::chrono::milliseconds(refreshTimeout));
Andrew Jeffery96281222018-03-06 21:48:11 +1030120 sd_event_run(eventPtr.get(), 10);
121 };
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600122
Andrew Jeffery96281222018-03-06 21:48:11 +1030123 EXPECT_EQ(true, isInterfaceAdded("igb5"));
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600124}
125
Gunnar Mills57d9c502018-09-14 14:42:34 -0500126} // namespace network
127} // namespace phosphor