aboutsummaryrefslogtreecommitdiff
path: root/src/transport
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2020-11-16 20:44:29 -0800
committerGarrett D'Amore <garrett@damore.org>2020-11-18 21:05:16 -0800
commitb826bfc171d90f8bde7bd672c0ac14201b8b2742 (patch)
tree5c416487f24104e6305a797af31c5e8b1aab99d1 /src/transport
parentcda4885676f009e2e7f2ad5e6c52743efc8b8924 (diff)
downloadnng-b826bfc171d90f8bde7bd672c0ac14201b8b2742.tar.gz
nng-b826bfc171d90f8bde7bd672c0ac14201b8b2742.tar.bz2
nng-b826bfc171d90f8bde7bd672c0ac14201b8b2742.zip
Work for test refactoring.
There are a few major areas in this change. * CMake options are now located in a common cmake/NNGOptions.cmake file. This should make it easier for folks to figure out what the options are, and how they are used. * Tests are now scoped with their directory name, which should avoid possible name collisions with test names. * A number of tests have been either moved or incorporated into the newer testutil/acutest framework. We are moving away from my old c-convey framework to something easier to debug. * We use CMake directories a bit more extensively leading to a much cleaner CMake structure. It's not complete, but a big step in the right direction, and a preview of future work. * Tests are now run with verbose flags, so we get more test results in the CI/CD logs.
Diffstat (limited to 'src/transport')
-rw-r--r--src/transport/CMakeLists.txt19
-rw-r--r--src/transport/inproc/CMakeLists.txt5
-rw-r--r--src/transport/ipc/CMakeLists.txt3
-rw-r--r--src/transport/ipc/ipc_test.c50
-rw-r--r--src/transport/tcp/CMakeLists.txt8
-rw-r--r--src/transport/tcp/tcp_test.c304
-rw-r--r--src/transport/tls/CMakeLists.txt3
-rw-r--r--src/transport/ws/CMakeLists.txt12
-rw-r--r--src/transport/ws/ws_test.c42
-rw-r--r--src/transport/zerotier/CMakeLists.txt2
10 files changed, 397 insertions, 51 deletions
diff --git a/src/transport/CMakeLists.txt b/src/transport/CMakeLists.txt
new file mode 100644
index 00000000..add8a9c9
--- /dev/null
+++ b/src/transport/CMakeLists.txt
@@ -0,0 +1,19 @@
+#
+# Copyright 2020 Staysail Systems, Inc. <info@staystail.tech>
+#
+# 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.
+#
+
+# Transports.
+nng_directory(transport)
+
+add_subdirectory(inproc)
+add_subdirectory(ipc)
+add_subdirectory(tcp)
+add_subdirectory(tls)
+add_subdirectory(ws)
+add_subdirectory(zerotier)
+
diff --git a/src/transport/inproc/CMakeLists.txt b/src/transport/inproc/CMakeLists.txt
index e440fe31..317686bb 100644
--- a/src/transport/inproc/CMakeLists.txt
+++ b/src/transport/inproc/CMakeLists.txt
@@ -1,5 +1,5 @@
#
-# Copyright 2019 Staysail Systems, Inc. <info@staysail.tech>
+# Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
# Copyright 2018 Capitar IT Group BV <info@capitar.com>
#
# This software is supplied under the terms of the MIT License, a
@@ -9,8 +9,7 @@
#
# inproc protocol
-option (NNG_TRANSPORT_INPROC "Enable inproc transport." ON)
-mark_as_advanced(NNG_TRANSPORT_INPROC)
+nng_directory(inproc)
nng_sources_if(NNG_TRANSPORT_INPROC inproc.c)
nng_headers_if(NNG_TRANSPORT_INPROC nng/transport/inproc/inproc.h)
diff --git a/src/transport/ipc/CMakeLists.txt b/src/transport/ipc/CMakeLists.txt
index 00e81d54..c9927f75 100644
--- a/src/transport/ipc/CMakeLists.txt
+++ b/src/transport/ipc/CMakeLists.txt
@@ -9,8 +9,7 @@
#
# ipc protocol
-option (NNG_TRANSPORT_IPC "Enable IPC transport." ON)
-mark_as_advanced(NNG_TRANSPORT_IPC)
+nng_directory(ipc)
nng_sources_if(NNG_TRANSPORT_IPC ipc.c)
nng_headers_if(NNG_TRANSPORT_IPC nng/transport/ipc/ipc.h)
diff --git a/src/transport/ipc/ipc_test.c b/src/transport/ipc/ipc_test.c
index 7bf3d2ec..3240b21d 100644
--- a/src/transport/ipc/ipc_test.c
+++ b/src/transport/ipc/ipc_test.c
@@ -1,5 +1,6 @@
//
// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2018 Cody Piersall <cody.piersall@gmail.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
@@ -107,27 +108,24 @@ test_ipc_listener_perms(void)
TEST_NNG_PASS(nng_listener_create(&l, s, addr));
#ifdef _WIN32
- TEST_NNG_FAIL(
- nng_listener_setopt_int(l, NNG_OPT_IPC_PERMISSIONS, 0444),
+ TEST_NNG_FAIL(nng_listener_set_int(l, NNG_OPT_IPC_PERMISSIONS, 0444),
NNG_ENOTSUP);
#else
path = &addr[strlen("ipc://")];
// Attempt to set invalid permissions fails.
TEST_NNG_FAIL(
- nng_listener_setopt_int(l, NNG_OPT_IPC_PERMISSIONS, S_IFREG),
+ nng_listener_set_int(l, NNG_OPT_IPC_PERMISSIONS, S_IFREG),
NNG_EINVAL);
- TEST_NNG_PASS(
- nng_listener_setopt_int(l, NNG_OPT_IPC_PERMISSIONS, 0444));
+ TEST_NNG_PASS(nng_listener_set_int(l, NNG_OPT_IPC_PERMISSIONS, 0444));
TEST_NNG_PASS(nng_listener_start(l, 0));
TEST_CHECK(stat(path, &st) == 0);
TEST_CHECK((st.st_mode & 0777) == 0444);
// Now that it's running, we cannot set it.
TEST_NNG_FAIL(
- nng_listener_setopt_int(l, NNG_OPT_IPC_PERMISSIONS, 0644),
- NNG_EBUSY);
+ nng_listener_set_int(l, NNG_OPT_IPC_PERMISSIONS, 0644), NNG_EBUSY);
#endif
TEST_NNG_PASS(nng_close(s));
@@ -146,19 +144,19 @@ test_ipc_listener_properties(void)
TEST_NNG_PASS(nng_pair0_open(&s));
TEST_NNG_PASS(nng_listen(s, addr, &l, 0));
- TEST_NNG_PASS(nng_listener_getopt_sockaddr(l, NNG_OPT_LOCADDR, &sa));
+ TEST_NNG_PASS(nng_listener_get_addr(l, NNG_OPT_LOCADDR, &sa));
TEST_CHECK(sa.s_ipc.sa_family == NNG_AF_IPC);
TEST_STREQUAL(sa.s_ipc.sa_path, addr + strlen("ipc://"));
- TEST_NNG_FAIL(nng_listener_setopt(l, NNG_OPT_LOCADDR, &sa, sizeof(sa)),
+ TEST_NNG_FAIL(nng_listener_set(l, NNG_OPT_LOCADDR, &sa, sizeof(sa)),
NNG_EREADONLY);
z = 8192;
- TEST_NNG_PASS(nng_listener_setopt_size(l, NNG_OPT_RECVMAXSZ, z));
+ TEST_NNG_PASS(nng_listener_set_size(l, NNG_OPT_RECVMAXSZ, z));
z = 0;
- TEST_NNG_PASS(nng_listener_getopt_size(l, NNG_OPT_RECVMAXSZ, &z));
+ TEST_NNG_PASS(nng_listener_get_size(l, NNG_OPT_RECVMAXSZ, &z));
TEST_CHECK(z == 8192);
TEST_NNG_FAIL(
- nng_listener_setopt_bool(l, NNG_OPT_RAW, true), NNG_ENOTSUP);
+ nng_listener_set_bool(l, NNG_OPT_RAW, true), NNG_ENOTSUP);
TEST_NNG_PASS(nng_close(s));
}
@@ -242,10 +240,10 @@ test_abstract_auto_bind(void)
TEST_NNG_PASS(nng_pair0_open(&s1));
TEST_NNG_PASS(nng_pair0_open(&s2));
- TEST_NNG_PASS(nng_setopt_ms(s1, NNG_OPT_SENDTIMEO, 1000));
- TEST_NNG_PASS(nng_setopt_ms(s2, NNG_OPT_SENDTIMEO, 1000));
- TEST_NNG_PASS(nng_setopt_ms(s1, NNG_OPT_RECVTIMEO, 1000));
- TEST_NNG_PASS(nng_setopt_ms(s2, NNG_OPT_RECVTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s1, NNG_OPT_SENDTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s2, NNG_OPT_SENDTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s1, NNG_OPT_RECVTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s2, NNG_OPT_RECVTIMEO, 1000));
TEST_NNG_PASS(nng_listen(s1, addr, &l, 0));
TEST_NNG_PASS(nng_listener_get_addr(l, NNG_OPT_LOCADDR, &sa));
@@ -287,8 +285,8 @@ test_abstract_too_long(void)
TEST_ASSERT(strlen(addr) == 255);
TEST_NNG_PASS(nng_pair0_open(&s1));
- TEST_NNG_PASS(nng_setopt_ms(s1, NNG_OPT_SENDTIMEO, 1000));
- TEST_NNG_PASS(nng_setopt_ms(s1, NNG_OPT_RECVTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s1, NNG_OPT_SENDTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s1, NNG_OPT_RECVTIMEO, 1000));
TEST_NNG_FAIL(nng_listen(s1, addr, NULL, 0), NNG_EADDRINVAL);
TEST_NNG_FAIL(
nng_dial(s1, addr, NULL, NNG_FLAG_NONBLOCK), NNG_EADDRINVAL);
@@ -317,10 +315,10 @@ test_abstract_null(void)
TEST_NNG_PASS(nng_pair0_open(&s1));
TEST_NNG_PASS(nng_pair0_open(&s2));
- TEST_NNG_PASS(nng_setopt_ms(s1, NNG_OPT_SENDTIMEO, 1000));
- TEST_NNG_PASS(nng_setopt_ms(s2, NNG_OPT_SENDTIMEO, 1000));
- TEST_NNG_PASS(nng_setopt_ms(s1, NNG_OPT_RECVTIMEO, 1000));
- TEST_NNG_PASS(nng_setopt_ms(s2, NNG_OPT_RECVTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s1, NNG_OPT_SENDTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s2, NNG_OPT_SENDTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s1, NNG_OPT_RECVTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s2, NNG_OPT_RECVTIMEO, 1000));
TEST_NNG_PASS(nng_listen(s1, addr, &l, 0));
TEST_NNG_PASS(nng_listener_get_addr(l, NNG_OPT_LOCADDR, &sa));
@@ -372,10 +370,10 @@ test_unix_alias(void)
TEST_NNG_PASS(nng_pair0_open(&s1));
TEST_NNG_PASS(nng_pair0_open(&s2));
- TEST_NNG_PASS(nng_setopt_ms(s1, NNG_OPT_SENDTIMEO, 1000));
- TEST_NNG_PASS(nng_setopt_ms(s2, NNG_OPT_SENDTIMEO, 1000));
- TEST_NNG_PASS(nng_setopt_ms(s1, NNG_OPT_RECVTIMEO, 1000));
- TEST_NNG_PASS(nng_setopt_ms(s2, NNG_OPT_RECVTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s1, NNG_OPT_SENDTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s2, NNG_OPT_SENDTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s1, NNG_OPT_RECVTIMEO, 1000));
+ TEST_NNG_PASS(nng_socket_set_ms(s2, NNG_OPT_RECVTIMEO, 1000));
TEST_NNG_PASS(nng_listen(s1, addr1, NULL, 0));
TEST_NNG_PASS(nng_dial(s2, addr2, NULL, 0));
diff --git a/src/transport/tcp/CMakeLists.txt b/src/transport/tcp/CMakeLists.txt
index f3daa0a4..d6022329 100644
--- a/src/transport/tcp/CMakeLists.txt
+++ b/src/transport/tcp/CMakeLists.txt
@@ -1,5 +1,5 @@
#
-# Copyright 2019 Staysail Systems, Inc. <info@staysail.tech>
+# Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
# Copyright 2018 Capitar IT Group BV <info@capitar.com>
#
# This software is supplied under the terms of the MIT License, a
@@ -9,9 +9,9 @@
#
# TCP protocol
-option (NNG_TRANSPORT_TCP "Enable TCP transport." ON)
-mark_as_advanced(NNG_TRANSPORT_TCP)
+nng_directory(tcp)
nng_sources_if(NNG_TRANSPORT_TCP tcp.c)
nng_headers_if(NNG_TRANSPORT_TCP nng/transport/tcp/tcp.h)
-nng_defines_if(NNG_TRANSPORT_TCP NNG_TRANSPORT_TCP) \ No newline at end of file
+nng_defines_if(NNG_TRANSPORT_TCP NNG_TRANSPORT_TCP)
+nng_test(tcp_test) \ No newline at end of file
diff --git a/src/transport/tcp/tcp_test.c b/src/transport/tcp/tcp_test.c
new file mode 100644
index 00000000..88b77ab4
--- /dev/null
+++ b/src/transport/tcp/tcp_test.c
@@ -0,0 +1,304 @@
+//
+// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2018 Capitar IT Group BV <info@capitar.com>
+// Copyright 2018 Devolutions <info@devolutions.net>
+// Copyright 2018 Cody Piersall <cody.piersall@gmail.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.
+//
+
+#include <nng/nng.h>
+#include <nng/protocol/pair0/pair.h>
+#include <nng/supplemental/util/platform.h>
+
+#include <acutest.h>
+#include <testutil.h>
+
+// TCP tests.
+
+static void
+test_tcp_wild_card_connect_fail(void)
+{
+ nng_socket s;
+ char addr[NNG_MAXADDRLEN];
+
+ TEST_NNG_PASS(nng_pair0_open(&s));
+ (void) snprintf(
+ addr, sizeof(addr), "tcp://*:%u", testutil_next_port());
+ TEST_NNG_FAIL(nng_dial(s, addr, NULL, 0), NNG_EADDRINVAL);
+ TEST_NNG_PASS(nng_close(s));
+}
+
+void
+test_tcp_wild_card_bind(void)
+{
+ nng_socket s1;
+ nng_socket s2;
+ char addr[NNG_MAXADDRLEN];
+ uint16_t port;
+
+ port = testutil_next_port();
+
+ TEST_NNG_PASS(nng_pair0_open(&s1));
+ TEST_NNG_PASS(nng_pair0_open(&s2));
+ (void) snprintf(addr, sizeof(addr), "tcp4://*:%u", port);
+ TEST_NNG_PASS(nng_listen(s1, addr, NULL, 0));
+ // reset port back one
+ (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+ TEST_NNG_PASS(nng_dial(s2, addr, NULL, 0));
+ TEST_NNG_PASS(nng_close(s2));
+ TEST_NNG_PASS(nng_close(s1));
+}
+
+void
+test_tcp_local_address_connect(void)
+{
+
+ nng_socket s1;
+ nng_socket s2;
+ char addr[NNG_MAXADDRLEN];
+ uint16_t port;
+
+ TEST_NNG_PASS(nng_pair0_open(&s1));
+ TEST_NNG_PASS(nng_pair0_open(&s2));
+ port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+ TEST_NNG_PASS(nng_listen(s1, addr, NULL, 0));
+ // reset port back one
+ (void) snprintf(
+ addr, sizeof(addr), "tcp://127.0.0.1;127.0.0.1:%u", port);
+ TEST_NNG_PASS(nng_dial(s2, addr, NULL, 0));
+ TEST_NNG_PASS(nng_close(s2));
+ TEST_NNG_PASS(nng_close(s1));
+}
+
+void
+test_tcp_port_zero_bind(void)
+{
+ nng_socket s1;
+ nng_socket s2;
+ nng_sockaddr sa;
+ nng_listener l;
+ char * addr;
+
+ TEST_NNG_PASS(nng_pair0_open(&s1));
+ TEST_NNG_PASS(nng_pair_open(&s2));
+ TEST_NNG_PASS(nng_listen(s1, "tcp://127.0.0.1:0", &l, 0));
+ TEST_NNG_PASS(nng_listener_get_string(l, NNG_OPT_URL, &addr));
+ TEST_CHECK(memcmp(addr, "tcp://", 6) == 0);
+ TEST_NNG_PASS(nng_listener_get_addr(l, NNG_OPT_LOCADDR, &sa));
+ TEST_CHECK(sa.s_in.sa_family == NNG_AF_INET);
+ TEST_CHECK(sa.s_in.sa_port != 0);
+ TEST_CHECK(sa.s_in.sa_addr = testutil_htonl(0x7f000001));
+ TEST_NNG_PASS(nng_dial(s2, addr, NULL, 0));
+ nng_strfree(addr);
+ TEST_NNG_PASS(nng_close(s2));
+ TEST_NNG_PASS(nng_close(s1));
+}
+
+void
+test_tcp_bad_local_interface(void)
+{
+ nng_socket s1;
+
+ TEST_NNG_PASS(nng_pair0_open(&s1));
+ TEST_NNG_FAIL(nng_dial(s1, "tcp://bogus1;127.0.0.1:80", NULL, 0),
+ NNG_EADDRINVAL);
+ TEST_NNG_PASS(nng_close(s1));
+}
+
+void
+test_tcp_non_local_address(void)
+{
+ nng_socket s1;
+
+ TEST_NNG_PASS(nng_pair0_open(&s1));
+ TEST_NNG_FAIL(nng_dial(s1, "tcp://8.8.8.8;127.0.0.1:80", NULL, 0),
+ NNG_EADDRINVAL);
+ TEST_NNG_PASS(nng_close(s1));
+}
+
+void
+test_tcp_malformed_address(void)
+{
+ nng_socket s1;
+
+ TEST_NNG_PASS(nng_pair0_open(&s1));
+ TEST_NNG_FAIL(
+ nng_dial(s1, "tcp://127.0.0.1", NULL, 0), NNG_EADDRINVAL);
+ TEST_NNG_FAIL(
+ nng_dial(s1, "tcp://127.0.0.1.32", NULL, 0), NNG_EADDRINVAL);
+ TEST_NNG_FAIL(
+ nng_dial(s1, "tcp://127.0.x.1.32", NULL, 0), NNG_EADDRINVAL);
+ TEST_NNG_FAIL(
+ nng_listen(s1, "tcp://127.0.0.1.32", NULL, 0), NNG_EADDRINVAL);
+ TEST_NNG_FAIL(
+ nng_listen(s1, "tcp://127.0.x.1.32", NULL, 0), NNG_EADDRINVAL);
+ TEST_NNG_PASS(nng_close(s1));
+}
+
+void
+test_tcp_no_delay_option(void)
+{
+ nng_socket s;
+ nng_dialer d;
+ nng_listener l;
+ bool v;
+ int x;
+ char addr[64];
+
+ testutil_scratch_addr("tcp", sizeof(addr), addr);
+
+ TEST_NNG_PASS(nng_pair0_open(&s));
+#ifndef NNG_ELIDE_DEPRECATED
+ TEST_NNG_PASS(nng_socket_get_bool(s, NNG_OPT_TCP_NODELAY, &v));
+ TEST_CHECK(v == true);
+#endif
+ TEST_NNG_PASS(nng_dialer_create(&d, s, addr));
+ TEST_NNG_PASS(nng_dialer_get_bool(d, NNG_OPT_TCP_NODELAY, &v));
+ TEST_CHECK(v == true);
+ TEST_NNG_PASS(nng_dialer_set_bool(d, NNG_OPT_TCP_NODELAY, false));
+ TEST_NNG_PASS(nng_dialer_get_bool(d, NNG_OPT_TCP_NODELAY, &v));
+ TEST_CHECK(v == false);
+ TEST_NNG_FAIL(
+ nng_dialer_get_int(d, NNG_OPT_TCP_NODELAY, &x), NNG_EBADTYPE);
+ x = 0;
+ TEST_NNG_FAIL(
+ nng_dialer_set_int(d, NNG_OPT_TCP_NODELAY, x), NNG_EBADTYPE);
+ // This assumes sizeof (bool) != sizeof (int)
+ if (sizeof(bool) != sizeof(int)) {
+ TEST_NNG_FAIL(
+ nng_dialer_set(d, NNG_OPT_TCP_NODELAY, &x, sizeof(x)),
+ NNG_EINVAL);
+ }
+
+ TEST_NNG_PASS(nng_listener_create(&l, s, addr));
+ TEST_NNG_PASS(nng_listener_get_bool(l, NNG_OPT_TCP_NODELAY, &v));
+ TEST_CHECK(v == true);
+ x = 0;
+ TEST_NNG_FAIL(
+ nng_listener_set_int(l, NNG_OPT_TCP_NODELAY, x), NNG_EBADTYPE);
+ // This assumes sizeof (bool) != sizeof (int)
+ TEST_NNG_FAIL(nng_listener_set(l, NNG_OPT_TCP_NODELAY, &x, sizeof(x)),
+ NNG_EINVAL);
+
+ TEST_NNG_PASS(nng_dialer_close(d));
+ TEST_NNG_PASS(nng_listener_close(l));
+
+ // Make sure socket wide defaults apply.
+#ifndef NNG_ELIDE_DEPRECATED
+ TEST_NNG_PASS(nng_socket_set_bool(s, NNG_OPT_TCP_NODELAY, true));
+ v = false;
+ TEST_NNG_PASS(nng_socket_get_bool(s, NNG_OPT_TCP_NODELAY, &v));
+ TEST_CHECK(v == true);
+ TEST_NNG_PASS(nng_socket_set_bool(s, NNG_OPT_TCP_NODELAY, false));
+ TEST_NNG_PASS(nng_dialer_create(&d, s, addr));
+ TEST_NNG_PASS(nng_dialer_get_bool(d, NNG_OPT_TCP_NODELAY, &v));
+ TEST_CHECK(v == false);
+#endif
+ TEST_NNG_PASS(nng_close(s));
+}
+
+void
+test_tcp_keep_alive_option(void)
+{
+ nng_socket s;
+ nng_dialer d;
+ nng_listener l;
+ bool v;
+ int x;
+ char addr[64];
+
+ testutil_scratch_addr("tcp", sizeof(addr), addr);
+ TEST_NNG_PASS(nng_pair0_open(&s));
+#ifndef NNG_ELIDE_DEPRECATED
+ TEST_NNG_PASS(nng_socket_get_bool(s, NNG_OPT_TCP_KEEPALIVE, &v));
+ TEST_CHECK(v == false);
+#endif
+ TEST_NNG_PASS(nng_dialer_create(&d, s, addr));
+ TEST_NNG_PASS(nng_dialer_get_bool(d, NNG_OPT_TCP_KEEPALIVE, &v));
+ TEST_CHECK(v == false);
+ TEST_NNG_PASS(nng_dialer_set_bool(d, NNG_OPT_TCP_KEEPALIVE, true));
+ TEST_NNG_PASS(nng_dialer_get_bool(d, NNG_OPT_TCP_KEEPALIVE, &v));
+ TEST_CHECK(v == true);
+ TEST_NNG_FAIL(
+ nng_dialer_get_int(d, NNG_OPT_TCP_KEEPALIVE, &x), NNG_EBADTYPE);
+ x = 1;
+ TEST_NNG_FAIL(
+ nng_dialer_set_int(d, NNG_OPT_TCP_KEEPALIVE, x), NNG_EBADTYPE);
+
+ TEST_NNG_PASS(nng_listener_create(&l, s, addr));
+ TEST_NNG_PASS(nng_listener_get_bool(l, NNG_OPT_TCP_KEEPALIVE, &v));
+ TEST_CHECK(v == false);
+ x = 1;
+ TEST_NNG_FAIL(
+ nng_listener_set_int(l, NNG_OPT_TCP_KEEPALIVE, x), NNG_EBADTYPE);
+
+ TEST_NNG_PASS(nng_dialer_close(d));
+ TEST_NNG_PASS(nng_listener_close(l));
+
+ // Make sure socket wide defaults apply.
+#ifndef NNG_ELIDE_DEPRECATED
+ TEST_NNG_PASS(nng_socket_set_bool(s, NNG_OPT_TCP_KEEPALIVE, false));
+ v = true;
+ TEST_NNG_PASS(nng_socket_get_bool(s, NNG_OPT_TCP_KEEPALIVE, &v));
+ TEST_CHECK(v == false);
+ TEST_NNG_PASS(nng_socket_set_bool(s, NNG_OPT_TCP_KEEPALIVE, true));
+ TEST_NNG_PASS(nng_dialer_create(&d, s, addr));
+ TEST_NNG_PASS(nng_dialer_get_bool(d, NNG_OPT_TCP_KEEPALIVE, &v));
+ TEST_CHECK(v == true);
+#endif
+ TEST_NNG_PASS(nng_close(s));
+}
+
+void
+test_tcp_recv_max(void)
+{
+ char msg[256];
+ char buf[256];
+ nng_socket s0;
+ nng_socket s1;
+ nng_listener l;
+ size_t sz;
+ char addr[64];
+
+ testutil_scratch_addr("tcp", sizeof(addr), addr);
+
+ TEST_NNG_PASS(nng_pair0_open(&s0));
+ TEST_NNG_PASS(nng_socket_set_ms(s0, NNG_OPT_RECVTIMEO, 100));
+ TEST_NNG_PASS(nng_socket_set_size(s0, NNG_OPT_RECVMAXSZ, 200));
+ TEST_NNG_PASS(nng_listener_create(&l, s0, addr));
+ TEST_NNG_PASS(nng_socket_get_size(s0, NNG_OPT_RECVMAXSZ, &sz));
+ TEST_CHECK(sz == 200);
+ TEST_NNG_PASS(nng_listener_set_size(l, NNG_OPT_RECVMAXSZ, 100));
+ TEST_NNG_PASS(nng_listener_start(l, 0));
+
+ TEST_NNG_PASS(nng_pair0_open(&s1));
+ TEST_NNG_PASS(nng_dial(s1, addr, NULL, 0));
+ TEST_NNG_PASS(nng_send(s1, msg, 95, 0));
+ TEST_NNG_PASS(nng_socket_set_ms(s1, NNG_OPT_SENDTIMEO, 100));
+ TEST_NNG_PASS(nng_recv(s0, buf, &sz, 0));
+ TEST_CHECK(sz == 95);
+ TEST_NNG_PASS(nng_send(s1, msg, 150, 0));
+ TEST_NNG_FAIL(nng_recv(s0, buf, &sz, 0), NNG_ETIMEDOUT);
+ TEST_NNG_PASS(nng_close(s0));
+ TEST_NNG_PASS(nng_close(s1));
+}
+
+TEST_LIST = {
+
+ { "tcp wild card connect fail", test_tcp_wild_card_connect_fail },
+ { "tcp wild card bind", test_tcp_wild_card_bind },
+ { "tcp port zero bind", test_tcp_port_zero_bind },
+ { "tcp local address connect", test_tcp_local_address_connect },
+ { "tcp bad local interface", test_tcp_bad_local_interface },
+ { "tcp non-local address", test_tcp_non_local_address },
+ { "tcp malformed address", test_tcp_malformed_address },
+ { "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 },
+ { NULL, NULL },
+}; \ No newline at end of file
diff --git a/src/transport/tls/CMakeLists.txt b/src/transport/tls/CMakeLists.txt
index d77a67cd..82f24c79 100644
--- a/src/transport/tls/CMakeLists.txt
+++ b/src/transport/tls/CMakeLists.txt
@@ -9,8 +9,7 @@
#
# TLS transport
-option (NNG_TRANSPORT_TLS "Enable TLS transport." ON)
-mark_as_advanced(NNG_TRANSPORT_TLS)
+nng_directory(tls)
nng_sources_if(NNG_TRANSPORT_TLS tls.c)
nng_headers_if(NNG_TRANSPORT_TLS nng/transport/tls/tls.h)
diff --git a/src/transport/ws/CMakeLists.txt b/src/transport/ws/CMakeLists.txt
index 8d8b5965..6e409b43 100644
--- a/src/transport/ws/CMakeLists.txt
+++ b/src/transport/ws/CMakeLists.txt
@@ -9,19 +9,9 @@
#
# WebSocket transport
-option (NNG_TRANSPORT_WS "Enable WebSocket transport." ON)
-mark_as_advanced(NNG_TRANSPORT_WS)
-
-CMAKE_DEPENDENT_OPTION(NNG_TRANSPORT_WSS "Enable WSS transport" ON
- "NNG_ENABLE_TLS" OFF)
-mark_as_advanced(NNG_TRANSPORT_WSS)
+nng_directory(ws)
if (NNG_TRANSPORT_WS OR NNG_TRANSPORT_WSS)
- # Make sure things we *MUST* have are enabled.
- set(NNG_SUPP_WEBSOCKET ON PARENT_SCOPE)
- set(NNG_SUPP_HTTP ON PARENT_SCOPE)
- set(NNG_SUPP_BASE64 ON PARENT_SCOPE)
- set(NNG_SUPP_SHA1 ON PARENT_SCOPE)
set(WS_ON ON)
endif()
diff --git a/src/transport/ws/ws_test.c b/src/transport/ws/ws_test.c
index 3a6e7fdf..f8f122a1 100644
--- a/src/transport/ws/ws_test.c
+++ b/src/transport/ws/ws_test.c
@@ -1,5 +1,6 @@
//
// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2018 Cody Piersall <cody.piersall@gmail.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
@@ -60,18 +61,18 @@ test_wild_card_port(void)
TEST_NNG_PASS(nng_pair0_open(&s6));
TEST_NNG_PASS(nng_listen(s1, "ws://127.0.0.1:0/one", &l1, 0));
TEST_NNG_PASS(
- nng_listener_getopt_int(l1, NNG_OPT_TCP_BOUND_PORT, &port1));
+ nng_listener_get_int(l1, NNG_OPT_TCP_BOUND_PORT, &port1));
TEST_CHECK(port1 != 0);
snprintf(ws_url, sizeof(ws_url), "ws4://127.0.0.1:%d/two", port1);
TEST_NNG_PASS(nng_listen(s2, ws_url, &l2, 0));
TEST_NNG_PASS(
- nng_listener_getopt_int(l2, NNG_OPT_TCP_BOUND_PORT, &port2));
+ nng_listener_get_int(l2, NNG_OPT_TCP_BOUND_PORT, &port2));
TEST_CHECK(port1 != 0);
TEST_CHECK(port1 == port2);
// Now try a different wild card port.
TEST_NNG_PASS(nng_listen(s3, "ws4://127.0.0.1:0/three", &l3, 0));
TEST_NNG_PASS(
- nng_listener_getopt_int(l3, NNG_OPT_TCP_BOUND_PORT, &port3));
+ nng_listener_get_int(l3, NNG_OPT_TCP_BOUND_PORT, &port3));
TEST_CHECK(port3 != 0);
TEST_CHECK(port3 != port1);
@@ -141,10 +142,45 @@ test_empty_host(void)
TEST_NNG_PASS(nng_close(s2));
}
+void
+test_ws_recv_max(void)
+{
+ char msg[256];
+ char buf[256];
+ nng_socket s0;
+ nng_socket s1;
+ nng_listener l;
+ size_t sz;
+ char addr[64];
+
+ testutil_scratch_addr("ws", sizeof(addr), addr);
+
+ TEST_NNG_PASS(nng_pair0_open(&s0));
+ TEST_NNG_PASS(nng_socket_set_ms(s0, NNG_OPT_RECVTIMEO, 100));
+ TEST_NNG_PASS(nng_socket_set_size(s0, NNG_OPT_RECVMAXSZ, 200));
+ TEST_NNG_PASS(nng_listener_create(&l, s0, addr));
+ TEST_NNG_PASS(nng_socket_get_size(s0, NNG_OPT_RECVMAXSZ, &sz));
+ TEST_CHECK(sz == 200);
+ TEST_NNG_PASS(nng_listener_set_size(l, NNG_OPT_RECVMAXSZ, 100));
+ TEST_NNG_PASS(nng_listener_start(l, 0));
+
+ TEST_NNG_PASS(nng_pair0_open(&s1));
+ TEST_NNG_PASS(nng_dial(s1, addr, NULL, 0));
+ TEST_NNG_PASS(nng_send(s1, msg, 95, 0));
+ TEST_NNG_PASS(nng_socket_set_ms(s1, NNG_OPT_SENDTIMEO, 100));
+ TEST_NNG_PASS(nng_recv(s0, buf, &sz, 0));
+ TEST_CHECK(sz == 95);
+ TEST_NNG_PASS(nng_send(s1, msg, 150, 0));
+ TEST_NNG_FAIL(nng_recv(s0, buf, &sz, 0), NNG_ETIMEDOUT);
+ TEST_NNG_PASS(nng_close(s0));
+ TEST_NNG_PASS(nng_close(s1));
+}
+
TEST_LIST = {
{ "ws url path filters", test_ws_url_path_filters },
{ "ws wild card port", test_wild_card_port },
{ "ws wild card host", test_wild_card_host },
{ "ws empty host", test_empty_host },
+ { "ws recv max", test_ws_recv_max },
{ NULL, NULL },
}; \ No newline at end of file
diff --git a/src/transport/zerotier/CMakeLists.txt b/src/transport/zerotier/CMakeLists.txt
index 167a98c0..903b7f56 100644
--- a/src/transport/zerotier/CMakeLists.txt
+++ b/src/transport/zerotier/CMakeLists.txt
@@ -13,6 +13,8 @@
option (NNG_TRANSPORT_ZEROTIER "Enable ZeroTier transport (requires libzerotiercore)." OFF)
mark_as_advanced(NNG_TRANSPORT_ZEROTIER)
+nng_directory(zerotier)
+
if (NNG_TRANSPORT_ZEROTIER)
# NB: As we wind up linking libzerotiercore.a into the application,