src/test/resolve.c
author Tero Marttila <terom@fixme.fi>
Thu, 07 May 2009 18:11:50 +0300
changeset 184 2ab01ab33cfa
permissions -rw-r--r--
test/resolve.c, and fix AI_* -> NI_* bug in call to getnameinfo
#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);
}