diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/CMakeLists.txt | 23 | ||||
| -rw-r--r-- | tests/httpclient.c | 1 | ||||
| -rw-r--r-- | tests/stubs.h | 94 | ||||
| -rw-r--r-- | tests/trantest.h | 492 | ||||
| -rw-r--r-- | tests/wss.c | 212 |
5 files changed, 0 insertions, 822 deletions
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); -}) |
