diff options
Diffstat (limited to 'src/testing')
| -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 |
4 files changed, 51 insertions, 6 deletions
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); |
