summaryrefslogtreecommitdiff
path: root/tests/dns.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/dns.cpp')
-rw-r--r--tests/dns.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/tests/dns.cpp b/tests/dns.cpp
new file mode 100644
index 0000000..c3eda7b
--- /dev/null
+++ b/tests/dns.cpp
@@ -0,0 +1,91 @@
+#include "catch.hpp"
+
+#include <network/dns_handler.hpp>
+#include <network/resolver.hpp>
+#include <network/poller.hpp>
+
+#include <utils/timed_events.hpp>
+
+TEST_CASE("DNS resolver")
+{
+ Resolver resolver;
+ Resolver resolver2;
+ Resolver resolver3;
+
+ /**
+ * 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<Poller>();
+
+ 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;
+
+ const auto error_cb = [&success](const std::string& hostname)
+ {
+ return [&success, hostname](const char *msg)
+ {
+ INFO("Failed to resolve " << hostname << ":" << msg);
+ success = false;
+ };
+ };
+ const auto success_cb = [&success](const std::string& hostname)
+ {
+ return [&success, hostname](const struct addrinfo *addr)
+ {
+ INFO("Successfully resolved " << hostname << ": " << addr_to_string(addr));
+ success = true;
+ };
+ };
+
+ hostname = "example.com";
+ resolver.resolve(hostname, port,
+ success_cb(hostname), error_cb(hostname));
+ hostname = "poez.io";
+ resolver2.resolve(hostname, port,
+ success_cb(hostname), error_cb(hostname));
+ hostname = "louiz.org";
+ resolver3.resolve(hostname, port,
+ success_cb(hostname), error_cb(hostname));
+ loop();
+ CHECK(success);
+
+ hostname = "this.should.fail.because.it.is..misformatted";
+ resolver.resolve(hostname, port,
+ success_cb(hostname), error_cb(hostname));
+ loop();
+ CHECK(!success);
+
+ hostname = "this.should.fail.because.it.is.does.not.exist.invalid";
+ resolver.resolve(hostname, port,
+ success_cb(hostname), error_cb(hostname));
+ loop();
+ CHECK(!success);
+
+ hostname = "localhost";
+ resolver.resolve(hostname, port,
+ success_cb(hostname), error_cb(hostname));
+ loop();
+ CHECK(success);
+
+#ifdef CARES_FOUND
+ DNSHandler::instance.destroy();
+#endif
+}