ipv6_address_ut.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include <library/cpp/testing/unittest/registar.h>
  2. #include <library/cpp/ipv6_address/ipv6_address.h>
  3. #include <unordered_set>
  4. class TIpv6AddressTest: public TTestBase {
  5. UNIT_TEST_SUITE(TIpv6AddressTest);
  6. UNIT_TEST(ParseHostAndMayBePortFromString_data);
  7. UNIT_TEST(CheckAddressValidity)
  8. UNIT_TEST_SUITE_END();
  9. private:
  10. void ParseHostAndMayBePortFromString_data();
  11. void CheckAddressValidity();
  12. void HashCompileTest();
  13. };
  14. UNIT_TEST_SUITE_REGISTRATION(TIpv6AddressTest);
  15. using TResult = std::tuple<THostAddressAndPort, TString, TIpPort>;
  16. TResult IpRes(TString Ip, TIpPort Port) {
  17. bool Ok;
  18. THostAddressAndPort HostAddressAndPort;
  19. HostAddressAndPort.Ip = TIpv6Address::FromString(Ip, Ok);
  20. Y_ABORT_UNLESS(Ok);
  21. HostAddressAndPort.Port = Port;
  22. return TResult(HostAddressAndPort, {}, {});
  23. }
  24. TResult HostRes(TString HostName, TIpPort Port) {
  25. return TResult({}, HostName, Port);
  26. }
  27. void ParseHostAndMayBePortFromString(TString RawStr,
  28. TIpPort DefaultPort,
  29. const TResult ExpectedResult,
  30. const bool ExpectedOk) {
  31. bool Ok = false;
  32. const TResult ActualResult = ParseHostAndMayBePortFromString(RawStr, DefaultPort, Ok);
  33. UNIT_ASSERT(Ok == ExpectedOk);
  34. if (Ok == false)
  35. return;
  36. UNIT_ASSERT(ActualResult == ExpectedResult);
  37. }
  38. void CheckIpDefPortAgainstIpPortDefPort_v4OrHost(TString Ip,
  39. TIpPort Port,
  40. const TResult ExpectedResult,
  41. const bool ExpectedOk) {
  42. ParseHostAndMayBePortFromString(Ip, Port, ExpectedResult, ExpectedOk);
  43. TString New = Ip + ":" + ToString(Port);
  44. ParseHostAndMayBePortFromString(New, Port + 12, ExpectedResult, ExpectedOk);
  45. }
  46. void CheckIpDefPortAgainstIpPortDefPort_v6(TString Ip, TIpPort Port, const TResult ExpectedResult, const bool ExpectedOk) {
  47. ParseHostAndMayBePortFromString(Ip, Port, ExpectedResult, ExpectedOk);
  48. TString New = "[" + Ip + "]" + ":" + ToString(Port);
  49. ParseHostAndMayBePortFromString(New, Port + 12, ExpectedResult, ExpectedOk);
  50. }
  51. void CheckIpDefPortAgainstIpPortDefPort(TString Ip, TIpPort Port, const TResult ExpectedResult, const bool ExpectedOk) {
  52. if (Ip.find(':') == TString::npos) {
  53. CheckIpDefPortAgainstIpPortDefPort_v4OrHost(Ip, Port, ExpectedResult, ExpectedOk);
  54. } else {
  55. CheckIpDefPortAgainstIpPortDefPort_v6(Ip, Port, ExpectedResult, ExpectedOk);
  56. }
  57. }
  58. void TIpv6AddressTest::ParseHostAndMayBePortFromString_data() {
  59. CheckIpDefPortAgainstIpPortDefPort("1.2.3.4", 123, IpRes("1.2.3.4", 123), true);
  60. ParseHostAndMayBePortFromString("[1.2.3.4]", 123, {}, false);
  61. ParseHostAndMayBePortFromString("[2001::7348]", 123, IpRes("2001::7348", 123), true);
  62. CheckIpDefPortAgainstIpPortDefPort("2001::7348", 123, IpRes("2001::7348", 123), true);
  63. CheckIpDefPortAgainstIpPortDefPort("ya.ru", 123, HostRes("ya.ru", 123), true);
  64. }
  65. void TIpv6AddressTest::CheckAddressValidity() {
  66. bool Ok;
  67. constexpr TIpv6Address partsV4 {12, 34, 56, 78};
  68. static_assert(partsV4.Type() == TIpv6Address::Ipv4);
  69. constexpr TIpv6Address intV4 {0x0C22384E, TIpv6Address::Ipv4};
  70. static_assert(partsV4 == intV4);
  71. const auto parsedV4 = TIpv6Address::FromString("12.34.56.78", Ok);
  72. UNIT_ASSERT(Ok);
  73. UNIT_ASSERT_EQUAL(parsedV4, partsV4);
  74. constexpr TIpv6Address partsV6 {0xFB, 0x1634, 0x19, 0xABED, 0, 0x8001, 0x1670, 0x742};
  75. static_assert(partsV6.Type() == TIpv6Address::Ipv6);
  76. constexpr TIpv6Address intV6 {{0x00FB16340019ABED, 0x0000800116700742}, TIpv6Address::Ipv6};
  77. static_assert(partsV6 == intV6);
  78. const auto parsedV6 = TIpv6Address::FromString("FB:1634:19:ABED:0:8001:1670:742", Ok);
  79. UNIT_ASSERT(Ok);
  80. UNIT_ASSERT_EQUAL(parsedV6, partsV6);
  81. static_assert(Get127001() == TIpv6Address(0x7F000001, TIpv6Address::Ipv4));
  82. static_assert(Get1() == TIpv6Address(0, 0, 0, 0, 0, 0, 0, 1));
  83. }
  84. void TIpv6AddressTest::HashCompileTest() {
  85. std::unordered_set<TIpv6Address> test;
  86. Y_UNUSED(test);
  87. }