TestIPv6Address.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * Copyright (c) 2022, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibTest/TestCase.h>
  7. #include <AK/Endian.h>
  8. #include <AK/IPv6Address.h>
  9. TEST_CASE(should_default_contructor_with_0s)
  10. {
  11. constexpr IPv6Address addr {};
  12. static_assert(addr.is_zero());
  13. EXPECT(addr.is_zero());
  14. }
  15. TEST_CASE(should_construct_from_c_array)
  16. {
  17. constexpr auto addr = [] {
  18. u8 const a[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
  19. return IPv6Address(a);
  20. }();
  21. static_assert(!addr.is_zero());
  22. EXPECT(!addr.is_zero());
  23. }
  24. TEST_CASE(should_get_groups_by_index)
  25. {
  26. constexpr IPv6Address addr({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 });
  27. static_assert(0x102 == addr[0]);
  28. static_assert(0x304 == addr[1]);
  29. static_assert(0x506 == addr[2]);
  30. static_assert(0x708 == addr[3]);
  31. static_assert(0x90a == addr[4]);
  32. static_assert(0xb0c == addr[5]);
  33. static_assert(0xd0e == addr[6]);
  34. static_assert(0xf10 == addr[7]);
  35. EXPECT_EQ(0x102, addr[0]);
  36. EXPECT_EQ(0x304, addr[1]);
  37. EXPECT_EQ(0x506, addr[2]);
  38. EXPECT_EQ(0x708, addr[3]);
  39. EXPECT_EQ(0x90a, addr[4]);
  40. EXPECT_EQ(0xb0c, addr[5]);
  41. EXPECT_EQ(0xd0e, addr[6]);
  42. EXPECT_EQ(0xf10, addr[7]);
  43. }
  44. TEST_CASE(should_convert_to_string)
  45. {
  46. EXPECT_EQ("102:304:506:708:90a:b0c:d0e:f10"sv, IPv6Address({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }).to_deprecated_string());
  47. EXPECT_EQ("::"sv, IPv6Address().to_deprecated_string());
  48. EXPECT_EQ("::1"sv, IPv6Address({ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }).to_deprecated_string());
  49. EXPECT_EQ("1::"sv, IPv6Address({ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }).to_deprecated_string());
  50. EXPECT_EQ("102:0:506:708:900::10"sv, IPv6Address({ 1, 2, 0, 0, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 16 }).to_deprecated_string());
  51. EXPECT_EQ("102:0:506:708:900::"sv, IPv6Address({ 1, 2, 0, 0, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0 }).to_deprecated_string());
  52. EXPECT_EQ("::304:506:708:90a:b0c:d0e:f10"sv, IPv6Address({ 0, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }).to_deprecated_string());
  53. EXPECT_EQ("102:304::708:90a:b0c:d0e:f10"sv, IPv6Address({ 1, 2, 3, 4, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }).to_deprecated_string());
  54. }
  55. TEST_CASE(should_make_ipv6_address_from_string)
  56. {
  57. EXPECT(!IPv6Address::from_string(":::"sv).has_value());
  58. EXPECT(!IPv6Address::from_string(":::1"sv).has_value());
  59. EXPECT(!IPv6Address::from_string("1:::"sv).has_value());
  60. EXPECT_EQ(IPv6Address::from_string("102:304:506:708:90a:b0c:d0e:f10"sv).value(), IPv6Address({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }));
  61. EXPECT_EQ(IPv6Address::from_string("::"sv).value(), IPv6Address());
  62. EXPECT_EQ(IPv6Address::from_string("::1"sv).value(), IPv6Address({ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }));
  63. EXPECT_EQ(IPv6Address::from_string("1::"sv).value(), IPv6Address({ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }));
  64. EXPECT_EQ(IPv6Address::from_string("102:0:506:708:900::10"sv).value(), IPv6Address({ 1, 2, 0, 0, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 16 }));
  65. EXPECT_EQ(IPv6Address::from_string("102:0:506:708:900::"sv).value(), IPv6Address({ 1, 2, 0, 0, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0 }));
  66. EXPECT_EQ(IPv6Address::from_string("::304:506:708:90a:b0c:d0e:f10"sv).value(), IPv6Address({ 0, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }));
  67. EXPECT_EQ(IPv6Address::from_string("102:304::708:90a:b0c:d0e:f10"sv).value(), IPv6Address({ 1, 2, 3, 4, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }));
  68. }
  69. TEST_CASE(ipv4_mapped_ipv6)
  70. {
  71. auto ipv4_address_to_map = IPv4Address::from_string("192.168.0.1"sv).release_value();
  72. IPv6Address mapped_address(ipv4_address_to_map);
  73. EXPECT(mapped_address.is_ipv4_mapped());
  74. EXPECT_EQ(ipv4_address_to_map, mapped_address.ipv4_mapped_address().value());
  75. EXPECT_EQ("::ffff:192.168.0.1"sv, mapped_address.to_deprecated_string());
  76. EXPECT_EQ(IPv4Address(192, 168, 1, 9), IPv6Address::from_string("::FFFF:192.168.1.9"sv).value().ipv4_mapped_address().value());
  77. EXPECT(!IPv6Address::from_string("::abcd:192.168.1.9"sv).has_value());
  78. }
  79. TEST_CASE(should_make_empty_optional_from_bad_string)
  80. {
  81. auto const addr = IPv6Address::from_string("bad string"sv);
  82. EXPECT(!addr.has_value());
  83. }
  84. TEST_CASE(should_make_empty_optional_from_out_of_range_values)
  85. {
  86. auto const addr = IPv6Address::from_string("::10000"sv);
  87. EXPECT(!addr.has_value());
  88. }
  89. TEST_CASE(should_only_compare_bytes_from_address)
  90. {
  91. constexpr IPv6Address addr_a({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 });
  92. constexpr IPv6Address addr_b({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17 });
  93. constexpr IPv6Address addr_c({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17 });
  94. static_assert(addr_a != addr_b);
  95. static_assert(addr_a == addr_a);
  96. static_assert(addr_b == addr_c);
  97. EXPECT(addr_a != addr_b);
  98. EXPECT(addr_a == addr_a);
  99. EXPECT(addr_b == addr_c);
  100. }