From b7ccdb7948b4909833eeb2c4ba7a51ad74ec2723 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 3 Jun 2007 02:15:00 +0000 Subject: [PATCH] Add a couple of tests for the URI parsing and resolving code. --- src/tests/uri_test.c | 145 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 src/tests/uri_test.c diff --git a/src/tests/uri_test.c b/src/tests/uri_test.c new file mode 100644 index 00000000..25487603 --- /dev/null +++ b/src/tests/uri_test.c @@ -0,0 +1,145 @@ +#include +#include +#include +#include +#include +#include + +#define URI_MAX_LEN 1024 + +struct uri_test { + const char *base_uri_string; + const char *relative_uri_string; + const char *resolved_uri_string; +}; + +static struct uri_test uri_tests[] = { + { "http://www.fensystems.co.uk", "", + "http://www.fensystems.co.uk/" }, + { "http://etherboot.org/wiki/page1", "page2", + "http://etherboot.org/wiki/page2" }, + { "http://etherboot.org/wiki/page1", "../page3", + "http://etherboot.org/page3" }, + { "tftp://192.168.0.1/", "/tftpboot/vmlinuz", + "tftp://192.168.0.1/tftpboot/vmlinuz" }, +#if 0 + "http://www.etherboot.org/wiki", + "mailto:bob@nowhere.com", + "ftp://joe:secret@insecure.org:8081/hidden/path/to?what=is#this", +#endif +}; + +static int test_parse_unparse ( const char *uri_string ) { + char buf[URI_MAX_LEN]; + size_t len; + struct uri *uri = NULL; + int rc; + + /* Parse and unparse URI */ + uri = parse_uri ( uri_string ); + if ( ! uri ) { + rc = -ENOMEM; + goto done; + } + len = unparse_uri ( buf, sizeof ( buf ), uri ); + + /* Compare result */ + if ( strcmp ( buf, uri_string ) != 0 ) { + printf ( "Unparse of \"%s\" produced \"%s\"\n", + uri_string, buf ); + rc = -EINVAL; + goto done; + } + + rc = 0; + + done: + uri_put ( uri ); + if ( rc ) { + printf ( "URI parse-unparse of \"%s\" failed: %s\n", + uri_string, strerror ( rc ) ); + } + return rc; +} + +static int test_resolve ( const char *base_uri_string, + const char *relative_uri_string, + const char *resolved_uri_string ) { + struct uri *base_uri = NULL; + struct uri *relative_uri = NULL; + struct uri *resolved_uri = NULL; + char buf[URI_MAX_LEN]; + size_t len; + int rc; + + /* Parse URIs */ + base_uri = parse_uri ( base_uri_string ); + if ( ! base_uri ) { + rc = -ENOMEM; + goto done; + } + relative_uri = parse_uri ( relative_uri_string ); + if ( ! relative_uri ) { + rc = -ENOMEM; + goto done; + } + + /* Resolve URI */ + resolved_uri = resolve_uri ( base_uri, relative_uri ); + if ( ! resolved_uri ) { + rc = -ENOMEM; + goto done; + } + + /* Compare result */ + len = unparse_uri ( buf, sizeof ( buf ), resolved_uri ); + if ( strcmp ( buf, resolved_uri_string ) != 0 ) { + printf ( "Resolution of \"%s\"+\"%s\" produced \"%s\"\n", + base_uri_string, relative_uri_string, buf ); + rc = -EINVAL; + goto done; + } + + rc = 0; + + done: + uri_put ( base_uri ); + uri_put ( relative_uri ); + uri_put ( resolved_uri ); + if ( rc ) { + printf ( "URI resolution of \"%s\"+\"%s\" failed: %s\n", + base_uri_string, relative_uri_string, + strerror ( rc ) ); + } + return rc; +} + +int uri_test ( void ) { + unsigned int i; + struct uri_test *uri_test; + int rc; + int overall_rc = 0; + + for ( i = 0 ; i < ( sizeof ( uri_tests ) / + sizeof ( uri_tests[0] ) ) ; i++ ) { + uri_test = &uri_tests[i]; + rc = test_parse_unparse ( uri_test->base_uri_string ); + if ( rc != 0 ) + overall_rc = rc; + rc = test_parse_unparse ( uri_test->relative_uri_string ); + if ( rc != 0 ) + overall_rc = rc; + rc = test_parse_unparse ( uri_test->resolved_uri_string ); + if ( rc != 0 ) + overall_rc = rc; + rc = test_resolve ( uri_test->base_uri_string, + uri_test->relative_uri_string, + uri_test->resolved_uri_string ); + if ( rc != 0 ) + overall_rc = rc; + } + + if ( overall_rc ) + printf ( "URI tests failed: %s\n", strerror ( overall_rc ) ); + return overall_rc; +}