blob: 5042cc61df659065d0cf5dabdb38ca9838a899b0 [file] [log] [blame]
William A. Kennington IIIfd862be2022-10-09 18:40:55 -07001#include "system_queries.hpp"
2
3#include <linux/rtnetlink.h>
4#include <net/if.h>
5
6#include <stdplus/raw.hpp>
7
8#include <gtest/gtest.h>
9
10using std::literals::string_view_literals::operator""sv;
11
12namespace phosphor::network::system
13{
14namespace detail
15{
16
17TEST(ParseInterface, NotLinkType)
18{
19 nlmsghdr hdr{};
20 hdr.nlmsg_type = RTM_NEWADDR;
21
22 EXPECT_THROW(parseInterface(hdr, ""), std::runtime_error);
23}
24
25TEST(ParseInterface, SmallMsg)
26{
27 nlmsghdr hdr{};
28 hdr.nlmsg_type = RTM_NEWLINK;
29 auto data = "1"sv;
30
31 EXPECT_THROW(parseInterface(hdr, data), std::runtime_error);
32}
33
34TEST(ParseInterface, NoAttrs)
35{
36 nlmsghdr hdr{};
37 hdr.nlmsg_type = RTM_NEWLINK;
38 struct
39 {
40 ifinfomsg hdr __attribute__((aligned(NLMSG_ALIGNTO)));
41 } msg;
42 msg.hdr.ifi_index = 1;
43 msg.hdr.ifi_flags = 2;
44 auto data = stdplus::raw::asView<char>(msg);
45
46 auto info = parseInterface(hdr, data);
47 auto expected = InterfaceInfo{.idx = 1, .flags = 2};
48 EXPECT_EQ(info, expected);
49}
50
51TEST(ParseInterface, AllAttrs)
52{
53 nlmsghdr hdr{};
54 hdr.nlmsg_type = RTM_NEWLINK;
55 struct
56 {
57 ifinfomsg hdr __attribute__((aligned(NLMSG_ALIGNTO)));
58 rtattr addr_hdr __attribute__((aligned((RTA_ALIGNTO))));
59 char addr[6]
60 __attribute__((aligned((RTA_ALIGNTO)))) = {0, 1, 2, 3, 4, 5};
61 rtattr name_hdr __attribute__((aligned((RTA_ALIGNTO))));
62 char name[5] __attribute__((aligned((RTA_ALIGNTO)))) = "eth0";
63 rtattr mtu_hdr __attribute__((aligned((RTA_ALIGNTO))));
64 unsigned mtu __attribute__((aligned((RTA_ALIGNTO)))) = 50;
65 } msg;
66 msg.hdr.ifi_index = 1;
67 msg.hdr.ifi_flags = 2;
68 msg.addr_hdr.rta_type = IFLA_ADDRESS;
69 msg.addr_hdr.rta_len = RTA_LENGTH(sizeof(msg.addr));
70 msg.name_hdr.rta_type = IFLA_IFNAME;
71 msg.name_hdr.rta_len = RTA_LENGTH(sizeof(msg.name));
72 msg.mtu_hdr.rta_type = IFLA_MTU;
73 msg.mtu_hdr.rta_len = RTA_LENGTH(sizeof(msg.mtu));
74 auto data = stdplus::raw::asView<char>(msg);
75
76 auto info = parseInterface(hdr, data);
77 auto expected = InterfaceInfo{.idx = 1,
78 .flags = 2,
79 .name = "eth0",
80 .mac = ether_addr{0, 1, 2, 3, 4, 5},
81 .mtu = 50};
82 EXPECT_EQ(info, expected);
83}
84
William A. Kennington III6a923632022-11-06 18:17:33 -080085TEST(ValidateNewAddr, Filtering)
86{
87 AddressInfo info = {};
88 EXPECT_TRUE(validateNewAddr(info, {}));
89
90 info.ifidx = 2;
91 EXPECT_TRUE(validateNewAddr(info, {}));
92 EXPECT_TRUE(validateNewAddr(info, {.ifidx = 2}));
93 EXPECT_FALSE(validateNewAddr(info, {.ifidx = 3}));
94}
95
William A. Kennington IIIa8426902022-11-07 15:37:41 -080096TEST(ValidateNewNeigh, Filtering)
97{
98 NeighborInfo info = {};
99 EXPECT_TRUE(validateNewNeigh(info, {}));
100
101 info.ifidx = 2;
102 EXPECT_TRUE(validateNewNeigh(info, {}));
103 EXPECT_TRUE(validateNewNeigh(info, {.ifidx = 2}));
104 EXPECT_FALSE(validateNewNeigh(info, {.ifidx = 3}));
105}
106
William A. Kennington IIIfd862be2022-10-09 18:40:55 -0700107} // namespace detail
108} // namespace phosphor::network::system