1 #include <gtest/gtest.h>
2 #include <netinet/in.h>
3 #include "util.hpp"
4 
5 namespace phosphor
6 {
7 namespace network
8 {
9 
10 class TestUtil : public testing::Test
11 {
12     public:
13         TestUtil()
14         {
15             // Empty
16         }
17 
18 };
19 
20 TEST_F(TestUtil, IpValidation)
21 {
22     std::string ipaddress = "0.0.0.0";
23     EXPECT_EQ(true, isValidIP(AF_INET, ipaddress));
24 
25     ipaddress = "9.3.185.83";
26     EXPECT_EQ(true, isValidIP(AF_INET, ipaddress));
27 
28     ipaddress = "9.3.185.a";
29     EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
30 
31     ipaddress = "9.3.a.83";
32     EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
33 
34     ipaddress = "x.x.x.x";
35     EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
36 
37     ipaddress = "0:0:0:0:0:0:0:0";
38     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
39 
40     ipaddress = "1:0:0:0:0:0:0:8";
41     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
42 
43     ipaddress = "1::8";
44     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
45 
46     ipaddress = "0:0:0:0:0:FFFF:204.152.189.116";
47     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
48 
49     ipaddress = "::ffff:204.152.189.116";
50     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
51 
52     ipaddress = "a:0:0:0:0:FFFF:204.152.189.116";
53     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
54 
55     ipaddress = "1::8";
56     EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
57 
58 
59 }
60 
61 TEST_F(TestUtil, PrefixValidation)
62 {
63     uint8_t prefixLength = 1;
64     EXPECT_EQ(true, isValidPrefix(AF_INET, prefixLength));
65 
66     prefixLength = 32;
67     EXPECT_EQ(true, isValidPrefix(AF_INET, prefixLength));
68 
69     prefixLength = 0;
70     EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
71 
72     prefixLength = 33;
73     EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
74 
75     prefixLength = 33;
76     EXPECT_EQ(true, isValidPrefix(AF_INET6, prefixLength));
77 
78     prefixLength = 65;
79     EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
80 
81 }
82 
83 
84 TEST_F(TestUtil, MacValidation)
85 {
86     std::string macaddress = "00:00:00:00:00:00";
87     EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
88 
89     macaddress = "F6:C6:E6:6:B0:D3";
90     EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
91 
92     macaddress = "F6:C6:E6:06:B0:D3";
93     EXPECT_EQ(true, phosphor::network::mac_address::validate(macaddress));
94 
95     macaddress = "hh:HH:HH:hh:HH:yy";
96     EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
97 
98     macaddress = "hhh:GGG:iii:jjj:kkk:lll";
99     EXPECT_EQ(false, phosphor::network::mac_address::validate(macaddress));
100 
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     address = getNetworkID(AF_INET,"a.b.c.d",25);
192     EXPECT_EQ("",address);
193 
194     address = getNetworkID(AF_INET6,"2001:db8:gghh:dd12::0",64);
195     EXPECT_EQ("",address);
196 
197     address = getNetworkID(AF_INET6,"fe80::201:6cff:fe80:228",64);
198     EXPECT_EQ("fe80::",address);
199 }
200 
201 }// namespce network
202 }// namespace phosphor
203