summaryrefslogtreecommitdiff
path: root/tests/udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/udp.c')
-rw-r--r--tests/udp.c291
1 files changed, 0 insertions, 291 deletions
diff --git a/tests/udp.c b/tests/udp.c
deleted file mode 100644
index 4f9eabe5..00000000
--- a/tests/udp.c
+++ /dev/null
@@ -1,291 +0,0 @@
-//
-// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
-// Copyright 2018 Capitar IT Group BV <info@capitar.com>
-//
-// This software is supplied under the terms of the MIT License, a
-// copy of which should be located in the distribution where this
-// file was obtained (LICENSE.txt). A copy of the license may also be
-// found online at https://opensource.org/licenses/MIT.
-//
-
-// Basic UDP tests.
-
-#ifndef _WIN32
-#include <arpa/inet.h>
-#endif
-
-#include "convey.h"
-#include "core/nng_impl.h"
-#include "trantest.h"
-
-TestMain("UDP support", {
- nni_init();
-
- trantest_port = trantest_port ? trantest_port : 5555;
-
- Convey("We can start a pair of UDP ports", {
- nng_sockaddr sa1;
- nng_sockaddr sa2;
- uint16_t p1;
- uint16_t p2;
- nni_plat_udp *u1;
- nni_plat_udp *u2;
- uint32_t loopback;
-
- loopback = htonl(0x7f000001); // 127.0.0.1
-
- p1 = trantest_port++;
- p2 = trantest_port++;
-
- sa1.s_in.sa_family = NNG_AF_INET;
- sa1.s_in.sa_addr = loopback;
- sa1.s_in.sa_port = htons(p1);
-
- sa2.s_in.sa_family = NNG_AF_INET;
- sa2.s_in.sa_addr = loopback;
- sa2.s_in.sa_port = htons(p2);
-
- So(nni_plat_udp_open(&u1, &sa1) == 0);
- So(nni_plat_udp_open(&u2, &sa2) == 0);
- Reset({
- nni_plat_udp_close(u1);
- nni_plat_udp_close(u2);
- });
-
- Convey("They can talk to each other", {
- char msg[] = "hello";
- char rbuf[1024];
- nng_sockaddr to;
- nng_sockaddr from;
- nng_aio *aio1;
- nng_aio *aio2;
- nng_iov iov1;
- nng_iov iov2;
-
- So(nng_aio_alloc(&aio1, NULL, NULL) == 0);
- So(nng_aio_alloc(&aio2, NULL, NULL) == 0);
-
- to = sa2;
- iov1.iov_buf = msg;
- iov1.iov_len = strlen(msg) + 1;
- So(nng_aio_set_iov(aio1, 1, &iov1) == 0);
- nng_aio_set_input(aio1, 0, &to);
-
- iov2.iov_buf = rbuf;
- iov2.iov_len = 1024;
- So(nng_aio_set_iov(aio2, 1, &iov2) == 0);
- nng_aio_set_input(aio2, 0, &from);
-
- nni_plat_udp_recv(u2, aio2);
- nni_plat_udp_send(u1, aio1);
- nng_aio_wait(aio1);
- nng_aio_wait(aio2);
-
- So(nng_aio_result(aio1) == 0);
- So(nng_aio_result(aio2) == 0);
-
- So(nng_aio_count(aio2) == strlen(msg) + 1);
- So(strcmp(msg, rbuf) == 0);
-
- So(from.s_in.sa_family == sa1.s_in.sa_family);
- So(from.s_in.sa_port == sa1.s_in.sa_port);
- So(from.s_in.sa_addr == sa1.s_in.sa_addr);
-
- // Set up some calls that will ever complete, so
- // we test cancellation, etc.
- nni_plat_udp_recv(u2, aio2);
- nni_plat_udp_send(u2, aio1);
-
- nng_aio_free(aio1);
- nng_aio_free(aio2);
- });
-
- Convey("Sending without an address fails", {
- nng_aio *aio1;
- char *msg = "nope";
- nng_iov iov;
-
- So(nng_aio_alloc(&aio1, NULL, NULL) == 0);
-
- iov.iov_buf = msg;
- iov.iov_len = strlen(msg) + 1;
- So(nng_aio_set_iov(aio1, 1, &iov) == 0);
-
- nni_plat_udp_send(u1, aio1);
- nng_aio_wait(aio1);
- So(nng_aio_result(aio1) == NNG_EADDRINVAL);
- nng_aio_free(aio1);
- });
-
- Convey("Multiple operations work", {
- char msg1[] = "hello";
- char msg2[] = "there";
- char rbuf1[32];
- char rbuf2[32];
- nng_sockaddr to1;
- nng_sockaddr to2;
- nng_sockaddr from1;
- nng_sockaddr from2;
- nng_aio *aio1;
- nng_aio *aio2;
- nng_aio *aio3;
- nng_aio *aio4;
- nng_iov iov1;
- nng_iov iov2;
- nng_iov iov3;
- nng_iov iov4;
-
- So(nng_aio_alloc(&aio1, NULL, NULL) == 0);
- So(nng_aio_alloc(&aio2, NULL, NULL) == 0);
- So(nng_aio_alloc(&aio3, NULL, NULL) == 0);
- So(nng_aio_alloc(&aio4, NULL, NULL) == 0);
-
- to1 = sa2;
- iov1.iov_buf = msg1;
- iov1.iov_len = strlen(msg1) + 1;
- So(nng_aio_set_iov(aio1, 1, &iov1) == 0);
- nng_aio_set_input(aio1, 0, &to1);
-
- to2 = sa2;
- iov2.iov_buf = msg2;
- iov2.iov_len = strlen(msg2) + 1;
- So(nng_aio_set_iov(aio2, 1, &iov2) == 0);
- nng_aio_set_input(aio2, 0, &to2);
-
- iov3.iov_buf = rbuf1;
- iov3.iov_len = 1024;
- So(nng_aio_set_iov(aio3, 1, &iov3) == 0);
- nng_aio_set_input(aio3, 0, &from1);
-
- iov4.iov_buf = rbuf2;
- iov4.iov_len = 1024;
- So(nng_aio_set_iov(aio4, 1, &iov4) == 0);
- nng_aio_set_input(aio4, 0, &from2);
-
- nni_plat_udp_recv(u2, aio4);
- nni_plat_udp_recv(u2, aio3);
- nni_plat_udp_send(u1, aio2);
- // This delay here is required to test for a race
- // condition that does not occur if it is absent.
- nng_msleep(1);
- nni_plat_udp_send(u1, aio1);
-
- nng_aio_wait(aio2);
- nng_aio_wait(aio1);
- nng_aio_wait(aio3);
- nng_aio_wait(aio4);
-
- So(nng_aio_result(aio1) == 0);
- So(nng_aio_result(aio2) == 0);
- So(nng_aio_result(aio3) == 0);
- So(nng_aio_result(aio4) == 0);
-
- So(from1.s_in.sa_family == sa1.s_in.sa_family);
- So(from1.s_in.sa_port == sa1.s_in.sa_port);
- So(from1.s_in.sa_addr == sa1.s_in.sa_addr);
-
- nng_aio_free(aio1);
- nng_aio_free(aio2);
- nng_aio_free(aio3);
- nng_aio_free(aio4);
- });
-
- Convey("Sending without an address fails", {
- nng_aio *aio1;
- char *msg = "nope";
- nng_iov iov;
-
- So(nng_aio_alloc(&aio1, NULL, NULL) == 0);
- iov.iov_buf = msg;
- iov.iov_len = strlen(msg) + 1;
- So(nng_aio_set_iov(aio1, 1, &iov) == 0);
-
- nni_plat_udp_send(u1, aio1);
- nng_aio_wait(aio1);
- So(nng_aio_result(aio1) == NNG_EADDRINVAL);
- nng_aio_free(aio1);
- });
-
- // When we refactor this test suite for NUTS, reenable this
- // test. test. #ifdef NNG_ENABLE_IPV6 Convey("Sending
- // to an IPv6 address on IPv4 fails", {
- // nng_aio *aio1; char *msg = "nope";
- // nng_sockaddr sa; int rv;
- // nng_iov iov;
- //
- // sa.s_in6.sa_family = NNG_AF_INET6;
- // // address is for google.com
- // inet_ntop(AF_INET6,
- // "2607:f8b0:4007:804::200e", (void *)
- // sa.s_in6.sa_addr, 16); sa.s_in6.sa_port = 80;
- // So(nng_aio_alloc(&aio1, NULL, NULL) ==
- // 0); iov.iov_buf = msg;
- // iov.iov_len = strlen(msg) + 1;
- // So(nng_aio_set_iov(aio1, 1, &iov) == 0);
- // nng_aio_set_input(aio1, 0, &sa);
- //
- // nni_plat_udp_send(u1, aio1);
- // nng_aio_wait(aio1);
- // So((rv = nng_aio_result(aio1)) != 0);
- // So(rv == NNG_EADDRINVAL || rv ==
- // NNG_ENOTSUP || rv ==
- // NNG_EUNREACHABLE || rv == NNG_EINVAL);
- // nng_aio_free(aio1);
- // });
- // #endif
-
- Convey("Sending to an IPC address fails", {
- nng_aio *aio1;
- char *msg = "nope";
- nng_sockaddr sa;
- int rv;
- nng_iov iov;
-
- sa.s_ipc.sa_family = NNG_AF_IPC;
- strcat(sa.s_ipc.sa_path, "/tmp/junk");
- So(nng_aio_alloc(&aio1, NULL, NULL) == 0);
- iov.iov_buf = msg;
- iov.iov_len = strlen(msg) + 1;
- So(nng_aio_set_iov(aio1, 1, &iov) == 0);
- nng_aio_set_input(aio1, 0, &sa);
-
- nni_plat_udp_send(u1, aio1);
- nng_aio_wait(aio1);
- So((rv = nng_aio_result(aio1)) != 0);
- So(rv == NNG_EADDRINVAL || rv == NNG_ENOTSUP ||
- rv == NNG_EUNREACHABLE || rv == NNG_EINVAL);
- nng_aio_free(aio1);
- });
- });
-
- Convey("Cannot open using bogus sockaddr", {
- nni_plat_udp *u;
- nng_sockaddr sa;
- int rv;
-
- sa.s_ipc.sa_family = NNG_AF_IPC;
- strcpy(sa.s_ipc.sa_path, "/tmp/t");
- So((rv = nni_plat_udp_open(&u, &sa)) != 0);
- // Some platforms reject IPC addresses altogether (Windows),
- // whereas others just say it's not supported with UDP.
- So((rv == NNG_ENOTSUP) || (rv == NNG_EADDRINVAL));
-
- // NULL address also bad.
- So((rv = nni_plat_udp_open(&u, NULL)) == NNG_EADDRINVAL);
- });
-
- Convey("Duplicate binds fail", {
- nni_plat_udp *u1;
- nni_plat_udp *u2;
- nng_sockaddr sa;
- uint16_t p1;
-
- p1 = trantest_port++;
- sa.s_in.sa_family = NNG_AF_INET;
- sa.s_in.sa_port = htons(p1);
- sa.s_in.sa_addr = htonl(0x7f000001);
- So(nni_plat_udp_open(&u1, &sa) == 0);
- So(nni_plat_udp_open(&u2, &sa) == NNG_EADDRINUSE);
- nni_plat_udp_close(u1);
- });
-})