xref: /openbmc/phosphor-networkd/test/test_static_gateway.cpp (revision c639f3dafe32313af78d4dc1d510f7eb679180a4)
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