Skip to content

Commit d1218d7

Browse files
committed
New NUTS test framework (NNG Unit Test Support).
This is based on testutil/acutest, but is cleaner and fixes some short-comings. We will be adding more support for additional common paradigms to better facilitate transport tests. While here we added some more test cases, and fixed a possible symbol collision in the the stats framework (due to Linux use of a macro definition of "si_value" in a standard OS header). Test coverage may regress slightly as we are no longer using some of the legacy APIs.
1 parent b826bfc commit d1218d7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+5329
-5444
lines changed

Diff for: .codecov.yml

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
ignore:
22
- "tests"
3+
- "src/testing"
34
- "perf"
45
- "**/*_test.c"
56
coverage:

Diff for: CMakeLists.txt

+1-3
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,7 @@ endif ()
8787
# include or not include code based on what's actually present.
8888
add_library(nng)
8989

90-
add_library(nng_testing STATIC EXCLUDE_FROM_ALL
91-
${PROJECT_SOURCE_DIR}/tests/testutil.c
92-
${PROJECT_SOURCE_DIR}/tests/testutil.h)
90+
add_library(nng_testing STATIC EXCLUDE_FROM_ALL)
9391
target_compile_definitions(nng_testing PUBLIC NNG_STATIC_LIB NNG_TEST_LIB NNG_PRIVATE)
9492

9593
add_library(nng_private INTERFACE)

Diff for: src/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ add_subdirectory(supplemental/tls)
3030
add_subdirectory(supplemental/util)
3131
add_subdirectory(supplemental/websocket)
3232

33+
add_subdirectory(testing)
34+
3335
# When building shared libraries we prefer to suppress default symbol
3436
# visibility, so that only the symbols that should be exposed in the
3537
# resulting library are. This is the default with Windows.

Diff for: src/compat/nanomsg/compat_tcp_test.c

+73-76
Original file line numberDiff line numberDiff line change
@@ -32,28 +32,28 @@
3232

3333
#include "compat_testutil.h"
3434

35-
#include <acutest.h>
36-
#include <testutil.h>
35+
#include <nuts.h>
3736

3837
void
3938
test_bind_and_close(void)
4039
{
41-
int sb;
42-
char addr[64];
43-
testutil_scratch_addr("tcp", sizeof (addr), addr);
40+
int sb;
41+
char *addr;
4442

45-
TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
46-
TEST_CHECK(nn_bind(sb, addr) >= 0);
47-
TEST_CHECK(nn_close(sb) == 0);
43+
NUTS_ADDR(addr, "tcp");
44+
45+
NUTS_TRUE((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
46+
NUTS_TRUE(nn_bind(sb, addr) >= 0);
47+
NUTS_TRUE(nn_close(sb) == 0);
4848
}
4949

5050
void
5151
test_connect_and_close(void)
5252
{
53-
int sc;
54-
char addr[64];
55-
testutil_scratch_addr("tcp", sizeof (addr), addr);
53+
int sc;
54+
char *addr;
5655

56+
NUTS_ADDR(addr, "tcp");
5757
TEST_NN_PASS((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
5858
TEST_NN_PASS(nn_connect(sc, addr));
5959
TEST_NN_PASS(nn_close(sc));
@@ -62,26 +62,25 @@ test_connect_and_close(void)
6262
void
6363
test_bind_and_connect(void)
6464
{
65-
int sb, sc, p1, p2;
66-
char addr[64];
67-
68-
testutil_scratch_addr("tcp", sizeof (addr), addr);
65+
int sb, sc, p1, p2;
66+
char *addr;
6967

70-
TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
71-
TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
72-
TEST_CHECK(sb != sc);
68+
NUTS_ADDR(addr, "tcp");
69+
NUTS_TRUE((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
70+
NUTS_TRUE((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
71+
NUTS_TRUE(sb != sc);
7372

7473
TEST_NN_MARRY_EX(sb, sc, addr, p1, p2);
7574

76-
TEST_CHECK(nn_close(sb) == 0);
77-
TEST_CHECK(nn_close(sc) == 0);
75+
TEST_NN_PASS(nn_close(sb));
76+
TEST_NN_PASS(nn_close(sc));
7877
}
7978

8079
void
8180
test_bad_addresses(void)
8281
{
8382
int s;
84-
TEST_CHECK((s = nn_socket(AF_SP, NN_PAIR)) >= 0);
83+
NUTS_TRUE((s = nn_socket(AF_SP, NN_PAIR)) >= 0);
8584

8685
TEST_NN_FAIL(nn_connect(s, "tcp://*:"), EINVAL);
8786
TEST_NN_FAIL(nn_connect(s, "tcp://*:1000000"), EINVAL);
@@ -100,12 +99,12 @@ test_no_delay(void)
10099
int s;
101100
int opt;
102101
size_t sz;
103-
TEST_CHECK((s = nn_socket(AF_SP, NN_PAIR)) >= 0);
102+
NUTS_TRUE((s = nn_socket(AF_SP, NN_PAIR)) >= 0);
104103

105104
sz = sizeof(opt);
106105
TEST_NN_PASS(nn_getsockopt(s, NN_TCP, NN_TCP_NODELAY, &opt, &sz));
107-
TEST_CHECK(sz == sizeof(opt));
108-
TEST_CHECK(opt == 0);
106+
NUTS_TRUE(sz == sizeof(opt));
107+
NUTS_TRUE(opt == 0);
109108
opt = 2;
110109
TEST_NN_FAIL(
111110
nn_setsockopt(s, NN_TCP, NN_TCP_NODELAY, &opt, sz), EINVAL);
@@ -115,25 +114,24 @@ test_no_delay(void)
115114

116115
opt = 3;
117116
TEST_NN_PASS(nn_getsockopt(s, NN_TCP, NN_TCP_NODELAY, &opt, &sz));
118-
TEST_CHECK(sz == sizeof(opt));
119-
TEST_CHECK(opt == 1);
117+
NUTS_TRUE(sz == sizeof(opt));
118+
NUTS_TRUE(opt == 1);
120119
TEST_NN_PASS(nn_close(s));
121120
}
122121

123122
void
124123
test_ping_pong(void)
125124
{
126-
int sb, sc, p1, p2;
127-
char addr[64];
128-
129-
testutil_scratch_addr("tcp", sizeof(addr), addr);
125+
int sb, sc, p1, p2;
126+
char *addr;
130127

128+
NUTS_ADDR(addr, "tcp");
131129
TEST_NN_PASS((sb = nn_socket(AF_SP, NN_PAIR)));
132130
TEST_NN_PASS((sc = nn_socket(AF_SP, NN_PAIR)));
133-
TEST_CHECK(sb != sc);
131+
NUTS_TRUE(sb != sc);
134132
TEST_NN_MARRY_EX(sc, sb, addr, p1, p2);
135-
TEST_CHECK(p1 >= 0);
136-
TEST_CHECK(p2 >= 0);
133+
NUTS_TRUE(p1 >= 0);
134+
NUTS_TRUE(p2 >= 0);
137135

138136
/* Ping-pong test. */
139137
for (int i = 0; i != 100; ++i) {
@@ -142,75 +140,74 @@ test_ping_pong(void)
142140
int n;
143141
TEST_NN_PASS(nn_send(sc, "ABC", 3, 0));
144142
TEST_NN_PASS(n = nn_recv(sb, buf, 4, 0));
145-
TEST_CHECK(n == 3);
146-
TEST_CHECK(memcmp(buf, "ABC", 3) == 0);
143+
NUTS_TRUE(n == 3);
144+
NUTS_TRUE(memcmp(buf, "ABC", 3) == 0);
147145

148146
TEST_NN_PASS(nn_send(sb, "DEF", 3, 0));
149147
TEST_NN_PASS(n = nn_recv(sc, buf, 4, 0));
150-
TEST_CHECK(n == 3);
151-
TEST_CHECK(memcmp(buf, "DEF", 3) == 0);
148+
NUTS_TRUE(n == 3);
149+
NUTS_TRUE(memcmp(buf, "DEF", 3) == 0);
152150
}
153151

154-
TEST_CHECK(nn_close(sb) == 0);
155-
TEST_CHECK(nn_close(sc) == 0);
152+
TEST_NN_PASS(nn_close(sb));
153+
TEST_NN_PASS(nn_close(sc));
156154
}
157155

158156
void
159157
test_pair_reject(void)
160158
{
161-
int sb, sc, sd, p1, p2;
162-
char addr[32];
159+
int sb, sc, sd, p1, p2;
160+
char *addr;
163161

164-
testutil_scratch_addr("tcp", sizeof(addr), addr);
162+
NUTS_ADDR(addr, "tcp");
165163

166-
TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
167-
TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
168-
TEST_CHECK((sd = nn_socket(AF_SP, NN_PAIR)) >= 0);
169-
TEST_CHECK(sb != sc);
164+
NUTS_TRUE((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
165+
NUTS_TRUE((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
166+
NUTS_TRUE((sd = nn_socket(AF_SP, NN_PAIR)) >= 0);
167+
NUTS_TRUE(sb != sc);
170168

171169
TEST_NN_MARRY_EX(sc, sb, addr, p1, p2);
172170

173-
TEST_CHECK(nn_connect(sd, addr) >= 0);
174-
testutil_sleep(200);
171+
NUTS_TRUE(nn_connect(sd, addr) >= 0);
172+
NUTS_SLEEP(200);
175173

176-
TEST_CHECK(nn_close(sb) == 0);
177-
TEST_CHECK(nn_close(sc) == 0);
178-
TEST_CHECK(nn_close(sd) == 0);
174+
TEST_NN_PASS(nn_close(sb));
175+
TEST_NN_PASS(nn_close(sc));
176+
TEST_NN_PASS(nn_close(sd));
179177
}
180178

181179
void
182180
test_addr_in_use(void)
183181
{
184-
int sb, sc;
185-
char addr[64];
186-
187-
testutil_scratch_addr("tcp", sizeof(addr), addr);
182+
int sb, sc;
183+
char *addr;
188184

189-
TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
190-
TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
191-
TEST_CHECK(sb != sc);
185+
NUTS_ADDR(addr, "tcp");
186+
NUTS_TRUE((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
187+
NUTS_TRUE((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
188+
NUTS_TRUE(sb != sc);
192189
TEST_NN_PASS(nn_bind(sb, addr));
193190
TEST_NN_FAIL(nn_bind(sc, addr), EADDRINUSE);
194191

195-
TEST_CHECK(nn_close(sb) == 0);
196-
TEST_CHECK(nn_close(sc) == 0);
192+
TEST_NN_PASS(nn_close(sb));
193+
TEST_NN_PASS(nn_close(sc));
197194
}
198195

199196
void
200197
test_max_recv_size(void)
201198
{
202-
int sb, sc, p1, p2;
203-
int opt;
204-
int n;
205-
size_t sz;
206-
char addr[64];
207-
char buf[64];
208-
209-
testutil_scratch_addr("tcp", sizeof(addr), addr);
210-
211-
TEST_CHECK((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
212-
TEST_CHECK((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
213-
TEST_CHECK(sb != sc);
199+
int sb, sc, p1, p2;
200+
int opt;
201+
int n;
202+
size_t sz;
203+
char buf[64];
204+
char *addr;
205+
206+
NUTS_ADDR(addr, "tcp");
207+
208+
NUTS_TRUE((sb = nn_socket(AF_SP, NN_PAIR)) >= 0);
209+
NUTS_TRUE((sc = nn_socket(AF_SP, NN_PAIR)) >= 0);
210+
NUTS_TRUE(sb != sc);
214211
opt = 100;
215212
sz = sizeof(opt);
216213
TEST_NN_PASS(nn_setsockopt(sb, NN_SOL_SOCKET, NN_RCVTIMEO, &opt, sz));
@@ -231,17 +228,17 @@ test_max_recv_size(void)
231228
opt = -5;
232229
TEST_NN_PASS(
233230
nn_getsockopt(sb, NN_SOL_SOCKET, NN_RCVMAXSIZE, &opt, &sz));
234-
TEST_CHECK(opt == 4);
235-
TEST_CHECK(sz == sizeof(opt));
231+
NUTS_TRUE(opt == 4);
232+
NUTS_TRUE(sz == sizeof(opt));
236233

237234
TEST_NN_MARRY_EX(sc, sb, addr, p1, p2);
238235

239236
TEST_NN_PASS(nn_send(sc, "ABC", 4, 0));
240237
TEST_NN_PASS(nn_send(sc, "012345", 6, 0));
241238

242239
TEST_NN_PASS(n = nn_recv(sb, buf, sizeof(buf), 0));
243-
TEST_CHECK(n == 4);
244-
TEST_CHECK(strcmp(buf, "ABC") == 0);
240+
NUTS_TRUE(n == 4);
241+
NUTS_TRUE(strcmp(buf, "ABC") == 0);
245242

246243
TEST_NN_FAIL(nn_recv(sb, buf, sizeof(buf), 0), ETIMEDOUT);
247244

Diff for: src/compat/nanomsg/compat_testutil.h

+18-22
Original file line numberDiff line numberDiff line change
@@ -45,30 +45,26 @@ extern "C" {
4545
// We do that to facilitate testing. Don't rely on this equivalence in your
4646
// own application code.
4747

48-
#define TEST_NN_MARRY(s1, s2) \
49-
do { \
50-
int rv_; \
51-
nng_socket s1_, s2_; \
52-
s1_.id = s1; \
53-
s2_.id = s2; \
54-
\
55-
TEST_CHECK_(testutil_marry(s1_, s2_) == 0, "marry %s", \
56-
nng_strerror(rv_)); \
48+
#define TEST_NN_MARRY(s1, s2) \
49+
do { \
50+
nng_socket s1_, s2_; \
51+
s1_.id = s1; \
52+
s2_.id = s2; \
53+
\
54+
NUTS_MARRY(s1_, s2_); \
5755
} while (0)
5856

59-
#define TEST_NN_MARRY_EX(s1, s2, url, p1, p2) \
60-
do { \
61-
int rv_; \
62-
nng_socket s1_, s2_; \
63-
nng_pipe p1_, p2_; \
64-
s1_.id = s1; \
65-
s2_.id = s2; \
66-
rv_ = testutil_marry_ex(s1_, s2_, url, &p1_, &p2_); \
67-
TEST_CHECK_(rv_ == 0, "marry %s", nng_strerror(rv_)); \
68-
p1 = p1_.id; \
69-
p2 = p2_.id; \
70-
TEST_CHECK(p1 >= 0); \
71-
TEST_CHECK(p2 >= 0); \
57+
#define TEST_NN_MARRY_EX(s1, s2, url, p1, p2) \
58+
do { \
59+
nng_socket s1_, s2_; \
60+
nng_pipe p1_, p2_; \
61+
s1_.id = s1; \
62+
s2_.id = s2; \
63+
NUTS_MARRY_EX(s1_, s2_, url, &p1_, &p2_); \
64+
p1 = p1_.id; \
65+
p2 = p2_.id; \
66+
NUTS_TRUE(p1 >= 0); \
67+
NUTS_TRUE(p2 >= 0); \
7268
} while (0)
7369

7470
#ifdef __cplusplus

0 commit comments

Comments
 (0)