Merge pull request #128 from azat/tests-disable-when-inactive-v5

Some tests for EVDNS_BASE_DISABLE_WHEN_INACTIVE flag
This commit is contained in:
Nick Mathewson 2014-09-18 11:25:27 -04:00
commit afce2721c2

View File

@ -443,6 +443,7 @@ end:
static int n_replies_left;
static struct event_base *exit_base;
static struct evdns_server_port *exit_port;
struct generic_dns_callback_result {
int result;
@ -483,8 +484,14 @@ generic_dns_callback(int result, char type, int count, int ttl, void *addresses,
res->addrs = res->addrs_buf;
}
if (--n_replies_left == 0)
event_base_loopexit(exit_base, NULL);
--n_replies_left;
if (n_replies_left == 0) {
if (exit_port) {
evdns_close_server_port(exit_port);
exit_port = NULL;
} else
event_base_loopexit(exit_base, NULL);
}
}
static struct regress_dns_server_table search_table[] = {
@ -819,21 +826,29 @@ dumb_bytes_fn(char *p, size_t n)
#endif
static void
dns_inflight_test(void *arg)
dns_inflight_test_impl(void *arg, int flags)
{
struct basic_test_data *data = arg;
struct event_base *base = data->base;
struct evdns_base *dns = NULL;
struct evdns_server_port *dns_port = NULL;
ev_uint16_t portnum = 0;
char buf[64];
int disable_when_inactive = flags & EVDNS_BASE_DISABLE_WHEN_INACTIVE;
struct generic_dns_callback_result r[20];
int i;
tt_assert(regress_dnsserver(base, &portnum, reissue_table));
dns_port = regress_get_dnsserver(base, &portnum, NULL,
regress_dns_server_cb, reissue_table);
tt_assert(dns_port);
if (disable_when_inactive) {
exit_port = dns_port;
}
evutil_snprintf(buf, sizeof(buf), "127.0.0.1:%d", (int)portnum);
dns = evdns_base_new(base, 0);
dns = evdns_base_new(base, flags);
tt_assert(!evdns_base_nameserver_ip_add(dns, buf));
tt_assert(! evdns_base_set_option(dns, "max-inflight:", "3"));
tt_assert(! evdns_base_set_option(dns, "randomize-case:", "0"));
@ -852,10 +867,64 @@ dns_inflight_test(void *arg)
tt_int_op(((ev_uint32_t*)r[i].addrs)[0], ==, htonl(0xf00ff00f));
}
end:
if (dns)
evdns_base_free(dns, 0);
if (exit_port)
evdns_close_server_port(exit_port);
}
static void
dns_inflight_test(void *arg)
{
dns_inflight_test_impl(arg, 0);
}
static void
dns_disable_when_inactive_test(void *arg)
{
dns_inflight_test_impl(arg, EVDNS_BASE_DISABLE_WHEN_INACTIVE);
}
static void
dns_disable_when_inactive_no_ns_test(void *arg)
{
struct basic_test_data *data = arg;
struct event_base *base = data->base, *inactive_base;
struct evdns_base *dns = NULL;
ev_uint16_t portnum = 0;
char buf[64];
struct generic_dns_callback_result r;
inactive_base = event_base_new();
tt_assert(inactive_base);
/** Create dns server with inactive base, to avoid replying to clients */
tt_assert(regress_dnsserver(inactive_base, &portnum, search_table));
evutil_snprintf(buf, sizeof(buf), "127.0.0.1:%d", (int)portnum);
dns = evdns_base_new(base, EVDNS_BASE_DISABLE_WHEN_INACTIVE);
tt_assert(!evdns_base_nameserver_ip_add(dns, buf));
tt_assert(! evdns_base_set_option(dns, "timeout:", "0.1"));
evdns_base_resolve_ipv4(dns, "foof.example.com", 0, generic_dns_callback, &r);
n_replies_left = 1;
exit_base = base;
event_base_dispatch(base);
tt_int_op(n_replies_left, ==, 0);
tt_int_op(r.result, ==, DNS_ERR_TIMEOUT);
tt_int_op(r.count, ==, 0);
tt_int_op(r.addrs, ==, NULL);
end:
if (dns)
evdns_base_free(dns, 0);
regress_clean_dnsserver();
if (inactive_base)
event_base_free(inactive_base);
}
/* === Test for bufferevent_socket_connect_hostname */
@ -1901,6 +1970,10 @@ struct testcase_t dns_testcases[] = {
{ "inflight", dns_inflight_test, TT_FORK|TT_NEED_BASE, &basic_setup, NULL },
{ "bufferevent_connect_hostname", test_bufferevent_connect_hostname,
TT_FORK|TT_NEED_BASE, &basic_setup, NULL },
{ "disable_when_inactive", dns_disable_when_inactive_test,
TT_FORK|TT_NEED_BASE, &basic_setup, NULL },
{ "disable_when_inactive_no_ns", dns_disable_when_inactive_no_ns_test,
TT_FORK|TT_NEED_BASE, &basic_setup, NULL },
{ "getaddrinfo_async", test_getaddrinfo_async,
TT_FORK|TT_NEED_BASE, &basic_setup, (char*)"" },