diff options
| author | Garrett D'Amore <garrett@damore.org> | 2024-12-30 19:59:27 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2024-12-30 22:28:32 -0800 |
| commit | 6ff9e9beb18ee46e64d7bf929baf57590f23c789 (patch) | |
| tree | 143d5ce8d9c0b1633c02336548c76db0a6e1d27a | |
| parent | 071de8a7049839b5ed9a7478f29c8921455ae50a (diff) | |
| download | nng-6ff9e9beb18ee46e64d7bf929baf57590f23c789.tar.gz nng-6ff9e9beb18ee46e64d7bf929baf57590f23c789.tar.bz2 nng-6ff9e9beb18ee46e64d7bf929baf57590f23c789.zip | |
tcp dialer tests: add local address tests
| -rw-r--r-- | src/platform/posix/posix_tcpdial.c | 14 | ||||
| -rw-r--r-- | src/platform/tcp_stream_test.c | 133 |
2 files changed, 139 insertions, 8 deletions
diff --git a/src/platform/posix/posix_tcpdial.c b/src/platform/posix/posix_tcpdial.c index e827b666..e28b6d5a 100644 --- a/src/platform/posix/posix_tcpdial.c +++ b/src/platform/posix/posix_tcpdial.c @@ -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); } + d->src = ss; + d->srclen = len; + nni_mtx_unlock(&d->mtx); return (0); } diff --git a/src/platform/tcp_stream_test.c b/src/platform/tcp_stream_test.c index e2ca694b..92f2817f 100644 --- a/src/platform/tcp_stream_test.c +++ b/src/platform/tcp_stream_test.c @@ -428,6 +428,131 @@ 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); + + memset(&sa, 0, sizeof(sa)); + sa.s_ipc.sa_family = NNG_AF_IPC; + snprintf(sa.s_ipc.sa_path, sizeof(sa.s_ipc.sa_path), "%s", "/bogus"); + 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 }, @@ -443,5 +568,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 }, }; |
