1 #include "config_parser.hpp"
2 #include "mock_ethernet_interface.hpp"
3 #include "static_gateway.hpp"
4 #include "test_network_manager.hpp"
5
6 #include <net/if_arp.h>
7
8 #include <sdbusplus/bus.hpp>
9 #include <stdplus/gtest/tmp.hpp>
10 #include <xyz/openbmc_project/Common/error.hpp>
11
12 #include <string_view>
13
14 #include <gtest/gtest.h>
15
16 namespace phosphor
17 {
18 namespace network
19 {
20
21 using sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
22 using std::literals::string_view_literals::operator""sv;
23 using testing::Return;
24
25 class TestStaticGateway : public stdplus::gtest::TestWithTmp
26 {
27 public:
28 stdplus::Pinned<sdbusplus::bus_t> bus;
29 std::filesystem::path confDir;
30 TestManager manager;
31 stdplus::Pinned<MockEthernetInterface> interface;
32
TestStaticGateway()33 TestStaticGateway() :
34 bus(sdbusplus::bus::new_default()), confDir(CaseTmpDir()),
35 manager(bus, "/xyz/openbmc_test/network", confDir),
36 interface(bus, manager, makeInterfaceInfo(),
37 "/xyz/openbmc_test/network"sv, config::Parser())
38 {}
39
makeInterfaceInfo()40 static AllIntfInfo makeInterfaceInfo()
41 {
42 return AllIntfInfo{InterfaceInfo{
43 .type = ARPHRD_ETHER, .idx = 1, .flags = 0, .name = "test0"}};
44 }
45
createStaticGateway(std::string gateway,IP::Protocol protocolType)46 std::unique_ptr<StaticGateway> createStaticGateway(
47 std::string gateway, IP::Protocol protocolType)
48 {
49 return std::make_unique<StaticGateway>(
50 bus, "/xyz/openbmc_test/network/test0"sv, interface, gateway,
51 protocolType);
52 }
53 };
54
TEST_F(TestStaticGateway,ConstructorIPv4)55 TEST_F(TestStaticGateway, ConstructorIPv4)
56 {
57 auto gw = createStaticGateway("192.168.1.1", IP::Protocol::IPv4);
58
59 EXPECT_EQ("192.168.1.1", gw->gateway());
60 EXPECT_EQ(IP::Protocol::IPv4, gw->protocolType());
61 }
62
TEST_F(TestStaticGateway,ConstructorIPv6)63 TEST_F(TestStaticGateway, ConstructorIPv6)
64 {
65 auto gw = createStaticGateway("2001:db8::1", IP::Protocol::IPv6);
66
67 EXPECT_EQ("2001:db8::1", gw->gateway());
68 EXPECT_EQ(IP::Protocol::IPv6, gw->protocolType());
69 }
70
TEST_F(TestStaticGateway,ConstructorIPv6LinkLocal)71 TEST_F(TestStaticGateway, ConstructorIPv6LinkLocal)
72 {
73 auto gw = createStaticGateway("fe80::1", IP::Protocol::IPv6);
74
75 EXPECT_EQ("fe80::1", gw->gateway());
76 EXPECT_EQ(IP::Protocol::IPv6, gw->protocolType());
77 }
78
TEST_F(TestStaticGateway,SetGatewayNotAllowed)79 TEST_F(TestStaticGateway, SetGatewayNotAllowed)
80 {
81 auto gw = createStaticGateway("192.168.1.1", IP::Protocol::IPv4);
82
83 EXPECT_THROW(gw->gateway("192.168.1.254"), NotAllowed);
84 EXPECT_EQ("192.168.1.1", gw->gateway());
85 }
86
TEST_F(TestStaticGateway,SetProtocolTypeNotAllowed)87 TEST_F(TestStaticGateway, SetProtocolTypeNotAllowed)
88 {
89 auto gw = createStaticGateway("192.168.1.1", IP::Protocol::IPv4);
90
91 EXPECT_THROW(gw->protocolType(IP::Protocol::IPv6), NotAllowed);
92 EXPECT_EQ(IP::Protocol::IPv4, gw->protocolType());
93 }
94
TEST_F(TestStaticGateway,GetGatewayIPv4)95 TEST_F(TestStaticGateway, GetGatewayIPv4)
96 {
97 auto gw = createStaticGateway("10.0.0.1", IP::Protocol::IPv4);
98 EXPECT_EQ("10.0.0.1", gw->gateway());
99 }
100
TEST_F(TestStaticGateway,GetGatewayIPv6)101 TEST_F(TestStaticGateway, GetGatewayIPv6)
102 {
103 auto gw = createStaticGateway("fd00::1", IP::Protocol::IPv6);
104 EXPECT_EQ("fd00::1", gw->gateway());
105 }
106
TEST_F(TestStaticGateway,GetProtocolTypeIPv4)107 TEST_F(TestStaticGateway, GetProtocolTypeIPv4)
108 {
109 auto gw = createStaticGateway("192.168.1.1", IP::Protocol::IPv4);
110 EXPECT_EQ(IP::Protocol::IPv4, gw->protocolType());
111 }
112
TEST_F(TestStaticGateway,GetProtocolTypeIPv6)113 TEST_F(TestStaticGateway, GetProtocolTypeIPv6)
114 {
115 auto gw = createStaticGateway("2001:db8::1", IP::Protocol::IPv6);
116 EXPECT_EQ(IP::Protocol::IPv6, gw->protocolType());
117 }
118
TEST_F(TestStaticGateway,DeleteGateway)119 TEST_F(TestStaticGateway, DeleteGateway)
120 {
121 auto gw = createStaticGateway("192.168.1.1", IP::Protocol::IPv4);
122 EXPECT_NO_THROW(gw->delete_());
123 }
124
TEST_F(TestStaticGateway,DeleteIPv6Gateway)125 TEST_F(TestStaticGateway, DeleteIPv6Gateway)
126 {
127 auto gw = createStaticGateway("2001:db8::1", IP::Protocol::IPv6);
128 EXPECT_NO_THROW(gw->delete_());
129 }
130
TEST_F(TestStaticGateway,IPv4DefaultRoute)131 TEST_F(TestStaticGateway, IPv4DefaultRoute)
132 {
133 auto gateway = createStaticGateway("0.0.0.0", IP::Protocol::IPv4);
134 EXPECT_EQ("0.0.0.0", gateway->gateway());
135 }
136
TEST_F(TestStaticGateway,IPv6DefaultRoute)137 TEST_F(TestStaticGateway, IPv6DefaultRoute)
138 {
139 auto gateway = createStaticGateway("::", IP::Protocol::IPv6);
140 EXPECT_EQ("::", gateway->gateway());
141 }
142
TEST_F(TestStaticGateway,IPv4PrivateNetwork)143 TEST_F(TestStaticGateway, IPv4PrivateNetwork)
144 {
145 auto gateway = createStaticGateway("10.0.0.1", IP::Protocol::IPv4);
146 EXPECT_EQ("10.0.0.1", gateway->gateway());
147 EXPECT_EQ(IP::Protocol::IPv4, gateway->protocolType());
148 }
149
TEST_F(TestStaticGateway,IPv6UniqueLocal)150 TEST_F(TestStaticGateway, IPv6UniqueLocal)
151 {
152 auto gateway = createStaticGateway("fd00::1", IP::Protocol::IPv6);
153 EXPECT_EQ("fd00::1", gateway->gateway());
154 EXPECT_EQ(IP::Protocol::IPv6, gateway->protocolType());
155 }
156
TEST_F(TestStaticGateway,IPv4DifferentOctets)157 TEST_F(TestStaticGateway, IPv4DifferentOctets)
158 {
159 std::vector<std::string> gateways = {"192.168.1.1", "10.0.0.1",
160 "172.16.0.1", "1.2.3.4"};
161
162 for (const auto& gw : gateways)
163 {
164 auto gateway = createStaticGateway(gw, IP::Protocol::IPv4);
165 EXPECT_EQ(gw, gateway->gateway());
166 }
167 }
168
TEST_F(TestStaticGateway,IPv6DifferentFormats)169 TEST_F(TestStaticGateway, IPv6DifferentFormats)
170 {
171 std::vector<std::string> gateways = {
172 "2001:db8::1", "fe80::1", "::1",
173 "2001:0db8:0000:0000:0000:0000:0000:0001"};
174
175 for (const auto& gw : gateways)
176 {
177 auto gateway = createStaticGateway(gw, IP::Protocol::IPv6);
178 EXPECT_EQ(gw, gateway->gateway());
179 }
180 }
181
TEST_F(TestStaticGateway,MultipleIPv4Gateways)182 TEST_F(TestStaticGateway, MultipleIPv4Gateways)
183 {
184 auto gw1 = createStaticGateway("192.168.1.1", IP::Protocol::IPv4);
185 auto gw2 = createStaticGateway("192.168.1.254", IP::Protocol::IPv4);
186 auto gw3 = createStaticGateway("10.0.0.1", IP::Protocol::IPv4);
187
188 EXPECT_EQ("192.168.1.1", gw1->gateway());
189 EXPECT_EQ("192.168.1.254", gw2->gateway());
190 EXPECT_EQ("10.0.0.1", gw3->gateway());
191 }
192
TEST_F(TestStaticGateway,MultipleIPv6Gateways)193 TEST_F(TestStaticGateway, MultipleIPv6Gateways)
194 {
195 auto gw1 = createStaticGateway("2001:db8::1", IP::Protocol::IPv6);
196 auto gw2 = createStaticGateway("fe80::1", IP::Protocol::IPv6);
197 auto gw3 = createStaticGateway("fd00::1", IP::Protocol::IPv6);
198
199 EXPECT_EQ("2001:db8::1", gw1->gateway());
200 EXPECT_EQ("fe80::1", gw2->gateway());
201 EXPECT_EQ("fd00::1", gw3->gateway());
202 }
203
TEST_F(TestStaticGateway,MixedProtocolGateways)204 TEST_F(TestStaticGateway, MixedProtocolGateways)
205 {
206 auto gw4 = createStaticGateway("192.168.1.1", IP::Protocol::IPv4);
207 auto gw6 = createStaticGateway("2001:db8::1", IP::Protocol::IPv6);
208
209 EXPECT_EQ("192.168.1.1", gw4->gateway());
210 EXPECT_EQ(IP::Protocol::IPv4, gw4->protocolType());
211
212 EXPECT_EQ("2001:db8::1", gw6->gateway());
213 EXPECT_EQ(IP::Protocol::IPv6, gw6->protocolType());
214 }
215
TEST_F(TestStaticGateway,DeleteMultipleGateways)216 TEST_F(TestStaticGateway, DeleteMultipleGateways)
217 {
218 auto gw1 = createStaticGateway("192.168.1.1", IP::Protocol::IPv4);
219 auto gw2 = createStaticGateway("192.168.1.254", IP::Protocol::IPv4);
220 auto gw3 = createStaticGateway("10.0.0.1", IP::Protocol::IPv4);
221
222 EXPECT_NO_THROW(gw1->delete_());
223 EXPECT_NO_THROW(gw2->delete_());
224 EXPECT_NO_THROW(gw3->delete_());
225 }
226
TEST_F(TestStaticGateway,DeleteAndReAddGateway)227 TEST_F(TestStaticGateway, DeleteAndReAddGateway)
228 {
229 std::string gwAddr = "192.168.1.1";
230
231 auto gw1 = createStaticGateway(gwAddr, IP::Protocol::IPv4);
232 EXPECT_EQ(gwAddr, gw1->gateway());
233 EXPECT_NO_THROW(gw1->delete_());
234 gw1.reset();
235
236 auto gw2 = createStaticGateway(gwAddr, IP::Protocol::IPv4);
237 EXPECT_EQ(gwAddr, gw2->gateway());
238 }
239
TEST_F(TestStaticGateway,SameAddressDifferentProtocol)240 TEST_F(TestStaticGateway, SameAddressDifferentProtocol)
241 {
242 std::string gw4 = "1.2.3.4";
243 std::string gw6 = "2001:db8::1";
244
245 auto gateway4 = createStaticGateway(gw4, IP::Protocol::IPv4);
246 auto gateway6 = createStaticGateway(gw6, IP::Protocol::IPv6);
247
248 EXPECT_EQ(IP::Protocol::IPv4, gateway4->protocolType());
249 EXPECT_EQ(IP::Protocol::IPv6, gateway6->protocolType());
250 }
251
TEST_F(TestStaticGateway,ProtocolTypeConsistency)252 TEST_F(TestStaticGateway, ProtocolTypeConsistency)
253 {
254 auto gateway = createStaticGateway("192.168.1.1", IP::Protocol::IPv4);
255
256 EXPECT_EQ(IP::Protocol::IPv4, gateway->protocolType());
257 EXPECT_EQ(IP::Protocol::IPv4, gateway->protocolType());
258 }
259
TEST_F(TestStaticGateway,MultipleDeletesOnSameInterface)260 TEST_F(TestStaticGateway, MultipleDeletesOnSameInterface)
261 {
262 auto gw1 = createStaticGateway("192.168.1.1", IP::Protocol::IPv4);
263 auto gw2 = createStaticGateway("192.168.1.254", IP::Protocol::IPv4);
264 auto gw3 = createStaticGateway("10.0.0.1", IP::Protocol::IPv4);
265
266 EXPECT_NO_THROW(gw2->delete_());
267 EXPECT_NO_THROW(gw1->delete_());
268 EXPECT_NO_THROW(gw3->delete_());
269 }
270
271 } // namespace network
272 } // namespace phosphor
273