aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2025-04-27 11:44:42 -0700
committerGarrett D'Amore <garrett@damore.org>2025-04-27 11:44:42 -0700
commit9ebf1b2d2cc4bb850cc152168c08a1bb9e3e8ddb (patch)
tree33a003210caa2686bdd940539f7d280830a1ebdd
parent6f1e1d0bfa5a6e897c2eab64623e17bddc693d10 (diff)
downloadnng-9ebf1b2d2cc4bb850cc152168c08a1bb9e3e8ddb.tar.gz
nng-9ebf1b2d2cc4bb850cc152168c08a1bb9e3e8ddb.tar.bz2
nng-9ebf1b2d2cc4bb850cc152168c08a1bb9e3e8ddb.zip
Tests: remove the legacy wss transport test and framework support for Convey transport tests
This has been needed for some time; the convey framework is not reliable or debuggable, and will ultimately be removed. Only the http client test remains using it.
-rw-r--r--src/core/list_test.c11
-rw-r--r--tests/CMakeLists.txt23
-rw-r--r--tests/httpclient.c1
-rw-r--r--tests/stubs.h94
-rw-r--r--tests/trantest.h492
-rw-r--r--tests/wss.c212
6 files changed, 5 insertions, 828 deletions
diff --git a/src/core/list_test.c b/src/core/list_test.c
index e121e4c5..ec56cd93 100644
--- a/src/core/list_test.c
+++ b/src/core/list_test.c
@@ -8,7 +8,6 @@
//
#include "nng_impl.h"
-#include "stubs.h"
#include <nuts.h>
typedef struct {
@@ -116,8 +115,8 @@ test_list_two_items(void)
}
NUTS_TESTS = {
- { "list empty", test_list_init_empty },
- { "list add one", test_list_add_item },
- { "list add two", test_list_two_items },
- { NULL, NULL },
-}; \ No newline at end of file
+ { "list empty", test_list_init_empty },
+ { "list add one", test_list_add_item },
+ { "list add two", test_list_two_items },
+ { NULL, NULL },
+};
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 4dcfb1ad..5cbeb228 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -79,39 +79,16 @@ if (NNG_TESTS)
endif ()
endmacro()
- macro(add_nng_test2 NAME TIMEOUT COND1 COND2)
- if (${COND1} AND ${COND2})
- add_nng_test(${NAME} ${TIMEOUT})
- else ()
- message(STATUS "Test ${NAME} disabled (unconfigured)")
- endif ()
- endmacro()
-
- macro(add_nng_test3 NAME TIMEOUT COND1 COND2 COND3)
- if (${COND1} AND ${COND2} AND ${COND3})
- add_nng_test(${NAME} ${TIMEOUT} ON)
- else ()
- message(STATUS "Test ${NAME} disabled (unconfigured)")
- endif ()
- endmacro()
-
else ()
macro(add_nng_test NAME TIMEOUT)
endmacro(add_nng_test)
- macro(add_nng_compat_test NAME TIMEOUT)
- endmacro(add_nng_compat_test)
macro(add_nng_cpp_test NAME TIMEOUT)
endmacro(add_nng_cpp_test)
macro(add_nng_test1 NAME TIMEOUT COND1)
endmacro(add_nng_test1)
- macro(add_nng_test2 NAME TIMEOUT COND1 COND2)
- endmacro(add_nng_test2)
- macro(add_nng_test3 NAME TIMEOUT COND1 COND2 COND3)
- endmacro(add_nng_test3)
endif ()
add_nng_test1(httpclient 60 NNG_SUPP_HTTP)
-add_nng_test(wss 30)
# c++ tests
add_nng_cpp_test(cplusplus_pair 5)
diff --git a/tests/httpclient.c b/tests/httpclient.c
index b23449f1..4f55b8c7 100644
--- a/tests/httpclient.c
+++ b/tests/httpclient.c
@@ -20,7 +20,6 @@
#include "core/nng_impl.h"
#include "convey.h"
-#include "trantest.h"
TestMain("HTTP Client", {
Convey("Given a TCP connection to example.com", {
diff --git a/tests/stubs.h b/tests/stubs.h
deleted file mode 100644
index 8b230705..00000000
--- a/tests/stubs.h
+++ /dev/null
@@ -1,94 +0,0 @@
-//
-// Copyright 2018 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.
-//
-
-#ifndef STUBS_H
-#define STUBS_H
-
-#ifdef _WIN32
-
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif
-
-#include <windows.h>
-#include <winsock2.h>
-// order counts
-#include <mswsock.h>
-#define PLATFD SOCKET
-#define poll WSAPoll
-#else
-#include <poll.h>
-#include <stdint.h>
-#include <sys/time.h>
-#include <time.h>
-#define PLATFD int
-#endif
-
-// Stub handlers for some common things.
-
-uint64_t
-getms(void)
-{
-#ifdef _WIN32
- return (GetTickCount64());
-#else
- static time_t epoch;
- struct timeval tv;
-
- if (epoch == 0) {
- epoch = time(NULL);
- }
- gettimeofday(&tv, NULL);
-
- if (tv.tv_sec < epoch) {
- // Broken clock.
- // This will force all other timing tests to fail
- return (0);
- }
- tv.tv_sec -= epoch;
- return (
- ((uint64_t)(tv.tv_sec) * 1000) + (uint64_t)(tv.tv_usec / 1000));
-#endif
-}
-
-bool
-fdready(int fd)
-{
- struct pollfd pfd;
- pfd.fd = (PLATFD) fd;
- pfd.events = POLLRDNORM;
- pfd.revents = 0;
-
- switch (poll(&pfd, 1, 0)) {
- case 0:
- return (false);
- case 1:
- return (true);
- default:
-#ifdef CONVEY_H
- ConveyError("BAD POLL RETURN!");
-#elif defined(TEST_CHECK)
- TEST_ASSERT(0);
-#endif
- return (false);
- }
-}
-
-uint16_t
-test_htons(uint16_t in)
-{
- short one = 1;
- if (*((char *)(void *)&one) == 1) {
- in = ((in / 256) + ((in % 256) * 256));
- }
- return (in);
-}
-
-#endif // STUBS_H
diff --git a/tests/trantest.h b/tests/trantest.h
deleted file mode 100644
index b70bc1c4..00000000
--- a/tests/trantest.h
+++ /dev/null
@@ -1,492 +0,0 @@
-//
-// Copyright 2025 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.
-//
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <nng/nng.h>
-
-#include "convey.h"
-#include "core/nng_impl.h"
-
-// Transport common tests. By making a common test framework for transports,
-// we can avoid rewriting the same tests for each new transport. Include this
-// file once in your test code. The test framework uses the REQ/REP protocol
-// for messaging.
-typedef int (*trantest_proptest_t)(nng_msg *);
-
-typedef struct trantest trantest;
-
-struct trantest {
- const char *tmpl;
- char addr[NNG_MAXADDRLEN + 1];
- nng_socket reqsock;
- nng_socket repsock;
- nni_sp_tran *tran;
- int (*init)(struct trantest *);
- void (*fini)(struct trantest *);
- int (*dialer_init)(nng_dialer);
- int (*listener_init)(nng_listener);
- int (*proptest)(nng_msg *);
- void *private; // transport specific private data
-};
-
-unsigned trantest_port = 0;
-
-extern int notransport(void);
-extern void trantest_checktran(const char *url);
-extern void trantest_next_address(char *out, const char *prefix);
-extern void trantest_prev_address(char *out, const char *prefix);
-extern void trantest_init(trantest *tt, const char *addr);
-extern int trantest_dial(trantest *tt, nng_dialer *dp);
-extern int trantest_listen(trantest *tt, nng_listener *lp);
-extern void trantest_scheme(trantest *tt);
-extern void trantest_test(trantest *tt);
-extern void trantest_test_extended(const char *addr, trantest_proptest_t f);
-extern void trantest_test_all(const char *addr);
-
-int
-notransport(void)
-{
- ConveySkip("Transport not configured");
- return (NNG_ENOTSUP);
-}
-
-#define CHKTRAN(s, t) \
- if (strncmp(s, t, strlen(t)) == 0) \
- notransport()
-
-void
-trantest_checktran(const char *url)
-{
-#ifndef NNG_TRANSPORT_WSS
- CHKTRAN(url, "wss:");
-#endif
-#ifndef NNG_TRANSPORT_ZEROTIER
- CHKTRAN(url, "zt:");
-#endif
-
- (void) url;
-}
-
-void
-trantest_next_address(char *out, const char *prefix)
-{
- trantest_checktran(prefix);
-
- if (trantest_port == 0) {
- char *pstr;
-
- // start at a different port each time -- 5000 - 10000 --
- // unless a specific port is given.
- trantest_port = nng_clock() % 5000 + 5000;
- if (((pstr = ConveyGetEnv("TEST_PORT")) != NULL) &&
- (atoi(pstr) != 0)) {
- trantest_port = atoi(pstr);
- }
- }
-
- // we append the port, and for web sockets also a /test path
- (void) snprintf(out, NNG_MAXADDRLEN, "%s%u%s", prefix, trantest_port,
- prefix[0] == 'w' ? "/test" : "");
- trantest_port++;
-}
-
-void
-trantest_prev_address(char *out, const char *prefix)
-{
- trantest_port--;
- trantest_next_address(out, prefix);
-}
-
-void
-trantest_init(trantest *tt, const char *addr)
-{
- trantest_next_address(tt->addr, addr);
-
- So(nng_req0_open(&tt->reqsock) == 0);
- So(nng_rep0_open(&tt->repsock) == 0);
-
- nng_url *url;
- tt->tran = nni_sp_tran_find(addr);
- So(tt->tran != NULL);
- So(nng_url_parse(&url, tt->addr) == 0);
- nng_url_free(url);
-}
-
-void
-trantest_fini(trantest *tt)
-{
- nng_socket_close(tt->reqsock);
- nng_socket_close(tt->repsock);
-}
-
-int
-trantest_dial(trantest *tt, nng_dialer *dp)
-{
- nng_dialer d = NNG_DIALER_INITIALIZER;
- int rv;
-
- rv = nng_dialer_create(&d, tt->reqsock, tt->addr);
- if (rv != 0) {
- return (rv);
- }
- if (tt->dialer_init != NULL) {
- if ((rv = tt->dialer_init(d)) != 0) {
- nng_dialer_close(d);
- return (rv);
- }
- }
- if ((rv = nng_dialer_start(d, 0)) != 0) {
- nng_dialer_close(d);
- return (rv);
- }
- *dp = d;
- return (0);
-}
-
-int
-trantest_listen(trantest *tt, nng_listener *lp)
-{
- int rv;
- nng_listener l = NNG_LISTENER_INITIALIZER;
-
- rv = nng_listener_create(&l, tt->repsock, tt->addr);
- if (rv != 0) {
- return (rv);
- }
- if (tt->listener_init != NULL) {
- if ((rv = tt->listener_init(l)) != 0) {
- nng_listener_close(l);
- return (rv);
- }
- }
- if ((rv = nng_listener_start(l, 0)) != 0) {
- nng_listener_close(l);
- return (rv);
- }
- *lp = l;
- return (rv);
-}
-
-void
-trantest_scheme(trantest *tt)
-{
- Convey("Scheme is correct", {
- size_t l = strlen(tt->tran->tran_scheme);
- So(strncmp(tt->addr, tt->tran->tran_scheme, l) == 0);
- So(strncmp(tt->addr + l, "://", 3) == 0);
- })
-}
-
-void
-trantest_conn_refused(trantest *tt)
-{
- Convey("Connection refused works", {
- nng_dialer d = NNG_DIALER_INITIALIZER;
-
- So(trantest_dial(tt, &d) == NNG_ECONNREFUSED);
- So(nng_dialer_id(d) < 0);
- So(trantest_dial(tt, &d) == NNG_ECONNREFUSED);
- So(nng_dialer_id(d) < 0);
- });
-}
-
-void
-trantest_duplicate_listen(trantest *tt)
-{
- Convey("Duplicate listen rejected", {
- nng_listener l1 = NNG_LISTENER_INITIALIZER;
- nng_listener l2 = NNG_LISTENER_INITIALIZER;
- int rv;
- rv = trantest_listen(tt, &l1);
- So(rv == 0);
- So(nng_listener_id(l1) > 0);
- So(trantest_listen(tt, &l2) == NNG_EADDRINUSE);
- So(nng_listener_id(l2) < 0);
- So(nng_listener_id(l1) != nng_listener_id(l2));
- });
-}
-
-void
-trantest_listen_accept(trantest *tt)
-{
- Convey("Listen and accept", {
- nng_listener l = NNG_LISTENER_INITIALIZER;
- nng_dialer d = NNG_DIALER_INITIALIZER;
- nng_dialer d0 = NNG_DIALER_INITIALIZER;
- So(trantest_listen(tt, &l) == 0);
- So(nng_listener_id(l) > 0);
-
- nng_msleep(500);
- So(trantest_dial(tt, &d) == 0);
- So(nng_dialer_id(d) > 0);
- So(nng_dialer_id(d0) < 0);
- });
-}
-
-void
-trantest_send_recv(trantest *tt)
-{
- Convey("Send and recv", {
- nng_listener l = NNG_LISTENER_INITIALIZER;
- nng_dialer d = NNG_DIALER_INITIALIZER;
- nng_pipe p = NNG_PIPE_INITIALIZER;
- nng_msg *send;
- nng_msg *recv;
- size_t len;
-
- So(trantest_listen(tt, &l) == 0);
- So(nng_listener_id(l) > 0);
-
- So(trantest_dial(tt, &d) == 0);
- So(nng_dialer_id(d) > 0);
-
- nng_msleep(200); // listener may be behind slightly
-
- send = NULL;
- So(nng_msg_alloc(&send, 0) == 0);
- So(send != NULL);
- So(nng_msg_append(send, "ping", 5) == 0);
-
- So(nng_sendmsg(tt->reqsock, send, 0) == 0);
- recv = NULL;
- So(nng_recvmsg(tt->repsock, &recv, 0) == 0);
- So(recv != NULL);
- So(nng_msg_len(recv) == 5);
- So(strcmp(nng_msg_body(recv), "ping") == 0);
- nng_msg_free(recv);
-
- len = strlen("acknowledge");
- So(nng_msg_alloc(&send, 0) == 0);
- So(nng_msg_append(send, "acknowledge", len) == 0);
- So(nng_sendmsg(tt->repsock, send, 0) == 0);
- So(nng_recvmsg(tt->reqsock, &recv, 0) == 0);
- So(recv != NULL);
- So(nng_msg_len(recv) == strlen("acknowledge"));
- So(strcmp(nng_msg_body(recv), "acknowledge") == 0);
- p = nng_msg_get_pipe(recv);
- So(nng_pipe_id(p) > 0);
- nng_msg_free(recv);
- });
-}
-
-void
-trantest_send_recv_multi(trantest *tt)
-{
- Convey("Send and recv multi", {
- nng_listener l = NNG_LISTENER_INITIALIZER;
- nng_dialer d = NNG_DIALER_INITIALIZER;
- nng_pipe p = NNG_PIPE_INITIALIZER;
- nng_msg *send;
- nng_msg *recv;
- int i;
- char msgbuf[16];
-
- So(trantest_listen(tt, &l) == 0);
- So(nng_listener_id(l) > 0);
- So(trantest_dial(tt, &d) == 0);
- So(nng_dialer_id(d) > 0);
-
- nng_msleep(200); // listener may be behind slightly
-
- for (i = 0; i < 10; i++) {
- snprintf(msgbuf, sizeof(msgbuf), "ping%d", i);
- send = NULL;
- So(nng_msg_alloc(&send, 0) == 0);
- So(send != NULL);
- So(nng_msg_append(send, msgbuf, strlen(msgbuf) + 1) ==
- 0);
-
- So(nng_sendmsg(tt->reqsock, send, 0) == 0);
- recv = NULL;
- So(nng_recvmsg(tt->repsock, &recv, 0) == 0);
- So(recv != NULL);
- So(nng_msg_len(recv) == strlen(msgbuf) + 1);
- So(strcmp(nng_msg_body(recv), msgbuf) == 0);
- nng_msg_free(recv);
-
- snprintf(msgbuf, sizeof(msgbuf), "pong%d", i);
- So(nng_msg_alloc(&send, 0) == 0);
- So(nng_msg_append(send, msgbuf, strlen(msgbuf) + 1) ==
- 0);
- So(nng_sendmsg(tt->repsock, send, 0) == 0);
- So(nng_recvmsg(tt->reqsock, &recv, 0) == 0);
- So(recv != NULL);
- So(nng_msg_len(recv) == strlen(msgbuf) + 1);
- So(strcmp(nng_msg_body(recv), msgbuf) == 0);
- p = nng_msg_get_pipe(recv);
- So(nng_pipe_id(p) > 0);
- nng_msg_free(recv);
- }
- });
-}
-
-void
-trantest_check_properties(trantest *tt, trantest_proptest_t f)
-{
- Convey("Properties test", {
- nng_listener l = NNG_LISTENER_INITIALIZER;
- nng_dialer d = NNG_DIALER_INITIALIZER;
- nng_msg *send;
- nng_msg *recv;
- int rv;
-
- So(trantest_listen(tt, &l) == 0);
- So(nng_listener_id(l) > 0);
- So(trantest_dial(tt, &d) == 0);
- So(nng_dialer_id(d) > 0);
-
- nng_msleep(200); // listener may be behind slightly
-
- send = NULL;
- So(nng_msg_alloc(&send, 0) == 0);
- So(send != NULL);
- So(nng_msg_append(send, "props", 5) == 0);
-
- So(nng_sendmsg(tt->reqsock, send, 0) == 0);
-
- recv = NULL;
- So(nng_recvmsg(tt->repsock, &recv, 0) == 0);
- So(recv != NULL);
- So(nng_msg_len(recv) == 5);
- So(strcmp(nng_msg_body(recv), "props") == 0);
- rv = f(recv);
- nng_msg_free(recv);
- So(rv == 0);
- });
-}
-
-void
-trantest_send_recv_large(trantest *tt)
-{
- Convey("Send and recv large data", {
- nng_listener l = NNG_LISTENER_INITIALIZER;
- nng_dialer d = NNG_DIALER_INITIALIZER;
- nng_msg *send;
- nng_msg *recv;
- char *data;
- size_t size;
-
- size = 1024 * 128; // bigger than any transport segment
- So((data = nng_alloc(size)) != NULL);
-
- for (int i = 0; (size_t) i < size; i++) {
- data[i] = nng_random() & 0xff;
- }
-
- So(trantest_listen(tt, &l) == 0);
- So(nng_listener_id(l) > 0);
- So(trantest_dial(tt, &d) == 0);
- So(nng_dialer_id(d) > 0);
-
- nng_msleep(200); // listener may be behind slightly
-
- send = NULL;
- So(nng_msg_alloc(&send, size) == 0);
- So(send != NULL);
- memcpy(nng_msg_body(send), data, size);
-
- So(nng_sendmsg(tt->reqsock, send, 0) == 0);
- recv = NULL;
- So(nng_recvmsg(tt->repsock, &recv, 0) == 0);
- So(recv != NULL);
- So(nng_msg_len(recv) == size);
- So(memcmp(nng_msg_body(recv), data, size) == 0);
- nng_msg_free(recv);
-
- memset(data, 0x2, size);
-
- So(nng_msg_alloc(&send, 0) == 0);
- So(nng_msg_append(send, data, size) == 0);
- So(nng_sendmsg(tt->repsock, send, 0) == 0);
- So(nng_recvmsg(tt->reqsock, &recv, 0) == 0);
- So(recv != NULL);
- So(nng_msg_len(recv) == size);
- So(memcmp(nng_msg_body(recv), data, size) == 0);
- nng_msg_free(recv);
-
- nng_free(data, size);
- })
-}
-
-void
-trantest_test_all(const char *addr)
-{
- trantest tt;
-
- memset(&tt, 0, sizeof(tt));
- Convey("Given transport", {
- trantest_init(&tt, addr);
-
- Reset({ trantest_fini(&tt); });
-
- trantest_scheme(&tt);
- trantest_conn_refused(&tt);
- trantest_duplicate_listen(&tt);
- trantest_listen_accept(&tt);
- trantest_send_recv(&tt);
- trantest_send_recv_large(&tt);
- trantest_send_recv_multi(&tt);
- })
-}
-
-void
-trantest_test_extended(const char *addr, trantest_proptest_t f)
-{
- trantest tt;
-
- memset(&tt, 0, sizeof(tt));
- Convey("Given transport", {
- trantest_init(&tt, addr);
-
- Reset({ trantest_fini(&tt); });
-
- trantest_scheme(&tt);
- trantest_conn_refused(&tt);
- trantest_duplicate_listen(&tt);
- trantest_listen_accept(&tt);
- trantest_send_recv(&tt);
- trantest_send_recv_large(&tt);
- trantest_send_recv_multi(&tt);
- trantest_check_properties(&tt, f);
- })
-}
-
-void
-trantest_test(trantest *tt)
-{
- Convey("Given transport", {
- trantest_init(tt, tt->tmpl);
- if (tt->init != NULL) {
- So(tt->init(tt) == 0);
- }
-
- Reset({
- if (tt->fini != NULL) {
- tt->fini(tt);
- }
- trantest_fini(tt);
- });
-
- trantest_scheme(tt);
-
- trantest_conn_refused(tt);
- trantest_duplicate_listen(tt);
- trantest_listen_accept(tt);
-
- trantest_send_recv(tt);
- trantest_send_recv_large(tt);
- trantest_send_recv_multi(tt);
- if (tt->proptest != NULL) {
- trantest_check_properties(tt, tt->proptest);
- }
- })
-}
diff --git a/tests/wss.c b/tests/wss.c
deleted file mode 100644
index 8b028fbe..00000000
--- a/tests/wss.c
+++ /dev/null
@@ -1,212 +0,0 @@
-//
-// Copyright 2025 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.
-//
-
-#ifndef _WIN32
-#include <arpa/inet.h>
-#endif
-
-#include <nng/nng.h>
-
-#include "convey.h"
-#include "stubs.h"
-#include "trantest.h"
-
-// These keys are for demonstration purposes ONLY. DO NOT USE.
-// The certificate is valid for 100 years, because I don't want to
-// have to regenerate it ever again. The CN is 127.0.0.1, and self-signed.
-//
-// Generated using openssl:
-//
-// % openssl rsa -genkey -out key.key
-// % openssl req -new -key key.key -out cert.csr -sha256
-// % openssl x509 -req -in cert.csr -days 36500 -out cert.crt
-// -signkey key.key -sha256
-//
-// Relevant metadata:
-//
-// Certificate:
-// Data:
-// Version: 1 (0x0)
-// Serial Number: 17127835813110005400 (0xedb24becc3a2be98)
-// Signature Algorithm: sha256WithRSAEncryption
-// Issuer: C=US, ST=CA, L=San Diego, O=nanomsg.org, CN=localhost
-// Validity
-// Not Before: Jan 11 22:34:35 2018 GMT
-// Not After : Dec 18 22:34:35 2117 GMT
-// Subject: C=US, ST=CA, L=San Diego, O=nanomsg.org, CN=localhost
-// Subject Public Key Info:
-// Public Key Algorithm: rsaEncryption
-// Public-Key: (2048 bit)
-//
-static const char cert[] =
- "-----BEGIN CERTIFICATE-----\n"
- "MIIDLjCCAhYCCQDtskvsw6K+mDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJV\n"
- "UzELMAkGA1UECAwCQ0ExEjAQBgNVBAcMCVNhbiBEaWVnbzEUMBIGA1UECgwLbmFu\n"
- "b21zZy5vcmcxEjAQBgNVBAMMCWxvY2FsaG9zdDAgFw0xODAxMTEyMjM0MzVaGA8y\n"
- "MTE3MTIxODIyMzQzNVowWDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRIwEAYD\n"
- "VQQHDAlTYW4gRGllZ28xFDASBgNVBAoMC25hbm9tc2cub3JnMRIwEAYDVQQDDAls\n"
- "b2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMvoHdEnfO\n"
- "hmG3PTj6YC5qz6N5hgmcwf4EZkor4+R1Q5hDOKqOknWmVuGBD5mA61ObK76vycIT\n"
- "Tp+H+vKvfgunySZrlyYg8IbgoDbvVgj9RF8xFHdN0PVeqnkBCsCzLtSu6TP8PSgI\n"
- "SKiRMH0NUSakWqCPEc2E1r1CKdOpa7av/Na30LPsuKFcAUhu7QiVYfER86ktrO8G\n"
- "F2PeVy44Q8RkiLw8uhU0bpAflqkR1KCjOLajw1eL3C+Io75Io8qUOLxWc3LH0hl3\n"
- "oEI0jWu7JYlRAw/O7xm4pcGTwy5L8Odz4a7ZTAmuapFRarGOIcDg8Yr0tllRd1mH\n"
- "1T4Z2Wv7Rs0tAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAIfUXK7UonrYAOrlXUHH\n"
- "gfHNdOXMzQP2Ms6Sxov+1tCTfgsYE65Mggo7hRJUqmKpstpbdRBVXhTyht/xjyTz\n"
- "5sMjoeCyv1tXOHpLTfD3LBXwYZwsFdoLS1UHhD3qiYjCyyY2LWa6S786CtlcbCvu\n"
- "Uij2q8zJ4WFrNqAzxZtsTfg16/6JRFw9zpVSCNlHqCxNQxzWucbmUFTiWn9rnc/N\n"
- "r7utG4JsDPZbEI6QS43R7gGLDF7s0ftWKqzlQiZEtuDQh2p7Uejbft8XmZd/VuV/\n"
- "dFMXOO1rleU0lWAJcXWOWHH3er0fivu2ISL8fRjjikYvhRGxtkwC0kPDa2Ntzgd3\n"
- "Hsg=\n"
- "-----END CERTIFICATE-----\n";
-static const char key[] =
- "-----BEGIN RSA PRIVATE KEY-----\n"
- "MIIEpQIBAAKCAQEAzL6B3RJ3zoZhtz04+mAuas+jeYYJnMH+BGZKK+PkdUOYQziq\n"
- "jpJ1plbhgQ+ZgOtTmyu+r8nCE06fh/ryr34Lp8kma5cmIPCG4KA271YI/URfMRR3\n"
- "TdD1Xqp5AQrAsy7Urukz/D0oCEiokTB9DVEmpFqgjxHNhNa9QinTqWu2r/zWt9Cz\n"
- "7LihXAFIbu0IlWHxEfOpLazvBhdj3lcuOEPEZIi8PLoVNG6QH5apEdSgozi2o8NX\n"
- "i9wviKO+SKPKlDi8VnNyx9IZd6BCNI1ruyWJUQMPzu8ZuKXBk8MuS/Dnc+Gu2UwJ\n"
- "rmqRUWqxjiHA4PGK9LZZUXdZh9U+Gdlr+0bNLQIDAQABAoIBAC82HqvjfkzZH98o\n"
- "9uKFGy72AjQbfEvxT6mkDKZiPmPr2khl4K5Ph2F71zPzbOoVWYoGZEoUs/PPxWmN\n"
- "rDhbUES4VWupxtkBnZheWUyHAjukcG7Y0UnYTTwvAwgCerzWp6RNkfcwAvMmDfis\n"
- "vak8dTSg0TUsXb+r5KhFDNGcTNv3f7R0cJmaZ/t9FT7SerXf1LW7itvTjRor8/ZK\n"
- "KPwT4oklp1o6RFXSenn/e2e3rAjI+TEwJA3Zp5dqO/M/AhaZKVaxL4voDVdVVkT+\n"
- "LHJWVhjLY5ilPkmPWqmZ2reTaF+gGSSjAQ+t/ahGWFqEdWIz9UoXhBBOd1ibeyvd\n"
- "Kyxp1QECgYEA8KcDkmwPrhqFlQe/U+Md27OhrQ4cecLCa6EVLsCXN1bFyCi3NSo2\n"
- "o5zFCC699KOL0ZwSmYlaQP4xjnqv4Gsa0s3uL7tqOJR2UuEtGK/MPMluGHVaWsGt\n"
- "zbnWH3xgsvvsxdt6hInFhcABLDupW336tJ8EcH7mOKoIP+azwF4kPiUCgYEA2c09\n"
- "zJBUW6SZXhgJ5vgENYc+UwDT7pfhIWZaRL+wXnwSoa7igodTKJtQp/KfFBJK4RA0\n"
- "prvwj4Wr/1ScaboR2hYZApbqXU5zkEkjC1hHIbg1fBe0EcnhP7ojMXrk6B5ed+Lq\n"
- "OVdYhUuvtdL/perelmbTJLnb8S214+tzVyg7EGkCgYEA6JLwX8zxpnhZSztOjBr9\n"
- "2zuSb7YojQBNd0kZOLLGMaQ5xwSactYWMi8rOIo76Lc6RFxKmXnl8NP5PtKRMRkx\n"
- "tjNxE05UDNRmOhkGxUn433JoZVjc9sMhXqZQKuPAbJoOLPW9RWQEsgtq1r3eId7x\n"
- "sSfRWYs6od6p1F/4rlwNOMUCgYEAtJmqf+DCAoe3IL3gICRSISy28k7CbZqE9JQR\n"
- "j+Y/Uemh7W29pyydOROoysq1PAh7DKrKbeNzcx8NYxh+5nCC8wrVzD7lsV8nFmJ+\n"
- "655UxVIhD3f8Oa/j1lr7acEU5KCiBtkjDU8vOMBsv+FpWOQrlB1JQa/X/+G+bHLF\n"
- "XmUerNkCgYEAv7R8vIKgJ1f69imgHdB31kue3wnOO/6NlfY3GTcaZcTdChY8SZ5B\n"
- "xits8xog0VcaxXhWlfO0hyCnZ9YRQbyDu0qp5eBU2p3qcE01x4ljJBZUOTweG06N\n"
- "cL9dYcwse5FhNMjrQ/OKv6B38SIXpoKQUtjgkaMtmpK8cXX1eqEMNkM=\n"
- "-----END RSA PRIVATE KEY-----\n";
-
-static int
-validloopback(nng_sockaddr *sa)
-{
- char ipv6[16];
- memset(ipv6, 0, sizeof(ipv6));
- ipv6[15] = 1;
-
- switch (sa->s_family) {
- case NNG_AF_INET:
- if (sa->s_in.sa_port == 0) {
- return (0);
- }
- if (sa->s_in.sa_addr != htonl(0x7f000001)) {
- return (0);
- }
- return (1);
-
- case NNG_AF_INET6:
- if (sa->s_in6.sa_port == 0) {
- return (0);
- }
- if (memcmp(sa->s_in6.sa_addr, ipv6, sizeof(ipv6)) != 0) {
- return (0);
- }
- return (1);
-
- default:
- return (0);
- }
-}
-
-static int
-check_props(nng_msg *msg)
-{
- nng_pipe p;
- nng_sockaddr la;
- nng_sockaddr ra;
-
- p = nng_msg_get_pipe(msg);
- So(nng_pipe_id(p) > 0);
-
- So(nng_pipe_get_addr(p, NNG_OPT_LOCADDR, &la) == 0);
- So(validloopback(&la));
-
- So(nng_pipe_get_addr(p, NNG_OPT_REMADDR, &ra) == 0);
- So(validloopback(&ra));
-
- return (0);
-}
-
-static int
-init_dialer_wss(nng_dialer d)
-{
- nng_tls_config *cfg;
- int rv;
-
- if ((rv = nng_tls_config_alloc(&cfg, NNG_TLS_MODE_CLIENT)) != 0) {
- return (rv);
- }
- if ((rv = nng_tls_config_ca_chain(cfg, cert, NULL)) != 0) {
- goto out;
- }
- if ((rv = nng_tls_config_server_name(cfg, "localhost")) != 0) {
- goto out;
- }
- if ((rv = nng_tls_config_auth_mode(cfg, NNG_TLS_AUTH_MODE_REQUIRED)) !=
- 0) {
- goto out;
- }
- rv = nng_dialer_set_tls(d, cfg);
-
-out:
- nng_tls_config_free(cfg);
- return (rv);
-}
-
-static int
-init_listener_wss(nng_listener l)
-{
- nng_tls_config *cfg;
- int rv;
-
- if ((rv = nng_tls_config_alloc(&cfg, NNG_TLS_MODE_SERVER)) != 0) {
- return (rv);
- }
- if ((rv = nng_tls_config_own_cert(cfg, cert, key, NULL)) != 0) {
- goto out;
- }
-
- if ((rv = nng_listener_set_tls(l, cfg)) != 0) {
- // We can wind up with EBUSY from the server already running.
- if (rv == NNG_EBUSY) {
- rv = 0;
- }
- }
-
-out:
- nng_tls_config_free(cfg);
- return (rv);
-}
-
-TestMain("WebSocket Secure (TLS) Transport", {
- static trantest tt;
-
- if (strcmp(nng_tls_engine_name(), "none") == 0) {
- Skip("TLS not enabled");
- }
-
- tt.dialer_init = init_dialer_wss;
- tt.listener_init = init_listener_wss;
- tt.tmpl = "wss://localhost:";
- tt.proptest = check_props;
-
- trantest_test(&tt);
-})