Files
shadowsocks-libev/tests/test_resolv.c
Max Lv bdc77408cb Rename to shadowsocks-c with libuv, async DNS and CI lint (#3051)
Rename the project to shadowsocks-c while retaining ss-* commands, the embedding ABI, and legacy library/package lookup compatibility.

Replace libev with bundled libuv for IOCP/kqueue event backends, expand asynchronous runtime DNS coverage, and add actionlint/Ruff with strict clang-tidy failure handling. Validate native platforms, static builds, packaging, interoperability, sanitizers, and canonical/legacy consumers.

All 22 hosted checks pass at reviewed head a8493250eb.
2026-09-11 14:18:37 +08:00

57 lines
1.9 KiB
C

/* Exercise real c-ares cancellation with outstanding A and AAAA requests. */
#include "test_helpers.h"
#include "ss_event.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 ss_loop *loop = ss_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]);
}
ss_run(loop, SS_RUN_NOWAIT);
resolv_shutdown(loop);
for (unsigned i = 0; i < 64; i++) {
assert(results[i].called == 1);
assert(results[i].freed == 1);
}
assert(ss_run(loop, SS_RUN_NOWAIT) == 0);
}
ss_loop_destroy(loop);
ss_socket_close(sink);
return 0;
}