More unit tests for getaddrinfo_async: v4timeout and cancel.

One covers the case where the v4 request times out but the v6 request
doesn't.  The other makes sure that cancelling a request actually works.
This commit is contained in:
Nick Mathewson 2010-01-14 14:46:16 -05:00
parent 94131e92b8
commit a334b31c6f

View File

@ -936,6 +936,21 @@ be_getaddrinfo_server_cb(struct evdns_server_request *req, void *data)
evdns_server_request_drop(req); evdns_server_request_drop(req);
return; return;
} }
} else if (!evutil_ascii_strcasecmp(qname,
"v4timeout.example.com")) {
if (qtype == EVDNS_TYPE_AAAA) {
ans6.s6_addr[0] = 0x0a;
ans6.s6_addr[1] = 0x0a;
ans6.s6_addr[14] = 0xff;
ans6.s6_addr[15] = 0x01;
evdns_server_request_add_aaaa_reply(req, qname,
1, &ans6.s6_addr, 2000);
added_any = 1;
} else if (qtype == EVDNS_TYPE_A) {
/* Let the v4 request time out.*/
evdns_server_request_drop(req);
return;
}
} else if (!evutil_ascii_strcasecmp(qname, } else if (!evutil_ascii_strcasecmp(qname,
"v6timeout-nonexist.example.com")) { "v6timeout-nonexist.example.com")) {
if (qtype == EVDNS_TYPE_A) { if (qtype == EVDNS_TYPE_A) {
@ -945,6 +960,11 @@ be_getaddrinfo_server_cb(struct evdns_server_request *req, void *data)
evdns_server_request_drop(req); evdns_server_request_drop(req);
return; return;
} }
} else if (!evutil_ascii_strcasecmp(qname,
"all-timeout.example.com")) {
/* drop all requests */
evdns_server_request_drop(req);
return;
} else { } else {
TT_GRIPE(("Got weird request for %s",qname)); TT_GRIPE(("Got weird request for %s",qname));
} }
@ -1135,13 +1155,20 @@ gai_cb(int err, struct evutil_addrinfo *res, void *ptr)
n_gai_results_pending)); n_gai_results_pending));
} }
static void
cancel_gai_cb(evutil_socket_t fd, short what, void *ptr)
{
struct evdns_getaddrinfo_request *r = ptr;
evdns_getaddrinfo_cancel(r);
}
static void static void
test_getaddrinfo_async(void *arg) test_getaddrinfo_async(void *arg)
{ {
struct basic_test_data *data = arg; struct basic_test_data *data = arg;
struct evutil_addrinfo hints, *a; struct evutil_addrinfo hints, *a;
struct gai_outcome local_outcome; struct gai_outcome local_outcome;
struct gai_outcome a_out[10]; struct gai_outcome a_out[12];
int i; int i;
struct evdns_getaddrinfo_request *r; struct evdns_getaddrinfo_request *r;
char buf[128]; char buf[128];
@ -1378,14 +1405,33 @@ test_getaddrinfo_async(void *arg)
"8009", &hints, gai_cb, &a_out[9]); "8009", &hints, gai_cb, &a_out[9]);
tt_assert(r); tt_assert(r);
/* 10: PF_UNSPEC for v4timeout.example.com should give an ipv6 address
* only. */
hints.ai_family = PF_UNSPEC;
hints.ai_flags = 0;
r = evdns_getaddrinfo(dns_base, "v4timeout.example.com", "8010",
&hints, gai_cb, &a_out[10]);
tt_assert(r);
/* 11: timeout.example.com: cancel it after 100 msec. */
r = evdns_getaddrinfo(dns_base, "all-timeout.example.com", "8011",
&hints, gai_cb, &a_out[11]);
tt_assert(r);
{
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 100*1000; /* 100 msec */
event_base_once(data->base, -1, EV_TIMEOUT, cancel_gai_cb,
r, &tv);
}
/* XXXXX There are more tests we could do, including: /* XXXXX There are more tests we could do, including:
- A test to elicit NODATA. - A test to elicit NODATA.
- A test of cancelling a request.
*/ */
n_gai_results_pending = 10; n_gai_results_pending = 12;
exit_base_on_no_pending_results = data->base; exit_base_on_no_pending_results = data->base;
event_base_dispatch(data->base); event_base_dispatch(data->base);
@ -1462,6 +1508,16 @@ test_getaddrinfo_async(void *arg)
else else
tt_assert(ai_find_by_family(a_out[9].ai, PF_INET)); tt_assert(ai_find_by_family(a_out[9].ai, PF_INET));
/* 10: v4timeout.example.com */
tt_int_op(a_out[10].err, ==, 0);
tt_assert(a_out[10].ai);
tt_assert(! a_out[10].ai->ai_next);
test_ai_eq(a_out[10].ai, "[a0a::ff01]:8010", SOCK_STREAM, IPPROTO_TCP);
/* 11: cancelled request. */
tt_int_op(a_out[11].err, ==, EVUTIL_EAI_CANCEL);
tt_assert(a_out[11].ai == NULL);
end: end:
if (local_outcome.ai) if (local_outcome.ai)
evutil_freeaddrinfo(local_outcome.ai); evutil_freeaddrinfo(local_outcome.ai);