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 )