Skip to content

Commit 207a6d1

Browse files
committed
tcp dialer tests: add local address tests
1 parent 071de8a commit 207a6d1

File tree

2 files changed

+132
-8
lines changed

2 files changed

+132
-8
lines changed

src/platform/posix/posix_tcpdial.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -379,16 +379,14 @@ tcp_dialer_set_locaddr(void *arg, const void *buf, size_t sz, nni_type t)
379379
default:
380380
return (NNG_EADDRINVAL);
381381
}
382-
if (d != NULL) {
383-
nni_mtx_lock(&d->mtx);
384-
if (d->closed) {
385-
nni_mtx_unlock(&d->mtx);
386-
return (NNG_ECLOSED);
387-
}
388-
d->src = ss;
389-
d->srclen = len;
382+
nni_mtx_lock(&d->mtx);
383+
if (d->closed) {
390384
nni_mtx_unlock(&d->mtx);
385+
return (NNG_ECLOSED);
391386
}
387+
d->src = ss;
388+
d->srclen = len;
389+
nni_mtx_unlock(&d->mtx);
392390
return (0);
393391
}
394392

src/platform/tcp_stream_test.c

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,124 @@ test_tcp_listen_activation_bad_arg(void)
428428
nng_stream_listener_free(l1);
429429
}
430430

431+
void
432+
test_tcp_dialer_local_bind(void)
433+
{
434+
nng_stream_dialer *d;
435+
nng_sockaddr sa = { 0 };
436+
437+
NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://127.0.0.1:80"));
438+
439+
sa.s_in.sa_family = NNG_AF_INET;
440+
sa.s_in.sa_addr = nuts_be32(0x7F000001); // loopback
441+
sa.s_in.sa_port = 0;
442+
NUTS_PASS(nng_stream_dialer_set_addr(d, NNG_OPT_LOCADDR, &sa));
443+
memset(&sa, 0, sizeof(sa));
444+
NUTS_PASS(nng_stream_dialer_get_addr(d, NNG_OPT_LOCADDR, &sa));
445+
NUTS_TRUE(sa.s_in.sa_family == NNG_AF_INET);
446+
NUTS_TRUE(sa.s_in.sa_addr == nuts_be32(0x7F000001));
447+
NUTS_TRUE(sa.s_in.sa_port == 0);
448+
nng_stream_dialer_free(d);
449+
}
450+
451+
void
452+
test_tcp_dialer_local_bind_v6(void)
453+
{
454+
#ifdef NNG_ENABLE_IPV6
455+
nng_stream_dialer *d;
456+
nng_sockaddr sa = { 0 };
457+
uint8_t loopback[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
458+
1 };
459+
460+
NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://[::1]:80"));
461+
462+
sa.s_in6.sa_family = NNG_AF_INET6;
463+
memcpy(sa.s_in6.sa_addr, loopback, 16);
464+
sa.s_in6.sa_addr[15] = 1;
465+
sa.s_in6.sa_port = 0;
466+
NUTS_PASS(nng_stream_dialer_set_addr(d, NNG_OPT_LOCADDR, &sa));
467+
memset(&sa, 0, sizeof(sa));
468+
NUTS_PASS(nng_stream_dialer_get_addr(d, NNG_OPT_LOCADDR, &sa));
469+
NUTS_TRUE(sa.s_in6.sa_family == NNG_AF_INET6);
470+
NUTS_TRUE(memcmp(sa.s_in6.sa_addr, loopback, 16) == 0);
471+
NUTS_TRUE(sa.s_in6.sa_port == 0);
472+
nng_stream_dialer_free(d);
473+
#else
474+
NUTS_SKIP("No IPv6 support");
475+
#endif
476+
}
477+
478+
void
479+
test_tcp_dialer_local_bind_no_port(void)
480+
{
481+
nng_stream_dialer *d;
482+
nng_sockaddr sa = { 0 };
483+
484+
NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://127.0.0.1:80"));
485+
486+
memset(&sa, 0, sizeof(sa));
487+
sa.s_family = NNG_AF_INPROC;
488+
NUTS_PASS(nng_stream_dialer_get_addr(d, NNG_OPT_LOCADDR, &sa));
489+
490+
NUTS_TRUE(sa.s_in.sa_family == NNG_AF_UNSPEC);
491+
nng_stream_dialer_free(d);
492+
}
493+
494+
void
495+
test_tcp_dialer_local_bind_bad_family(void)
496+
{
497+
nng_stream_dialer *d;
498+
nng_sockaddr sa = { 0 };
499+
500+
NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://127.0.0.1:80"));
501+
502+
memset(&sa, 0, sizeof(sa));
503+
sa.s_family = NNG_AF_INPROC;
504+
NUTS_FAIL(nng_stream_dialer_set_addr(d, NNG_OPT_LOCADDR, &sa),
505+
NNG_EADDRINVAL);
506+
nng_stream_dialer_free(d);
507+
}
508+
509+
void
510+
test_tcp_dialer_local_unbound(void)
511+
{
512+
nng_stream_dialer *d;
513+
nng_sockaddr sa = { 0 };
514+
515+
NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://127.0.0.1:80"));
516+
517+
sa.s_in.sa_family = NNG_AF_INET;
518+
sa.s_in.sa_addr = nuts_be32(0x7F000001); // loopback
519+
sa.s_in.sa_port = nuts_be16(1212);
520+
NUTS_FAIL(nng_stream_dialer_set_addr(d, NNG_OPT_LOCADDR, &sa),
521+
NNG_EADDRINVAL);
522+
523+
#ifdef NNG_ENABLE_IPV6
524+
memset(&sa, 0, sizeof(sa));
525+
sa.s_in6.sa_family = NNG_AF_INET6;
526+
sa.s_in6.sa_port = nuts_be16(1212);
527+
NUTS_FAIL(nng_stream_dialer_set_addr(d, NNG_OPT_LOCADDR, &sa),
528+
NNG_EADDRINVAL);
529+
#endif
530+
531+
nng_stream_dialer_free(d);
532+
}
533+
534+
void
535+
test_tcp_dialer_local_bind_bad_type(void)
536+
{
537+
nng_stream_dialer *d;
538+
nng_sockaddr sa = { 0 };
539+
540+
NUTS_PASS(nng_stream_dialer_alloc(&d, "tcp://127.0.0.1:80"));
541+
542+
memset(&sa, 0, sizeof(sa));
543+
sa.s_family = NNG_AF_INPROC;
544+
NUTS_FAIL(nng_stream_dialer_set_bool(d, NNG_OPT_LOCADDR, false),
545+
NNG_EBADTYPE);
546+
nng_stream_dialer_free(d);
547+
}
548+
431549
NUTS_TESTS = {
432550
{ "tcp stream", test_tcp_stream },
433551
{ "tcp listen accept cancel", test_tcp_listen_accept_cancel },
@@ -443,5 +561,13 @@ NUTS_TESTS = {
443561
test_tcp_listen_activation_bogus_fd },
444562
{ "tcp socket activation bad arg",
445563
test_tcp_listen_activation_bad_arg },
564+
{ "tcp dialer local bind", test_tcp_dialer_local_bind },
565+
{ "tcp dialer local bind v6", test_tcp_dialer_local_bind_v6 },
566+
{ "tcp dialer local bind no port",
567+
test_tcp_dialer_local_bind_no_port },
568+
{ "tcp dialer local unbound", test_tcp_dialer_local_unbound },
569+
{ "tcp dialer local bad family",
570+
test_tcp_dialer_local_bind_bad_family },
571+
{ "tcp dialer local bad type", test_tcp_dialer_local_bind_bad_type },
446572
{ NULL, NULL },
447573
};

0 commit comments

Comments
 (0)