1 #include "util.hpp"
2 
3 #include <netinet/in.h>
4 
5 #include <xyz/openbmc_project/Common/error.hpp>
6 
7 #include <gtest/gtest.h>
8 
9 namespace phosphor
10 {
11 namespace network
12 {
13 
14 using InternalFailure =
15     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
16 class TestUtil : public testing::Test
17 {
18   public:
19     TestUtil()
20     {
21         // Empty
22     }
23 };
24 
25 TEST_F(TestUtil, IpValidation)
26 {
27     std::string ipaddress = "0.0.0.0";
28     EXPECT_EQ(true, isValidIP(AF_INET, ipaddress));
29 
30     ipaddress = "9.3.185.83";
31     EXPECT_EQ(true, isValidIP(AF_INET, ipaddress));
32 
33     ipaddress = "9.3.185.a";
34     EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
35 
36     ipaddress = "9.3.a.83";
37     EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
38 
39     ipaddress = "x.x.x.x";
40     EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
41 
42     ipaddress = "0:0:0:0:0:0:0:0";
43     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
44 
45     ipaddress = "1:0:0:0:0:0:0:8";
46     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
47 
48     ipaddress = "1::8";
49     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
50 
51     ipaddress = "0:0:0:0:0:FFFF:204.152.189.116";
52     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
53 
54     ipaddress = "::ffff:204.152.189.116";
55     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
56 
57     ipaddress = "a:0:0:0:0:FFFF:204.152.189.116";
58     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
59 
60     ipaddress = "1::8";
61     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
62 }
63 
64 TEST_F(TestUtil, PrefixValidation)
65 {
66     uint8_t prefixLength = 1;
67     EXPECT_EQ(true, isValidPrefix(AF_INET, prefixLength));
68 
69     prefixLength = 32;
70     EXPECT_EQ(true, isValidPrefix(AF_INET, prefixLength));
71 
72     prefixLength = 0;
73     EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
74 
75     prefixLength = 33;
76     EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
77 
78     prefixLength = 33;
79     EXPECT_EQ(true, isValidPrefix(AF_INET6, prefixLength));
80 
81     prefixLength = 65;
82     EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
83 }
84 
85 TEST_F(TestUtil, MacValidation)
86 {
87     std::string macaddress = "00:00:00:00:00:00";
88     EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
89 
90     macaddress = "F6:C6:E6:6:B0:D3";
91     EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
92 
93     macaddress = "F6:C6:E6:06:B0:D3";
94     EXPECT_EQ(true, phosphor::network::mac_address::validate(macaddress));
95 
96     macaddress = "hh:HH:HH:hh:HH:yy";
97     EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
98 
99     macaddress = "hhh:GGG:iii:jjj:kkk:lll";
100     EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
101 }
102 
103 TEST_F(TestUtil, ConvertV4MasktoPrefix)
104 {
105     std::string mask = "255.255.255.0";
106     uint8_t prefix = toCidr(AF_INET, mask);
107     EXPECT_EQ(prefix, 24);
108 
109     mask = "255.255.0.0";
110     prefix = toCidr(AF_INET, mask);
111     EXPECT_EQ(prefix, 16);
112 
113     mask = "255.0.0.0";
114     prefix = toCidr(AF_INET, mask);
115     EXPECT_EQ(prefix, 8);
116 
117     mask = "255.224.0.0";
118     prefix = toCidr(AF_INET, mask);
119     EXPECT_EQ(prefix, 11);
120 
121     // Invalid Mask
122     mask = "255.0.255.0";
123     prefix = toCidr(AF_INET, mask);
124     EXPECT_EQ(prefix, 0);
125 }
126 
127 TEST_F(TestUtil, convertV6MasktoPrefix)
128 {
129     std::string mask = "ffff:ffff::";
130     uint8_t prefix = toCidr(AF_INET6, mask);
131     EXPECT_EQ(prefix, 32);
132 
133     mask = "ffff:ffff:ffff::";
134     prefix = toCidr(AF_INET6, mask);
135     EXPECT_EQ(prefix, 48);
136 
137     mask = "ffff:ffff:fc00::";
138     prefix = toCidr(AF_INET6, mask);
139     EXPECT_EQ(prefix, 38);
140 
141     // Invalid Mask
142     mask = "ffff:0fff::";
143     prefix = toCidr(AF_INET6, mask);
144     EXPECT_EQ(prefix, 0);
145 }
146 
147 TEST_F(TestUtil, isLinkLocaladdress)
148 {
149     std::string ipaddress = "fe80:fec0::";
150     EXPECT_TRUE(isLinkLocalIP(ipaddress));
151 
152     ipaddress = "2000:fe80:789::";
153     EXPECT_FALSE(isLinkLocalIP(ipaddress));
154 
155     ipaddress = "2000:fe80::";
156     EXPECT_FALSE(isLinkLocalIP(ipaddress));
157 
158     ipaddress = "169.254.3.3";
159     EXPECT_TRUE(isLinkLocalIP(ipaddress));
160 
161     ipaddress = "3.169.254.3";
162     EXPECT_FALSE(isLinkLocalIP(ipaddress));
163 
164     ipaddress = "3.3.169.254";
165     EXPECT_FALSE(isLinkLocalIP(ipaddress));
166 }
167 
168 TEST_F(TestUtil, convertPrefixToMask)
169 {
170     std::string mask = toMask(AF_INET, 24);
171     EXPECT_EQ(mask, "255.255.255.0");
172 
173     mask = toMask(AF_INET, 8);
174     EXPECT_EQ(mask, "255.0.0.0");
175 
176     mask = toMask(AF_INET, 27);
177     EXPECT_EQ(mask, "255.255.255.224");
178 }
179 
180 TEST_F(TestUtil, getNetworkAddress)
181 {
182     std::string address = getNetworkID(AF_INET, "9.3.23.251", 24);
183     EXPECT_EQ("9.3.23.0", address);
184 
185     address = getNetworkID(AF_INET, "9.3.23.251", 25);
186     EXPECT_EQ("9.3.23.128", address);
187 
188     address = getNetworkID(AF_INET6, "2001:db8:abcd:dd12::0", 64);
189     EXPECT_EQ("2001:db8:abcd:dd12::", address);
190 
191     EXPECT_THROW(getNetworkID(AF_INET, "a.b.c.d", 25), InternalFailure);
192 
193     EXPECT_THROW(getNetworkID(AF_INET6, "2001:db8:gghh:dd12::0", 64),
194                  InternalFailure);
195 
196     address = getNetworkID(AF_INET6, "fe80::201:6cff:fe80:228", 64);
197     EXPECT_EQ("fe80::", address);
198 }
199 
200 } // namespace network
201 } // namespace phosphor
202