aboutsummaryrefslogtreecommitdiffstats
path: root/test/test_uri.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_uri.c')
-rw-r--r--test/test_uri.c195
1 files changed, 106 insertions, 89 deletions
diff --git a/test/test_uri.c b/test/test_uri.c
index cc81b40e..96fde600 100644
--- a/test/test_uri.c
+++ b/test/test_uri.c
@@ -3,12 +3,11 @@
#undef NDEBUG
-#include "serd/serd.h"
+#include <serd/serd.h>
#include <assert.h>
#include <stdbool.h>
#include <stdint.h>
-#include <stdio.h>
#include <string.h>
#define USTR(s) ((const uint8_t*)(s))
@@ -16,6 +15,8 @@
static void
test_uri_string_has_scheme(void)
{
+ assert(!serd_uri_string_has_scheme(NULL));
+
assert(!serd_uri_string_has_scheme(USTR("relative")));
assert(!serd_uri_string_has_scheme(USTR("http")));
assert(!serd_uri_string_has_scheme(USTR("5nostartdigit")));
@@ -35,11 +36,11 @@ test_uri_string_has_scheme(void)
}
static void
-test_file_uri(const char* const hostname,
- const char* const path,
- const bool escape,
- const char* const expected_uri,
- const char* expected_path)
+check_file_uri(const char* const hostname,
+ const char* const path,
+ const bool escape,
+ const char* const expected_uri,
+ const char* expected_path)
{
if (!expected_path) {
expected_path = path;
@@ -51,6 +52,7 @@ test_file_uri(const char* const hostname,
uint8_t* out_path =
serd_file_uri_parse((const uint8_t*)node.buf, &out_hostname);
+ assert(out_path);
assert(!strcmp((const char*)node.buf, expected_uri));
assert((hostname && out_hostname) || (!hostname && !out_hostname));
assert(!hostname || !strcmp(hostname, (const char*)out_hostname));
@@ -67,38 +69,27 @@ test_file_uri(const char* const hostname,
#endif
static void
-test_uri_to_path(void)
+check_uri_to_path(const char* const uri, const char* const expected_path)
{
- assert(!strcmp(
- (const char*)serd_uri_to_path((const uint8_t*)"file:///home/user/foo.ttl"),
- "/home/user/foo.ttl"));
-
- assert(!strcmp((const char*)serd_uri_to_path(
- (const uint8_t*)"file://localhost/home/user/foo.ttl"),
- "/home/user/foo.ttl"));
-
- assert(!serd_uri_to_path((const uint8_t*)"file:illegal/file/uri"));
-
- assert(!strcmp(
- (const char*)serd_uri_to_path((const uint8_t*)"file:///c:/awful/system"),
- "c:/awful/system"));
-
- assert(!strcmp(
- (const char*)serd_uri_to_path((const uint8_t*)"file:///c:awful/system"),
- "/c:awful/system"));
-
- assert(!strcmp((const char*)serd_uri_to_path((const uint8_t*)"file:///0/1"),
- "/0/1"));
-
- assert(
- !strcmp((const char*)serd_uri_to_path((const uint8_t*)"C:\\Windows\\Sucks"),
- "C:\\Windows\\Sucks"));
-
- assert(
- !strcmp((const char*)serd_uri_to_path((const uint8_t*)"C|/Windows/Sucks"),
- "C|/Windows/Sucks"));
+ const uint8_t* const path = serd_uri_to_path((const uint8_t*)uri);
+ assert(path);
+ assert(!strcmp((const char*)path, expected_path));
+}
+static void
+test_uri_to_path(void)
+{
+ assert(!serd_uri_to_path((const uint8_t*)"file:invalid/file/uri"));
assert(!serd_uri_to_path((const uint8_t*)"http://example.org/path"));
+
+ check_uri_to_path("file:///home/user/foo.ttl", "/home/user/foo.ttl");
+ check_uri_to_path("file://localhost/home/user/foo.ttl", "/home/user/foo.ttl");
+ check_uri_to_path("file:///c:/awful/system", "c:/awful/system");
+ check_uri_to_path("file:///c:awful/system", "/c:awful/system");
+ check_uri_to_path("file:///0/1", "/0/1");
+ check_uri_to_path("C:\\Windows\\Sucks", "C:\\Windows\\Sucks");
+ check_uri_to_path("C|/Windows/Sucks", "C|/Windows/Sucks");
+ check_uri_to_path("rel", "rel");
}
#if defined(__GNUC__)
@@ -108,69 +99,81 @@ test_uri_to_path(void)
static void
test_uri_parsing(void)
{
- test_file_uri(NULL, "C:/My 100%", true, "file:///C:/My%20100%%", NULL);
- test_file_uri(NULL, "/foo/bar", true, "file:///foo/bar", NULL);
- test_file_uri("bhost", "/foo/bar", true, "file://bhost/foo/bar", NULL);
- test_file_uri(NULL, "a/relative path", false, "a/relative path", NULL);
- test_file_uri(
+ check_file_uri(NULL, "C:/My 100%", true, "file:///C:/My%20100%%", NULL);
+ check_file_uri(NULL, "/foo/bar", true, "file:///foo/bar", NULL);
+ check_file_uri("bhost", "/foo/bar", true, "file://bhost/foo/bar", NULL);
+ check_file_uri(NULL, "a/relative path", false, "a/relative path", NULL);
+ check_file_uri(
NULL, "a/relative <path>", true, "a/relative%20%3Cpath%3E", NULL);
#ifdef _WIN32
- test_file_uri(
+ check_file_uri(
NULL, "C:\\My 100%", true, "file:///C:/My%20100%%", "C:/My 100%");
- test_file_uri(NULL,
- "\\drive\\relative",
- true,
- "file:///drive/relative",
- "/drive/relative");
-
- test_file_uri(NULL,
- "C:\\Program Files\\Serd",
- true,
- "file:///C:/Program%20Files/Serd",
- "C:/Program Files/Serd");
-
- test_file_uri("ahost",
- "C:\\Pointless Space",
- true,
- "file://ahost/C:/Pointless%20Space",
- "C:/Pointless Space");
+ check_file_uri(NULL,
+ "\\drive\\relative",
+ true,
+ "file:///drive/relative",
+ "/drive/relative");
+
+ check_file_uri(NULL,
+ "C:\\Program Files\\Serd",
+ true,
+ "file:///C:/Program%20Files/Serd",
+ "C:/Program Files/Serd");
+
+ check_file_uri("ahost",
+ "C:\\Pointless Space",
+ true,
+ "file://ahost/C:/Pointless%20Space",
+ "C:/Pointless Space");
#else
/* What happens with Windows paths on other platforms is a bit weird, but
more or less unavoidable. It doesn't work to interpret backslashes as
path separators on any other platform. */
- test_file_uri("ahost",
- "C:\\Pointless Space",
- true,
- "file://ahost/C:%5CPointless%20Space",
- "/C:\\Pointless Space");
-
- test_file_uri(NULL,
- "\\drive\\relative",
- true,
- "%5Cdrive%5Crelative",
- "\\drive\\relative");
-
- test_file_uri(NULL,
- "C:\\Program Files\\Serd",
- true,
- "file:///C:%5CProgram%20Files%5CSerd",
- "/C:\\Program Files\\Serd");
-
- test_file_uri("ahost",
- "C:\\Pointless Space",
- true,
- "file://ahost/C:%5CPointless%20Space",
- "/C:\\Pointless Space");
+ check_file_uri("ahost",
+ "C:\\Pointless Space",
+ true,
+ "file://ahost/C:%5CPointless%20Space",
+ "/C:\\Pointless Space");
+
+ check_file_uri(NULL,
+ "\\drive\\relative",
+ true,
+ "%5Cdrive%5Crelative",
+ "\\drive\\relative");
+
+ check_file_uri(NULL,
+ "C:\\Program Files\\Serd",
+ true,
+ "file:///C:%5CProgram%20Files%5CSerd",
+ "/C:\\Program Files\\Serd");
+
+ check_file_uri("ahost",
+ "C:\\Pointless Space",
+ true,
+ "file://ahost/C:%5CPointless%20Space",
+ "/C:\\Pointless Space");
#endif
+ // Test tolerance of NULL hostname parameter
+ uint8_t* const hosted = serd_file_uri_parse(USTR("file://host/path"), NULL);
+ assert(hosted);
+ assert(!strcmp((const char*)hosted, "/path"));
+ serd_free(hosted);
+
// Test tolerance of parsing junk URI escapes
- uint8_t* out_path = serd_file_uri_parse(USTR("file:///foo/%0Xbar"), NULL);
- assert(!strcmp((const char*)out_path, "/foo/bar"));
- serd_free(out_path);
+ uint8_t* const junk1 = serd_file_uri_parse(USTR("file:///foo/%0Xbar"), NULL);
+ assert(junk1);
+ assert(!strcmp((const char*)junk1, "/foo/bar"));
+ serd_free(junk1);
+
+ uint8_t* const junk2 = serd_file_uri_parse(USTR("file:///foo/%X0bar"), NULL);
+ assert(junk2);
+ assert(!strcmp((const char*)junk2, "/foo/bar"));
+ serd_free(junk2);
}
static void
@@ -194,8 +197,8 @@ test_uri_from_string(void)
serd_node_free(&base);
}
-static inline bool
-chunk_equals(const SerdChunk* a, const SerdChunk* b)
+static bool
+chunk_equals(const SerdChunk* const a, const SerdChunk* const b)
{
return (!a->len && !b->len && !a->buf && !b->buf) ||
(a->len && b->len && a->buf && b->buf &&
@@ -343,6 +346,22 @@ test_relative_uri(void)
"http://example.org/a/b/c",
"http://example.org/a/b",
"http://example.org/a");
+
+ // Tolerance of NULL URI output parameter
+ {
+ SerdURI uri = SERD_URI_NULL;
+ assert(!serd_uri_parse(USTR("http://example.org/path"), &uri));
+
+ SerdURI base = SERD_URI_NULL;
+ assert(!serd_uri_parse(USTR("http://example.org/"), &base));
+
+ SerdNode result_node = serd_node_new_relative_uri(&uri, &base, NULL, NULL);
+
+ assert(result_node.n_bytes == 4U);
+ assert(!strcmp((const char*)result_node.buf, "path"));
+
+ serd_node_free(&result_node);
+ }
}
int
@@ -353,7 +372,5 @@ main(void)
test_uri_parsing();
test_uri_from_string();
test_relative_uri();
-
- printf("Success\n");
return 0;
}