Files
shadowsocks-libev/tests/test_resolv.c
T

57 lines
1.9 KiB
C

/* Exercise real c-ares cancellation with outstanding A and AAAA requests. */
#include "test_helpers.h"
#include <ev.h>
#include "resolv.h"
int verbose = 0;
struct result { unsigned called, freed; };
static void resolved(struct sockaddr *address, void *data)
{
struct result *result = data;
assert(address == NULL);
assert(result->freed == 0);
result->called++;
}
static void released(void *data)
{
struct result *result = data;
assert(result->called == 1);
result->freed++;
}
int main(void)
{
test_network_init();
/* A bound but unread UDP socket prevents DNS responses or ICMP rejection;
* the test needs no external DNS server or connectivity. */
ss_socket_t sink = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in address = {0};
address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
assert(bind(sink, (struct sockaddr *)&address, sizeof(address)) == 0);
socklen_t size = sizeof(address);
assert(getsockname(sink, (struct sockaddr *)&address, &size) == 0);
char nameserver[64];
snprintf(nameserver, sizeof(nameserver), "127.0.0.1:%u", ntohs(address.sin_port));
struct ev_loop *loop = ev_loop_new(0);
assert(loop != NULL);
for (unsigned round = 0; round < 3; round++) {
struct result results[64] = {{0}};
assert(resolv_init(loop, nameserver, 0) == 0);
for (unsigned i = 0; i < 64; i++) {
char hostname[64];
snprintf(hostname, sizeof(hostname), "pending-%u.invalid", i);
resolv_start(hostname, htons(443), resolved, released, &results[i]);
}
ev_run(loop, EVRUN_NOWAIT);
resolv_shutdown(loop);
for (unsigned i = 0; i < 64; i++) {
assert(results[i].called == 1);
assert(results[i].freed == 1);
}
assert(ev_run(loop, EVRUN_NOWAIT) == 0);
}
ev_loop_destroy(loop);
ss_socket_close(sink);
return 0;
}