summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2019-12-27 18:06:23 -0800
committerGarrett D'Amore <garrett@damore.org>2019-12-27 18:06:23 -0800
commitddc078b98b2014e570969bd277936ffe0684f005 (patch)
treec84e59dc27bfb695edac3bcb9f1e55cc8197595c
parent7c6ce24b028a8c201ac8eb1513a6424205c4d8d8 (diff)
downloadnng-ddc078b98b2014e570969bd277936ffe0684f005.tar.gz
nng-ddc078b98b2014e570969bd277936ffe0684f005.tar.bz2
nng-ddc078b98b2014e570969bd277936ffe0684f005.zip
Move the WSS file test, and hopefully provide more debuggability.
-rw-r--r--src/supplemental/websocket/CMakeLists.txt7
-rw-r--r--src/supplemental/websocket/wssfile_test.c (renamed from tests/wssfile.c)364
-rw-r--r--tests/CMakeLists.txt1
3 files changed, 182 insertions, 190 deletions
diff --git a/src/supplemental/websocket/CMakeLists.txt b/src/supplemental/websocket/CMakeLists.txt
index 74438cd5..421c8915 100644
--- a/src/supplemental/websocket/CMakeLists.txt
+++ b/src/supplemental/websocket/CMakeLists.txt
@@ -10,6 +10,9 @@
if (NNG_SUPP_WEBSOCKET)
nng_sources(websocket.c websocket.h)
-else()
+ if (NNG_SUPP_TLS)
+ nng_test(wssfile_test)
+ endif ()
+else ()
nng_sources(stub.c)
-endif()
+endif ()
diff --git a/tests/wssfile.c b/src/supplemental/websocket/wssfile_test.c
index 3ce26e1a..5d58a289 100644
--- a/tests/wssfile.c
+++ b/src/supplemental/websocket/wssfile_test.c
@@ -1,5 +1,5 @@
//
-// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2019 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
@@ -8,18 +8,16 @@
// found online at https://opensource.org/licenses/MIT.
//
-#ifndef _WIN32
-#include <arpa/inet.h>
-#endif
-
#include <nng/nng.h>
#include <nng/protocol/pair1/pair.h>
#include <nng/supplemental/tls/tls.h>
+#include <nng/supplemental/util/platform.h>
#include <nng/transport/ws/websocket.h>
-#include "convey.h"
-#include "stubs.h"
-#include "trantest.h"
+#include "core/nng_impl.h"
+
+#include "acutest.h"
+#include "testutil.h"
// These keys are for demonstration purposes ONLY. DO NOT USE.
// The certificate is valid for 100 years, because I don't want to
@@ -98,6 +96,7 @@ static const char key[] =
"cL9dYcwse5FhNMjrQ/OKv6B38SIXpoKQUtjgkaMtmpK8cXX1eqEMNkM=\n"
"-----END RSA PRIVATE KEY-----\n";
+#if 0
static int
validloopback(nng_sockaddr *sa)
{
@@ -192,207 +191,198 @@ check_props(nng_msg *msg)
return (0);
}
-static int
+#endif
+
+#define CACERT "wss_test_ca_cert.pem"
+#define CERTKEY "wss_test_certkey.pem"
+
+static void
init_dialer_wss_file(nng_dialer d)
{
- int rv;
char *tmpdir;
char *pth;
- if ((tmpdir = nni_plat_temp_dir()) == NULL) {
- return (NNG_ENOTSUP);
- }
- if ((pth = nni_file_join(tmpdir, "wss_test_cacert.pem")) == NULL) {
- nni_strfree(tmpdir);
- return (NNG_ENOMEM);
- }
+ TEST_ASSERT((tmpdir = nni_plat_temp_dir()) != NULL);
+ TEST_ASSERT((pth = nni_file_join(tmpdir, CACERT)) != NULL);
nni_strfree(tmpdir);
-
- if ((rv = nni_file_put(pth, cert, strlen(cert))) != 0) {
- nni_strfree(pth);
- return (rv);
- }
-
- rv = nng_dialer_setopt_string(d, NNG_OPT_TLS_CA_FILE, pth);
+ TEST_NNG_PASS(nni_file_put(pth, cert, strlen(cert)));
+ TEST_NNG_PASS(nng_dialer_setopt_string(d, NNG_OPT_TLS_CA_FILE, pth));
nni_file_delete(pth);
nni_strfree(pth);
-
- return (rv);
}
-static int
+static void
init_listener_wss_file(nng_listener l)
{
- int rv;
char *tmpdir;
char *pth;
char *certkey;
- if ((tmpdir = nni_plat_temp_dir()) == NULL) {
- return (NNG_ENOTSUP);
- }
-
- if ((pth = nni_file_join(tmpdir, "wss_test_certkey.pem")) == NULL) {
- nni_strfree(tmpdir);
- return (NNG_ENOMEM);
- }
+ TEST_ASSERT((tmpdir = nni_plat_temp_dir()) != NULL);
+ TEST_ASSERT((pth = nni_file_join(tmpdir, CERTKEY)) != NULL);
nni_strfree(tmpdir);
- if ((rv = nni_asprintf(&certkey, "%s\r\n%s\r\n", cert, key)) != 0) {
- nni_strfree(pth);
- return (rv);
- }
+ TEST_NNG_PASS(nni_asprintf(&certkey, "%s\r\n%s\r\n", cert, key));
- rv = nni_file_put(pth, certkey, strlen(certkey));
+ TEST_NNG_PASS(nni_file_put(pth, certkey, strlen(certkey)));
nni_strfree(certkey);
- if (rv != 0) {
- nni_strfree(pth);
- return (rv);
- }
-
- rv = nng_listener_setopt_string(l, NNG_OPT_TLS_CERT_KEY_FILE, pth);
- if (rv != 0) {
- // We can wind up with EBUSY from the server already
- // running.
- if (rv == NNG_EBUSY) {
- rv = 0;
- }
- }
+ TEST_NNG_PASS(
+ nng_listener_setopt_string(l, NNG_OPT_TLS_CERT_KEY_FILE, pth));
nni_file_delete(pth);
nni_strfree(pth);
- return (rv);
}
-TestMain("WebSocket Secure (TLS) Transport (file based)", {
- static trantest tt;
-
- tt.dialer_init = init_dialer_wss_file;
- tt.listener_init = init_listener_wss_file;
- tt.tmpl = "wss://localhost:%u/test";
- tt.proptest = check_props;
-
- trantest_test(&tt);
-
- Convey("Invalid verify works", {
- nng_socket s1;
- nng_socket s2;
- nng_listener l;
- char addr[NNG_MAXADDRLEN];
-
- So(nng_pair_open(&s1) == 0);
- So(nng_pair_open(&s2) == 0);
- Reset({
- nng_close(s2);
- nng_close(s1);
- });
- trantest_next_address(addr, "wss://:%u/test");
- So(nng_listener_create(&l, s1, addr) == 0);
- So(init_listener_wss_file(l) == 0);
- So(nng_listener_start(l, 0) == 0);
- nng_msleep(100);
-
- // reset port back one
- trantest_prev_address(addr, "wss://127.0.0.1:%u/test");
- So(nng_setopt_int(s2, NNG_OPT_TLS_AUTH_MODE,
- NNG_TLS_AUTH_MODE_REQUIRED) == 0);
-
- So(nng_dial(s2, addr, NULL, 0) == NNG_EPEERAUTH);
- });
-
- Convey("No verify works", {
- nng_socket s1;
- nng_socket s2;
- nng_listener l;
- nng_dialer d;
- char addr[NNG_MAXADDRLEN];
- nng_msg * msg;
- nng_pipe p;
- bool b;
-
- So(nng_pair_open(&s1) == 0);
- So(nng_pair_open(&s2) == 0);
- Reset({
- nng_close(s2);
- nng_close(s1);
- });
- trantest_next_address(addr, "wss://:%u/test");
- So(nng_listener_create(&l, s1, addr) == 0);
- So(init_listener_wss_file(l) == 0);
- So(nng_listener_start(l, 0) == 0);
- nng_msleep(100);
-
- // reset port back one
- trantest_prev_address(addr, "wss://127.0.0.1:%u/test");
- So(nng_setopt_ms(s2, NNG_OPT_RECVTIMEO, 200) == 0);
- So(nng_dialer_create(&d, s2, addr) == 0);
- So(init_dialer_wss_file(d) == 0);
- So(nng_dialer_setopt_int(d, NNG_OPT_TLS_AUTH_MODE,
- NNG_TLS_AUTH_MODE_OPTIONAL) == 0);
- So(nng_dialer_setopt_string(
- d, NNG_OPT_TLS_SERVER_NAME, "example.com") == 0);
- So(nng_dialer_start(d, 0) == 0);
-#if 0
- So(nng_setopt_int(s2, NNG_OPT_TLS_AUTH_MODE,
- NNG_TLS_AUTH_MODE_OPTIONAL) == 0);
- So(nng_setopt_ms(s2, NNG_OPT_RECVTIMEO, 200) == 0);
- So(nng_dial(s2, addr, NULL, 0) == 0);
-#endif
- nng_msleep(100);
-
- So(nng_send(s1, "hello", 6, 0) == 0);
- So(nng_recvmsg(s2, &msg, 0) == 0);
- So(msg != NULL);
- So(nng_msg_len(msg) == 6);
- So(strcmp(nng_msg_body(msg), "hello") == 0);
- p = nng_msg_get_pipe(msg);
- So(nng_pipe_id(p) > 0);
- So(nng_pipe_getopt_bool(p, NNG_OPT_TLS_VERIFIED, &b) == 0);
- So(b == false);
- nng_msg_free(msg);
- });
-
- Convey("Valid verify works", {
- nng_socket s1;
- nng_socket s2;
- nng_listener l;
- nng_dialer d;
- char addr[NNG_MAXADDRLEN];
- nng_msg * msg;
- nng_pipe p;
- bool b;
-
- So(nng_pair_open(&s1) == 0);
- So(nng_pair_open(&s2) == 0);
- Reset({
- nng_close(s2);
- nng_close(s1);
- });
- trantest_next_address(addr, "wss://:%u/test");
- So(nng_listener_create(&l, s1, addr) == 0);
- So(init_listener_wss_file(l) == 0);
- So(nng_listener_start(l, 0) == 0);
- nng_msleep(100);
-
- // reset port back one
- trantest_prev_address(addr, "wss://localhost:%u/test");
- So(nng_dialer_create(&d, s2, addr) == 0);
- So(init_dialer_wss_file(d) == 0);
- So(nng_setopt_ms(s2, NNG_OPT_RECVTIMEO, 200) == 0);
- So(nng_dialer_start(d, 0) == 0);
- nng_msleep(100);
-
- So(nng_send(s1, "hello", 6, 0) == 0);
- So(nng_recvmsg(s2, &msg, 0) == 0);
- So(msg != NULL);
- So(nng_msg_len(msg) == 6);
- So(strcmp(nng_msg_body(msg), "hello") == 0);
- p = nng_msg_get_pipe(msg);
- So(nng_pipe_id(p) > 0);
- So(nng_pipe_getopt_bool(p, NNG_OPT_TLS_VERIFIED, &b) == 0);
- So(b == true);
- nng_msg_free(msg);
- });
-
- nng_fini();
-})
+void
+test_invalid_verify(void)
+{
+ uint16_t port = testutil_next_port();
+ nng_socket s1;
+ nng_socket s2;
+ nng_listener l;
+ char addr[32];
+
+ snprintf(addr, sizeof(addr), "wss://localhost:%u/test", port);
+
+ TEST_NNG_PASS(nng_pair_open(&s1));
+ TEST_NNG_PASS(nng_pair_open(&s2));
+ TEST_NNG_PASS(nng_listener_create(&l, s1, addr));
+ init_listener_wss_file(l);
+ TEST_NNG_PASS(nng_listener_start(l, 0));
+
+ nng_msleep(100);
+
+ snprintf(addr, sizeof(addr), "wss://127.0.0.1:%u/test", port);
+
+ TEST_NNG_PASS(nng_setopt_int(
+ s2, NNG_OPT_TLS_AUTH_MODE, NNG_TLS_AUTH_MODE_REQUIRED));
+
+ TEST_NNG_FAIL(nng_dial(s2, addr, NULL, 0), NNG_EPEERAUTH);
+
+ TEST_NNG_PASS(nng_close(s1));
+ TEST_NNG_PASS(nng_close(s2));
+}
+
+void
+test_no_verify(void)
+{
+ nng_socket s1;
+ nng_socket s2;
+ nng_listener l;
+ nng_dialer d;
+ char addr[NNG_MAXADDRLEN];
+ nng_msg * msg;
+ nng_pipe p;
+ bool b;
+ uint16_t port;
+
+ TEST_NNG_PASS(nng_pair_open(&s1));
+ TEST_NNG_PASS(nng_pair_open(&s2));
+ port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "wss://:%u/test", port);
+ TEST_NNG_PASS(nng_listener_create(&l, s1, addr));
+ TEST_NNG_PASS(nng_setopt_ms(s1, NNG_OPT_SENDTIMEO, 5000));
+ init_listener_wss_file(l);
+ TEST_NNG_PASS(nng_listener_start(l, 0));
+
+ nng_msleep(100);
+ snprintf(addr, sizeof(addr), "wss://127.0.0.1:%u/test", port);
+ TEST_NNG_PASS(nng_dialer_create(&d, s2, addr));
+ init_dialer_wss_file(d);
+ TEST_NNG_PASS(nng_dialer_setopt_int(
+ d, NNG_OPT_TLS_AUTH_MODE, NNG_TLS_AUTH_MODE_OPTIONAL));
+ TEST_NNG_PASS(nng_dialer_setopt_string(
+ d, NNG_OPT_TLS_SERVER_NAME, "example.com"));
+
+ TEST_NNG_PASS(nng_setopt_ms(s2, NNG_OPT_RECVTIMEO, 5000));
+ TEST_NNG_PASS(nng_dialer_start(d, 0));
+ nng_msleep(100);
+
+ TEST_NNG_PASS(nng_send(s1, "hello", 6, 0));
+ TEST_NNG_PASS(nng_recvmsg(s2, &msg, 0));
+ TEST_ASSERT(msg != NULL);
+ TEST_CHECK(nng_msg_len(msg) == 6);
+ TEST_CHECK(strcmp(nng_msg_body(msg), "hello") == 0);
+
+ p = nng_msg_get_pipe(msg);
+ TEST_CHECK(nng_pipe_id(p) > 0);
+ TEST_NNG_PASS(nng_pipe_getopt_bool(p, NNG_OPT_TLS_VERIFIED, &b));
+ TEST_CHECK(b == false);
+
+ TEST_NNG_PASS(nng_close(s1));
+ TEST_NNG_PASS(nng_close(s2));
+}
+
+void
+test_verify_works(void)
+{
+ nng_socket s1;
+ nng_socket s2;
+ nng_listener l;
+ nng_dialer d;
+ char addr[NNG_MAXADDRLEN];
+ nng_msg * msg;
+ nng_pipe p;
+ bool b;
+ uint16_t port;
+
+ TEST_NNG_PASS(nng_pair_open(&s1));
+ TEST_NNG_PASS(nng_pair_open(&s2));
+ port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "wss://:%u/test", port);
+ TEST_NNG_PASS(nng_listener_create(&l, s1, addr));
+ TEST_NNG_PASS(nng_setopt_ms(s1, NNG_OPT_SENDTIMEO, 5000));
+ init_listener_wss_file(l);
+ TEST_NNG_PASS(nng_listener_start(l, 0));
+
+ nng_msleep(100);
+ snprintf(addr, sizeof(addr), "wss://localhost:%u/test", port);
+ TEST_NNG_PASS(nng_dialer_create(&d, s2, addr));
+ init_dialer_wss_file(d);
+
+ TEST_NNG_PASS(nng_setopt_ms(s2, NNG_OPT_RECVTIMEO, 5000));
+ TEST_NNG_PASS(nng_dialer_start(d, 0));
+ nng_msleep(100);
+
+ TEST_NNG_PASS(nng_send(s1, "hello", 6, 0));
+ TEST_NNG_PASS(nng_recvmsg(s2, &msg, 0));
+ TEST_ASSERT(msg != NULL);
+ TEST_CHECK(nng_msg_len(msg) == 6);
+ TEST_CHECK(strcmp(nng_msg_body(msg), "hello") == 0);
+
+ p = nng_msg_get_pipe(msg);
+ TEST_CHECK(nng_pipe_id(p) > 0);
+ TEST_NNG_PASS(nng_pipe_getopt_bool(p, NNG_OPT_TLS_VERIFIED, &b));
+ TEST_CHECK(b == true);
+
+ TEST_NNG_PASS(nng_close(s1));
+ TEST_NNG_PASS(nng_close(s2));
+}
+
+void
+test_cert_file_not_present(void)
+{
+ nng_socket s1;
+ nng_listener l;
+ char addr[NNG_MAXADDRLEN];
+ uint16_t port;
+
+ TEST_NNG_PASS(nng_pair_open(&s1));
+ port = testutil_next_port();
+ (void) snprintf(addr, sizeof(addr), "wss://:%u/test", port);
+ TEST_NNG_PASS(nng_listener_create(&l, s1, addr));
+
+ TEST_NNG_FAIL(nng_listener_setopt_string(
+ l, NNG_OPT_TLS_CERT_KEY_FILE, "no-such-file.pem"),
+ NNG_ENOENT);
+
+ TEST_NNG_PASS(nng_close(s1));
+}
+
+TEST_LIST = {
+ { "wss file invalid verify", test_invalid_verify },
+ { "wss file no verify", test_no_verify },
+ { "wss file verify works", test_verify_works },
+ { "wss file cacert missing", test_cert_file_not_present },
+ { NULL, NULL },
+};
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index e32107ed..d4cdf2e8 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -163,7 +163,6 @@ add_nng_test(udp 5)
add_nng_test(url 5)
add_nng_test1(ws 30 NNG_TRANSPORT_WS)
add_nng_test1(wss 30 NNG_TRANSPORT_WSS)
-add_nng_test1(wssfile 30 NNG_TRANSPORT_WSS)
add_nng_test1(wsstream 10 NNG_TRANSPORT_WS)
add_nng_test1(zt 60 NNG_TRANSPORT_ZEROTIER)