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