From aa340e1c5e4e28397ef212aa210633e9dcb81f98 Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Thu, 15 Oct 2015 04:32:02 +0200 Subject: Separate the DNS resolution logic from the TCP communication logic fix #3137 --- src/test.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) (limited to 'src') diff --git a/src/test.cpp b/src/test.cpp index 1a59041..0a3b4c8 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -3,10 +3,13 @@ */ #include +#include #include #include #include +#include #include +#include #include #include #include @@ -462,7 +465,84 @@ int main() res = xdg_data_path("bonjour.txt"); std::cout << res << std::endl; assert(res == "/datadir/biboumi/bonjour.txt"); + } + + + { + std::cout << color << "Testing the DNS resolver…" << reset << std::endl; + + Resolver resolver; + + /** + * If we are using cares, we need to run a poller loop until each + * resolution is finished. Without cares we get the result before + * resolve() returns because it’s blocking. + */ +#ifdef CARES_FOUND + auto p = std::make_shared(); + + const auto loop = [&p]() + { + do + { + DNSHandler::instance.watch_dns_sockets(p); + } + while (p->poll(utils::no_timeout) != -1); + }; +#else + // We don’t need to do anything if we are not using cares. + const auto loop = [](){}; +#endif + + std::string hostname; + std::string port = "6667"; + + bool success = true; + auto error_cb = [&success, &hostname, &port](const char* msg) + { + std::cout << "Failed to resolve " << hostname << ":" << port << ": " << msg << std::endl; + success = false; + }; + auto success_cb = [&success, &hostname, &port](const struct addrinfo* addr) + { + std::cout << "Successfully resolved " << hostname << ":" << port << ": " << addr_to_string(addr) << std::endl; + success = true; + }; + + hostname = "example.com"; + resolver.resolve(hostname, port, + success_cb, error_cb); + loop(); + assert(success); + + hostname = "this.should.fail.because.it.is..misformatted"; + resolver.resolve(hostname, port, + success_cb, error_cb); + loop(); + assert(!success); + + hostname = "this.should.fail.because.it.is.does.not.exist.invalid"; + resolver.resolve(hostname, port, + success_cb, error_cb); + loop(); + assert(!success); + + hostname = "localhost6"; + resolver.resolve(hostname, port, + success_cb, error_cb); + loop(); + assert(success); + + hostname = "localhost"; + resolver.resolve(hostname, port, + success_cb, error_cb); + loop(); + assert(success); + +#ifdef CARES_FOUND + DNSHandler::instance.destroy(); +#endif } return 0; -- cgit v1.2.3