Index: uspace/lib/uri/Makefile
===================================================================
--- uspace/lib/uri/Makefile	(revision d7b7f5e312adb3acb6e7c2044551454dfd1e4019)
+++ uspace/lib/uri/Makefile	(revision da4e6958d016f7b437fc5c019e3e15e85e8fd14c)
@@ -36,3 +36,7 @@
 	uri.c
 
+TEST_SOURCES = \
+	test/main.c \
+	test/parser.c
+
 include $(USPACE_PREFIX)/Makefile.common
Index: uspace/lib/uri/test/main.c
===================================================================
--- uspace/lib/uri/test/main.c	(revision da4e6958d016f7b437fc5c019e3e15e85e8fd14c)
+++ uspace/lib/uri/test/main.c	(revision da4e6958d016f7b437fc5c019e3e15e85e8fd14c)
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2014 Vojtech Horky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <pcut/pcut.h>
+
+PCUT_INIT
+
+PCUT_IMPORT(uri_parse);
+
+
+PCUT_MAIN()
Index: uspace/lib/uri/test/parser.c
===================================================================
--- uspace/lib/uri/test/parser.c	(revision da4e6958d016f7b437fc5c019e3e15e85e8fd14c)
+++ uspace/lib/uri/test/parser.c	(revision da4e6958d016f7b437fc5c019e3e15e85e8fd14c)
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2014 Vojtech Horky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <pcut/pcut.h>
+#include <str.h>
+#include "../uri.h"
+
+typedef struct {
+	const char *scheme;
+	const char *user_info;
+	const char *user_credential;
+	const char *host;
+	const char *port;
+	const char *path;
+	const char *query;
+	const char *fragment;
+} const_uri_t;
+
+
+static const_uri_t expected_uri;
+static uri_t *parsed_uri;
+
+/*
+ * In the following macros we assume that the expected and the parsed
+ * URI are in the global variables declared above.
+ */
+
+#define CHECK(item) \
+	PCUT_ASSERT_STR_EQUALS_OR_NULL(expected_uri.item, parsed_uri->item)
+
+#define PARSE_AND_CHECK(the_uri) \
+	do { \
+		parsed_uri = uri_parse(the_uri); \
+		PCUT_ASSERT_NOT_NULL(parsed_uri); \
+		PCUT_ASSERT_INT_EQUALS(0, !uri_validate(parsed_uri)); \
+		CHECK(scheme); \
+		CHECK(user_info); \
+		CHECK(user_credential); \
+		CHECK(host); \
+		CHECK(port); \
+		CHECK(path); \
+		CHECK(query); \
+		CHECK(fragment); \
+	} while (0)
+
+
+PCUT_INIT
+
+PCUT_TEST_SUITE(uri_parse);
+
+PCUT_TEST_BEFORE {
+	parsed_uri = NULL;
+	expected_uri.scheme = NULL;
+	expected_uri.user_info = NULL;
+	expected_uri.user_credential = NULL;
+	expected_uri.host = NULL;
+	expected_uri.port = NULL;
+	expected_uri.path = "";
+	expected_uri.query = NULL;
+	expected_uri.fragment = NULL;
+}
+
+PCUT_TEST_AFTER {
+	if (parsed_uri != NULL) {
+		uri_destroy(parsed_uri);
+		parsed_uri = NULL;
+	}
+}
+
+PCUT_TEST(only_hostname) {
+	expected_uri.scheme = "http";
+	expected_uri.host = "localhost";
+	
+	PARSE_AND_CHECK("http://localhost");
+}
+
+PCUT_TEST(hostname_with_user) {
+	expected_uri.scheme = "http";
+	expected_uri.host = "localhost";
+	expected_uri.user_info = "user";
+		
+	PARSE_AND_CHECK("http://user@localhost");
+}
+
+PCUT_TEST(hostname_with_user_and_password) {
+	expected_uri.scheme = "https";
+	expected_uri.host = "localhost";
+	expected_uri.user_info = "user";
+	expected_uri.user_credential = "password";
+		
+	PARSE_AND_CHECK("https://user:password@localhost");
+}
+
+PCUT_TEST(path_specification) {
+	expected_uri.scheme = "http";
+	expected_uri.host = "localhost";
+	expected_uri.path = "/alpha";
+		
+	PARSE_AND_CHECK("http://localhost/alpha");
+}
+
+PCUT_TEST(with_fragment) {
+	expected_uri.scheme = "http";
+	expected_uri.host = "localhost";
+	expected_uri.path = "/alpha";
+	expected_uri.fragment = "fragment-name";
+		
+	PARSE_AND_CHECK("http://localhost/alpha#fragment-name");
+}
+
+
+PCUT_EXPORT(uri_parse);
