diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/sp/transport/tcp/tcp_test.c | 78 | ||||
| -rw-r--r-- | src/testing/acutest.h | 2 | ||||
| -rw-r--r-- | src/testing/marry.c | 13 | ||||
| -rw-r--r-- | src/testing/nuts.h | 8 | ||||
| -rw-r--r-- | src/testing/util.c | 34 |
5 files changed, 92 insertions, 43 deletions
diff --git a/src/sp/transport/tcp/tcp_test.c b/src/sp/transport/tcp/tcp_test.c index 482d4ff4..02a6b879 100644 --- a/src/sp/transport/tcp/tcp_test.c +++ b/src/sp/transport/tcp/tcp_test.c @@ -127,42 +127,6 @@ test_tcp_no_delay_option(void) NUTS_CLOSE(s); } -static bool -has_v6(void) -{ - nng_sockaddr sa; - nng_udp *u; - int rv; - - sa.s_in6.sa_family = NNG_AF_INET6; - sa.s_in6.sa_port = 0; - memset(sa.s_in6.sa_addr, 0, 16); - sa.s_in6.sa_addr[15] = 1; - - rv = nng_udp_open(&u, &sa); - if (rv == 0) { - nng_udp_close(u); - } - return (rv == 0 ? 1 : 0); -} - -void -test_tcp_ipv6(void) -{ - if (!has_v6()) { - NUTS_SKIP("No IPv6 support"); - return; - } - nng_socket s; - NUTS_OPEN(s); - // this should have a [::1] bracket - NUTS_FAIL(nng_dial(s, "tcp://::1", NULL, 0), NNG_EINVAL); - NUTS_FAIL(nng_dial(s, "tcp://::1:5055", NULL, 0), NNG_EINVAL); - // this requires a port, but otherwise its ok, so address is invalid - NUTS_FAIL(nng_dial(s, "tcp://[::1]", NULL, 0), NNG_EADDRINVAL); - NUTS_CLOSE(s); -} - void test_tcp_keep_alive_option(void) { @@ -270,12 +234,51 @@ check_props_v4(nng_msg *msg) } void +check_props_v6(nng_msg *msg) +{ + nng_pipe p; + size_t z; + nng_sockaddr la; + nng_sockaddr ra; + bool b; + uint8_t self[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; + + p = nng_msg_get_pipe(msg); + NUTS_TRUE(nng_pipe_id(p) > 0); + NUTS_PASS(nng_pipe_get_addr(p, NNG_OPT_LOCADDR, &la)); + NUTS_FAIL(nng_pipe_get_size(p, NNG_OPT_LOCADDR, &z), NNG_EBADTYPE); + NUTS_TRUE(la.s_family == NNG_AF_INET6); + NUTS_TRUE(la.s_in6.sa_port != 0); + NUTS_TRUE(memcmp(la.s_in6.sa_addr, self, 16) == 0); + + NUTS_PASS(nng_pipe_get_addr(p, NNG_OPT_REMADDR, &ra)); + NUTS_TRUE(ra.s_family == NNG_AF_INET6); + NUTS_TRUE(ra.s_in6.sa_port != 0); + NUTS_TRUE(memcmp(ra.s_in6.sa_addr, self, 16) == 0); + NUTS_TRUE(ra.s_in6.sa_port != la.s_in6.sa_port); + NUTS_FAIL(nng_pipe_get_size(p, NNG_OPT_REMADDR, &z), NNG_EBADTYPE); + + NUTS_PASS(nng_pipe_get_bool(p, NNG_OPT_TCP_KEEPALIVE, &b)); + NUTS_TRUE(b == false); // default + + NUTS_PASS(nng_pipe_get_bool(p, NNG_OPT_TCP_NODELAY, &b)); + NUTS_TRUE(b); // default +} + +void test_tcp_props_v4(void) { nuts_tran_msg_props("tcp4", check_props_v4); } +void +test_tcp_props_v6(void) +{ + nuts_tran_msg_props("tcp6", check_props_v6); +} + NUTS_DECLARE_TRAN_TESTS(tcp) +NUTS_DECLARE_TRAN_TESTS(tcp6) NUTS_TESTS = { NUTS_INSERT_TRAN_TESTS(tcp), @@ -287,7 +290,8 @@ NUTS_TESTS = { { "tcp no delay option", test_tcp_no_delay_option }, { "tcp keep alive option", test_tcp_keep_alive_option }, { "tcp recv max", test_tcp_recv_max }, - { "tcp ipv6", test_tcp_ipv6 }, { "tcp props v4", test_tcp_props_v4 }, + NUTS_INSERT_TRAN_TESTS(tcp6), + { "tcp props v6", test_tcp_props_v6 }, { NULL, NULL }, }; diff --git a/src/testing/acutest.h b/src/testing/acutest.h index b64f2f1d..e6efb120 100644 --- a/src/testing/acutest.h +++ b/src/testing/acutest.h @@ -332,6 +332,8 @@ void acutest_message_(const char* fmt, ...); void acutest_message_color_(int color, const char* fmt, ...); void acutest_dump_(const char* title, const void* addr, size_t size); void acutest_abort_(void) ACUTEST_ATTRIBUTE_(noreturn); +void ACUTEST_ATTRIBUTE_(format (printf, 3, 4)) +acutest_skip_(const char* file, int line, const char* fmt, ...); #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/src/testing/marry.c b/src/testing/marry.c index 7441468f..8cc94473 100644 --- a/src/testing/marry.c +++ b/src/testing/marry.c @@ -48,16 +48,19 @@ nuts_scratch_addr(const char *scheme, size_t sz, char *addr) if ((strncmp(scheme, "tcp", 3) == 0) || (strncmp(scheme, "tls", 3) == 0) || (strncmp(scheme, "udp", 3) == 0)) { + const char *ip = + strchr(scheme, '6') != NULL ? "[::1]" : "127.0.0.1"; (void) snprintf( - addr, sz, "%s://127.0.0.1:%u", scheme, nuts_next_port()); + addr, sz, "%s://%s:%u", scheme, ip, nuts_next_port()); return; } if (strncmp(scheme, "ws", 2) == 0) { - (void) snprintf(addr, sz, - "%s://127.0.0.1:%u/nuts%04x%04x%04x%04x", scheme, - nuts_next_port(), nng_random(), nng_random(), nng_random(), - nng_random()); + const char *ip = + strchr(scheme, '6') != NULL ? "[::1]" : "127.0.0.1"; + (void) snprintf(addr, sz, "%s://%s:%u/nuts%04x%04x%04x%04x", + scheme, ip, nuts_next_port(), nng_random(), nng_random(), + nng_random(), nng_random()); return; } diff --git a/src/testing/nuts.h b/src/testing/nuts.h index 0d3d4f7c..5fe193db 100644 --- a/src/testing/nuts.h +++ b/src/testing/nuts.h @@ -121,6 +121,14 @@ extern void nuts_tran_huge_msg(const char *scheme, size_t size); extern void nuts_tran_msg_props(const char *scheme, void (*check)(nng_msg *)); extern void nuts_tran_perf(const char *scheme); +#define NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme) \ + do { \ + if ((strchr(scheme, '6') != NULL) && (!nuts_has_ipv6())) { \ + NUTS_SKIP("No IPv6 support present"); \ + return; \ + } \ + } while (0) + #ifndef NUTS_TRAN_HUGE_MSG_SIZE #define NUTS_TRAN_HUGE_MSG_SIZE (1U << 20) #endif diff --git a/src/testing/util.c b/src/testing/util.c index 6aabe35f..045aacdf 100644 --- a/src/testing/util.c +++ b/src/testing/util.c @@ -9,6 +9,7 @@ // #include "nng/nng.h" +#include <stdbool.h> #define TEST_NO_MAIN #ifdef _WIN32 @@ -41,7 +42,7 @@ #include <poll.h> #endif -#include "nuts.h" +#include <nuts.h> uint64_t nuts_clock(void) @@ -171,6 +172,25 @@ nuts_sleep(int msec) #define NUTS_COLOR_GREEN_INTENSIVE_ 4 #define NUTS_COLOR_RED_INTENSIVE_ 5 +bool +nuts_has_ipv6(void) +{ + nng_sockaddr sa; + nng_udp *u; + int rv; + + sa.s_in6.sa_family = NNG_AF_INET6; + sa.s_in6.sa_port = 0; + memset(sa.s_in6.sa_addr, 0, 16); + sa.s_in6.sa_addr[15] = 1; + + rv = nng_udp_open(&u, &sa); + if (rv == 0) { + nng_udp_close(u); + } + return (rv == 0 ? 1 : 0); +} + void nuts_set_logger(int level) { @@ -222,6 +242,7 @@ nuts_tran_conn_refused(const char *scheme) nng_dialer d = NNG_DIALER_INITIALIZER; const char *addr; + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); NUTS_ADDR(addr, scheme); NUTS_OPEN(s); NUTS_FAIL(nng_dial(s, addr, &d, 0), NNG_ECONNREFUSED); @@ -236,6 +257,7 @@ nuts_tran_dialer_cancel(const char *scheme) nng_dialer d = NNG_DIALER_INITIALIZER; const char *addr; + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); NUTS_ADDR(addr, scheme); NUTS_OPEN(s); NUTS_PASS(nng_dial(s, addr, &d, NNG_FLAG_NONBLOCK)); @@ -251,6 +273,7 @@ nuts_tran_dialer_closed(const char *scheme) nng_dialer d = NNG_DIALER_INITIALIZER; const char *addr; + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); NUTS_ADDR(addr, scheme); NUTS_OPEN(s); NUTS_PASS(nng_dialer_create(&d, s, addr)); @@ -268,6 +291,7 @@ nuts_tran_duplicate_listen(const char *scheme) nng_listener l2 = NNG_LISTENER_INITIALIZER; const char *addr; + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); NUTS_ADDR(addr, scheme); NUTS_OPEN(s); NUTS_PASS(nng_listen(s, addr, &l1, 0)); @@ -284,6 +308,7 @@ nuts_tran_listener_cancel(const char *scheme) nng_listener l = NNG_LISTENER_INITIALIZER; const char *addr; + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); NUTS_ADDR(addr, scheme); NUTS_OPEN(s); NUTS_PASS(nng_listen(s, addr, &l, 0)); @@ -299,6 +324,7 @@ nuts_tran_listener_closed(const char *scheme) nng_listener l = NNG_LISTENER_INITIALIZER; const char *addr; + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); NUTS_ADDR(addr, scheme); NUTS_OPEN(s); NUTS_PASS(nng_listener_create(&l, s, addr)); @@ -318,6 +344,7 @@ nuts_tran_listen_accept(const char *scheme) nng_dialer d2 = NNG_LISTENER_INITIALIZER; const char *addr; + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); NUTS_ADDR(addr, scheme); NUTS_OPEN(s1); NUTS_OPEN(s2); @@ -345,6 +372,7 @@ nuts_tran_exchange(const char *scheme) nng_dialer d1 = NNG_LISTENER_INITIALIZER; const char *addr; + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); NUTS_ADDR(addr, scheme); NUTS_OPEN(s1); NUTS_OPEN(s2); @@ -378,6 +406,7 @@ nuts_tran_pipe_id(const char *scheme) nng_pipe p1; nng_pipe p2; + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); NUTS_ADDR(addr, scheme); NUTS_OPEN(s1); NUTS_OPEN(s2); @@ -419,6 +448,7 @@ nuts_tran_huge_msg(const char *scheme, size_t size) buf = nng_alloc(size); + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); NUTS_ADDR(addr, scheme); NUTS_OPEN(s1); NUTS_OPEN(s2); @@ -460,6 +490,7 @@ nuts_tran_msg_props(const char *scheme, void (*check)(nng_msg *)) const char *addr; nng_msg *msg; + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); NUTS_ADDR(addr, scheme); NUTS_OPEN(s1); NUTS_OPEN(s2); @@ -488,6 +519,7 @@ nuts_tran_perf(const char *scheme) const char *addr; nng_msg *msg; + NUTS_SKIP_IF_IPV6_NEEDED_AND_ABSENT(scheme); nuts_set_logger(NNG_LOG_NOTICE); NUTS_OPEN(s1); NUTS_OPEN(s2); |
