summaryrefslogtreecommitdiffstats
path: root/netwerk/base/rust-url-capi/test
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/base/rust-url-capi/test')
-rw-r--r--netwerk/base/rust-url-capi/test/Makefile4
-rw-r--r--netwerk/base/rust-url-capi/test/test.cpp141
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