dnsresolver_ut.cpp 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "dnsresolver.h"
  2. #include <library/cpp/actors/testlib/test_runtime.h>
  3. #include <library/cpp/testing/unittest/registar.h>
  4. #include <util/string/builder.h>
  5. #include <ares.h>
  6. using namespace NActors;
  7. using namespace NActors::NDnsResolver;
  8. Y_UNIT_TEST_SUITE(DnsResolver) {
  9. struct TSilentUdpServer {
  10. TInetDgramSocket Socket;
  11. ui16 Port;
  12. TSilentUdpServer() {
  13. TSockAddrInet addr("127.0.0.1", 0);
  14. int err = Socket.Bind(&addr);
  15. Y_VERIFY(err == 0, "Cannot bind a udp socket");
  16. Port = addr.GetPort();
  17. }
  18. };
  19. Y_UNIT_TEST(ResolveLocalHost) {
  20. TTestActorRuntimeBase runtime;
  21. runtime.Initialize();
  22. auto sender = runtime.AllocateEdgeActor();
  23. auto resolver = runtime.Register(CreateSimpleDnsResolver());
  24. runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("localhost", AF_UNSPEC)),
  25. 0, true);
  26. auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
  27. UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
  28. size_t addrs = ev->Get()->AddrsV4.size() + ev->Get()->AddrsV6.size();
  29. UNIT_ASSERT_C(addrs > 0, "Got " << addrs << " addresses");
  30. }
  31. Y_UNIT_TEST(ResolveYandexRu) {
  32. TTestActorRuntimeBase runtime;
  33. runtime.Initialize();
  34. auto sender = runtime.AllocateEdgeActor();
  35. auto resolver = runtime.Register(CreateSimpleDnsResolver());
  36. runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("yandex.ru", AF_UNSPEC)),
  37. 0, true);
  38. auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
  39. UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
  40. size_t addrs = ev->Get()->AddrsV4.size() + ev->Get()->AddrsV6.size();
  41. UNIT_ASSERT_C(addrs > 0, "Got " << addrs << " addresses");
  42. }
  43. Y_UNIT_TEST(GetAddrYandexRu) {
  44. TTestActorRuntimeBase runtime;
  45. runtime.Initialize();
  46. auto sender = runtime.AllocateEdgeActor();
  47. auto resolver = runtime.Register(CreateSimpleDnsResolver());
  48. runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetAddr("yandex.ru", AF_UNSPEC)),
  49. 0, true);
  50. auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetAddrResult>(sender);
  51. UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, 0, ev->Get()->ErrorText);
  52. UNIT_ASSERT_C(ev->Get()->IsV4() || ev->Get()->IsV6(), "Expect v4 or v6 address");
  53. }
  54. Y_UNIT_TEST(ResolveTimeout) {
  55. TSilentUdpServer server;
  56. TTestActorRuntimeBase runtime;
  57. runtime.Initialize();
  58. auto sender = runtime.AllocateEdgeActor();
  59. TSimpleDnsResolverOptions options;
  60. options.Timeout = TDuration::MilliSeconds(250);
  61. options.Attempts = 2;
  62. options.Servers.emplace_back(TStringBuilder() << "127.0.0.1:" << server.Port);
  63. auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
  64. runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("timeout.yandex.ru", AF_INET)),
  65. 0, true);
  66. auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
  67. UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, ARES_ETIMEOUT, ev->Get()->ErrorText);
  68. }
  69. Y_UNIT_TEST(ResolveGracefulStop) {
  70. TSilentUdpServer server;
  71. TTestActorRuntimeBase runtime;
  72. runtime.Initialize();
  73. auto sender = runtime.AllocateEdgeActor();
  74. TSimpleDnsResolverOptions options;
  75. options.Timeout = TDuration::Seconds(5);
  76. options.Attempts = 5;
  77. options.Servers.emplace_back(TStringBuilder() << "127.0.0.1:" << server.Port);
  78. auto resolver = runtime.Register(CreateSimpleDnsResolver(options));
  79. runtime.Send(new IEventHandle(resolver, sender, new TEvDns::TEvGetHostByName("timeout.yandex.ru", AF_INET)),
  80. 0, true);
  81. runtime.Send(new IEventHandle(resolver, sender, new TEvents::TEvPoison), 0, true);
  82. auto ev = runtime.GrabEdgeEventRethrow<TEvDns::TEvGetHostByNameResult>(sender);
  83. UNIT_ASSERT_VALUES_EQUAL_C(ev->Get()->Status, ARES_ECANCELLED, ev->Get()->ErrorText);
  84. }
  85. }