PageRenderTime 24ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/net/base/ip_address_unittest.cc

https://gitlab.com/0072016/Facebook-SDK-
C++ | 369 lines | 276 code | 77 blank | 16 comment | 6 complexity | be51e1efd15342e89df62655b2831b0e MD5 | raw file
  1. // Copyright (c) 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/base/ip_address.h"
  5. #include <vector>
  6. #include "base/strings/string_number_conversions.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. namespace net {
  9. namespace {
  10. // Helper to stringize an IP address (used to define expectations).
  11. std::string DumpIPAddress(const IPAddress& v) {
  12. std::string out;
  13. for (size_t i = 0; i < v.bytes().size(); ++i) {
  14. if (i != 0)
  15. out.append(",");
  16. out.append(base::UintToString(v.bytes()[i]));
  17. }
  18. return out;
  19. }
  20. TEST(IPAddressTest, ConstructIPv4) {
  21. EXPECT_EQ("127.0.0.1", IPAddress::IPv4Localhost().ToString());
  22. IPAddress ipv4_ctor(192, 168, 1, 1);
  23. EXPECT_EQ("192.168.1.1", ipv4_ctor.ToString());
  24. }
  25. TEST(IPAddressTest, ConstructIPv6) {
  26. EXPECT_EQ("::1", IPAddress::IPv6Localhost().ToString());
  27. IPAddress ipv6_ctor(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
  28. EXPECT_EQ("102:304:506:708:90a:b0c:d0e:f10", ipv6_ctor.ToString());
  29. }
  30. TEST(IPAddressTest, IsIPVersion) {
  31. uint8_t addr1[4] = {192, 168, 0, 1};
  32. IPAddress ip_address1(addr1);
  33. EXPECT_TRUE(ip_address1.IsIPv4());
  34. EXPECT_FALSE(ip_address1.IsIPv6());
  35. uint8_t addr2[16] = {0xFE, 0xDC, 0xBA, 0x98};
  36. IPAddress ip_address2(addr2);
  37. EXPECT_TRUE(ip_address2.IsIPv6());
  38. EXPECT_FALSE(ip_address2.IsIPv4());
  39. IPAddress ip_address3;
  40. EXPECT_FALSE(ip_address3.IsIPv6());
  41. EXPECT_FALSE(ip_address3.IsIPv4());
  42. }
  43. TEST(IPAddressTest, IsValid) {
  44. uint8_t addr1[4] = {192, 168, 0, 1};
  45. IPAddress ip_address1(addr1);
  46. EXPECT_TRUE(ip_address1.IsValid());
  47. EXPECT_FALSE(ip_address1.empty());
  48. uint8_t addr2[16] = {0xFE, 0xDC, 0xBA, 0x98};
  49. IPAddress ip_address2(addr2);
  50. EXPECT_TRUE(ip_address2.IsValid());
  51. EXPECT_FALSE(ip_address2.empty());
  52. uint8_t addr3[5] = {0xFE, 0xDC, 0xBA, 0x98};
  53. IPAddress ip_address3(addr3);
  54. EXPECT_FALSE(ip_address3.IsValid());
  55. EXPECT_FALSE(ip_address3.empty());
  56. IPAddress ip_address4;
  57. EXPECT_FALSE(ip_address4.IsValid());
  58. EXPECT_TRUE(ip_address4.empty());
  59. }
  60. TEST(IPAddressTest, IsZero) {
  61. uint8_t address1[4] = {};
  62. IPAddress zero_ipv4_address(address1);
  63. EXPECT_TRUE(zero_ipv4_address.IsZero());
  64. uint8_t address2[4] = {10};
  65. IPAddress non_zero_ipv4_address(address2);
  66. EXPECT_FALSE(non_zero_ipv4_address.IsZero());
  67. uint8_t address3[16] = {};
  68. IPAddress zero_ipv6_address(address3);
  69. EXPECT_TRUE(zero_ipv6_address.IsZero());
  70. uint8_t address4[16] = {10};
  71. IPAddress non_zero_ipv6_address(address4);
  72. EXPECT_FALSE(non_zero_ipv6_address.IsZero());
  73. IPAddress empty_address;
  74. EXPECT_FALSE(empty_address.IsZero());
  75. }
  76. TEST(IPAddressTest, AllZeros) {
  77. EXPECT_TRUE(IPAddress::AllZeros(0).empty());
  78. EXPECT_EQ(3u, IPAddress::AllZeros(3).size());
  79. EXPECT_TRUE(IPAddress::AllZeros(3).IsZero());
  80. EXPECT_EQ("0.0.0.0", IPAddress::IPv4AllZeros().ToString());
  81. EXPECT_EQ("::", IPAddress::IPv6AllZeros().ToString());
  82. }
  83. TEST(IPAddressTest, ToString) {
  84. uint8_t addr1[4] = {0, 0, 0, 0};
  85. IPAddress ip_address1(addr1);
  86. EXPECT_EQ("0.0.0.0", ip_address1.ToString());
  87. uint8_t addr2[4] = {192, 168, 0, 1};
  88. IPAddress ip_address2(addr2);
  89. EXPECT_EQ("192.168.0.1", ip_address2.ToString());
  90. uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
  91. IPAddress ip_address3(addr3);
  92. EXPECT_EQ("fedc:ba98::", ip_address3.ToString());
  93. // ToString() shouldn't crash on invalid addresses.
  94. uint8_t addr4[2];
  95. IPAddress ip_address4(addr4);
  96. EXPECT_EQ("", ip_address4.ToString());
  97. IPAddress ip_address5;
  98. EXPECT_EQ("", ip_address5.ToString());
  99. }
  100. // Test that invalid IP literals fail to parse.
  101. TEST(IPAddressTest, AssignFromIPLiteral_FailParse) {
  102. IPAddress address;
  103. EXPECT_FALSE(address.AssignFromIPLiteral("bad value"));
  104. EXPECT_FALSE(address.AssignFromIPLiteral("bad:value"));
  105. EXPECT_FALSE(address.AssignFromIPLiteral(std::string()));
  106. EXPECT_FALSE(address.AssignFromIPLiteral("192.168.0.1:30"));
  107. EXPECT_FALSE(address.AssignFromIPLiteral(" 192.168.0.1 "));
  108. EXPECT_FALSE(address.AssignFromIPLiteral("[::1]"));
  109. }
  110. // Test parsing an IPv4 literal.
  111. TEST(IPAddressTest, AssignFromIPLiteral_IPv4) {
  112. IPAddress address;
  113. EXPECT_TRUE(address.AssignFromIPLiteral("192.168.0.1"));
  114. EXPECT_EQ("192,168,0,1", DumpIPAddress(address));
  115. EXPECT_EQ("192.168.0.1", address.ToString());
  116. }
  117. // Test parsing an IPv6 literal.
  118. TEST(IPAddressTest, AssignFromIPLiteral_IPv6) {
  119. IPAddress address;
  120. EXPECT_TRUE(address.AssignFromIPLiteral("1:abcd::3:4:ff"));
  121. EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPAddress(address));
  122. EXPECT_EQ("1:abcd::3:4:ff", address.ToString());
  123. }
  124. TEST(IPAddressTest, IsIPv4MappedIPv6) {
  125. IPAddress ipv4_address;
  126. EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("192.168.0.1"));
  127. EXPECT_FALSE(ipv4_address.IsIPv4MappedIPv6());
  128. IPAddress ipv6_address;
  129. EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("::1"));
  130. EXPECT_FALSE(ipv6_address.IsIPv4MappedIPv6());
  131. IPAddress ipv4mapped_address;
  132. EXPECT_TRUE(ipv4mapped_address.AssignFromIPLiteral("::ffff:0101:1"));
  133. EXPECT_TRUE(ipv4mapped_address.IsIPv4MappedIPv6());
  134. }
  135. TEST(IPAddressTest, IsEqual) {
  136. IPAddress ip_address1;
  137. EXPECT_TRUE(ip_address1.AssignFromIPLiteral("127.0.0.1"));
  138. IPAddress ip_address2;
  139. EXPECT_TRUE(ip_address2.AssignFromIPLiteral("2001:db8:0::42"));
  140. IPAddress ip_address3;
  141. EXPECT_TRUE(ip_address3.AssignFromIPLiteral("127.0.0.1"));
  142. EXPECT_FALSE(ip_address1 == ip_address2);
  143. EXPECT_TRUE(ip_address1 == ip_address3);
  144. }
  145. TEST(IPAddressTest, LessThan) {
  146. // IPv4 vs IPv6
  147. IPAddress ip_address1;
  148. EXPECT_TRUE(ip_address1.AssignFromIPLiteral("127.0.0.1"));
  149. IPAddress ip_address2;
  150. EXPECT_TRUE(ip_address2.AssignFromIPLiteral("2001:db8:0::42"));
  151. EXPECT_TRUE(ip_address1 < ip_address2);
  152. EXPECT_FALSE(ip_address2 < ip_address1);
  153. // Compare equivalent addresses.
  154. IPAddress ip_address3;
  155. EXPECT_TRUE(ip_address3.AssignFromIPLiteral("127.0.0.1"));
  156. EXPECT_FALSE(ip_address1 < ip_address3);
  157. EXPECT_FALSE(ip_address3 < ip_address1);
  158. }
  159. TEST(IPAddressTest, IPAddressToStringWithPort) {
  160. IPAddress address1;
  161. EXPECT_TRUE(address1.AssignFromIPLiteral("0.0.0.0"));
  162. EXPECT_EQ("0.0.0.0:3", IPAddressToStringWithPort(address1, 3));
  163. IPAddress address2;
  164. EXPECT_TRUE(address2.AssignFromIPLiteral("192.168.0.1"));
  165. EXPECT_EQ("192.168.0.1:99", IPAddressToStringWithPort(address2, 99));
  166. IPAddress address3;
  167. EXPECT_TRUE(address3.AssignFromIPLiteral("fedc:ba98::"));
  168. EXPECT_EQ("[fedc:ba98::]:8080", IPAddressToStringWithPort(address3, 8080));
  169. // ToString() shouldn't crash on invalid addresses.
  170. IPAddress address4;
  171. EXPECT_EQ("", IPAddressToStringWithPort(address4, 8080));
  172. }
  173. TEST(IPAddressTest, IPAddressToPackedString) {
  174. IPAddress ipv4_address;
  175. EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("4.31.198.44"));
  176. std::string expected_ipv4_address("\x04\x1f\xc6\x2c", 4);
  177. EXPECT_EQ(expected_ipv4_address, IPAddressToPackedString(ipv4_address));
  178. IPAddress ipv6_address;
  179. EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("2001:0700:0300:1800::000f"));
  180. std::string expected_ipv6_address(
  181. "\x20\x01\x07\x00\x03\x00\x18\x00"
  182. "\x00\x00\x00\x00\x00\x00\x00\x0f",
  183. 16);
  184. EXPECT_EQ(expected_ipv6_address, IPAddressToPackedString(ipv6_address));
  185. }
  186. TEST(IPAddressTest, ConvertIPv4ToIPv4MappedIPv6) {
  187. IPAddress ipv4_address;
  188. EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("192.168.0.1"));
  189. IPAddress ipv6_address = ConvertIPv4ToIPv4MappedIPv6(ipv4_address);
  190. // ::ffff:192.168.0.1
  191. EXPECT_EQ("::ffff:c0a8:1", ipv6_address.ToString());
  192. }
  193. TEST(IPAddressTest, ConvertIPv4MappedIPv6ToIPv4) {
  194. IPAddress ipv4mapped_address;
  195. EXPECT_TRUE(ipv4mapped_address.AssignFromIPLiteral("::ffff:c0a8:1"));
  196. IPAddress expected;
  197. EXPECT_TRUE(expected.AssignFromIPLiteral("192.168.0.1"));
  198. IPAddress result = ConvertIPv4MappedIPv6ToIPv4(ipv4mapped_address);
  199. EXPECT_EQ(expected, result);
  200. }
  201. // Test parsing invalid CIDR notation literals.
  202. TEST(IPAddressTest, ParseCIDRBlock_Invalid) {
  203. const char* const bad_literals[] = {"foobar",
  204. "",
  205. "192.168.0.1",
  206. "::1",
  207. "/",
  208. "/1",
  209. "1",
  210. "192.168.1.1/-1",
  211. "192.168.1.1/33",
  212. "::1/-3",
  213. "a::3/129",
  214. "::1/x",
  215. "192.168.0.1//11",
  216. "192.168.1.1/+1",
  217. "192.168.1.1/ +1",
  218. "192.168.1.1/"};
  219. for (const auto& bad_literal : bad_literals) {
  220. IPAddress ip_address;
  221. size_t prefix_length_in_bits;
  222. EXPECT_FALSE(
  223. ParseCIDRBlock(bad_literal, &ip_address, &prefix_length_in_bits));
  224. }
  225. }
  226. // Test parsing a valid CIDR notation literal.
  227. TEST(IPAddressTest, ParseCIDRBlock_Valid) {
  228. IPAddress ip_address;
  229. size_t prefix_length_in_bits;
  230. EXPECT_TRUE(
  231. ParseCIDRBlock("192.168.0.1/11", &ip_address, &prefix_length_in_bits));
  232. EXPECT_EQ("192,168,0,1", DumpIPAddress(ip_address));
  233. EXPECT_EQ(11u, prefix_length_in_bits);
  234. EXPECT_TRUE(ParseCIDRBlock("::ffff:192.168.0.1/112", &ip_address,
  235. &prefix_length_in_bits));
  236. EXPECT_EQ("0,0,0,0,0,0,0,0,0,0,255,255,192,168,0,1",
  237. DumpIPAddress(ip_address));
  238. EXPECT_EQ(112u, prefix_length_in_bits);
  239. }
  240. TEST(IPAddressTest, ParseURLHostnameToAddress_FailParse) {
  241. IPAddress address;
  242. EXPECT_FALSE(ParseURLHostnameToAddress("bad value", &address));
  243. EXPECT_FALSE(ParseURLHostnameToAddress("bad:value", &address));
  244. EXPECT_FALSE(ParseURLHostnameToAddress(std::string(), &address));
  245. EXPECT_FALSE(ParseURLHostnameToAddress("192.168.0.1:30", &address));
  246. EXPECT_FALSE(ParseURLHostnameToAddress(" 192.168.0.1 ", &address));
  247. EXPECT_FALSE(ParseURLHostnameToAddress("::1", &address));
  248. EXPECT_FALSE(ParseURLHostnameToAddress("[192.169.0.1]", &address));
  249. }
  250. TEST(IPAddressTest, ParseURLHostnameToAddress_IPv4) {
  251. IPAddress address;
  252. EXPECT_TRUE(ParseURLHostnameToAddress("192.168.0.1", &address));
  253. EXPECT_EQ("192,168,0,1", DumpIPAddress(address));
  254. EXPECT_EQ("192.168.0.1", address.ToString());
  255. }
  256. TEST(IPAddressTest, ParseURLHostnameToAddress_IPv6) {
  257. IPAddress address;
  258. EXPECT_TRUE(ParseURLHostnameToAddress("[1:abcd::3:4:ff]", &address));
  259. EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPAddress(address));
  260. EXPECT_EQ("1:abcd::3:4:ff", address.ToString());
  261. }
  262. TEST(IPAddressTest, IPAddressStartsWith) {
  263. IPAddress ipv4_address(192, 168, 10, 5);
  264. uint8_t ipv4_prefix1[] = {192, 168, 10};
  265. EXPECT_TRUE(IPAddressStartsWith(ipv4_address, ipv4_prefix1));
  266. uint8_t ipv4_prefix3[] = {192, 168, 10, 5};
  267. EXPECT_TRUE(IPAddressStartsWith(ipv4_address, ipv4_prefix3));
  268. uint8_t ipv4_prefix2[] = {192, 168, 10, 10};
  269. EXPECT_FALSE(IPAddressStartsWith(ipv4_address, ipv4_prefix2));
  270. // Prefix is longer than the address.
  271. uint8_t ipv4_prefix4[] = {192, 168, 10, 10, 0};
  272. EXPECT_FALSE(IPAddressStartsWith(ipv4_address, ipv4_prefix4));
  273. IPAddress ipv6_address;
  274. EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("2a00:1450:400c:c09::64"));
  275. uint8_t ipv6_prefix1[] = {42, 0, 20, 80, 64, 12, 12, 9};
  276. EXPECT_TRUE(IPAddressStartsWith(ipv6_address, ipv6_prefix1));
  277. uint8_t ipv6_prefix2[] = {41, 0, 20, 80, 64, 12, 12, 9,
  278. 0, 0, 0, 0, 0, 0, 100};
  279. EXPECT_FALSE(IPAddressStartsWith(ipv6_address, ipv6_prefix2));
  280. uint8_t ipv6_prefix3[] = {42, 0, 20, 80, 64, 12, 12, 9,
  281. 0, 0, 0, 0, 0, 0, 0, 100};
  282. EXPECT_TRUE(IPAddressStartsWith(ipv6_address, ipv6_prefix3));
  283. uint8_t ipv6_prefix4[] = {42, 0, 20, 80, 64, 12, 12, 9,
  284. 0, 0, 0, 0, 0, 0, 0, 0};
  285. EXPECT_FALSE(IPAddressStartsWith(ipv6_address, ipv6_prefix4));
  286. // Prefix is longer than the address.
  287. uint8_t ipv6_prefix5[] = {42, 0, 20, 80, 64, 12, 12, 9, 0,
  288. 0, 0, 0, 0, 0, 0, 0, 10};
  289. EXPECT_FALSE(IPAddressStartsWith(ipv6_address, ipv6_prefix5));
  290. }
  291. } // anonymous namespace
  292. } // namespace net