diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | tests/ipcperms.c | 120 | ||||
| -rw-r--r-- | tests/testutil.c | 14 | ||||
| -rw-r--r-- | tests/testutil.h | 14 | ||||
| -rw-r--r-- | tests/url.c | 777 |
5 files changed, 483 insertions, 445 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 737aa4d7..a7835826 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -132,6 +132,7 @@ nng_test(platform) nng_test(reconnect) nng_test(resolv) nng_test(sock) +nng_test(url) add_nng_test(device 5) @@ -141,7 +142,6 @@ add_nng_test1(httpclient 60 NNG_SUPP_HTTP) add_nng_test1(httpserver 30 NNG_SUPP_HTTP) add_nng_test(inproc 5) add_nng_test(ipc 5) -add_nng_test(ipcperms 5) add_nng_test(ipcsupp 10) add_nng_test(ipcwinsec 5) add_nng_test(list 5) @@ -161,7 +161,6 @@ add_nng_test(tcp 180) add_nng_test(tcp6 60) add_nng_test(transport 5) add_nng_test(udp 5) -add_nng_test(url 5) add_nng_test(ws 30) add_nng_test(wss 30) add_nng_test1(zt 60 NNG_TRANSPORT_ZEROTIER) diff --git a/tests/ipcperms.c b/tests/ipcperms.c deleted file mode 100644 index 5f4a847c..00000000 --- a/tests/ipcperms.c +++ /dev/null @@ -1,120 +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 _WIN32 -#include <errno.h> -#include <string.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/un.h> -#include <unistd.h> -#endif - -#include <nng/nng.h> -#include <nng/protocol/reqrep0/rep.h> -#include <nng/protocol/reqrep0/req.h> -#include <nng/transport/ipc/ipc.h> - -#include "convey.h" -#include "stubs.h" -#include "trantest.h" - -#define ADDR "/tmp/ipc_perms_test" - -#if defined(__sun) -#define honor_chmod() false -#else -#define honor_chmod() true -#endif - -// Inproc tests. - -#ifdef _WIN32 -TestMain("IPC Permissions", { - atexit(nng_fini); - Convey("Given a socket and an IPC listener", { - nng_socket s; - nng_listener l; - - So(nng_rep0_open(&s) == 0); - Reset({ nng_close(s); }); - So(nng_listener_create(&l, s, "ipc://" ADDR) == 0); - Convey("We cannot set perms on Windows", { - So(nng_listener_setopt_int(l, NNG_OPT_IPC_PERMISSIONS, - 0444) == NNG_ENOTSUP); - }); - }); -}) -#else -TestMain("IPC Permissions", { - atexit(nng_fini); - - Convey("Given a socket and an IPC listener", { - nng_socket s; - nng_listener l; - - So(nng_rep0_open(&s) == 0); - Reset({ - nng_close(s); - unlink(ADDR); - }); - So(nng_listener_create(&l, s, "ipc://" ADDR) == 0); - Convey("We can set perms on POSIX", { - struct stat st; - So(nng_listener_setopt_int( - l, NNG_OPT_IPC_PERMISSIONS, 0444) == 0); - So(nng_listener_start(l, 0) == 0); - So(stat(ADDR, &st) == 0); - So((st.st_mode & 0777) == 0444); - - Convey("And permissions are honored", { - struct sockaddr_un sa; - int cfd; - - if (geteuid() == 0) { - Skip("Running as root"); - } - if (!honor_chmod()) { - Skip("System does not honor chmod"); - } - strcpy(sa.sun_path, ADDR); - sa.sun_family = AF_UNIX; - So((cfd = socket(AF_UNIX, SOCK_STREAM, 0)) >= - 0); - Reset({ close(cfd); }); - So(connect(cfd, (void *) &sa, sizeof(sa)) < 0); - So(errno == EACCES); - }); - }); - - Convey("We cannot set perms after it is started", { - So(nng_listener_start(l, 0) == 0); - So(nng_listener_setopt_int( - l, NNG_OPT_IPC_PERMISSIONS, 0444) == NNG_EBUSY); - }); - - Convey("We cannot set bogus permissions", { - So(nng_listener_setopt_int(l, NNG_OPT_IPC_PERMISSIONS, - S_IFREG) == NNG_EINVAL); - }); - }); - - Convey("We cannot set perms on an IPC dialer", { - nng_socket s; - nng_dialer d; - - So(nng_rep0_open(&s) == 0); - Reset({ nng_close(s); }); - So(nng_dialer_create(&d, s, "ipc://" ADDR) == 0); - So(nng_dialer_setopt_int(d, NNG_OPT_IPC_PERMISSIONS, 0444) == - NNG_ENOTSUP); - }); -}) -#endif diff --git a/tests/testutil.c b/tests/testutil.c index 58de1524..7068e394 100644 --- a/tests/testutil.c +++ b/tests/testutil.c @@ -136,7 +136,8 @@ testutil_htonl(uint32_t in) void testutil_scratch_addr(const char *scheme, size_t sz, char *addr) { - if (strcmp(scheme, "inproc") == 0) { + if ((strcmp(scheme, "inproc") == 0) || + (strcmp(scheme, "abstract") == 0)) { (void) snprintf(addr, sz, "%s://testutil%04x%04x%04x%04x", scheme, nng_random(), nng_random(), nng_random(), nng_random()); @@ -158,7 +159,8 @@ testutil_scratch_addr(const char *scheme, size_t sz, char *addr) return; } - if (strncmp(scheme, "ipc", 3) == 0) { + if ((strncmp(scheme, "ipc", 3) == 0) || + (strncmp(scheme, "unix", 4) == 0)) { #ifdef _WIN32 // Windows doesn't place IPC names in the filesystem. (void) snprintf(addr, sz, "%s://testutil%04x%04x%04x%04x", @@ -476,10 +478,10 @@ stream_xfr_alloc(nng_stream *s, void (*submit)(nng_stream *, nng_aio *), nng_aio_begin(x->upper_aio); - x->s = s; - x->rem = size; - x->base = buf; - x->submit = submit; + x->s = s; + x->rem = size; + x->base = buf; + x->submit = submit; return (x); } diff --git a/tests/testutil.h b/tests/testutil.h index 15028106..eb7ab7d1 100644 --- a/tests/testutil.h +++ b/tests/testutil.h @@ -63,8 +63,8 @@ extern int testutil_marry_ex( // success, an NNG error number otherwise.) extern void *testutil_stream_send_start(nng_stream *, void *, size_t); extern void *testutil_stream_recv_start(nng_stream *, void *, size_t); -extern int testutil_stream_send_wait(void *); -extern int testutil_stream_recv_wait(void *); +extern int testutil_stream_send_wait(void *); +extern int testutil_stream_recv_wait(void *); // These are TLS certificates. The client and server are signed with the // root. The server uses CN 127.0.0.1. Other details are bogus, but @@ -111,6 +111,16 @@ extern const char *testutil_client_crt; strcmp(string, buf_) == 0, "%s == %s", string, buf_); \ } while (0) +#define TEST_STREQUAL(s1, s2) \ + do { \ + TEST_CHECK_(strcmp(s1, s2) == 0, "%s == %s", s1, s2); \ + } while (0) + +#define TEST_NULL(x) \ + do { \ + TEST_CHECK_((x) == NULL, "%p == NULL", x); \ + } while (0) + #ifdef __cplusplus }; #endif diff --git a/tests/url.c b/tests/url.c index 9b44dda4..847b7df3 100644 --- a/tests/url.c +++ b/tests/url.c @@ -8,325 +8,472 @@ // found online at https://opensource.org/licenses/MIT. // + +#include "acutest.h" + #include <string.h> #include <nng/nng.h> -#include "convey.h" +#include "core/url.h" + +#include "testutil.h" + +void +test_url_host(void) +{ + nng_url *url; + + TEST_NNG_PASS(nng_url_parse(&url, "http://www.google.com")); + TEST_ASSERT(url != NULL); + TEST_CHECK(strcmp(url->u_scheme, "http") == 0); + TEST_CHECK(strcmp(url->u_host, "www.google.com") == 0); + TEST_CHECK(strcmp(url->u_hostname, "www.google.com") == 0); + TEST_CHECK(strcmp(url->u_port, "80") == 0); + TEST_CHECK(strcmp(url->u_path, "") == 0); + TEST_CHECK(strcmp(url->u_requri, "") == 0); + TEST_CHECK(url->u_query == NULL); + TEST_CHECK(url->u_fragment == NULL); + TEST_CHECK(url->u_userinfo == NULL); + nng_url_free(url); +} + +void +test_url_host_port(void) +{ + nng_url *url; + TEST_NNG_PASS(nng_url_parse(&url, "http://www.google.com:1234")); + TEST_ASSERT(url != NULL); + TEST_CHECK(strcmp(url->u_scheme, "http") == 0); + TEST_CHECK(strcmp(url->u_host, "www.google.com:1234") == 0); + TEST_CHECK(strcmp(url->u_hostname, "www.google.com") == 0); + TEST_CHECK(strcmp(url->u_port, "1234") == 0); + TEST_CHECK(strcmp(url->u_path, "") == 0); + TEST_CHECK(strcmp(url->u_requri, "") == 0); + TEST_CHECK(url->u_query == NULL); + TEST_CHECK(url->u_fragment == NULL); + TEST_CHECK(url->u_userinfo == NULL); + nng_url_free(url); +} + +void +test_url_host_port_path(void) +{ + nng_url *url; + + TEST_NNG_PASS( + nng_url_parse(&url, "http://www.google.com:1234/somewhere")); + TEST_ASSERT(url != NULL); + TEST_CHECK(strcmp(url->u_scheme, "http") == 0); + TEST_CHECK(strcmp(url->u_host, "www.google.com:1234") == 0); + TEST_CHECK(strcmp(url->u_hostname, "www.google.com") == 0); + TEST_CHECK(strcmp(url->u_port, "1234") == 0); + TEST_CHECK(strcmp(url->u_path, "/somewhere") == 0); + TEST_CHECK(strcmp(url->u_requri, "/somewhere") == 0); + TEST_CHECK(url->u_userinfo == NULL); + TEST_CHECK(url->u_query == NULL); + TEST_CHECK(url->u_fragment == NULL); + nng_url_free(url); +} + +void +test_url_user_info(void) +{ + nng_url *url; + TEST_NNG_PASS(nng_url_parse( + &url, "http://garrett@www.google.com:1234/somewhere")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_userinfo, "garrett"); + TEST_STREQUAL(url->u_host, "www.google.com:1234"); + TEST_STREQUAL(url->u_hostname, "www.google.com"); + TEST_STREQUAL(url->u_port, "1234"); + TEST_STREQUAL(url->u_path, "/somewhere"); + TEST_STREQUAL(url->u_requri, "/somewhere"); + TEST_NULL(url->u_query); + TEST_NULL(url->u_fragment); + nng_url_free(url); +} + +void +test_url_path_query_param(void) +{ + nng_url *url; + TEST_NNG_PASS( + nng_url_parse(&url, "http://www.google.com/somewhere?result=yes")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_host, "www.google.com"); + TEST_STREQUAL(url->u_hostname, "www.google.com"); + TEST_STREQUAL(url->u_port, "80"); + TEST_STREQUAL(url->u_path, "/somewhere"); + TEST_STREQUAL(url->u_query, "result=yes"); + TEST_STREQUAL(url->u_requri, "/somewhere?result=yes"); + TEST_NULL(url->u_userinfo); + TEST_NULL(url->u_fragment); + nng_url_free(url); +} + +void +test_url_query_param_anchor(void) +{ + nng_url *url; + TEST_NNG_PASS(nng_url_parse(&url, + "http://www.google.com/" + "somewhere?result=yes#chapter1")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_host, "www.google.com"); + TEST_STREQUAL(url->u_hostname, "www.google.com"); + TEST_STREQUAL(url->u_port, "80"); + TEST_STREQUAL(url->u_path, "/somewhere"); + TEST_STREQUAL(url->u_query, "result=yes"); + TEST_STREQUAL(url->u_fragment, "chapter1"); + TEST_STREQUAL(url->u_requri, "/somewhere?result=yes#chapter1"); + TEST_NULL(url->u_userinfo); + nng_url_free(url); +} + +void +test_url_path_anchor(void) +{ + nng_url *url; + TEST_NNG_PASS( + nng_url_parse(&url, "http://www.google.com/somewhere#chapter2")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_host, "www.google.com"); + TEST_STREQUAL(url->u_hostname, "www.google.com"); + TEST_STREQUAL(url->u_port, "80"); + TEST_STREQUAL(url->u_path, "/somewhere"); + TEST_STREQUAL(url->u_fragment, "chapter2"); + TEST_STREQUAL(url->u_requri, "/somewhere#chapter2"); + TEST_NULL(url->u_query); + TEST_NULL(url->u_userinfo); + nng_url_free(url); +} + +void +test_url_anchor(void) +{ + nng_url *url; + TEST_NNG_PASS(nng_url_parse(&url, "http://www.google.com#chapter3")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_host, "www.google.com"); + TEST_STREQUAL(url->u_hostname, "www.google.com"); + TEST_STREQUAL(url->u_path, ""); + TEST_STREQUAL(url->u_port, "80"); + TEST_STREQUAL(url->u_fragment, "chapter3"); + TEST_STREQUAL(url->u_requri, "#chapter3"); + TEST_NULL(url->u_query); + TEST_NULL(url->u_userinfo); + nng_url_free(url); +} + +void +test_url_query_param(void) +{ + nng_url *url; + TEST_NNG_PASS(nng_url_parse(&url, "http://www.google.com?color=red")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_host, "www.google.com"); + TEST_STREQUAL(url->u_hostname, "www.google.com"); + TEST_STREQUAL(url->u_path, ""); + TEST_STREQUAL(url->u_port, "80"); + TEST_STREQUAL(url->u_query, "color=red"); + TEST_STREQUAL(url->u_requri, "?color=red"); + TEST_ASSERT(url != NULL); + TEST_NULL(url->u_userinfo); + nng_url_free(url); +} + +void +test_url_v6_host(void) +{ + nng_url *url; + TEST_NNG_PASS(nng_url_parse(&url, "http://[::1]")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_host, "[::1]"); + TEST_STREQUAL(url->u_hostname, "::1"); + TEST_STREQUAL(url->u_path, ""); + TEST_STREQUAL(url->u_port, "80"); + TEST_NULL(url->u_query); + TEST_NULL(url->u_fragment); + TEST_NULL(url->u_userinfo); + nng_url_free(url); +} + +void +test_url_v6_host_port(void) +{ + nng_url *url; + TEST_NNG_PASS(nng_url_parse(&url, "http://[::1]:29")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_host, "[::1]:29"); + TEST_STREQUAL(url->u_hostname, "::1"); + TEST_STREQUAL(url->u_path, ""); + TEST_STREQUAL(url->u_port, "29"); + TEST_NULL(url->u_query); + TEST_NULL(url->u_fragment); + TEST_NULL(url->u_userinfo); + nng_url_free(url); +} + +void +test_url_v6_host_port_path(void) +{ + nng_url *url; + TEST_NNG_PASS(nng_url_parse(&url, "http://[::1]:29/bottles")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_host, "[::1]:29"); + TEST_STREQUAL(url->u_hostname, "::1"); + TEST_STREQUAL(url->u_path, "/bottles"); + TEST_STREQUAL(url->u_port, "29"); + TEST_NULL(url->u_query); + TEST_NULL(url->u_fragment); + TEST_NULL(url->u_userinfo); + nng_url_free(url); +} + +void +test_url_tcp_port(void) +{ + nng_url *url; + TEST_NNG_PASS(nng_url_parse(&url, "tcp://:9876/")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "tcp"); + TEST_STREQUAL(url->u_host, ":9876"); + TEST_STREQUAL(url->u_hostname, ""); + TEST_STREQUAL(url->u_path, "/"); + TEST_STREQUAL(url->u_port, "9876"); + TEST_NULL(url->u_query); + TEST_NULL(url->u_fragment); + TEST_NULL(url->u_userinfo); + nng_url_free(url); +} + +void +test_url_bare_ws(void) +{ + nng_url *url; + + TEST_NNG_PASS(nng_url_parse(&url, "ws://")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "ws"); + TEST_STREQUAL(url->u_host, ""); + TEST_STREQUAL(url->u_hostname, ""); + TEST_STREQUAL(url->u_path, ""); + TEST_STREQUAL(url->u_port, "80"); + TEST_NULL(url->u_query); + TEST_NULL(url->u_fragment); + TEST_NULL(url->u_userinfo); + nng_url_free(url); +} + +void +test_url_ws_wildcard(void) +{ + nng_url *url; + TEST_NNG_PASS(nng_url_parse(&url, "ws://*:12345/foobar")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "ws"); + TEST_STREQUAL(url->u_host, ":12345"); + TEST_STREQUAL(url->u_hostname, ""); + TEST_STREQUAL(url->u_path, "/foobar"); + TEST_STREQUAL(url->u_port, "12345"); + TEST_NULL(url->u_query); + TEST_NULL(url->u_fragment); + TEST_NULL(url->u_userinfo); + nng_url_free(url); +} -TestMain("URLs", { +void +test_url_ssh(void) +{ nng_url *url; + TEST_NNG_PASS(nng_url_parse(&url, "ssh://user@host.example.com")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "ssh"); + TEST_STREQUAL(url->u_host, "host.example.com"); + TEST_STREQUAL(url->u_hostname, "host.example.com"); + TEST_STREQUAL(url->u_path, ""); + TEST_STREQUAL(url->u_port, "22"); + TEST_NULL(url->u_query); + TEST_NULL(url->u_fragment); + TEST_STREQUAL(url->u_userinfo, "user"); + nng_url_free(url); +} + +void +test_url_bad_scheme(void) +{ + nng_url *url = NULL; + TEST_NNG_FAIL(nng_url_parse(&url, "www.google.com"), NNG_EINVAL); + TEST_NULL(url); + TEST_NNG_FAIL(nng_url_parse(&url, "http:www.google.com"), NNG_EINVAL); + TEST_NULL(url); +} + +void +test_url_bad_ipv6(void) +{ + nng_url *url = NULL; + TEST_NNG_FAIL(nng_url_parse(&url, "http://[::1"), NNG_EINVAL); + TEST_NULL(url); + TEST_NNG_FAIL(nng_url_parse(&url, "http://[::1]bogus"), NNG_EINVAL); + TEST_NULL(url); +} + +void +test_url_canonify(void) +{ + nng_url *url = NULL; + TEST_NNG_PASS(nng_url_parse( + &url, "hTTp://www.EXAMPLE.com/bogus/.%2e/%7egarrett")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_hostname, "www.example.com"); + TEST_STREQUAL(url->u_port, "80"); + TEST_STREQUAL(url->u_path, "/~garrett"); + nng_url_free(url); +} + +void +test_url_path_resolve(void) +{ + nng_url *url = NULL; + TEST_NNG_PASS( + nng_url_parse(&url, "http://www.x.com//abc/def/./x/..///./../y")); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_hostname, "www.x.com"); + TEST_STREQUAL(url->u_port, "80"); + TEST_STREQUAL(url->u_path, "/abc/y"); + nng_url_free(url); +} + +void +test_url_query_info_pass(void) +{ + nng_url *url = NULL; + TEST_NNG_PASS( + nng_url_parse(&url, "http://www.x.com/?/abc/def/./x/.././../y")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_hostname, "www.x.com"); + TEST_STREQUAL(url->u_port, "80"); + TEST_STREQUAL(url->u_path, "/"); + TEST_STREQUAL(url->u_query, "/abc/def/./x/.././../y"); + nng_url_free(url); +} + +void +test_url_bad_utf8(void) +{ + nng_url *url = NULL; + TEST_NNG_FAIL(nng_url_parse(&url, "http://x.com/x%80x"), NNG_EINVAL); + TEST_NULL(url); + TEST_NNG_FAIL(nng_url_parse(&url, "http://x.com/x%c0%81"), NNG_EINVAL); + TEST_NULL(url); +} + +void +test_url_good_utf8(void) +{ + nng_url *url = NULL; + TEST_NNG_PASS(nng_url_parse(&url, "http://www.x.com/%c2%a2_cents")); + TEST_ASSERT(url != NULL); + TEST_STREQUAL(url->u_scheme, "http"); + TEST_STREQUAL(url->u_hostname, "www.x.com"); + TEST_STREQUAL(url->u_port, "80"); + TEST_STREQUAL(url->u_path, "/\xc2\xa2_cents"); + nng_url_free(url); +} + +void +test_url_decode(void) +{ + uint8_t out[16]; + size_t len; + + out[3] = 'x'; + len = nni_url_decode(out, "abc", 3); + TEST_CHECK(len == 3); + TEST_CHECK(memcmp(out, "abc", 3) == 0); + TEST_CHECK(out[3] == 'x'); + + len = nni_url_decode(out, "x%00y", 3); // embedded NULL + TEST_CHECK(len == 3); + TEST_CHECK(memcmp(out, "x\x00y", 3) == 0); + TEST_CHECK(out[3] == 'x'); + + len = nni_url_decode(out, "%3987", 3); + TEST_CHECK(len == 3); + TEST_CHECK(memcmp(out, "987", 3) == 0); + TEST_CHECK(out[3] == 'x'); + + len = nni_url_decode(out, "78%39", 3); + TEST_CHECK(len == 3); + TEST_CHECK(memcmp(out, "789", 3) == 0); + TEST_CHECK(out[3] == 'x'); + + len = nni_url_decode(out, "", 5); + TEST_CHECK(len == 0); + TEST_CHECK(memcmp(out, "789", 3) == 0); + TEST_CHECK(out[3] == 'x'); + + len = nni_url_decode(out, "be", 2); + TEST_CHECK(len == 2); + TEST_CHECK(memcmp(out, "be9", 3) == 0); + TEST_CHECK(out[3] == 'x'); + + len = nni_url_decode(out, "78%39", 2); + TEST_CHECK(len == (size_t) -1); + + len = nni_url_decode(out, "", 2); + TEST_CHECK(len == 0); + + len = nni_url_decode(out, "78%", 5); + TEST_CHECK(len == (size_t) -1); + + len = nni_url_decode(out, "78%xy", 5); + TEST_CHECK(len == (size_t) -1); + + len = nni_url_decode(out, "78%1$", 5); + TEST_CHECK(len == (size_t) -1); + + len = nni_url_decode(out, "%%20", 5); + TEST_CHECK(len == (size_t) -1); +} - Convey("http://www.google.com", { - So(nng_url_parse(&url, "http://www.google.com") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_host, "www.google.com") == 0); - So(strcmp(url->u_hostname, "www.google.com") == 0); - So(strcmp(url->u_port, "80") == 0); - So(strcmp(url->u_path, "") == 0); - So(strcmp(url->u_requri, "") == 0); - So(url->u_query == NULL); - So(url->u_fragment == NULL); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - - Convey("http://www.google.com:1234", { - So(nng_url_parse(&url, "http://www.google.com:1234") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_host, "www.google.com:1234") == 0); - So(strcmp(url->u_hostname, "www.google.com") == 0); - So(strcmp(url->u_port, "1234") == 0); - So(strcmp(url->u_path, "") == 0); - So(strcmp(url->u_requri, "") == 0); - So(url->u_query == NULL); - So(url->u_fragment == NULL); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - - Convey("http://www.google.com:1234/somewhere", { - So(nng_url_parse( - &url, "http://www.google.com:1234/somewhere") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_host, "www.google.com:1234") == 0); - So(strcmp(url->u_hostname, "www.google.com") == 0); - So(strcmp(url->u_port, "1234") == 0); - So(strcmp(url->u_path, "/somewhere") == 0); - So(strcmp(url->u_requri, "/somewhere") == 0); - So(url->u_userinfo == NULL); - So(url->u_query == NULL); - So(url->u_fragment == NULL); - nng_url_free(url); - }); - Convey("http://garrett@www.google.com:1234/somewhere", { - So(nng_url_parse(&url, - "http://garrett@www.google.com:1234/somewhere") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_userinfo, "garrett") == 0); - So(strcmp(url->u_host, "www.google.com:1234") == 0); - So(strcmp(url->u_hostname, "www.google.com") == 0); - So(strcmp(url->u_port, "1234") == 0); - So(strcmp(url->u_path, "/somewhere") == 0); - So(strcmp(url->u_requri, "/somewhere") == 0); - So(url->u_query == NULL); - So(url->u_fragment == NULL); - nng_url_free(url); - }); - Convey("http://www.google.com/somewhere?result=yes", { - So(nng_url_parse(&url, - "http://www.google.com/somewhere?result=yes") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_host, "www.google.com") == 0); - So(strcmp(url->u_hostname, "www.google.com") == 0); - So(strcmp(url->u_port, "80") == 0); - So(strcmp(url->u_path, "/somewhere") == 0); - So(strcmp(url->u_query, "result=yes") == 0); - So(strcmp(url->u_requri, "/somewhere?result=yes") == 0); - So(url->u_userinfo == NULL); - So(url->u_fragment == NULL); - nng_url_free(url); - }); - Convey("http://www.google.com/somewhere?result=yes#chapter1", { - So(nng_url_parse(&url, - "http://www.google.com/" - "somewhere?result=yes#chapter1") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_host, "www.google.com") == 0); - So(strcmp(url->u_hostname, "www.google.com") == 0); - So(strcmp(url->u_port, "80") == 0); - So(strcmp(url->u_path, "/somewhere") == 0); - So(strcmp(url->u_query, "result=yes") == 0); - So(strcmp(url->u_fragment, "chapter1") == 0); - So(strcmp(url->u_requri, "/somewhere?result=yes#chapter1") == - 0); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - Convey("http://www.google.com/somewhere#chapter2", { - So(nng_url_parse( - &url, "http://www.google.com/somewhere#chapter2") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_host, "www.google.com") == 0); - So(strcmp(url->u_hostname, "www.google.com") == 0); - So(strcmp(url->u_port, "80") == 0); - So(strcmp(url->u_path, "/somewhere") == 0); - So(strcmp(url->u_fragment, "chapter2") == 0); - So(strcmp(url->u_requri, "/somewhere#chapter2") == 0); - So(url->u_query == NULL); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - Convey("http://www.google.com#chapter3", { - So(nng_url_parse(&url, "http://www.google.com#chapter3") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_host, "www.google.com") == 0); - So(strcmp(url->u_hostname, "www.google.com") == 0); - So(strcmp(url->u_path, "") == 0); - So(strcmp(url->u_port, "80") == 0); - So(strcmp(url->u_fragment, "chapter3") == 0); - So(strcmp(url->u_requri, "#chapter3") == 0); - So(url->u_query == NULL); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - Convey("http://www.google.com?color=red", { - So(nng_url_parse(&url, "http://www.google.com?color=red") == - 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_host, "www.google.com") == 0); - So(strcmp(url->u_hostname, "www.google.com") == 0); - So(strcmp(url->u_path, "") == 0); - So(strcmp(url->u_port, "80") == 0); - So(strcmp(url->u_query, "color=red") == 0); - So(strcmp(url->u_requri, "?color=red") == 0); - So(url->u_fragment == NULL); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - - Convey("http://[::1]", { - So(nng_url_parse(&url, "http://[::1]") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_host, "[::1]") == 0); - So(strcmp(url->u_hostname, "::1") == 0); - So(strcmp(url->u_path, "") == 0); - So(strcmp(url->u_port, "80") == 0); - So(url->u_query == NULL); - So(url->u_fragment == NULL); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - - Convey("http://[::1]:29", { - So(nng_url_parse(&url, "http://[::1]:29") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_host, "[::1]:29") == 0); - So(strcmp(url->u_hostname, "::1") == 0); - So(strcmp(url->u_path, "") == 0); - So(strcmp(url->u_port, "29") == 0); - So(url->u_query == NULL); - So(url->u_fragment == NULL); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - Convey("http://[::1]:29/bottles", { - So(nng_url_parse(&url, "http://[::1]:29/bottles") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_host, "[::1]:29") == 0); - So(strcmp(url->u_hostname, "::1") == 0); - So(strcmp(url->u_path, "/bottles") == 0); - So(strcmp(url->u_port, "29") == 0); - So(url->u_query == NULL); - So(url->u_fragment == NULL); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - - Convey("tcp://:9876/", { - So(nng_url_parse(&url, "tcp://:9876/") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "tcp") == 0); - So(strcmp(url->u_host, ":9876") == 0); - So(strcmp(url->u_hostname, "") == 0); - So(strcmp(url->u_path, "/") == 0); - So(strcmp(url->u_port, "9876") == 0); - So(url->u_query == NULL); - So(url->u_fragment == NULL); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - - Convey("ws://", { - So(nng_url_parse(&url, "ws://") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "ws") == 0); - So(strcmp(url->u_host, "") == 0); - So(strcmp(url->u_hostname, "") == 0); - So(strcmp(url->u_path, "") == 0); - So(strcmp(url->u_port, "80") == 0); - So(url->u_query == NULL); - So(url->u_fragment == NULL); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - - Convey("ws://*:12345/foobar", { - So(nng_url_parse(&url, "ws://*:12345/foobar") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "ws") == 0); - So(strcmp(url->u_host, ":12345") == 0); - So(strcmp(url->u_hostname, "") == 0); - So(strcmp(url->u_path, "/foobar") == 0); - So(strcmp(url->u_port, "12345") == 0); - So(url->u_query == NULL); - So(url->u_fragment == NULL); - So(url->u_userinfo == NULL); - nng_url_free(url); - }); - - Convey("ssh://user@host.example.com", { - So(nng_url_parse(&url, "ssh://user@host.example.com") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "ssh") == 0); - So(strcmp(url->u_host, "host.example.com") == 0); - So(strcmp(url->u_hostname, "host.example.com") == 0); - So(strcmp(url->u_path, "") == 0); - So(strcmp(url->u_port, "22") == 0); - So(url->u_query == NULL); - So(url->u_fragment == NULL); - So(strcmp(url->u_userinfo, "user") == 0); - nng_url_free(url); - }); - - Convey("Negative www.google.com", { - url = NULL; - So(nng_url_parse(&url, "www.google.com") == NNG_EINVAL); - So(url == NULL); - }); - - Convey("Negative http:www.google.com", { - url = NULL; - So(nng_url_parse(&url, "http:www.google.com") == NNG_EINVAL); - So(url == NULL); - }); - - Convey("Negative http://[::1", { - url = NULL; - So(nng_url_parse(&url, "http://[::1") == NNG_EINVAL); - So(url == NULL); - }); - - Convey("Negative http://[::1]bogus", { - url = NULL; - So(nng_url_parse(&url, "http://[::1]bogus") == NNG_EINVAL); - So(url == NULL); - }); - - Convey("Canonicalization works", { - url = NULL; - So(nng_url_parse(&url, - "hTTp://www.EXAMPLE.com/bogus/.%2e/%7egarrett") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_hostname, "www.example.com") == 0); - So(strcmp(url->u_port, "80") == 0); - So(strcmp(url->u_path, "/~garrett") == 0); - nng_url_free(url); - }); - - Convey("Path resolution works", { - url = NULL; - So(nng_url_parse(&url, - "http://www.x.com//abc/def/./x/..///./../y") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_hostname, "www.x.com") == 0); - So(strcmp(url->u_port, "80") == 0); - So(strcmp(url->u_path, "/abc/y") == 0); - nng_url_free(url); - }); - - Convey("Query info unmolested", { - url = NULL; - So(nng_url_parse( - &url, "http://www.x.com/?/abc/def/./x/.././../y") == 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_hostname, "www.x.com") == 0); - So(strcmp(url->u_port, "80") == 0); - So(strcmp(url->u_path, "/") == 0); - So(strcmp(url->u_query, "/abc/def/./x/.././../y") == 0); - nng_url_free(url); - }); - - Convey("Bad UTF-8 fails", { - url = NULL; - So(nng_url_parse(&url, "http://x.com/x%80x") == NNG_EINVAL); - So(nng_url_parse(&url, "http://x.com/x%c0%81") == NNG_EINVAL); - }); - - Convey("Valid UTF-8 works", { - url = NULL; - So(nng_url_parse(&url, "http://www.x.com/%c2%a2_centsign") == - 0); - So(url != NULL); - So(strcmp(url->u_scheme, "http") == 0); - So(strcmp(url->u_hostname, "www.x.com") == 0); - So(strcmp(url->u_port, "80") == 0); - So(strcmp(url->u_path, "/\xc2\xa2_centsign") == 0); - nng_url_free(url); - }); -}) +TEST_LIST = { + { "url host", test_url_host }, + { "url host port", test_url_host_port }, + { "url host port path", test_url_host_port_path }, + { "url user info", test_url_user_info }, + { "url path query param", test_url_path_query_param }, + { "url query param anchor", test_url_query_param_anchor }, + { "url path anchor", test_url_path_anchor }, + { "url anchor", test_url_anchor }, + { "url query param", test_url_query_param }, + { "url v6 host", test_url_v6_host }, + { "url v6 host port", test_url_v6_host_port }, + { "url v6 host port path", test_url_v6_host_port_path }, + { "url tcp port", test_url_tcp_port }, + { "url bare ws", test_url_bare_ws }, + { "url ws wildcard", test_url_ws_wildcard }, + { "url ssh", test_url_ssh }, + { "url bad scheme", test_url_bad_scheme }, + { "url bad v6", test_url_bad_ipv6 }, + { "url canonify", test_url_canonify }, + { "url path resolve", test_url_path_resolve }, + { "url query info pass", test_url_query_info_pass }, + { "url bad utf8", test_url_bad_utf8 }, + { "url good utf8", test_url_good_utf8 }, + { "url decode", test_url_decode }, + { NULL, NULL }, +};
\ No newline at end of file |
