diff options
Diffstat (limited to 'src/platform/udp_test.c')
| -rw-r--r-- | src/platform/udp_test.c | 253 |
1 files changed, 162 insertions, 91 deletions
diff --git a/src/platform/udp_test.c b/src/platform/udp_test.c index 070b3eea..b6b31c9b 100644 --- a/src/platform/udp_test.c +++ b/src/platform/udp_test.c @@ -23,20 +23,18 @@ void test_udp_pair(void) { - nng_sockaddr sa1; - nng_sockaddr sa2; - nni_plat_udp *u1; - nni_plat_udp *u2; - uint32_t loopback; - nng_aio *aio1; - nng_aio *aio2; - nng_iov iov1, iov2; - char msg[] = "hello"; - char rbuf[1024]; - nng_sockaddr to; - nng_sockaddr from; - - NUTS_PASS(nni_init()); + nng_sockaddr sa1; + nng_sockaddr sa2; + nng_udp *u1; + nng_udp *u2; + uint32_t loopback; + nng_aio *aio1; + nng_aio *aio2; + nng_iov iov1, iov2; + char msg[] = "hello"; + char rbuf[1024]; + nng_sockaddr to; + nng_sockaddr from; loopback = htonl(0x7f000001); // 127.0.0.1 @@ -48,11 +46,11 @@ test_udp_pair(void) sa2.s_in.sa_addr = loopback; sa2.s_in.sa_port = 0; - NUTS_PASS(nni_plat_udp_open(&u1, &sa1)); - NUTS_PASS(nni_plat_udp_open(&u2, &sa2)); + NUTS_PASS(nng_udp_open(&u1, &sa1)); + NUTS_PASS(nng_udp_open(&u2, &sa2)); - NUTS_PASS(nni_plat_udp_sockname(u1, &sa1)); - NUTS_PASS(nni_plat_udp_sockname(u2, &sa2)); + NUTS_PASS(nng_udp_sockname(u1, &sa1)); + NUTS_PASS(nng_udp_sockname(u2, &sa2)); NUTS_PASS(nng_aio_alloc(&aio1, NULL, NULL)); NUTS_PASS(nng_aio_alloc(&aio2, NULL, NULL)); @@ -68,8 +66,8 @@ test_udp_pair(void) NUTS_PASS(nng_aio_set_iov(aio2, 1, &iov2)); NUTS_PASS(nng_aio_set_input(aio2, 0, &from)); - nni_plat_udp_recv(u2, aio2); - nni_plat_udp_send(u1, aio1); + nng_udp_recv(u2, aio2); + nng_udp_send(u1, aio1); nng_aio_wait(aio1); nng_aio_wait(aio2); @@ -83,26 +81,24 @@ test_udp_pair(void) nng_aio_free(aio1); nng_aio_free(aio2); - nni_plat_udp_close(u1); - nni_plat_udp_close(u2); + nng_udp_close(u1); + nng_udp_close(u2); } void test_udp_multi_send_recv(void) { - nng_sockaddr sa1, sa2, sa3, sa4; - nni_plat_udp *u1; - nni_plat_udp *u2; - uint32_t loopback; - nng_aio *aio1, *aio2, *aio3, *aio4; - nng_iov iov1, iov2, iov3, iov4; - char msg1[] = "hello"; - char msg2[] = "there"; - char rbuf1[32]; - char rbuf2[32]; - nng_sockaddr to; - - NUTS_PASS(nni_init()); + nng_sockaddr sa1, sa2, sa3, sa4; + nng_udp *u1; + nng_udp *u2; + uint32_t loopback; + nng_aio *aio1, *aio2, *aio3, *aio4; + nng_iov iov1, iov2, iov3, iov4; + char msg1[] = "hello"; + char msg2[] = "there"; + char rbuf1[32]; + char rbuf2[32]; + nng_sockaddr to; loopback = htonl(0x7f000001); // 127.0.0.1 @@ -114,11 +110,11 @@ test_udp_multi_send_recv(void) sa2.s_in.sa_addr = loopback; sa2.s_in.sa_port = 0; - NUTS_PASS(nni_plat_udp_open(&u1, &sa1)); - NUTS_PASS(nni_plat_udp_open(&u2, &sa2)); + NUTS_PASS(nng_udp_open(&u1, &sa1)); + NUTS_PASS(nng_udp_open(&u2, &sa2)); - NUTS_PASS(nni_plat_udp_sockname(u1, &sa1)); - NUTS_PASS(nni_plat_udp_sockname(u2, &sa2)); + NUTS_PASS(nng_udp_sockname(u1, &sa1)); + NUTS_PASS(nng_udp_sockname(u2, &sa2)); NUTS_PASS(nng_aio_alloc(&aio1, NULL, NULL)); NUTS_PASS(nng_aio_alloc(&aio2, NULL, NULL)); @@ -147,11 +143,11 @@ test_udp_multi_send_recv(void) NUTS_PASS(nng_aio_set_iov(aio4, 1, &iov4)); NUTS_PASS(nng_aio_set_input(aio4, 0, &sa4)); - nni_plat_udp_recv(u2, aio4); - nni_plat_udp_recv(u2, aio3); - nni_plat_udp_send(u1, aio2); + nng_udp_recv(u2, aio4); + nng_udp_recv(u2, aio3); + nng_udp_send(u1, aio2); nng_msleep(100); // to keep order clear - nni_plat_udp_send(u1, aio1); + nng_udp_send(u1, aio1); nng_aio_wait(aio1); nng_aio_wait(aio2); nng_aio_wait(aio3); @@ -166,7 +162,7 @@ test_udp_multi_send_recv(void) NUTS_ASSERT(strcmp(rbuf1, msg1) == 0); NUTS_ASSERT(strcmp(rbuf2, msg2) == 0); - NUTS_PASS(nni_plat_udp_sockname(u1, &sa2)); + NUTS_PASS(nng_udp_sockname(u1, &sa2)); NUTS_ASSERT(sa2.s_in.sa_family == sa3.s_in.sa_family); NUTS_ASSERT(sa2.s_in.sa_addr == sa3.s_in.sa_addr); NUTS_ASSERT(sa2.s_in.sa_port == sa3.s_in.sa_port); @@ -179,21 +175,19 @@ test_udp_multi_send_recv(void) nng_aio_free(aio2); nng_aio_free(aio3); nng_aio_free(aio4); - nni_plat_udp_close(u1); - nni_plat_udp_close(u2); + nng_udp_close(u1); + nng_udp_close(u2); } void test_udp_send_no_addr(void) { - nng_sockaddr sa1; - nni_plat_udp *u1; - uint32_t loopback; - nng_aio *aio1; - nng_iov iov1; - char msg[] = "hello"; - - NUTS_PASS(nni_init()); + nng_sockaddr sa1; + nng_udp *u1; + uint32_t loopback; + nng_aio *aio1; + nng_iov iov1; + char msg[] = "hello"; loopback = htonl(0x7f000001); // 127.0.0.1 @@ -201,8 +195,8 @@ test_udp_send_no_addr(void) sa1.s_in.sa_addr = loopback; sa1.s_in.sa_port = 0; // wild card port binding - NUTS_PASS(nni_plat_udp_open(&u1, &sa1)); - NUTS_PASS(nni_plat_udp_sockname(u1, &sa1)); + NUTS_PASS(nng_udp_open(&u1, &sa1)); + NUTS_PASS(nng_udp_sockname(u1, &sa1)); NUTS_PASS(nng_aio_alloc(&aio1, NULL, NULL)); @@ -210,28 +204,26 @@ test_udp_send_no_addr(void) iov1.iov_len = strlen(msg) + 1; NUTS_PASS(nng_aio_set_iov(aio1, 1, &iov1)); - nni_plat_udp_send(u1, aio1); + nng_udp_send(u1, aio1); nng_aio_wait(aio1); NUTS_FAIL(nng_aio_result(aio1), NNG_EADDRINVAL); nng_aio_free(aio1); - nni_plat_udp_close(u1); + nng_udp_close(u1); } void test_udp_send_ipc(void) { - nng_sockaddr sa1; - nng_sockaddr sa2; - nni_plat_udp *u1; - uint32_t loopback; - nng_aio *aio1; - nng_iov iov1; - char msg[] = "hello"; - int rv; - - NUTS_PASS(nni_init()); + nng_sockaddr sa1 = { 0 }; + nng_sockaddr sa2 = { 0 }; + nng_udp *u1; + uint32_t loopback; + nng_aio *aio1; + nng_iov iov1; + char msg[] = "hello"; + int rv; loopback = htonl(0x7f000001); // 127.0.0.1 @@ -242,8 +234,8 @@ test_udp_send_ipc(void) sa2.s_ipc.sa_family = NNG_AF_IPC; strcat(sa2.s_ipc.sa_path, "/tmp/bogus"); - NUTS_PASS(nni_plat_udp_open(&u1, &sa1)); - NUTS_PASS(nni_plat_udp_sockname(u1, &sa1)); + NUTS_PASS(nng_udp_open(&u1, &sa1)); + NUTS_PASS(nng_udp_sockname(u1, &sa1)); NUTS_PASS(nng_aio_alloc(&aio1, NULL, NULL)); @@ -252,49 +244,126 @@ test_udp_send_ipc(void) NUTS_PASS(nng_aio_set_iov(aio1, 1, &iov1)); NUTS_PASS(nng_aio_set_input(aio1, 0, &sa2)); - nni_plat_udp_send(u1, aio1); + nng_udp_send(u1, aio1); nng_aio_wait(aio1); rv = nng_aio_result(aio1); NUTS_ASSERT(rv == NNG_EADDRINVAL || rv == NNG_ENOTSUP); nng_aio_free(aio1); - nni_plat_udp_close(u1); + nng_udp_close(u1); } void test_udp_bogus_bind(void) { - nni_plat_udp *u; - nng_sockaddr sa; - int rv; + nng_udp *u; + nng_sockaddr sa = { 0 }; + int rv; sa.s_ipc.sa_family = NNG_AF_IPC; strcpy(sa.s_ipc.sa_path, "/tmp/t"); - rv = nni_plat_udp_open(&u, &sa); + rv = nng_udp_open(&u, &sa); // Some platforms reject IPC addresses altogether (Windows), // whereas others just say it's not supported with UDP. NUTS_ASSERT((rv == NNG_ENOTSUP) || (rv == NNG_EADDRINVAL)); // NULL address also bad. - NUTS_FAIL(nni_plat_udp_open(&u, NULL), NNG_EADDRINVAL); + NUTS_FAIL(nng_udp_open(&u, NULL), NNG_EADDRINVAL); } void test_udp_duplicate_bind(void) { - nni_plat_udp *u1; - nni_plat_udp *u2; - nng_sockaddr sa; + nng_udp *u1; + nng_udp *u2; + nng_sockaddr sa = { 0 }; + + sa.s_in.sa_family = NNG_AF_INET; + sa.s_in.sa_addr = htonl(0x7f000001); + + NUTS_PASS(nng_udp_open(&u1, &sa)); + NUTS_PASS(nng_udp_sockname(u1, &sa)); + NUTS_FAIL(nng_udp_open(&u2, &sa), NNG_EADDRINUSE); + nng_udp_close(u1); +} + +void +test_udp_multicast_membership(void) +{ + nng_udp *u1; + nng_sockaddr sa = { 0 }; + nng_sockaddr mc = { 0 }; + + mc.s_in.sa_family = NNG_AF_INET; + mc.s_in.sa_addr = htonl(0xe0000001); // 224.0.0.1 ... all hosts sa.s_in.sa_family = NNG_AF_INET; sa.s_in.sa_addr = htonl(0x7f000001); - NUTS_PASS(nni_init()); - NUTS_PASS(nni_plat_udp_open(&u1, &sa)); - NUTS_PASS(nni_plat_udp_sockname(u1, &sa)); - NUTS_FAIL(nni_plat_udp_open(&u2, &sa), NNG_EADDRINUSE); - nni_plat_udp_close(u1); + NUTS_PASS(nng_udp_open(&u1, &sa)); + NUTS_PASS(nng_udp_sockname(u1, &sa)); + NUTS_PASS(nng_udp_multicast_membership(u1, &mc, true)); + NUTS_PASS(nng_udp_multicast_membership(u1, &mc, false)); + nng_udp_close(u1); +} + +void +test_udp_multicast_send_recv(void) +{ + nng_udp *u1; + nng_udp *u2; + nng_sockaddr sa1 = { 0 }; + nng_sockaddr sa2 = { 0 }; + nng_sockaddr ra2 = { 0 }; + nng_sockaddr mc = { 0 }; + char *msg = "multi"; + nng_iov iov1; + nng_iov iov2; + nng_aio *aio1; + nng_aio *aio2; + char rbuf[32]; + + mc.s_in.sa_family = NNG_AF_INET; + mc.s_in.sa_addr = htonl(0xe0000001); // 224.0.0.1 ... all hosts + + sa1.s_in.sa_family = NNG_AF_INET; + sa1.s_in.sa_addr = htonl(0x7f000001); + + sa2.s_in.sa_family = NNG_AF_INET; + sa2.s_in.sa_addr = htonl(0x7f000001); + + NUTS_PASS(nng_udp_open(&u1, &sa1)); + NUTS_PASS(nng_udp_sockname(u1, &sa1)); + NUTS_PASS(nng_udp_open(&u2, &sa2)); + NUTS_PASS(nng_udp_sockname(u2, &sa2)); + NUTS_PASS(nng_udp_multicast_membership(u1, &mc, true)); + NUTS_PASS(nng_udp_multicast_membership(u2, &mc, true)); + NUTS_PASS(nng_aio_alloc(&aio1, NULL, NULL)); + NUTS_PASS(nng_aio_alloc(&aio2, NULL, NULL)); + + iov1.iov_buf = msg; + iov1.iov_len = strlen(msg) + 1; + NUTS_PASS(nng_aio_set_iov(aio1, 1, &iov1)); + NUTS_PASS(nng_aio_set_input(aio1, 0, &sa2)); + + iov2.iov_buf = rbuf; + iov2.iov_len = sizeof(rbuf); + NUTS_PASS(nng_aio_set_iov(aio2, 1, &iov2)); + NUTS_PASS(nng_aio_set_input(aio2, 0, &ra2)); + + nng_udp_recv(u2, aio2); + nng_udp_send(u1, aio1); + nng_aio_wait(aio1); + nng_aio_wait(aio2); + NUTS_PASS(nng_aio_result(aio1)); + NUTS_PASS(nng_aio_result(aio2)); + + NUTS_MATCH(msg, rbuf); + nng_udp_close(u1); + nng_udp_close(u2); + nng_aio_free(aio1); + nng_aio_free(aio2); } #ifdef NNG_ENABLE_IPV6 @@ -302,20 +371,20 @@ void test_udp_send_v6_from_v4(void) { int rv; - nni_plat_udp *u1; - nng_sockaddr sa; + nng_udp *u1; + nng_sockaddr sa = { 0 }; nng_aio *aio1; nng_iov iov1; char *msg = "nope"; const uint8_t google[16] = { 0x26, 0x07, 0xf8, 0xb0, 0x40, 0x07, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0e }; + memset(&sa, 0, sizeof(sa)); sa.s_in.sa_family = NNG_AF_INET; sa.s_in.sa_addr = htonl(0x7f000001); - NUTS_PASS(nni_init()); NUTS_PASS(nng_aio_alloc(&aio1, NULL, NULL)); - NUTS_PASS(nni_plat_udp_open(&u1, &sa)); + NUTS_PASS(nng_udp_open(&u1, &sa)); sa.s_in6.sa_family = NNG_AF_INET6; memcpy(sa.s_in6.sa_addr, google, 16); @@ -326,14 +395,14 @@ test_udp_send_v6_from_v4(void) nng_aio_set_iov(aio1, 1, &iov1); nng_aio_set_input(aio1, 0, &sa); - nni_plat_udp_send(u1, aio1); + nng_udp_send(u1, aio1); nng_aio_wait(aio1); rv = nng_aio_result(aio1); NUTS_ASSERT((rv == NNG_EADDRINVAL) || (rv == NNG_ENOTSUP) || (rv == NNG_EUNREACHABLE)); nng_aio_free(aio1); - nni_plat_udp_close(u1); + nng_udp_close(u1); } #endif // NNG_ENABLE_IPV6 @@ -344,6 +413,8 @@ NUTS_TESTS = { { "udp send ipc address", test_udp_send_ipc }, { "udp bogus bind", test_udp_bogus_bind }, { "udp duplicate bind", test_udp_duplicate_bind }, + { "udp multicast membership", test_udp_multicast_membership }, + { "udp multicast send recv", test_udp_multicast_send_recv }, #ifdef NNG_ENABLE_IPV6 { "udp send v6 from v4", test_udp_send_v6_from_v4 }, #endif |
