Skip to content

Commit

Permalink
tcp dialer tests: add local address tests
Browse files Browse the repository at this point in the history
  • Loading branch information
gdamore committed Dec 31, 2024
1 parent 071de8a commit 207a6d1
Show file tree
Hide file tree
Showing 2 changed files with 132 additions and 8 deletions.
14 changes: 6 additions & 8 deletions src/platform/posix/posix_tcpdial.c
Original file line number Diff line number Diff line change
Expand Up @@ -379,16 +379,14 @@ tcp_dialer_set_locaddr(void *arg, const void *buf, size_t sz, nni_type t)
default:
return (NNG_EADDRINVAL);
}
if (d != NULL) {
nni_mtx_lock(&d->mtx);
if (d->closed) {
nni_mtx_unlock(&d->mtx);
return (NNG_ECLOSED);
}
d->src = ss;
d->srclen = len;
nni_mtx_lock(&d->mtx);
if (d->closed) {
nni_mtx_unlock(&d->mtx);
return (NNG_ECLOSED);

Check warning on line 385 in src/platform/posix/posix_tcpdial.c

View check run for this annotation

Codecov / codecov/patch

src/platform/posix/posix_tcpdial.c#L385

Added line #L385 was not covered by tests
}
d->src = ss;
d->srclen = len;
nni_mtx_unlock(&d->mtx);
return (0);
}

Expand Down
126 changes: 126 additions & 0 deletions src/platform/tcp_stream_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,124 @@ test_tcp_listen_activation_bad_arg(void)
nng_stream_listener_free(l1);
}

void
test_tcp_dialer_local_bind(void)
{
nng_stream_dialer *d;
nng_sockaddr sa = { 0 };

NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://127.0.0.1:80"));

sa.s_in.sa_family = NNG_AF_INET;
sa.s_in.sa_addr = nuts_be32(0x7F000001); // loopback
sa.s_in.sa_port = 0;
NUTS_PASS(nng_stream_dialer_set_addr(d, NNG_OPT_LOCADDR, &sa));
memset(&sa, 0, sizeof(sa));
NUTS_PASS(nng_stream_dialer_get_addr(d, NNG_OPT_LOCADDR, &sa));
NUTS_TRUE(sa.s_in.sa_family == NNG_AF_INET);
NUTS_TRUE(sa.s_in.sa_addr == nuts_be32(0x7F000001));
NUTS_TRUE(sa.s_in.sa_port == 0);
nng_stream_dialer_free(d);
}

void
test_tcp_dialer_local_bind_v6(void)
{
#ifdef NNG_ENABLE_IPV6
nng_stream_dialer *d;
nng_sockaddr sa = { 0 };
uint8_t loopback[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1 };

NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://[::1]:80"));

sa.s_in6.sa_family = NNG_AF_INET6;
memcpy(sa.s_in6.sa_addr, loopback, 16);
sa.s_in6.sa_addr[15] = 1;
sa.s_in6.sa_port = 0;
NUTS_PASS(nng_stream_dialer_set_addr(d, NNG_OPT_LOCADDR, &sa));
memset(&sa, 0, sizeof(sa));
NUTS_PASS(nng_stream_dialer_get_addr(d, NNG_OPT_LOCADDR, &sa));
NUTS_TRUE(sa.s_in6.sa_family == NNG_AF_INET6);
NUTS_TRUE(memcmp(sa.s_in6.sa_addr, loopback, 16) == 0);
NUTS_TRUE(sa.s_in6.sa_port == 0);
nng_stream_dialer_free(d);
#else
NUTS_SKIP("No IPv6 support");
#endif
}

void
test_tcp_dialer_local_bind_no_port(void)
{
nng_stream_dialer *d;
nng_sockaddr sa = { 0 };

NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://127.0.0.1:80"));

memset(&sa, 0, sizeof(sa));
sa.s_family = NNG_AF_INPROC;
NUTS_PASS(nng_stream_dialer_get_addr(d, NNG_OPT_LOCADDR, &sa));

NUTS_TRUE(sa.s_in.sa_family == NNG_AF_UNSPEC);
nng_stream_dialer_free(d);
}

void
test_tcp_dialer_local_bind_bad_family(void)
{
nng_stream_dialer *d;
nng_sockaddr sa = { 0 };

NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://127.0.0.1:80"));

memset(&sa, 0, sizeof(sa));
sa.s_family = NNG_AF_INPROC;
NUTS_FAIL(nng_stream_dialer_set_addr(d, NNG_OPT_LOCADDR, &sa),
NNG_EADDRINVAL);
nng_stream_dialer_free(d);
}

void
test_tcp_dialer_local_unbound(void)
{
nng_stream_dialer *d;
nng_sockaddr sa = { 0 };

NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://127.0.0.1:80"));

sa.s_in.sa_family = NNG_AF_INET;
sa.s_in.sa_addr = nuts_be32(0x7F000001); // loopback
sa.s_in.sa_port = nuts_be16(1212);
NUTS_FAIL(nng_stream_dialer_set_addr(d, NNG_OPT_LOCADDR, &sa),
NNG_EADDRINVAL);

#ifdef NNG_ENABLE_IPV6
memset(&sa, 0, sizeof(sa));
sa.s_in6.sa_family = NNG_AF_INET6;
sa.s_in6.sa_port = nuts_be16(1212);
NUTS_FAIL(nng_stream_dialer_set_addr(d, NNG_OPT_LOCADDR, &sa),
NNG_EADDRINVAL);
#endif

nng_stream_dialer_free(d);
}

void
test_tcp_dialer_local_bind_bad_type(void)
{
nng_stream_dialer *d;
nng_sockaddr sa = { 0 };

NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://127.0.0.1:80"));

memset(&sa, 0, sizeof(sa));
sa.s_family = NNG_AF_INPROC;
NUTS_FAIL(nng_stream_dialer_set_bool(d, NNG_OPT_LOCADDR, false),
NNG_EBADTYPE);
nng_stream_dialer_free(d);
}

NUTS_TESTS = {
{ "tcp stream", test_tcp_stream },
{ "tcp listen accept cancel", test_tcp_listen_accept_cancel },
Expand All @@ -443,5 +561,13 @@ NUTS_TESTS = {
test_tcp_listen_activation_bogus_fd },
{ "tcp socket activation bad arg",
test_tcp_listen_activation_bad_arg },
{ "tcp dialer local bind", test_tcp_dialer_local_bind },
{ "tcp dialer local bind v6", test_tcp_dialer_local_bind_v6 },
{ "tcp dialer local bind no port",
test_tcp_dialer_local_bind_no_port },
{ "tcp dialer local unbound", test_tcp_dialer_local_unbound },
{ "tcp dialer local bad family",
test_tcp_dialer_local_bind_bad_family },
{ "tcp dialer local bad type", test_tcp_dialer_local_bind_bad_type },
{ NULL, NULL },
};

0 comments on commit 207a6d1

Please sign in to comment.