blob: 6a8c02d1371ececacea653eadab3747cfc663a46 [file] [log] [blame]
Ratan Gupta35297172018-11-28 18:40:16 +05301#include "mock_network_manager.hpp"
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -06002#include "mock_syscall.hpp"
Gunnar Mills57d9c502018-09-14 14:42:34 -05003#include "rtnetlink_server.hpp"
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -06004#include "types.hpp"
5
Gunnar Mills57d9c502018-09-14 14:42:34 -05006#include <linux/rtnetlink.h>
7#include <net/if.h>
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -06008
William A. Kennington III3a70fa22018-09-20 18:48:20 -07009#include <chrono>
10#include <functional>
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060011#include <sdbusplus/bus.hpp>
William A. Kennington III3a70fa22018-09-20 18:48:20 -070012#include <sdeventplus/event.hpp>
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060013
Gunnar Mills57d9c502018-09-14 14:42:34 -050014#include <gtest/gtest.h>
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060015
16namespace phosphor
17{
18
19namespace network
20{
Andrew Jeffery4aa13782018-03-07 14:04:50 +103021sdbusplus::bus::bus bus(sdbusplus::bus::new_default());
Ratan Gupta35297172018-11-28 18:40:16 +053022std::unique_ptr<MockManager> manager = nullptr;
23extern std::unique_ptr<Timer> refreshObjectTimer;
24extern std::unique_ptr<Timer> restartTimer;
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060025EventPtr eventPtr = nullptr;
26
27/** @brief refresh the network objects. */
28void refreshObjects()
29{
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060030 if (manager)
31 {
32 manager->createChildObjects();
33 }
34}
35
36void initializeTimers()
37{
William A. Kennington III3a70fa22018-09-20 18:48:20 -070038 refreshObjectTimer = std::make_unique<Timer>(
39 sdeventplus::Event::get_default(), std::bind(refreshObjects));
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 =
Ratan Gupta35297172018-11-28 18:40:16 +053052 std::make_unique<MockManager>(bus, "/xyz/openbmc_test/bcd", "/tmp");
Gunnar Mills57d9c502018-09-14 14:42:34 -050053 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 void createNetLinkSocket()
80 {
81 // RtnetLink socket
82 auto fd = socket(PF_NETLINK, SOCK_RAW | SOCK_NONBLOCK, NETLINK_ROUTE);
83 smartSock.set(fd);
84 }
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060085};
86
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060087TEST_F(TestRtNetlink, WithSingleInterface)
88{
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060089 using namespace std::chrono;
William A. Kennington III862275a2019-04-22 20:37:08 -070090 mock_clear();
Andrew Jeffery96281222018-03-06 21:48:11 +103091 // Adds the following ip in the getifaddrs list.
William A. Kennington IIIebb1ad02019-04-21 18:02:49 -070092 mock_addIF("igb5", 6);
Gunnar Mills57d9c502018-09-14 14:42:34 -050093 mock_addIP("igb5", "127.0.0.1", "255.255.255.128", IFF_UP | IFF_RUNNING);
Andrew Jeffery96281222018-03-06 21:48:11 +103094 constexpr auto BUFSIZE = 4096;
95 std::array<char, BUFSIZE> msgBuf = {0};
96
97 // point the header and the msg structure pointers into the buffer.
98 auto nlMsg = reinterpret_cast<nlmsghdr*>(msgBuf.data());
99 // Length of message
100 nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(rtmsg));
101 nlMsg->nlmsg_type = RTM_GETADDR;
102 nlMsg->nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST;
103 nlMsg->nlmsg_seq = 0;
104 nlMsg->nlmsg_pid = getpid();
105
Patrick Venture04c3d712019-01-07 13:49:16 -0800106 EXPECT_EQ(false, manager->hasInterface("igb5"));
Andrew Jeffery96281222018-03-06 21:48:11 +1030107 // Send the request
108 send(smartSock(), nlMsg, nlMsg->nlmsg_len, 0);
109
Andrew Jefferyc5ae81e2018-03-07 15:06:14 +1030110 int i = 3;
Andrew Jeffery96281222018-03-06 21:48:11 +1030111 while (i--)
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600112 {
Gunnar Mills57d9c502018-09-14 14:42:34 -0500113 // wait for timer to expire
114 std::this_thread::sleep_for(std::chrono::milliseconds(refreshTimeout));
Andrew Jeffery96281222018-03-06 21:48:11 +1030115 sd_event_run(eventPtr.get(), 10);
116 };
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600117
Patrick Venture04c3d712019-01-07 13:49:16 -0800118 EXPECT_EQ(true, manager->hasInterface("igb5"));
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600119}
120
Gunnar Mills57d9c502018-09-14 14:42:34 -0500121} // namespace network
122} // namespace phosphor