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