diff options
Diffstat (limited to 'netwerk/base/rust-url-capi/test')
-rw-r--r-- | netwerk/base/rust-url-capi/test/Makefile | 4 | ||||
-rw-r--r-- | netwerk/base/rust-url-capi/test/test.cpp | 141 |
2 files changed, 145 insertions, 0 deletions
diff --git a/netwerk/base/rust-url-capi/test/Makefile b/netwerk/base/rust-url-capi/test/Makefile new file mode 100644 index 000000000..a4e2fd0cf --- /dev/null +++ b/netwerk/base/rust-url-capi/test/Makefile @@ -0,0 +1,4 @@ +all: + cd .. && cargo build + g++ -Wall -o test test.cpp ../target/debug/librust*.a -ldl -lpthread -lrt -lgcc_s -lpthread -lc -lm -std=c++0x + ./test diff --git a/netwerk/base/rust-url-capi/test/test.cpp b/netwerk/base/rust-url-capi/test/test.cpp new file mode 100644 index 000000000..6e90ea43b --- /dev/null +++ b/netwerk/base/rust-url-capi/test/test.cpp @@ -0,0 +1,141 @@ +#include <stdio.h> +#include <string.h> +#include <assert.h> +#include "../src/rust-url-capi.h" + +class StringContainer +{ +public: + StringContainer() + { + mBuffer = nullptr; + mLength = 0; + } + + ~StringContainer() + { + free(mBuffer); + mBuffer = nullptr; + } + + void SetSize(size_t size) + { + mLength = size; + if (mBuffer) { + mBuffer = (char *)realloc(mBuffer, size); + return; + } + mBuffer = (char *)malloc(size); + } + + char * GetBuffer() + { + return mBuffer; + } + + void CheckEquals(const char * ref) { + int32_t refLen = strlen(ref); + printf("CheckEquals: %s (len:%d)\n", ref, refLen); + if (refLen != mLength || strncmp(mBuffer, ref, mLength)) { + printf("\t--- ERROR ---\n"); + printf("Got : "); + fwrite(mBuffer, mLength, 1, stdout); + printf(" (len:%d)\n", mLength); + exit(-1); + } + printf("-> OK\n"); + } +private: + int32_t mLength; + char * mBuffer; +}; + +extern "C" int32_t c_fn_set_size(void * container, size_t size) +{ + ((StringContainer *) container)->SetSize(size); + return 0; +} + +extern "C" char * c_fn_get_buffer(void * container) +{ + return ((StringContainer *) container)->GetBuffer(); +} + +#define TEST_CALL(func, expected) \ +{ \ + int32_t code = func; \ + printf("%s -> code %d\n", #func, code); \ + assert(code == expected); \ + printf("-> OK\n"); \ +} \ + + +int main() { + // Create URL + rusturl_ptr url = rusturl_new("http://example.com/path/some/file.txt", + strlen("http://example.com/path/some/file.txt")); + assert(url); // Check we have a URL + + StringContainer container; + + TEST_CALL(rusturl_get_spec(url, &container), 0); + container.CheckEquals("http://example.com/path/some/file.txt"); + TEST_CALL(rusturl_set_host(url, "test.com", strlen("test.com")), 0); + TEST_CALL(rusturl_get_host(url, &container), 0); + container.CheckEquals("test.com"); + TEST_CALL(rusturl_get_path(url, &container), 0); + container.CheckEquals("/path/some/file.txt"); + TEST_CALL(rusturl_set_path(url, "hello/../else.txt", strlen("hello/../else.txt")), 0); + TEST_CALL(rusturl_get_path(url, &container), 0); + container.CheckEquals("/else.txt"); + TEST_CALL(rusturl_resolve(url, "./bla/file.txt", strlen("./bla/file.txt"), &container), 0); + container.CheckEquals("http://test.com/bla/file.txt"); + TEST_CALL(rusturl_get_scheme(url, &container), 0); + container.CheckEquals("http"); + TEST_CALL(rusturl_set_username(url, "user", strlen("user")), 0); + TEST_CALL(rusturl_get_username(url, &container), 0); + container.CheckEquals("user"); + TEST_CALL(rusturl_get_spec(url, &container), 0); + container.CheckEquals("http://user@test.com/else.txt"); + TEST_CALL(rusturl_set_password(url, "pass", strlen("pass")), 0); + TEST_CALL(rusturl_get_password(url, &container), 0); + container.CheckEquals("pass"); + TEST_CALL(rusturl_get_spec(url, &container), 0); + container.CheckEquals("http://user:pass@test.com/else.txt"); + TEST_CALL(rusturl_set_username(url, "", strlen("")), 0); + TEST_CALL(rusturl_set_password(url, "", strlen("")), 0); + TEST_CALL(rusturl_get_spec(url, &container), 0); + container.CheckEquals("http://test.com/else.txt"); + TEST_CALL(rusturl_set_host_and_port(url, "example.org:1234", strlen("example.org:1234")), 0); + TEST_CALL(rusturl_get_host(url, &container), 0); + container.CheckEquals("example.org"); + assert(rusturl_get_port(url) == 1234); + TEST_CALL(rusturl_set_port(url, "9090", strlen("9090")), 0); + assert(rusturl_get_port(url) == 9090); + TEST_CALL(rusturl_set_query(url, "x=1", strlen("x=1")), 0); + TEST_CALL(rusturl_get_query(url, &container), 0); + container.CheckEquals("x=1"); + TEST_CALL(rusturl_set_fragment(url, "fragment", strlen("fragment")), 0); + TEST_CALL(rusturl_get_fragment(url, &container), 0); + container.CheckEquals("fragment"); + TEST_CALL(rusturl_get_spec(url, &container), 0); + container.CheckEquals("http://example.org:9090/else.txt?x=1#fragment"); + + // Free the URL + rusturl_free(url); + + url = rusturl_new("http://example.com/#", + strlen("http://example.com/#")); + assert(url); // Check we have a URL + + assert(rusturl_has_fragment(url) == 1); + TEST_CALL(rusturl_set_fragment(url, "", 0), 0); + assert(rusturl_has_fragment(url) == 0); + TEST_CALL(rusturl_get_spec(url, &container), 0); + container.CheckEquals("http://example.com/"); + + rusturl_free(url); + + printf("SUCCESS\n"); + return 0; +}
\ No newline at end of file |