1c33a039bSNan Zhou #include "utils/ip_utils.hpp"
2c33a039bSNan Zhou 
3*f0b59af4SEd Tanous #include <boost/asio/ip/address.hpp>
4*f0b59af4SEd Tanous 
5*f0b59af4SEd Tanous #include <cstdint>
6*f0b59af4SEd Tanous 
7c33a039bSNan Zhou #include <gtest/gtest.h> // IWYU pragma: keep
8c33a039bSNan Zhou 
9c33a039bSNan Zhou // IWYU pragma: no_include <gtest/gtest-message.h>
10c33a039bSNan Zhou // IWYU pragma: no_include <gtest/gtest-test-part.h>
11c33a039bSNan Zhou // IWYU pragma: no_include "gtest/gtest_pred_impl.h"
12c33a039bSNan Zhou 
13c33a039bSNan Zhou namespace redfish::ip_util
14c33a039bSNan Zhou {
15c33a039bSNan Zhou namespace
16c33a039bSNan Zhou {
17c33a039bSNan Zhou 
18c33a039bSNan Zhou using ::boost::asio::ip::make_address;
19c33a039bSNan Zhou 
TEST(IpToString,ReturnsCorrectIpStringForIpv4Addresses)20c33a039bSNan Zhou TEST(IpToString, ReturnsCorrectIpStringForIpv4Addresses)
21c33a039bSNan Zhou {
22c33a039bSNan Zhou     EXPECT_EQ(toString(make_address("127.0.0.1")), "127.0.0.1");
23c33a039bSNan Zhou     EXPECT_EQ(toString(make_address("192.168.1.1")), "192.168.1.1");
24c33a039bSNan Zhou     EXPECT_EQ(toString(make_address("::1")), "::1");
25c33a039bSNan Zhou }
26c33a039bSNan Zhou 
TEST(IpToString,ReturnsCorrectIpStringForIpv6Addresses)27c33a039bSNan Zhou TEST(IpToString, ReturnsCorrectIpStringForIpv6Addresses)
28c33a039bSNan Zhou {
29c33a039bSNan Zhou     EXPECT_EQ(toString(make_address("fd03:f9ab:25de:89ec::0001")),
30c33a039bSNan Zhou               "fd03:f9ab:25de:89ec::1");
31c33a039bSNan Zhou     EXPECT_EQ(toString(make_address("fd03:f9ab:25de:89ec::1234:abcd")),
32c33a039bSNan Zhou               "fd03:f9ab:25de:89ec::1234:abcd");
33c33a039bSNan Zhou     EXPECT_EQ(toString(make_address("fd03:f9ab:25de:89ec:1234:5678:90ab:cdef")),
34c33a039bSNan Zhou               "fd03:f9ab:25de:89ec:1234:5678:90ab:cdef");
35c33a039bSNan Zhou }
36c33a039bSNan Zhou 
TEST(IpToString,ReturnsCorrectIpStringForIpv4MappedIpv6Addresses)37c33a039bSNan Zhou TEST(IpToString, ReturnsCorrectIpStringForIpv4MappedIpv6Addresses)
38c33a039bSNan Zhou {
39c33a039bSNan Zhou     EXPECT_EQ(toString(make_address("::ffff:127.0.0.1")), "127.0.0.1");
40c33a039bSNan Zhou }
418ac6e503SEd Tanous 
TEST(ipv4VerifyIpAndGetBitcount,PositiveTests)428ac6e503SEd Tanous TEST(ipv4VerifyIpAndGetBitcount, PositiveTests)
438ac6e503SEd Tanous {
448ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("192.168.1.1", nullptr));
458ac6e503SEd Tanous 
468ac6e503SEd Tanous     uint8_t bits = 0;
478ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("128.0.0.0", &bits));
488ac6e503SEd Tanous     EXPECT_EQ(bits, 1);
498ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("192.0.0.0", &bits));
508ac6e503SEd Tanous     EXPECT_EQ(bits, 2);
518ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("224.0.0.0", &bits));
528ac6e503SEd Tanous     EXPECT_EQ(bits, 3);
538ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("240.0.0.0", &bits));
548ac6e503SEd Tanous     EXPECT_EQ(bits, 4);
558ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("248.0.0.0", &bits));
568ac6e503SEd Tanous     EXPECT_EQ(bits, 5);
578ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("252.0.0.0", &bits));
588ac6e503SEd Tanous     EXPECT_EQ(bits, 6);
598ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("254.0.0.0", &bits));
608ac6e503SEd Tanous     EXPECT_EQ(bits, 7);
618ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.0.0.0", &bits));
628ac6e503SEd Tanous     EXPECT_EQ(bits, 8);
638ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.128.0.0", &bits));
648ac6e503SEd Tanous     EXPECT_EQ(bits, 9);
658ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.192.0.0", &bits));
668ac6e503SEd Tanous     EXPECT_EQ(bits, 10);
678ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.224.0.0", &bits));
688ac6e503SEd Tanous     EXPECT_EQ(bits, 11);
698ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.240.0.0", &bits));
708ac6e503SEd Tanous     EXPECT_EQ(bits, 12);
718ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.248.0.0", &bits));
728ac6e503SEd Tanous     EXPECT_EQ(bits, 13);
738ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.252.0.0", &bits));
748ac6e503SEd Tanous     EXPECT_EQ(bits, 14);
758ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.254.0.0", &bits));
768ac6e503SEd Tanous     EXPECT_EQ(bits, 15);
778ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.0.0", &bits));
788ac6e503SEd Tanous     EXPECT_EQ(bits, 16);
798ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.128.0", &bits));
808ac6e503SEd Tanous     EXPECT_EQ(bits, 17);
818ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.192.0", &bits));
828ac6e503SEd Tanous     EXPECT_EQ(bits, 18);
838ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.224.0", &bits));
848ac6e503SEd Tanous     EXPECT_EQ(bits, 19);
858ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.240.0", &bits));
868ac6e503SEd Tanous     EXPECT_EQ(bits, 20);
878ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.248.0", &bits));
888ac6e503SEd Tanous     EXPECT_EQ(bits, 21);
898ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.252.0", &bits));
908ac6e503SEd Tanous     EXPECT_EQ(bits, 22);
918ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.254.0", &bits));
928ac6e503SEd Tanous     EXPECT_EQ(bits, 23);
938ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.0", &bits));
948ac6e503SEd Tanous     EXPECT_EQ(bits, 24);
958ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.128", &bits));
968ac6e503SEd Tanous     EXPECT_EQ(bits, 25);
978ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.192", &bits));
988ac6e503SEd Tanous     EXPECT_EQ(bits, 26);
998ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.224", &bits));
1008ac6e503SEd Tanous     EXPECT_EQ(bits, 27);
1018ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.240", &bits));
1028ac6e503SEd Tanous     EXPECT_EQ(bits, 28);
1038ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.248", &bits));
1048ac6e503SEd Tanous     EXPECT_EQ(bits, 29);
1058ac6e503SEd Tanous     EXPECT_TRUE(ipv4VerifyIpAndGetBitcount("255.255.255.252", &bits));
1068ac6e503SEd Tanous     EXPECT_EQ(bits, 30);
1078ac6e503SEd Tanous }
1088ac6e503SEd Tanous 
TEST(ipv4VerifyIpAndGetBitcount,NegativeTests)1098ac6e503SEd Tanous TEST(ipv4VerifyIpAndGetBitcount, NegativeTests)
1108ac6e503SEd Tanous {
1118ac6e503SEd Tanous     uint8_t bits = 0;
1128ac6e503SEd Tanous     // > 256 in any field
1138ac6e503SEd Tanous     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("256.0.0.0", &bits));
1148ac6e503SEd Tanous     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("1.256.0.0", &bits));
1158ac6e503SEd Tanous     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("1.1.256.0", &bits));
1168ac6e503SEd Tanous     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("1.1.1.256", &bits));
1178ac6e503SEd Tanous 
1188ac6e503SEd Tanous     // Non contiguous mask
1198ac6e503SEd Tanous     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("255.0.255.0", &bits));
1208ac6e503SEd Tanous 
1218ac6e503SEd Tanous     // Too many fields
1228ac6e503SEd Tanous     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("1.1.1.1.1", &bits));
1238ac6e503SEd Tanous     // Not enough fields
1248ac6e503SEd Tanous     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("1.1.1", &bits));
1258ac6e503SEd Tanous 
1268ac6e503SEd Tanous     // Empty string
1278ac6e503SEd Tanous     EXPECT_FALSE(ipv4VerifyIpAndGetBitcount("", &bits));
1288ac6e503SEd Tanous }
129c33a039bSNan Zhou } // namespace
130c33a039bSNan Zhou } // namespace redfish::ip_util
131