1 #include "utils/ip_utils.hpp"
2 
3 #include <boost/asio/ip/address.hpp>
4 
5 #include <cstdint>
6 
7 #include <gtest/gtest.h> // IWYU pragma: keep
8 
9 // IWYU pragma: no_include <gtest/gtest-message.h>
10 // IWYU pragma: no_include <gtest/gtest-test-part.h>
11 // IWYU pragma: no_include "gtest/gtest_pred_impl.h"
12 
13 namespace redfish::ip_util
14 {
15 namespace
16 {
17 
18 using ::boost::asio::ip::make_address;
19 
TEST(IpToString,ReturnsCorrectIpStringForIpv4Addresses)20 TEST(IpToString, ReturnsCorrectIpStringForIpv4Addresses)
21 {
22     EXPECT_EQ(toString(make_address("127.0.0.1")), "127.0.0.1");
23     EXPECT_EQ(toString(make_address("192.168.1.1")), "192.168.1.1");
24     EXPECT_EQ(toString(make_address("::1")), "::1");
25 }
26 
TEST(IpToString,ReturnsCorrectIpStringForIpv6Addresses)27 TEST(IpToString, ReturnsCorrectIpStringForIpv6Addresses)
28 {
29     EXPECT_EQ(toString(make_address("fd03:f9ab:25de:89ec::0001")),
30               "fd03:f9ab:25de:89ec::1");
31     EXPECT_EQ(toString(make_address("fd03:f9ab:25de:89ec::1234:abcd")),
32               "fd03:f9ab:25de:89ec::1234:abcd");
33     EXPECT_EQ(toString(make_address("fd03:f9ab:25de:89ec:1234:5678:90ab:cdef")),
34               "fd03:f9ab:25de:89ec:1234:5678:90ab:cdef");
35 }
36 
TEST(IpToString,ReturnsCorrectIpStringForIpv4MappedIpv6Addresses)37 TEST(IpToString, ReturnsCorrectIpStringForIpv4MappedIpv6Addresses)
38 {
39     EXPECT_EQ(toString(make_address("::ffff:127.0.0.1")), "127.0.0.1");
40 }
41 
TEST(ipv4VerifyIpAndGetBitcount,PositiveTests)42 TEST(ipv4VerifyIpAndGetBitcount, PositiveTests)
43 {
44     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("192.168.1.1", nullptr));
45 
46     uint8_t bits = 0;
47     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("128.0.0.0", &bits));
48     EXPECT_EQ(bits, 1);
49     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("192.0.0.0", &bits));
50     EXPECT_EQ(bits, 2);
51     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("224.0.0.0", &bits));
52     EXPECT_EQ(bits, 3);
53     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("240.0.0.0", &bits));
54     EXPECT_EQ(bits, 4);
55     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("248.0.0.0", &bits));
56     EXPECT_EQ(bits, 5);
57     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("252.0.0.0", &bits));
58     EXPECT_EQ(bits, 6);
59     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("254.0.0.0", &bits));
60     EXPECT_EQ(bits, 7);
61     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.0.0.0", &bits));
62     EXPECT_EQ(bits, 8);
63     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.128.0.0", &bits));
64     EXPECT_EQ(bits, 9);
65     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.192.0.0", &bits));
66     EXPECT_EQ(bits, 10);
67     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.224.0.0", &bits));
68     EXPECT_EQ(bits, 11);
69     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.240.0.0", &bits));
70     EXPECT_EQ(bits, 12);
71     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.248.0.0", &bits));
72     EXPECT_EQ(bits, 13);
73     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.252.0.0", &bits));
74     EXPECT_EQ(bits, 14);
75     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.254.0.0", &bits));
76     EXPECT_EQ(bits, 15);
77     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.0.0", &bits));
78     EXPECT_EQ(bits, 16);
79     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.128.0", &bits));
80     EXPECT_EQ(bits, 17);
81     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.192.0", &bits));
82     EXPECT_EQ(bits, 18);
83     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.224.0", &bits));
84     EXPECT_EQ(bits, 19);
85     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.240.0", &bits));
86     EXPECT_EQ(bits, 20);
87     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.248.0", &bits));
88     EXPECT_EQ(bits, 21);
89     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.252.0", &bits));
90     EXPECT_EQ(bits, 22);
91     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.254.0", &bits));
92     EXPECT_EQ(bits, 23);
93     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.0", &bits));
94     EXPECT_EQ(bits, 24);
95     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.128", &bits));
96     EXPECT_EQ(bits, 25);
97     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.192", &bits));
98     EXPECT_EQ(bits, 26);
99     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.224", &bits));
100     EXPECT_EQ(bits, 27);
101     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.240", &bits));
102     EXPECT_EQ(bits, 28);
103     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.248", &bits));
104     EXPECT_EQ(bits, 29);
105     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.252", &bits));
106     EXPECT_EQ(bits, 30);
107 }
108 
TEST(ipv4VerifyIpAndGetBitcount,NegativeTests)109 TEST(ipv4VerifyIpAndGetBitcount, NegativeTests)
110 {
111     uint8_t bits = 0;
112     // > 256 in any field
113     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("256.0.0.0", &bits));
114     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("1.256.0.0", &bits));
115     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("1.1.256.0", &bits));
116     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("1.1.1.256", &bits));
117 
118     // Non contiguous mask
119     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("255.0.255.0", &bits));
120 
121     // Too many fields
122     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("1.1.1.1.1", &bits));
123     // Not enough fields
124     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("1.1.1", &bits));
125 
126     // Empty string
127     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("", &bits));
128 }
129 } // namespace
130 } // namespace redfish::ip_util
131