aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2024-11-30 13:36:34 -0500
committerGarrett D'Amore <garrett@damore.org>2024-11-30 13:36:34 -0500
commit02d6b0bb28f6c964477a2362860e37a27d13d8d9 (patch)
treef93ba70eed56b60c61b9a65db73beb5485130156
parentc3196eac2be29a7b90304b4f9f377c03d9e6d6d8 (diff)
downloadnng-02d6b0bb28f6c964477a2362860e37a27d13d8d9.tar.gz
nng-02d6b0bb28f6c964477a2362860e37a27d13d8d9.tar.bz2
nng-02d6b0bb28f6c964477a2362860e37a27d13d8d9.zip
tests: convert TCPv6 transport test to NUTS (and consolidate with v4)
-rw-r--r--src/sp/transport/tcp/tcp_test.c78
-rw-r--r--src/testing/acutest.h2
-rw-r--r--src/testing/marry.c13
-rw-r--r--src/testing/nuts.h8
-rw-r--r--src/testing/util.c34
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/tcp6.c78
7 files changed, 92 insertions, 122 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);
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 4e1d2331..62b64167 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -132,7 +132,6 @@ add_nng_test(nonblock 60)
add_nng_test(scalability 20 ON)
add_nng_test(synch 5)
add_nng_test(tcpsupp 10)
-add_nng_test(tcp6 60)
add_nng_test(ws 30)
add_nng_test(wss 30)
add_nng_test1(zt 60 NNG_TRANSPORT_ZEROTIER)
diff --git a/tests/tcp6.c b/tests/tcp6.c
deleted file mode 100644
index a3ce919b..00000000
--- a/tests/tcp6.c
+++ /dev/null
@@ -1,78 +0,0 @@
-//
-// Copyright 2022 Staysail Systems, Inc. <info@staystail.tech>
-// Copyright 2018 Capitar IT Group BV <info@capitar.com>
-//
-// This software is supplied under the terms of the MIT License, a
-// copy of which should be located in the distribution where this
-// file was obtained (LICENSE.txt). A copy of the license may also be
-// found online at https://opensource.org/licenses/MIT.
-//
-
-// TCP tests for IPv6.
-
-#include <nng/nng.h>
-#include <nng/protocol/pair1/pair.h>
-
-#include "convey.h"
-#include "core/nng_impl.h"
-#include "trantest.h"
-
-#include "stubs.h"
-
-static int
-has_v6(void)
-{
- nng_sockaddr sa;
- nni_plat_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 = nni_plat_udp_open(&u, &sa);
- if (rv == 0) {
- nni_plat_udp_close(u);
- }
- return (rv == 0 ? 1 : 0);
-}
-
-static int
-check_props_v6(nng_msg *msg)
-{
- nng_pipe p;
- uint8_t loopback[16];
-
- memset(loopback, 0, sizeof(loopback));
- loopback[15] = 1;
-
- // IPv6 Local address property works
- nng_sockaddr la;
- p = nng_msg_get_pipe(msg);
- So(nng_pipe_id(p) > 0);
- So(nng_pipe_get_addr(p, NNG_OPT_LOCADDR, &la) == 0);
- So(la.s_family == NNG_AF_INET6);
- // So(la.s_in.sa_port == (trantest_port - 1));
- So(la.s_in6.sa_port != 0);
- So(memcmp(la.s_in6.sa_addr, loopback, 16) == 0);
-
- // IPv6 Remote address property works
- nng_sockaddr ra;
- p = nng_msg_get_pipe(msg);
- So(nng_pipe_id(p) > 0);
- So(nng_pipe_get_addr(p, NNG_OPT_REMADDR, &ra) == 0);
- So(ra.s_family == NNG_AF_INET6);
- So(ra.s_in6.sa_port != 0);
- So(memcmp(ra.s_in6.sa_addr, loopback, 16) == 0);
-
- return (0);
-}
-
-TestMain("TCP (IPv6) Transport", {
- if (has_v6()) {
- trantest_test_extended("tcp://[::1]:", check_props_v6);
- } else {
- SkipSo("IPv6 not available");
- }
-})