UniEvent
view release on metacpan or search on metacpan
clib/tests/resolver.cc view on Meta::CPAN
req->run();
v.test.run();
CHECK(v.resolver->cache().size() == 1);
req->run();
v.test.run_nowait();
CHECK(v.resolver->cache().size() == 1);
CHECK(v.res[0].is(v.res[1]));
}
SECTION("custom hints and empty hints") {
req->hints(AddrInfoHints(AF_INET));
req->run();
v.test.run();
CHECK(v.resolver->cache().size() == 1);
req->hints(AddrInfoHints());
req->run();
v.test.run();
CHECK(v.resolver->cache().size() == 2);
CHECK(!v.res[0].is(v.res[1]));
}
SECTION("different hints") {
req->hints(AddrInfoHints(AF_INET));
req->run();
v.test.run();
CHECK(v.resolver->cache().size() == 1);
req->hints(AddrInfoHints(AF_INET, SOCK_STREAM));
req->run();
v.test.run();
CHECK(v.resolver->cache().size() == 2);
CHECK(!v.res[0].is(v.res[1]));
}
}
TEST("service/port") {
Vars v(2);
auto req = v.resolver->resolve()->node("localhost")->on_resolve(v.success_cb);
req->service("80");
req->run();
v.test.run();
CHECK(v.resolver->cache().size() == 1);
req->service("");
req->port(80);
req->run();
v.test.run();
CHECK(v.resolver->cache().size() == 1);
CHECK(v.res[0].is(v.res[1]));
for (auto ai = v.res[0]; ai; ai = ai.next()) {
auto addr = ai.addr();
CHECK(addr.port() == 80);
if (addr.is_inet4()) CHECK(addr.ip() == "127.0.0.1");
else if (addr.is_inet6()) CHECK(addr.ip() == "::1");
}
}
TEST("cache limit") {
Vars v(3);
ResolverSP resolver = new Resolver(v.test.loop, 500, 2);
auto req = resolver->resolve()->node("localhost")->on_resolve(v.success_cb);
req->port(80);
req->run();
v.test.run();
CHECK(resolver->cache().size() == 1);
req->port(443);
req->run();
v.test.run();
CHECK(resolver->cache().size() == 2);
req->port(22);
req->run();
v.test.run();
CHECK(resolver->cache().size() == 1);
}
TEST("timeout") {
Vars v(2);
Resolver::Config cfg;
cfg.workers = 1;
cfg.query_timeout = 50;
ResolverSP resolver = new Resolver(v.test.loop, cfg);
// will not make it
resolver->resolve("ya.ru", [&](auto& ai, auto& err, auto) {
v.test.happens();
CHECK(err == std::errc::timed_out);
CHECK(!ai);
}, 1);
// put next request to worker to be processed after timeout
resolver->resolve("localhost", v.success_cb, 1000);
std::this_thread::sleep_for(std::chrono::milliseconds(51));
v.test.run();
CHECK(resolver->cache().size() == 1);
}
TEST("ares query timeout") {
Vars v(10);
Resolver::Config cfg;
cfg.workers = 10;
cfg.query_timeout = 1;
ResolverSP resolver = new Resolver(v.test.loop, cfg);
for (int i = 0; i < 10; ++i) resolver->resolve("ya.ru", [&](auto, auto, auto) {
v.test.happens();
}, 1000);
v.test.run();
}
( run in 2.246 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )