#include "../resolve.h"
#include "test.h"
void test_resolve_addr (void)
{
struct addrinfo ai;
struct sockaddr_in sa_in;
struct sockaddr_in6 sa_in6;
log_debug("test IPv4 bind addr");
ai.ai_flags = 0;
sa_in.sin_family = ai.ai_family = AF_INET;
ai.ai_socktype = SOCK_STREAM;
ai.ai_protocol = 0;
sa_in.sin_port = htons(1234);
sa_in.sin_addr.s_addr = INADDR_ANY;
ai.ai_addrlen = sizeof(sa_in);
ai.ai_addr = (struct sockaddr *) &sa_in;
ai.ai_canonname = NULL;
ai.ai_next = NULL;
assert_strcmp(resolve_addr_text(&ai), "[0.0.0.0]:1234");
log_debug("test IPv6 remote");
sa_in6.sin6_family = ai.ai_family = AF_INET6;
sa_in6.sin6_port = htons(1234);
sa_in6.sin6_flowinfo = 0;
sa_in6.sin6_addr = in6addr_loopback;
sa_in6.sin6_scope_id = 0;
ai.ai_addrlen = sizeof(sa_in6);
ai.ai_addr = (struct sockaddr *) &sa_in6;
assert_strcmp(resolve_addr_text(&ai), "[::1]:1234");
}
void test_resolve_result (void)
{
struct resolve_result rr;
log_debug("resolve_result_init");
resolve_result_init(&rr);
log_debug("test resolve_result_next on empty result");
assert_null(resolve_result_next(&rr));
resolve_result_deinit(&rr);
}
void test_resolve (void)
{
struct resolve_result rr;
struct addrinfo *ai;
error_t err, err2;
log_debug("test resolve_addr on 0.0.0.0:1234 passive");
assert_success(resolve_addr(&rr, NULL, "1234", SOCK_STREAM, AI_PASSIVE, &err));
while ((ai = resolve_result_next(&rr))) {
if (ai->ai_family == AF_INET)
assert_strcmp(resolve_addr_text(ai), "[0.0.0.0]:1234");
else if (ai->ai_family == AF_INET6)
assert_strcmp(resolve_addr_text(ai), "[::]:1234");
else
assert(false);
}
resolve_result_deinit(&rr);
log_debug("test resolve_addr error");
SET_ERROR_EXTRA(&err2, ERR_GETADDRINFO, EAI_NONAME);
assert_err(resolve_addr(&rr, NULL, NULL, 0, 0, &err), ERR_GETADDRINFO);
assert_error(&err, &err2);
}