summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2015-10-15 04:32:02 +0200
committerFlorent Le Coz <louiz@louiz.org>2015-10-15 04:32:02 +0200
commitaa340e1c5e4e28397ef212aa210633e9dcb81f98 (patch)
tree688baaa7b13fa1c7e19507a3fef92b8254c87388 /src
parent1aa2c2d857037f3274297527ca3971a75203d39c (diff)
downloadbiboumi-aa340e1c5e4e28397ef212aa210633e9dcb81f98.tar.gz
biboumi-aa340e1c5e4e28397ef212aa210633e9dcb81f98.tar.bz2
biboumi-aa340e1c5e4e28397ef212aa210633e9dcb81f98.tar.xz
biboumi-aa340e1c5e4e28397ef212aa210633e9dcb81f98.zip
Separate the DNS resolution logic from the TCP communication logic
fix #3137
Diffstat (limited to 'src')
-rw-r--r--src/test.cpp80
1 files changed, 80 insertions, 0 deletions
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 <xmpp/xmpp_component.hpp>
+#include <network/dns_handler.hpp>
#include <utils/timed_events.hpp>
#include <database/database.hpp>
#include <xmpp/xmpp_parser.hpp>
+#include <network/resolver.hpp>
#include <utils/encoding.hpp>
+#include <network/poller.hpp>
#include <logger/logger.hpp>
#include <config/config.hpp>
#include <bridge/colors.hpp>
@@ -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<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;
+ 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;