aboutsummaryrefslogtreecommitdiff
path: root/src/sp/transport/ws/ws_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sp/transport/ws/ws_test.c')
-rw-r--r--src/sp/transport/ws/ws_test.c181
1 files changed, 181 insertions, 0 deletions
diff --git a/src/sp/transport/ws/ws_test.c b/src/sp/transport/ws/ws_test.c
new file mode 100644
index 00000000..7cbcd9d7
--- /dev/null
+++ b/src/sp/transport/ws/ws_test.c
@@ -0,0 +1,181 @@
+//
+// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2018 Cody Piersall <cody.piersall@gmail.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.
+//
+
+#include <nuts.h>
+
+static void
+test_ws_url_path_filters(void)
+{
+ nng_socket s1;
+ nng_socket s2;
+ char addr[NNG_MAXADDRLEN];
+
+ NUTS_OPEN(s1);
+ NUTS_OPEN(s2);
+
+ nuts_scratch_addr("ws", sizeof(addr), addr);
+ NUTS_PASS(nng_listen(s1, addr, NULL, 0));
+
+ // Now try we just remove the last character for now.
+ // This will make the path different.
+ addr[strlen(addr) - 1] = '\0';
+ NUTS_FAIL(nng_dial(s2, addr, NULL, 0), NNG_ECONNREFUSED);
+
+ NUTS_CLOSE(s1);
+ NUTS_CLOSE(s2);
+}
+
+static void
+test_wild_card_port(void)
+{
+ nng_socket s1;
+ nng_socket s2;
+ nng_socket s3;
+ nng_socket s4;
+ nng_socket s5;
+ nng_socket s6;
+
+ nng_listener l1;
+ nng_listener l2;
+ nng_listener l3;
+ int port1;
+ int port2;
+ int port3;
+ char ws_url[128];
+ NUTS_OPEN(s1);
+ NUTS_OPEN(s2);
+ NUTS_OPEN(s3);
+ NUTS_OPEN(s4);
+ NUTS_OPEN(s5);
+ NUTS_OPEN(s6);
+ NUTS_PASS(nng_listen(s1, "ws://127.0.0.1:0/one", &l1, 0));
+ NUTS_PASS(
+ nng_listener_get_int(l1, NNG_OPT_TCP_BOUND_PORT, &port1));
+ NUTS_TRUE(port1 != 0);
+ snprintf(ws_url, sizeof(ws_url), "ws4://127.0.0.1:%d/two", port1);
+ NUTS_PASS(nng_listen(s2, ws_url, &l2, 0));
+ NUTS_PASS(
+ nng_listener_get_int(l2, NNG_OPT_TCP_BOUND_PORT, &port2));
+ NUTS_TRUE(port1 != 0);
+ NUTS_TRUE(port1 == port2);
+ // Now try a different wild card port.
+ NUTS_PASS(nng_listen(s3, "ws4://127.0.0.1:0/three", &l3, 0));
+ NUTS_PASS(
+ nng_listener_get_int(l3, NNG_OPT_TCP_BOUND_PORT, &port3));
+ NUTS_TRUE(port3 != 0);
+ NUTS_TRUE(port3 != port1);
+
+ // Let's make sure can dial to each.
+ snprintf(ws_url, sizeof(ws_url), "ws://127.0.0.1:%d/one", port1);
+ NUTS_PASS(nng_dial(s4, ws_url, NULL, 0));
+ snprintf(ws_url, sizeof(ws_url), "ws://127.0.0.1:%d/two", port2);
+ NUTS_PASS(nng_dial(s6, ws_url, NULL, 0));
+ snprintf(ws_url, sizeof(ws_url), "ws://127.0.0.1:%d/three", port3);
+ NUTS_PASS(nng_dial(s6, ws_url, NULL, 0));
+
+ NUTS_CLOSE(s1);
+ NUTS_CLOSE(s2);
+ NUTS_CLOSE(s3);
+ NUTS_CLOSE(s4);
+ NUTS_CLOSE(s5);
+ NUTS_CLOSE(s6);
+}
+
+static void
+test_wild_card_host(void)
+{
+ nng_socket s1;
+ nng_socket s2;
+ char addr[NNG_MAXADDRLEN];
+ uint16_t port;
+
+ NUTS_OPEN(s1);
+ NUTS_OPEN(s2);
+
+ port = nuts_next_port();
+
+ // we use ws4 to ensure 127.0.0.1 binding
+ snprintf(addr, sizeof(addr), "ws4://*:%u/test", port);
+ NUTS_PASS(nng_listen(s1, addr, NULL, 0));
+ nng_msleep(100);
+
+ snprintf(addr, sizeof(addr), "ws://127.0.0.1:%u/test", port);
+ NUTS_PASS(nng_dial(s2, addr, NULL, 0));
+
+ NUTS_CLOSE(s1);
+ NUTS_CLOSE(s2);
+}
+
+static void
+test_empty_host(void)
+{
+ nng_socket s1;
+ nng_socket s2;
+ char addr[NNG_MAXADDRLEN];
+ uint16_t port;
+
+ NUTS_OPEN(s1);
+ NUTS_OPEN(s2);
+
+ port = nuts_next_port();
+
+ // we use ws4 to ensure 127.0.0.1 binding
+ snprintf(addr, sizeof(addr), "ws4://:%u/test", port);
+ NUTS_PASS(nng_listen(s1, addr, NULL, 0));
+ nng_msleep(100);
+
+ snprintf(addr, sizeof(addr), "ws://127.0.0.1:%u/test", port);
+ NUTS_PASS(nng_dial(s2, addr, NULL, 0));
+
+ NUTS_CLOSE(s1);
+ NUTS_CLOSE(s2);
+}
+
+void
+test_ws_recv_max(void)
+{
+ char msg[256];
+ char buf[256];
+ nng_socket s0;
+ nng_socket s1;
+ nng_listener l;
+ size_t sz;
+ char *addr;
+
+ NUTS_ADDR(addr, "ws");
+ NUTS_OPEN(s0);
+ NUTS_PASS(nng_socket_set_ms(s0, NNG_OPT_RECVTIMEO, 100));
+ NUTS_PASS(nng_socket_set_size(s0, NNG_OPT_RECVMAXSZ, 200));
+ NUTS_PASS(nng_listener_create(&l, s0, addr));
+ NUTS_PASS(nng_socket_get_size(s0, NNG_OPT_RECVMAXSZ, &sz));
+ NUTS_TRUE(sz == 200);
+ NUTS_PASS(nng_listener_set_size(l, NNG_OPT_RECVMAXSZ, 100));
+ NUTS_PASS(nng_listener_start(l, 0));
+
+ NUTS_OPEN(s1);
+ NUTS_PASS(nng_dial(s1, addr, NULL, 0));
+ NUTS_PASS(nng_send(s1, msg, 95, 0));
+ NUTS_PASS(nng_socket_set_ms(s1, NNG_OPT_SENDTIMEO, 100));
+ NUTS_PASS(nng_recv(s0, buf, &sz, 0));
+ NUTS_TRUE(sz == 95);
+ NUTS_PASS(nng_send(s1, msg, 150, 0));
+ NUTS_FAIL(nng_recv(s0, buf, &sz, 0), NNG_ETIMEDOUT);
+ NUTS_CLOSE(s0);
+ NUTS_CLOSE(s1);
+}
+
+TEST_LIST = {
+ { "ws url path filters", test_ws_url_path_filters },
+ { "ws wild card port", test_wild_card_port },
+ { "ws wild card host", test_wild_card_host },
+ { "ws empty host", test_empty_host },
+ { "ws recv max", test_ws_recv_max },
+ { NULL, NULL },
+}; \ No newline at end of file