summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/coverage.yml4
-rw-r--r--.github/workflows/sanitizer.yml2
-rw-r--r--src/compat/nanomsg/CMakeLists.txt2
-rw-r--r--src/compat/nanomsg/compat_tcp.c309
-rw-r--r--src/compat/nanomsg/compat_testutil.h48
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/compat_tcp.c242
7 files changed, 362 insertions, 246 deletions
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index dac9664f..7aaf317a 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -16,7 +16,7 @@ jobs:
run: sudo apt-get install ninja-build
- name: Configure
- run: mkdir build && cd build && cmake -G Ninja -DNNG_ENABLE_COVERAGE=ON -DNNG_ENABLE_TLS=ON ..
+ run: mkdir build && cd build && cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DNNG_ENABLE_COVERAGE=ON -DNNG_ENABLE_TLS=ON ..
- name: build
run: cd build && ninja
@@ -47,7 +47,7 @@ jobs:
run: brew install lcov
- name: Configure
- run: mkdir build && cd build && cmake -G Ninja -DNNG_ENABLE_COVERAGE=ON -DNNG_ENABLE_TLS=ON ..
+ run: mkdir build && cd build && cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DNNG_ENABLE_COVERAGE=ON -DNNG_ENABLE_TLS=ON ..
- name: build
run: cd build && ninja
diff --git a/.github/workflows/sanitizer.yml b/.github/workflows/sanitizer.yml
index e55ed227..7b49c624 100644
--- a/.github/workflows/sanitizer.yml
+++ b/.github/workflows/sanitizer.yml
@@ -24,7 +24,7 @@ jobs:
run: |
mkdir build
cd build
- cmake -G Ninja -DNNG_SANITIZER=${{ matrix.sanitizer }} -DNNG_ENABLE_TLS=ON -DNNG_TOOLS=OFF ..
+ cmake -G Ninja -DNNG_SANITIZER=${{ matrix.sanitizer }} -DCMAKE_BUILD_TYPE=Debug -DNNG_ENABLE_TLS=ON -DNNG_TOOLS=OFF ..
- name: Build
run: |
cd build
diff --git a/src/compat/nanomsg/CMakeLists.txt b/src/compat/nanomsg/CMakeLists.txt
index 1608741d..2292d1a8 100644
--- a/src/compat/nanomsg/CMakeLists.txt
+++ b/src/compat/nanomsg/CMakeLists.txt
@@ -11,3 +11,5 @@
set(COMPAT_SOURCES compat/nanomsg/nn.c)
set(NNG_SRCS ${NNG_SRCS} ${COMPAT_SOURCES} PARENT_SCOPE)
+
+nng_test(compat_tcp) \ No newline at end of file
diff --git a/src/compat/nanomsg/compat_tcp.c b/src/compat/nanomsg/compat_tcp.c
new file mode 100644
index 00000000..881d0fec
--- /dev/null
+++ b/src/compat/nanomsg/compat_tcp.c
@@ -0,0 +1,309 @@
+/*
+ Copyright 2019 Garrett D'Amore <garrett@damore.org>
+ Copyright (c) 2012 Martin Sustrik All rights reserved.
+ Copyright 2016 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom
+ the Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+*/
+
+// This test is a pretty much completely rewritten version of the
+// legacy nanomsg tcp test. The NNG test infrastructure is a bit more
+// robust, and we take advantage of that.
+
+#include <nng/compat/nanomsg/nn.h>
+#include <nng/compat/nanomsg/pair.h>
+#include <nng/compat/nanomsg/pubsub.h>
+#include <nng/compat/nanomsg/tcp.h>
+
+#include "compat_testutil.h"
+
+#include <acutest.h>
+#include <testutil.h>
+
+void
+test_bind_and_close(void)
+{
+ int sb;
+ char addr[32];
+ uint16_t port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+
+ TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK(nn_bind(sb, addr) >= 0);
+ TEST_CHECK(nn_close(sb) == 0);
+}
+
+void
+test_connect_and_close(void)
+{
+ int sc;
+ char addr[32];
+ uint16_t port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+
+ TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK(nn_connect(sc, addr) >= 0);
+ TEST_CHECK(nn_close(sc) == 0);
+}
+
+void
+test_bind_and_connect(void)
+{
+ int sb, sc;
+ char addr[32];
+ uint16_t port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+
+ TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK(sb != sc);
+ TEST_CHECK(nn_bind(sb, addr) >= 0);
+ TEST_CHECK(nn_connect(sc, addr) >= 0);
+
+ testutil_sleep(200);
+
+ TEST_CHECK(nn_close(sb) == 0);
+ TEST_CHECK(nn_close(sc) == 0);
+}
+
+void
+test_bad_addresses(void)
+{
+ int s;
+ TEST_CHECK((s = nn_socket(AF_SP, NN_PAIR)) >= 0);
+
+ TEST_NN_FAIL(nn_connect(s, "tcp://*:"), EINVAL);
+ TEST_NN_FAIL(nn_connect(s, "tcp://*:1000000"), EINVAL);
+ TEST_NN_FAIL(nn_connect(s, "tcp://*:some_port"), EINVAL);
+ TEST_NN_FAIL(nn_connect(s, "tcp://127.0.0.1"), EINVAL);
+ TEST_NN_FAIL(nn_connect(s, "tcp://:5555"), EINVAL);
+ TEST_NN_FAIL(nn_connect(s, "tcp://abc.123.---.#:5555"), EINVAL);
+
+ TEST_NN_FAIL(nn_bind(s, "tcp://127.0.0.1:1000000"), EINVAL);
+ TEST_NN_PASS(nn_close(s));
+}
+
+void
+test_no_delay(void)
+{
+ int s;
+ int opt;
+ size_t sz;
+ TEST_CHECK((s = nn_socket(AF_SP, NN_PAIR)) >= 0);
+
+ sz = sizeof(opt);
+ TEST_NN_PASS(nn_getsockopt(s, NN_TCP, NN_TCP_NODELAY, &opt, &sz));
+ TEST_CHECK(sz == sizeof(opt));
+ TEST_CHECK(opt == 0);
+ opt = 2;
+ TEST_NN_FAIL(
+ nn_setsockopt(s, NN_TCP, NN_TCP_NODELAY, &opt, sz), EINVAL);
+
+ opt = 1;
+ TEST_NN_PASS(nn_setsockopt(s, NN_TCP, NN_TCP_NODELAY, &opt, sz));
+
+ opt = 3;
+ TEST_NN_PASS(nn_getsockopt(s, NN_TCP, NN_TCP_NODELAY, &opt, &sz));
+ TEST_CHECK(sz == sizeof(opt));
+ TEST_CHECK(opt == 1);
+ TEST_NN_PASS(nn_close(s));
+}
+
+void
+test_ping_pong(void)
+{
+ int sb, sc;
+ char addr[32];
+ uint16_t port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+
+ TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK(sb != sc);
+ TEST_CHECK(nn_bind(sb, addr) >= 0);
+ TEST_CHECK(nn_connect(sc, addr) >= 0);
+
+ testutil_sleep(200);
+
+ /* Ping-pong test. */
+ for (int i = 0; i != 100; ++i) {
+
+ char buf[4];
+ int n;
+ TEST_NN_PASS(nn_send(sc, "ABC", 3, 0));
+ TEST_NN_PASS(n = nn_recv(sb, buf, 4, 0));
+ TEST_CHECK(n == 3);
+ TEST_CHECK(memcmp(buf, "ABC", 3) == 0);
+
+ TEST_NN_PASS(nn_send(sb, "DEF", 3, 0));
+ TEST_NN_PASS(n = nn_recv(sc, buf, 4, 0));
+ TEST_CHECK(n == 3);
+ TEST_CHECK(memcmp(buf, "DEF", 3) == 0);
+ }
+
+ TEST_CHECK(nn_close(sb) == 0);
+ TEST_CHECK(nn_close(sc) == 0);
+}
+
+// test_batch tests sending a batch of messages. It relies on having
+// a reasonably deep buffer in the socket.
+void
+test_batch(void)
+{
+ int sb, sc;
+ char addr[32];
+ uint16_t port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+
+ TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK(sb != sc);
+ TEST_CHECK(nn_bind(sb, addr) >= 0);
+ TEST_CHECK(nn_connect(sc, addr) >= 0);
+
+ testutil_sleep(200);
+
+#define DIGITS "0123456789012345678901234567890123456789"
+ for (int i = 0; i < 100; i++) {
+ TEST_NN_PASS(nn_send(sc, DIGITS, strlen(DIGITS) + 1, 0));
+ }
+
+ for (int i = 0; i < 100; i++) {
+ char buf[64];
+ int n;
+ TEST_NN_PASS(n = nn_recv(sb, buf, sizeof(buf), 0));
+ TEST_CHECK(n == (strlen(DIGITS) + 1));
+ TEST_CHECK(memcmp(DIGITS, buf, n) == 0);
+ }
+
+ TEST_CHECK(nn_close(sb) == 0);
+ TEST_CHECK(nn_close(sc) == 0);
+}
+
+void
+test_pair_reject(void)
+{
+ int sb, sc, sd;
+ char addr[32];
+ uint16_t port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+
+ TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK((sd = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK(sb != sc);
+ TEST_CHECK(nn_bind(sb, addr) >= 0);
+ TEST_CHECK(nn_connect(sc, addr) >= 0);
+ testutil_sleep(100);
+ TEST_CHECK(nn_connect(sd, addr) >= 0);
+
+ testutil_sleep(200);
+
+ TEST_CHECK(nn_close(sb) == 0);
+ TEST_CHECK(nn_close(sc) == 0);
+ TEST_CHECK(nn_close(sd) == 0);
+}
+
+void
+test_addr_in_use(void)
+{
+ int sb, sc;
+ char addr[32];
+ uint16_t port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+
+ TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK(sb != sc);
+ TEST_NN_PASS(nn_bind(sb, addr));
+ TEST_NN_FAIL(nn_bind(sc, addr), EADDRINUSE);
+
+ TEST_CHECK(nn_close(sb) == 0);
+ TEST_CHECK(nn_close(sc) == 0);
+}
+
+void
+test_max_recv_size(void)
+{
+ int sb, sc;
+ int opt;
+ int n;
+ size_t sz;
+ char addr[32];
+ char buf[64];
+ uint16_t port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+
+ TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_CHECK(sb != sc);
+ opt = 100;
+ sz = sizeof (opt);
+ TEST_NN_PASS(nn_setsockopt(sb, NN_SOL_SOCKET, NN_RCVTIMEO, &opt, sz));
+
+ /* Test that NN_RCVMAXSIZE can be -1, but not lower */
+ sz = sizeof(opt);
+ opt = -1;
+ TEST_NN_PASS(
+ nn_setsockopt(sb, NN_SOL_SOCKET, NN_RCVMAXSIZE, &opt, sz));
+
+ opt = -2;
+ TEST_NN_FAIL(
+ nn_setsockopt(sb, NN_SOL_SOCKET, NN_RCVMAXSIZE, &opt, sz), EINVAL);
+
+ opt = 4;
+ TEST_NN_PASS(
+ nn_setsockopt(sb, NN_SOL_SOCKET, NN_RCVMAXSIZE, &opt, sz));
+ opt = -5;
+ TEST_NN_PASS(
+ nn_getsockopt(sb, NN_SOL_SOCKET, NN_RCVMAXSIZE, &opt, &sz));
+ TEST_CHECK(opt == 4);
+ TEST_CHECK(sz == sizeof(opt));
+
+ TEST_CHECK(nn_bind(sb, addr) >= 0);
+ TEST_CHECK(nn_connect(sc, addr) >= 0);
+
+ testutil_sleep(200);
+
+ TEST_NN_PASS(nn_send(sc, "ABC", 4, 0));
+ TEST_NN_PASS(nn_send(sc, "012345", 6, 0));
+
+ TEST_NN_PASS(n = nn_recv(sb, buf, sizeof(buf), 0));
+ TEST_CHECK(n == 4);
+ TEST_CHECK(strcmp(buf, "ABC") == 0);
+
+ TEST_NN_FAIL(nn_recv(sb, buf, sizeof(buf), 0), ETIMEDOUT);
+
+ TEST_NN_PASS(nn_close(sb));
+ TEST_NN_PASS(nn_close(sc));
+}
+
+TEST_LIST = {
+ { "compat tcp bind and close ", test_bind_and_close },
+ { "compat tcp connect and close ", test_connect_and_close },
+ { "compat tcp bind and connect ", test_bind_and_connect },
+ { "compat tcp invalid addresses", test_bad_addresses },
+ { "compat tcp no delay option", test_no_delay },
+ { "compat tcp ping pong", test_ping_pong },
+ { "compat tcp send recv batch", test_batch },
+ { "compat tcp pair reject", test_pair_reject },
+ { "compat tcp addr in use", test_addr_in_use },
+ { "compat tcp max recv size", test_max_recv_size },
+ { NULL, NULL },
+};
diff --git a/src/compat/nanomsg/compat_testutil.h b/src/compat/nanomsg/compat_testutil.h
new file mode 100644
index 00000000..afd75c34
--- /dev/null
+++ b/src/compat/nanomsg/compat_testutil.h
@@ -0,0 +1,48 @@
+//
+// Copyright 2019 Staysail Systems, Inc. <info@staysail.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.
+//
+
+#ifndef COMPAT_TESTUTIL_H
+#define COMPAT_TESTUTIL_H
+
+#include <stdbool.h>
+#include <stdint.h>
+
+// The following headers are provided for test code convenience.
+#include <nng/nng.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// TEST_NNG_PASS tests for NNG success. It reports the failure if it
+// did not.
+#define TEST_NN_PASS(cond) \
+ do { \
+ int result_ = (cond); \
+ TEST_CHECK_(result_ >= 0, "%s succeeds", #cond); \
+ TEST_MSG("%s: expected success, got %s (%d)", #cond, \
+ nn_strerror(errno), errno); \
+ } while (0)
+
+#define TEST_NN_FAIL(cond, expect) \
+ do { \
+ int result_ = (cond); \
+ int err_ = errno; \
+ TEST_CHECK_(result_ < 0, "%s did not succeed", #cond); \
+ TEST_CHECK_( \
+ err_ = expect, "%s fails with %s", #cond, #expect); \
+ TEST_MSG("%s: expected %s, got %s (%d)", #cond, #expect, \
+ expect, nng_strerror(err_), result_); \
+ } while (0)
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // COMPAT_TESTUTIL_H
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index c4856aed..fd9d1f68 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -195,7 +195,6 @@ add_nng_compat_test(compat_survey 10)
add_nng_compat_test(compat_reqttl 10)
add_nng_compat_test(compat_shutdown 10)
add_nng_compat_test(compat_surveyttl 10)
-add_nng_compat_test(compat_tcp 60)
add_nng_compat_test(compat_ws 60)
# These are special tests for compat mode, not inherited from the
diff --git a/tests/compat_tcp.c b/tests/compat_tcp.c
deleted file mode 100644
index 0fce4f08..00000000
--- a/tests/compat_tcp.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- Copyright (c) 2012 Martin Sustrik All rights reserved.
- Copyright 2015 Garrett D'Amore <garrett@damore.org>
- Copyright 2016 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom
- the Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- IN THE SOFTWARE.
-*/
-
-#include <nng/compat/nanomsg/nn.h>
-#include <nng/compat/nanomsg/pair.h>
-#include <nng/compat/nanomsg/pubsub.h>
-#include <nng/compat/nanomsg/tcp.h>
-
-#include "compat_testutil.h"
-
-/* Tests TCP transport. */
-
-int sc;
-
-int main (int argc, const char *argv[])
-{
- int rc;
- int sb;
- int i;
- int opt;
- size_t sz;
- int s1, s2;
- void * dummy_buf;
- char addr[128];
- char socket_address[128];
-
- int port = get_test_port(argc, argv);
-
- test_addr_from(socket_address, "tcp", "127.0.0.1", port);
-
- /* Try closing bound but unconnected socket. */
- sb = test_socket (AF_SP, NN_PAIR);
- test_bind (sb, socket_address);
- test_close (sb);
-
- /* Try closing a TCP socket while it not connected. At the same time
- test specifying the local address for the connection. */
- sc = test_socket (AF_SP, NN_PAIR);
-#if 0 // NNG doesn't support local binding
- test_addr_from(addr, "tcp", "127.0.0.1;127.0.0.1", port);
-#else
- test_addr_from(addr, "tcp", "127.0.0.1", port);
-#endif
- test_connect (sc, addr);
- test_close (sc);
-
- /* Open the socket anew. */
- sc = test_socket (AF_SP, NN_PAIR);
-
- /* Check NODELAY socket option. */
- sz = sizeof (opt);
- rc = nn_getsockopt (sc, NN_TCP, NN_TCP_NODELAY, &opt, &sz);
- errno_assert (rc == 0);
- nn_assert (sz == sizeof (opt));
- nn_assert (opt == 0);
- opt = 2;
- rc = nn_setsockopt (sc, NN_TCP, NN_TCP_NODELAY, &opt, sizeof (opt));
- nn_assert (rc < 0 && nn_errno () == EINVAL);
- opt = 1;
- rc = nn_setsockopt (sc, NN_TCP, NN_TCP_NODELAY, &opt, sizeof (opt));
- errno_assert (rc == 0);
- sz = sizeof (opt);
- rc = nn_getsockopt (sc, NN_TCP, NN_TCP_NODELAY, &opt, &sz);
- errno_assert (rc == 0);
- nn_assert (sz == sizeof (opt));
- nn_assert (opt == 1);
-
- /* Try using invalid address strings. */
- rc = nn_connect (sc, "tcp://*:");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
- rc = nn_connect (sc, "tcp://*:1000000");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
- rc = nn_connect (sc, "tcp://*:some_port");
- nn_assert (rc < 0);
-#if 0 // NNG does not support local interfaces
- rc = nn_connect (sc, "tcp://eth10000;127.0.0.1:5555");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == ENODEV);
-#endif
- rc = nn_connect (sc, "tcp://127.0.0.1");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
-#if 0 // NNG permits this -- the interface will get an ephemeral port
- rc = nn_bind (sc, "tcp://127.0.0.1:");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
-#endif
- rc = nn_bind (sc, "tcp://127.0.0.1:1000000");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
-#if 0 // NNG doesn't do interface binding here.
- rc = nn_bind (sc, "tcp://eth10000:5555");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == ENODEV);
-#endif
- rc = nn_connect (sc, "tcp://:5555");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
-#if 0 // NNG does not validate names apriori
- rc = nn_connect (sc, "tcp://-hostname:5555");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
-#endif
- rc = nn_connect (sc, "tcp://abc.123.---.#:5555");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
-
-#if 0 // NNG is ok with this -- its a valid IPv6 address.
- rc = nn_connect (sc, "tcp://[::1]:5555");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
-#endif
-
-#if 0 // Again NNG is not validating names apriori.
- rc = nn_connect (sc, "tcp://abc...123:5555");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
- rc = nn_connect (sc, "tcp://.123:5555");
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
-#endif
-
- /* Connect correctly. Do so before binding the peer socket. */
- test_connect (sc, socket_address);
-
- /* Leave enough time for at least on re-connect attempt. */
- nn_sleep (200);
-
- sb = test_socket (AF_SP, NN_PAIR);
- test_bind (sb, socket_address);
-
- /* Ping-pong test. */
- for (i = 0; i != 100; ++i) {
-
- test_send (sc, "ABC");
- test_recv (sb, "ABC");
-
- test_send (sb, "DEF");
- test_recv (sc, "DEF");
- }
-
- /* Batch transfer test. */
- for (i = 0; i != 100; ++i) {
- test_send (sc, "0123456789012345678901234567890123456789");
- }
- for (i = 0; i != 100; ++i) {
- test_recv (sb, "0123456789012345678901234567890123456789");
- }
-
- test_close (sc);
- test_close (sb);
-
- /* Test whether connection rejection is handled decently. */
- sb = test_socket (AF_SP, NN_PAIR);
- test_bind (sb, socket_address);
- s1 = test_socket (AF_SP, NN_PAIR);
- test_connect (s1, socket_address);
- s2 = test_socket (AF_SP, NN_PAIR);
- test_connect (s2, socket_address);
- nn_sleep (100);
- test_close (s2);
- test_close (s1);
- test_close (sb);
-
- /* Test two sockets binding to the same address. */
- sb = test_socket (AF_SP, NN_PAIR);
- test_bind (sb, socket_address);
- s1 = test_socket (AF_SP, NN_PAIR);
-
- rc = nn_bind (s1, socket_address);
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EADDRINUSE);
-
- sc = test_socket (AF_SP, NN_PAIR);
- test_connect (sc, socket_address);
- nn_sleep (100);
- test_send (sb, "ABC");
- test_recv (sc, "ABC");
- test_close (sb);
- test_close (sc);
- test_close (s1);
-
- /* Test NN_RCVMAXSIZE limit */
- sb = test_socket (AF_SP, NN_PAIR);
- test_bind (sb, socket_address);
- s1 = test_socket (AF_SP, NN_PAIR);
- test_connect (s1, socket_address);
- opt = 4;
- rc = nn_setsockopt (sb, NN_SOL_SOCKET, NN_RCVMAXSIZE, &opt, sizeof (opt));
- nn_assert (rc == 0);
- nn_sleep (100);
- test_send (s1, "ABC");
- test_recv (sb, "ABC");
- test_send (s1, "0123456789012345678901234567890123456789");
- rc = nn_recv (sb, &dummy_buf, NN_MSG, NN_DONTWAIT);
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EAGAIN);
- test_close (sb);
- test_close (s1);
-
- /* Test that NN_RCVMAXSIZE can be -1, but not lower */
- sb = test_socket (AF_SP, NN_PAIR);
- opt = -1;
- rc = nn_setsockopt (sb, NN_SOL_SOCKET, NN_RCVMAXSIZE, &opt, sizeof (opt));
- nn_assert (rc >= 0);
- opt = -2;
- rc = nn_setsockopt (sb, NN_SOL_SOCKET, NN_RCVMAXSIZE, &opt, sizeof (opt));
- nn_assert (rc < 0);
- errno_assert (nn_errno () == EINVAL);
- test_close (sb);
-
- /* Test closing a socket that is waiting to connect. */
- sc = test_socket (AF_SP, NN_PAIR);
- test_connect (sc, socket_address);
- nn_sleep (100);
- test_close (sc);
-
- return 0;
-}