aboutsummaryrefslogtreecommitdiff
path: root/src/compat
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2020-01-20 16:03:45 -0800
committerGarrett D'Amore <garrett@damore.org>2020-01-20 16:03:45 -0800
commit5e031e639df65d7f12a0d2f776f188fde1b98fd9 (patch)
tree159f9a76efa89ce40bc0cbe32502d6524b28b985 /src/compat
parent8abf75857e8993a25e50d07bdd6d9628f028d7cc (diff)
downloadnng-5e031e639df65d7f12a0d2f776f188fde1b98fd9.tar.gz
nng-5e031e639df65d7f12a0d2f776f188fde1b98fd9.tar.bz2
nng-5e031e639df65d7f12a0d2f776f188fde1b98fd9.zip
fixes #1163 compat tests are very brittle
This only addresses the newly rewitten compat_tcp test, but it sets the groundwork for the other tests, so that when they are updated to the new acutest.h they can use the new marry code to establish connections cleanly and safely.
Diffstat (limited to 'src/compat')
-rw-r--r--src/compat/nanomsg/CMakeLists.txt10
-rw-r--r--src/compat/nanomsg/compat_tcp_test.c (renamed from src/compat/nanomsg/compat_tcp.c)100
-rw-r--r--src/compat/nanomsg/compat_testutil.h32
3 files changed, 81 insertions, 61 deletions
diff --git a/src/compat/nanomsg/CMakeLists.txt b/src/compat/nanomsg/CMakeLists.txt
index 2292d1a8..b2d99c3c 100644
--- a/src/compat/nanomsg/CMakeLists.txt
+++ b/src/compat/nanomsg/CMakeLists.txt
@@ -1,6 +1,5 @@
#
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
+# Copyright 2020 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
@@ -8,8 +7,9 @@
# found online at https://opensource.org/licenses/MIT.
#
-set(COMPAT_SOURCES compat/nanomsg/nn.c)
+#set(COMPAT_SOURCES compat/nanomsg/nn.c)
+nng_sources(nn.c)
-set(NNG_SRCS ${NNG_SRCS} ${COMPAT_SOURCES} PARENT_SCOPE)
+#set(NNG_SRCS ${NNG_SRCS} ${COMPAT_SOURCES} PARENT_SCOPE)
-nng_test(compat_tcp) \ No newline at end of file
+nng_test(compat_tcp_test) \ No newline at end of file
diff --git a/src/compat/nanomsg/compat_tcp.c b/src/compat/nanomsg/compat_tcp_test.c
index 6e0c2185..8fb7f7b6 100644
--- a/src/compat/nanomsg/compat_tcp.c
+++ b/src/compat/nanomsg/compat_tcp_test.c
@@ -1,5 +1,5 @@
/*
- Copyright 2019 Garrett D'Amore <garrett@damore.org>
+ Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
Copyright (c) 2012 Martin Sustrik All rights reserved.
Copyright 2016 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
@@ -28,7 +28,6 @@
#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"
@@ -40,9 +39,8 @@ 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);
+ char addr[64];
+ testutil_scratch_addr("tcp", sizeof (addr), addr);
TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
TEST_CHECK(nn_bind(sb, addr) >= 0);
@@ -53,30 +51,27 @@ 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);
+ char addr[64];
+ testutil_scratch_addr("tcp", sizeof (addr), addr);
- TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
- TEST_CHECK(nn_connect(sc, addr) >= 0);
- TEST_CHECK(nn_close(sc) == 0);
+ TEST_NN_PASS((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
+ TEST_NN_PASS(nn_connect(sc, addr));
+ TEST_NN_PASS(nn_close(sc));
}
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);
+ int sb, sc, p1, p2;
+ char addr[64];
+
+ testutil_scratch_addr("tcp", sizeof (addr), addr);
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_NN_MARRY_EX(sb, sc, addr, p1, p2);
TEST_CHECK(nn_close(sb) == 0);
TEST_CHECK(nn_close(sc) == 0);
@@ -128,18 +123,17 @@ test_no_delay(void)
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);
+ int sb, sc, p1, p2;
+ char addr[64];
- 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_scratch_addr("tcp", sizeof(addr), addr);
- testutil_sleep(200);
+ TEST_NN_PASS((sb = nn_socket(AF_SP, NN_PAIR)));
+ TEST_NN_PASS((sc = nn_socket(AF_SP, NN_PAIR)));
+ TEST_CHECK(sb != sc);
+ TEST_NN_MARRY_EX(sc, sb, addr, p1, p2);
+ TEST_CHECK(p1 >= 0);
+ TEST_CHECK(p2 >= 0);
/* Ping-pong test. */
for (int i = 0; i != 100; ++i) {
@@ -166,18 +160,16 @@ test_ping_pong(void)
void
test_batch(void)
{
- int sb, sc;
- char addr[32];
- uint16_t port = testutil_next_port();
+ int sb, sc, p1, p2;
+ char addr[64];
int opt;
size_t sz;
- (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);
+ testutil_scratch_addr("tcp", sizeof(addr), addr);
+
+ TEST_NN_PASS((sb = nn_socket(AF_SP, NN_PAIR)));
+ TEST_NN_PASS((sc = nn_socket(AF_SP, NN_PAIR)));
TEST_CHECK(sb != sc);
- TEST_CHECK(nn_bind(sb, addr) >= 0);
- TEST_CHECK(nn_connect(sc, addr) >= 0);
opt = 1000;
sz = sizeof(opt);
TEST_NN_PASS(nn_setsockopt(sb, NN_SOL_SOCKET, NN_RCVTIMEO, &opt, sz));
@@ -185,7 +177,9 @@ test_batch(void)
TEST_NN_PASS(nn_setsockopt(sc, NN_SOL_SOCKET, NN_RCVTIMEO, &opt, sz));
TEST_NN_PASS(nn_setsockopt(sc, NN_SOL_SOCKET, NN_SNDTIMEO, &opt, sz));
- testutil_sleep(200);
+ TEST_NN_MARRY_EX(sc, sb, addr, p1, p2);
+ TEST_CHECK(p1 >= 0);
+ TEST_CHECK(p2 >= 0);
// We can send 10 of these, because TCP buffers a reasonable amount.
// Pushing say 100 of them may run into TCP buffering limitations.
@@ -209,20 +203,19 @@ test_batch(void)
void
test_pair_reject(void)
{
- int sb, sc, sd;
+ int sb, sc, sd, p1, p2;
char addr[32];
- uint16_t port = testutil_next_port();
- (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+
+ testutil_scratch_addr("tcp", sizeof(addr), addr);
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);
+ TEST_NN_MARRY_EX(sc, sb, addr, p1, p2);
+
+ TEST_CHECK(nn_connect(sd, addr) >= 0);
testutil_sleep(200);
TEST_CHECK(nn_close(sb) == 0);
@@ -234,9 +227,9 @@ 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);
+ char addr[64];
+
+ testutil_scratch_addr("tcp", sizeof(addr), addr);
TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
@@ -251,14 +244,14 @@ test_addr_in_use(void)
void
test_max_recv_size(void)
{
- int sb, sc;
+ int sb, sc, p1, p2;
int opt;
int n;
size_t sz;
- char addr[32];
+ char addr[64];
char buf[64];
- uint16_t port = testutil_next_port();
- (void) snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
+
+ testutil_scratch_addr("tcp", sizeof(addr), addr);
TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
@@ -286,10 +279,7 @@ test_max_recv_size(void)
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_MARRY_EX(sc, sb, addr, p1, p2);
TEST_NN_PASS(nn_send(sc, "ABC", 4, 0));
TEST_NN_PASS(nn_send(sc, "012345", 6, 0));
diff --git a/src/compat/nanomsg/compat_testutil.h b/src/compat/nanomsg/compat_testutil.h
index afd75c34..113d6672 100644
--- a/src/compat/nanomsg/compat_testutil.h
+++ b/src/compat/nanomsg/compat_testutil.h
@@ -1,5 +1,5 @@
//
-// Copyright 2019 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2020 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
@@ -41,6 +41,36 @@ extern "C" {
expect, nng_strerror(err_), result_); \
} while (0)
+// These macros use some details of the socket and pipe which are not public.
+// We do that to facilitate testing. Don't rely on this equivalence in your
+// own application code.
+
+#define TEST_NN_MARRY(s1, s2) \
+ do { \
+ int rv_; \
+ nng_socket s1_, s2_; \
+ s1_.id = s1; \
+ s2_.id = s2; \
+ \
+ TEST_CHECK_(testutil_marry(s1_, s2_) == 0, "marry %s", \
+ nng_strerror(rv_)); \
+ } while (0)
+
+#define TEST_NN_MARRY_EX(s1, s2, url, p1, p2) \
+ do { \
+ int rv_; \
+ nng_socket s1_, s2_; \
+ nng_pipe p1_, p2_; \
+ s1_.id = s1; \
+ s2_.id = s2; \
+ rv_ = testutil_marry_ex(s1_, s2_, url, &p1_, &p2_); \
+ TEST_CHECK_(rv_ == 0, "marry %s", nng_strerror(rv_)); \
+ p1 = p1_.id; \
+ p2 = p2_.id; \
+ TEST_CHECK(p1 >= 0); \
+ TEST_CHECK(p2 >= 0); \
+ } while (0)
+
#ifdef __cplusplus
};
#endif