| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "URITest.h" |
| |
| #include <decaf/net/URI.h> |
| #include <decaf/net/URL.h> |
| #include <decaf/lang/Integer.h> |
| #include <decaf/lang/Boolean.h> |
| |
| using namespace std; |
| using namespace decaf; |
| using namespace decaf::net; |
| using namespace decaf::lang; |
| using namespace decaf::lang::exceptions; |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| URITest::URITest() { |
| } |
| |
| namespace decaf{ |
| namespace net{ |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| std::vector<URI> getUris() { |
| |
| std::vector<URI> uris; |
| |
| uris.push_back( URI( "http://user%60%20info@host/a%20path?qu%60%20ery#fr%5E%20ag" ) ); |
| // escaped octets for illegal chars |
| uris.push_back( URI( "http", "user%60%20info", "host", 80, "/a%20path", "qu%60%20ery", "fr%5E%20ag" ) ); |
| // escaped octets for illegal |
| uris.push_back( URI( "http", "user%C3%9F%C2%A3info", "host", -1, |
| "/a%E2%82%ACpath", "qu%C2%A9%C2%AEery", "fr%C3%A4%C3%A8g" ) ); |
| // Illegal Chars |
| uris.push_back( URI( "http", "user` info", "host", 81, "/a path", "qu` ery", "fr^ ag" ) ); |
| // % as illegal char, not escaped octet |
| uris.push_back( URI( "http", "user%info", "host", 0, "/a%path", "que%ry", "f%rag" ) ); |
| uris.push_back( URI( "mailto", "user@domain.com", "" ) ); |
| // no host, path, query or fragment |
| uris.push_back( URI( "../adirectory/file.html#" ) ); |
| // relative path with empty fragment; |
| uris.push_back( URI( "news", "comp.infosystems.www.servers.unix", "" ) ); |
| uris.push_back( URI( "", "", "", "fragment" ) ); |
| uris.push_back( URI( "telnet://server.org" ) ); |
| uris.push_back( URI( "http://reg:istry?query" ) ); |
| uris.push_back( URI( "file:///c:/temp/calculate.pl?" ) ); |
| |
| return uris; |
| } |
| |
| }} |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testConstructorOneString() { |
| |
| std::vector<std::string> constructorTests; |
| constructorTests.push_back( "http://user@www.google.com:45/search?q=helpinfo#somefragment" ); |
| // http with authority, query and fragment |
| constructorTests.push_back( "ftp://ftp.is.co.za/rfc/rfc1808.txt" ); // ftp |
| constructorTests.push_back( |
| "gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles" ); |
| // gopher |
| constructorTests.push_back( "mailto:mduerst@ifi.unizh.ch" ); // mailto |
| constructorTests.push_back( "news:comp.infosystems.www.servers.unix" ); // news |
| constructorTests.push_back( "telnet://melvyl.ucop.edu/" ); // telnet |
| constructorTests.push_back( "http://123.24.17.98/test" ); // IPv4 authority |
| constructorTests.push_back( "http://www.google.com:80/test" );// domain name authority |
| constructorTests.push_back( "http://joe@[3ffe:2a00:100:7031::1]:80/test" ); |
| // IPv6 authority, with userinfo and port |
| constructorTests.push_back( "/relative" ); // relative starting with / |
| constructorTests.push_back( "//relative" ); // relative starting with // |
| constructorTests.push_back( "relative" ); // relative with no / |
| constructorTests.push_back( "#fragment" );// relative just with fragment |
| constructorTests.push_back( "http://user@host:80" ); // UI, host,port |
| constructorTests.push_back( "http://user@host" ); // ui, host |
| constructorTests.push_back( "http://host" ); // host |
| constructorTests.push_back( "http://host:80" ); // host,port |
| constructorTests.push_back( "http://joe@:80" ); // ui, port (becomes registry-based) |
| constructorTests.push_back( "file:///foo/bar" ); // empty authority, non empty path |
| constructorTests.push_back( "ht?tp://hoe@host:80" ); // miscellaneous tests |
| constructorTests.push_back( "mai/lto:hey?joe#man" ); |
| constructorTests.push_back( "http://host/a%20path#frag" ); |
| // path with an escaped octet for space char |
| constructorTests.push_back( "http://host/a%E2%82%ACpath#frag" ); |
| // path with escaped octet for unicode char, not USASCII |
| // constructorTests.push_back( "http://host/a\u20ACpath#frag" ); |
| // path with unicode char, not USASCII equivalent to |
| constructorTests.push_back( "http://host%20name/" ); |
| // escaped octets in host (becomes registry based) |
| constructorTests.push_back( "http://host\u00DFname/" ); |
| // unicodechar in host (becomes registry based) |
| // equivalent to = "http://host\u00dfname/", |
| constructorTests.push_back( "ht123-+tp://www.google.com:80/test" ); |
| // legal chars in scheme |
| |
| for( unsigned int i = 0; i < constructorTests.size(); i++ ) { |
| CPPUNIT_ASSERT_NO_THROW_MESSAGE( |
| string( "Failed to construct URI for: " ) + constructorTests[i], |
| URI( constructorTests.at(i) ) ); |
| } |
| |
| std::vector<const char*> constructorTestsInvalid; |
| // space char in path, not in escaped |
| constructorTestsInvalid.push_back( "http:///a path#frag" ); |
| // octet form, with no host |
| constructorTestsInvalid.push_back( "http://host/a[path#frag" ); |
| // an illegal char, not in escaped octet form, should throw an exception |
| // invalid escape sequence in path |
| constructorTestsInvalid.push_back( "http://host/a%path#frag" ); |
| // incomplete escape sequence in path |
| constructorTestsInvalid.push_back( "http://host/a%#frag" ); |
| // space char in fragment, not in |
| constructorTestsInvalid.push_back( "http://host#a frag" ); |
| // escaped octet form, no path |
| // illegal char in fragment |
| constructorTestsInvalid.push_back( "http://host/a#fr#ag" ); |
| // invalid escape sequence in fragment, |
| constructorTestsInvalid.push_back( "http:///path#fr%ag" ); |
| // with no host |
| // incomplete escape sequence in fragment |
| constructorTestsInvalid.push_back( "http://host/path#frag%" ); |
| // space char in query, not in escaped octet form |
| constructorTestsInvalid.push_back( "http://host/path?a query#frag" ); |
| // invalid escape sequence in query, no path |
| constructorTestsInvalid.push_back( "http://host?query%ag" ); |
| // incomplete escape sequence in query, with no host |
| constructorTestsInvalid.push_back( "http:///path?query%" ); |
| // invalid char in scheme specific part |
| constructorTestsInvalid.push_back( "mailto:user^name@fklkf.com" ); |
| |
| for( unsigned int i = 0; i < constructorTestsInvalid.size(); i++ ) { |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| string( "URI not caught as invalid: " ) + constructorTestsInvalid[i], |
| URI( constructorTestsInvalid.at(i) ), |
| URISyntaxException ); |
| } |
| |
| std::vector<const char*> constructorTestsInvalid2; |
| // authority validation |
| constructorTestsInvalid2.push_back( "http://user@[3ffe:2x00:100:7031::1]:80/test" );// malformed |
| // IPv6 authority |
| constructorTestsInvalid2.push_back( "http://[ipv6address]/apath#frag" ); // malformed ipv6 address |
| constructorTestsInvalid2.push_back( "http://[ipv6address/apath#frag" ); // malformed ipv6 address |
| constructorTestsInvalid2.push_back( "http://ipv6address]/apath#frag" ); // illegal char in host name |
| constructorTestsInvalid2.push_back( "http://ipv6[address/apath#frag" ); |
| constructorTestsInvalid2.push_back( "http://ipv6addr]ess/apath#frag" ); |
| constructorTestsInvalid2.push_back( "http://ipv6address[]/apath#frag" ); |
| // illegal char in username... |
| constructorTestsInvalid2.push_back( "http://us[]er@host/path?query#frag" ); |
| constructorTestsInvalid2.push_back( "http://host name/path" ); // illegal |
| // char in authority |
| constructorTestsInvalid2.push_back( "http://host^name#fragment" ); // illegal char in authority |
| constructorTestsInvalid2.push_back( "telnet://us er@hostname/" ); // illegal char in authority |
| // missing components |
| constructorTestsInvalid2.push_back( "//" ); // Authority expected |
| constructorTestsInvalid2.push_back( "ascheme://" ); // Authority expected |
| constructorTestsInvalid2.push_back( "ascheme:" ); // Scheme-specific part expected |
| // scheme validation |
| constructorTestsInvalid2.push_back( "a scheme://reg/" ); // illegal char |
| constructorTestsInvalid2.push_back( "1scheme://reg/" ); // non alpha char as 1st char |
| constructorTestsInvalid2.push_back( "asche\u00dfme:ssp" ); // unicode char , not USASCII |
| constructorTestsInvalid2.push_back( "asc%20heme:ssp" );// escape octets |
| |
| for( unsigned int i = 0; i < constructorTestsInvalid2.size(); i++ ) { |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| string( "URI not caught as invalid: " ) + constructorTestsInvalid2[i], |
| URI( constructorTestsInvalid2.at(i) ), |
| URISyntaxException ); |
| } |
| |
| try { |
| URI("%3"); |
| CPPUNIT_FAIL( "Assert 0: URI constructor failed to throw exception on invalid input." ); |
| } catch( URISyntaxException& e ) { |
| CPPUNIT_ASSERT_MESSAGE( |
| "Assert 1: Wrong index in URISyntaxException.", 0 == e.getIndex() ); |
| } |
| |
| // Regression test for HARMONY-25 |
| // if port value is negative, the authority should be considered |
| // registry-based. |
| URI uri("http://host:-8096/path/index.html"); |
| CPPUNIT_ASSERT_MESSAGE( |
| "Assert 2: returned wrong port value,", -1 == uri.getPort() ); |
| CPPUNIT_ASSERT_MESSAGE( "Assert 3: returned wrong host value,", uri.getHost() == "" ); |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Assert 4: Expected URISyntaxException: ", |
| uri.parseServerAuthority(), |
| URISyntaxException ); |
| |
| URI uri2( "http", "//myhost:-8096", "" ); |
| CPPUNIT_ASSERT_MESSAGE( |
| "Assert 5: returned wrong port value,", -1 == uri2.getPort() ); |
| CPPUNIT_ASSERT_MESSAGE( "Assert 6: returned wrong host value,", uri2.getHost() == "" ); |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Assert 7: Expected URISyntaxException: ", |
| uri.parseServerAuthority(), |
| URISyntaxException ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testURIString() { |
| |
| CPPUNIT_ASSERT_NO_THROW_MESSAGE( |
| "Should Not Throw an Exception URI( \"\\\" )", |
| URI uri( "/" ) |
| ); |
| |
| try { |
| URI myUri( ":abc@mymail.com" ); |
| CPPUNIT_FAIL("TestA, URISyntaxException expected, but not received."); |
| } catch( URISyntaxException& e ) { |
| CPPUNIT_ASSERT_MESSAGE( |
| "TestA, Wrong URISyntaxException index, ", 0 == e.getIndex()); |
| } |
| |
| try { |
| URI uri( "path[one" ); |
| CPPUNIT_FAIL("TestB, URISyntaxException expected, but not received."); |
| } catch( URISyntaxException& e1 ) { |
| CPPUNIT_ASSERT_MESSAGE( |
| "TestB, Wrong URISyntaxException index, ", 4 == e1.getIndex()); |
| } |
| |
| try { |
| URI uri( " " ); |
| CPPUNIT_FAIL("TestC, URISyntaxException expected, but not received."); |
| } catch( URISyntaxException& e2 ) { |
| CPPUNIT_ASSERT_MESSAGE( |
| "TestC, Wrong URISyntaxException index, ", 0 == e2.getIndex()); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testConstructorThreeString() { |
| |
| URI uri( "mailto", "mduerst@ifi.unizh.ch", "" ); |
| |
| CPPUNIT_ASSERT_MESSAGE( "wrong userinfo", uri.getUserInfo() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong hostname", uri.getHost() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong authority", uri.getAuthority() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong port number", -1 == uri.getPort() ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong path", uri.getPath() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong query", uri.getQuery() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong fragment", uri.getFragment() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( |
| "wrong SchemeSpecificPart", uri.getSchemeSpecificPart() == "mduerst@ifi.unizh.ch" ); |
| |
| // scheme specific part can not be null |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "mailto", "", "" ), |
| URISyntaxException ); |
| |
| // scheme needs to start with an alpha char |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "3scheme", "//authority/path", "fragment" ), |
| URISyntaxException ); |
| |
| // scheme can not be a colon |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( ":", "//authority/path", "fragment" ), |
| URISyntaxException ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testConstructorStringPlusInts() { |
| |
| // check for URISyntaxException for invalid Server Authority |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "http", "user", "host\u00DFname", -1, "/file", "query", "fragment" ), |
| URISyntaxException ); |
| |
| // escaped octets in host name |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "http", "user", "host%20name", -1, "/file", "query", "fragment" ), |
| URISyntaxException ); |
| |
| // illegal char in host name |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "http", "user", "host name", -1, "/file", "query", "fragment" ), |
| URISyntaxException ); |
| |
| // illegal char in host name |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "http", "user", "host]name", -1, "/file", "query", "fragment" ), |
| URISyntaxException ); |
| |
| // missing host name |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "http", "user", "", 80, "/file", "query", "fragment" ), |
| URISyntaxException ); |
| |
| // missing host name |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "http", "user", "", -1, "/file", "query", "fragment" ), |
| URISyntaxException ); |
| |
| // malformed ipv4 address |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "telnet", "", "256.197.221.200", -1, "", "", "" ), |
| URISyntaxException ); |
| |
| // malformed ipv4 address |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "ftp", "", "198.256.221.200", -1, "", "", "" ), |
| URISyntaxException ); |
| |
| // check for URISyntaxException for invalid scheme |
| // escaped octets in scheme |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "ht%20tp", "user", "hostname", -1, "/file", "query", "fragment" ), |
| URISyntaxException ); |
| |
| // illegal char in scheme |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "ht tp", "user", "hostname", -1, "/file", "query", "fragment" ), |
| URISyntaxException ); |
| |
| // illegal char in scheme |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "ht]tp", "user", "hostname", -1, "/file", "query", "fragment" ), |
| URISyntaxException ); |
| |
| // relative path with scheme |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "http", "user", "hostname", -1, "relative", "query", "fragment" ), |
| URISyntaxException ); |
| |
| // functional test |
| try { |
| |
| URI uri( "http", "us:e@r", "hostname", 85, "/file/dir#/qu?e/", "qu?er#y", "frag#me?nt" ); |
| |
| CPPUNIT_ASSERT_MESSAGE( "wrong userinfo", uri.getUserInfo() == "us:e@r" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong hostname", uri.getHost() == "hostname" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong port number", 85 == uri.getPort() ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong path", uri.getPath() =="/file/dir#/qu?e/" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong query", uri.getQuery() == "qu?er#y" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong fragment", uri.getFragment() == "frag#me?nt" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong SchemeSpecificPart", |
| uri.getSchemeSpecificPart() == "//us:e@r@hostname:85/file/dir#/qu?e/?qu?er#y" ); |
| |
| } catch( URISyntaxException& e ) { |
| CPPUNIT_FAIL( "Unexpected Exception: " + e.getMessage() ); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testConstructorFourString() { |
| |
| // relative path |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "http", "www.joe.com", "relative", "jimmy" ), |
| URISyntaxException ); |
| |
| // valid parameters for this constructor |
| { |
| URI uri( "http", "www.joe.com", "/path", "jimmy" ); |
| } |
| |
| // illegal char in path |
| { |
| URI uri( "http", "www.host.com", "/path?q", "somefragment" ); |
| } |
| |
| // empty fragment |
| { |
| URI uri( "ftp", "ftp.is.co.za", "/rfc/rfc1808.txt", "" ); |
| } |
| |
| // path with escaped octet for unicode char, not USASCII |
| { |
| URI uri( "http", "host", "/a%E2%82%ACpath", "frag" ); |
| } |
| |
| // All fields empty |
| { |
| URI uri( "", "", "", "" ); |
| } |
| |
| // CPPUNIT_ASSERT_THROW_MESSAGE( |
| // "Expected URISyntaxException: ", |
| // URI( "http", ":2:3:4:5:6:7:8", "/apath", "\u20ACfrag" ), |
| // URISyntaxException ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testConstructorFiveString() { |
| |
| // URISyntaxException on relative path |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException: ", |
| URI( "http", "www.joe.com", "relative", "query", "jimmy" ), |
| URISyntaxException ); |
| |
| // test if empty authority is parsed into undefined host, userinfo and port |
| // and if escaped octets in components are preserved, illegal chars are quoted |
| URI uri("ht12-3+tp", "", "/p#a%E2%82%ACth", "q^u%25ery", "fragment"); |
| |
| CPPUNIT_ASSERT_MESSAGE( "wrong scheme", uri.getScheme() == "ht12-3+tp" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong port number", -1 == uri.getPort() ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong path", uri.getPath() == "/p#a%E2%82%ACth" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong query", uri.getQuery() == "q^u%25ery" ); |
| CPPUNIT_ASSERT_MESSAGE( "wrong fragment", uri.getFragment() == "fragment" ); |
| |
| CPPUNIT_ASSERT_MESSAGE( |
| string( "wrong SchemeSpecificPart: " ) + uri.getSchemeSpecificPart(), |
| uri.getSchemeSpecificPart() == "///p#a%E2%82%ACth?q^u%25ery" ); |
| |
| CPPUNIT_ASSERT_MESSAGE( |
| string( "wrong RawSchemeSpecificPart" ) + uri.getRawSchemeSpecificPart(), |
| uri.getRawSchemeSpecificPart() == "///p%23a%25E2%2582%25ACth?q%5Eu%2525ery" ); |
| |
| CPPUNIT_ASSERT_MESSAGE( |
| string( "incorrect toString()" ) + uri.toString(), |
| uri.toString() == "ht12-3+tp:/p%23a%25E2%2582%25ACth?q%5Eu%2525ery#fragment" ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testConstructorFiveString2() { |
| |
| // accept [] as part of valid ipv6 host name |
| URI uri( "ftp", "[0001:1234::0001]", "/dir1/dir2", "query", "frag" ); |
| |
| CPPUNIT_ASSERT_MESSAGE( "Returned incorrect host", |
| uri.getHost() == "[0001:1234::0001]" ); |
| |
| // do not accept [] as part of invalid ipv6 address |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException for invalid ipv6 address", |
| URI( "ftp", "[www.abc.com]", "/dir1/dir2", "query", "frag" ), |
| URISyntaxException ); |
| |
| // do not accept [] as part of user info |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException for invalid user info", |
| URI( "ftp", "[user]@host", "/dir1/dir2", "query", "frag" ), |
| URISyntaxException ); |
| |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testCompareToOne() { |
| |
| // compareTo tests |
| const char* compareToData[34][2] = { |
| // scheme tests |
| { "http:test", "" }, // scheme null, scheme not null |
| { "", "http:test" }, // reverse |
| { "http:test", "ftp:test" }, // schemes different |
| { "/test", "/test" }, // schemes null |
| { "http://joe", "http://joe" }, // schemes same |
| { "http://joe", "hTTp://joe" }, // schemes same ignoring case |
| |
| // opacity : one opaque, the other not |
| { "http:opaque", "http://nonopaque" }, |
| { "http://nonopaque", "http:opaque" }, |
| { "mailto:abc", "mailto:abc" }, // same ssp |
| { "mailto:abC", "mailto:Abc" }, // different, by case |
| { "mailto:abc", "mailto:def" }, // different by letter |
| { "mailto:abc#ABC", "mailto:abc#DEF" }, |
| { "mailto:abc#ABC", "mailto:abc#ABC" }, |
| { "mailto:abc#DEF", "mailto:abc#ABC" }, |
| |
| // hierarchical tests.. |
| |
| // different authorities |
| { "//www.test.com/test", "//www.test2.com/test" }, |
| |
| { "/nullauth", "//nonnullauth/test" }, // one null authority |
| { "//nonnull", "/null" }, |
| { "/hello", "/hello" }, // both authorities null |
| // different userinfo |
| { "http://joe@test.com:80", "http://test.com" }, |
| { "http://jim@test.com", "http://james@test.com" }, |
| // different hostnames |
| { "http://test.com", "http://toast.com" }, |
| { "http://test.com:80", "test.com:87" }, // different ports |
| { "http://test.com", "http://test.com:80" }, |
| // different paths |
| { "http://test.com:91/dir1", "http://test.com:91/dir2" }, |
| // one null host |
| { "http:/hostless", "http://hostfilled.com/hostless" }, |
| |
| // queries |
| { "http://test.com/dir?query", "http://test.com/dir?koory" }, |
| { "/test?query", "/test" }, |
| { "/test", "/test?query" }, |
| { "/test", "/test" }, |
| |
| // fragments |
| { "ftp://test.com/path?query#frag", "ftp://test.com/path?query" }, |
| { "ftp://test.com/path?query", "ftp://test.com/path?query#frag" }, |
| { "#frag", "#frag" }, |
| { "p", "" }, |
| |
| { "http://www.google.com", "#test" } // miscellaneous |
| }; |
| |
| int compareToResults[34] = { |
| 1, -1, 1, 0, 0, 0, 1, -1, 0, 1, -1, -1, 0, 1, -1, -1, 1, 0, 1, 1, |
| -1, -1, -1, -1, -1, 1, 1, -1, 0, 1, -1, 0, 1, 1 |
| }; |
| |
| // test compareTo functionality |
| for( unsigned int i = 0; i < 34; i++ ) { |
| |
| URI b( compareToData[i][0] ); |
| URI r( compareToData[i][1] ); |
| |
| if( b.compareTo( r ) != compareToResults[i] ) { |
| CPPUNIT_FAIL( std::string("Test ") + decaf::lang::Integer::toString(i) |
| + std::string(": ") + compareToData[i][0] + " compared to " |
| + compareToData[i][1] + " -> " |
| + decaf::lang::Integer::toString( b.compareTo(r) ) |
| + " rather than " |
| + decaf::lang::Integer::toString( compareToResults[i] ) ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testCompareToTwo() { |
| |
| { |
| // test URIs with host names with different casing |
| URI uri1( "http://AbC.cOm/root/news" ); |
| URI uri2( "http://aBc.CoM/root/news" ); |
| CPPUNIT_ASSERT_MESSAGE( "TestA", 0 == uri1.compareTo( uri2 ) ); |
| CPPUNIT_ASSERT_MESSAGE( "TestB", 0 == uri2.compareTo( uri1 ) ); |
| } |
| |
| { |
| // test URIs with one undefined component |
| URI uri1( "http://abc.com:80/root/news" ); |
| URI uri2( "http://abc.com/root/news" ); |
| CPPUNIT_ASSERT_MESSAGE( "TestC", uri1.compareTo( uri2 ) > 0 ); |
| CPPUNIT_ASSERT_MESSAGE( "TestD", uri2.compareTo( uri1 ) < 0 ); |
| } |
| |
| { |
| // test URIs with one undefined component |
| URI uri1( "http://user@abc.com/root/news" ); |
| URI uri2( "http://abc.com/root/news" ); |
| CPPUNIT_ASSERT_MESSAGE( "TestE", uri1.compareTo( uri2 ) > 0 ); |
| CPPUNIT_ASSERT_MESSAGE( "TestF", uri2.compareTo( uri1 ) < 0 ); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testCreate() { |
| |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "IllegalArgumentException expected but not received.", |
| URI::create( "a scheme://reg/" ), |
| IllegalArgumentException ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testEquals() { |
| |
| const char* equalsData[30][2] = { |
| { "", "" }, // null frags |
| { "/path", "/path#frag" }, |
| { "#frag", "#frag2" }, |
| { "#frag", "#FRag" }, |
| // case insensitive on hex escapes |
| { "#fr%4F", "#fr%4f" }, |
| { "scheme:test", "scheme2:test" }, // scheme stuff |
| { "test", "http:test" }, |
| { "http:test", "test" }, |
| { "SCheme:test", "schEMe:test" }, |
| // hierarchical/opaque mismatch |
| { "mailto:jim", "mailto://jim" }, |
| { "mailto://test", "mailto:test" }, |
| // opaque |
| { "mailto:name", "mailto:name" }, |
| { "mailtO:john", "mailto:jim" }, |
| // test hex case insensitivity on ssp |
| { "mailto:te%4Fst", "mailto:te%4fst" }, |
| { "mailto:john#frag", "mailto:john#frag2" }, |
| // hierarchical |
| { "/test", "/test" }, // paths |
| { "/te%F4st", "/te%f4st" }, |
| { "/TEst", "/teSt" }, |
| { "", "/test" }, |
| // registry based because they don't resolve properly to |
| // server-based add more tests here |
| { "//host.com:80err", "//host.com:80e" }, |
| { "//host.com:81e%Abrr", "//host.com:81e%abrr" }, |
| { "/test", "//auth.com/test" }, |
| { "//test.com", "/test" }, |
| { "//test.com", "//test.com" }, // hosts |
| // case insensitivity for hosts |
| { "//HoSt.coM/", "//hOsT.cOm/" }, |
| { "//te%ae.com", "//te%aE.com" }, |
| { "//test.com:80", "//test.com:81" }, |
| { "//joe@test.com:80", "//test.com:80" }, |
| { "//jo%3E@test.com:82", "//jo%3E@test.com:82" }, |
| { "//test@test.com:85", "//test@test.com" }, |
| }; |
| |
| bool equalsResults[30] = { |
| true, false, false, false, true, false, false, false, |
| true, false, false, true, false, true, false, true, |
| true, false, false, false, true, false, false, true, |
| true, true, false, false, true, false, }; |
| |
| // test equals functionality |
| for( int i = 0; i < 30; i++ ) { |
| URI b( equalsData[i][0] ); |
| URI r( equalsData[i][1] ); |
| if( b.equals( r ) != equalsResults[i] ) { |
| CPPUNIT_FAIL( std::string( "Error: " ) + equalsData[i][0] + |
| std::string( " == " ) + equalsData[i][1] + "? -> " + |
| Boolean::toString( b.equals( r ) ) + " expected " + |
| Boolean::toString( equalsResults[i] ) ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testEquals2() { |
| |
| { |
| // test URIs with empty string authority |
| URI uri1( "http:///~/dictionary" ); |
| URI uri2( uri1.getScheme(), uri1.getAuthority(), uri1.getPath(), |
| uri1.getQuery(), uri1.getFragment() ); |
| |
| CPPUNIT_ASSERT( uri2.equals( uri1 ) ); |
| } |
| |
| { |
| // test URIs with port number |
| URI uri1( "http://abc.com%E2%82%AC:88/root/news" ); |
| URI uri2( "http://abc.com%E2%82%AC/root/news" ); |
| CPPUNIT_ASSERT( !uri1.equals( uri2 ) ); |
| CPPUNIT_ASSERT( !uri2.equals( uri1 ) ); |
| } |
| |
| { |
| // test URIs with host names with different casing |
| URI uri1( "http://AbC.cOm/root/news" ); |
| URI uri2( "http://aBc.CoM/root/news" ); |
| CPPUNIT_ASSERT( uri1.equals( uri2 ) ); |
| CPPUNIT_ASSERT( uri2.equals( uri1 ) ); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetAuthority() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getAuthorityResults[] = { |
| "user` info@host", |
| "user%60%20info@host:80", |
| "user%C3%9F%C2%A3info@host", |
| "user` info@host:81", |
| "user%info@host:0", |
| "", |
| "", |
| "", |
| "", |
| "server.org", |
| "reg:istry", |
| "" |
| }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++) { |
| |
| std::string result = uris[i].getAuthority(); |
| |
| if( getAuthorityResults[i] != result ) { |
| |
| CPPUNIT_FAIL( std::string( "Error: For URI \"" ) + uris[i].toString() + |
| std::string( "\"," ) + "\n" + |
| string( "getAuthority() returned: " ) + result + "\n" + |
| string( "expected: ") + getAuthorityResults[i] ); |
| } |
| } |
| |
| CPPUNIT_ASSERT( |
| URI( "", "", "", 127, "", "", "" ).getAuthority() == "" ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetAuthority2() { |
| |
| { |
| // tests for URIs with empty string authority component |
| URI uri( "file:///tmp/" ); |
| CPPUNIT_ASSERT_MESSAGE( string( "Authority not empty for URI: " ) + uri.toString(), |
| uri.getAuthority() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( string( "Host not empty for URI " ) + uri.toString(), |
| uri.getHost() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( "testA, toString() returned incorrect value", |
| string( "file:///tmp/" ) == uri.toString() ); |
| } |
| { |
| URI uri( "file", "", "/tmp", "frag" ); |
| CPPUNIT_ASSERT_MESSAGE( string( "Authority not null for URI: " ) + uri.toString(), |
| uri.getAuthority() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( string( "Host not null for URI " ) + uri.toString(), |
| uri.getHost() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( string( "testB, toString() returned incorrect value:" ) + uri.toString(), |
| string( "file:/tmp#frag" ) == uri.toString() ); |
| } |
| { |
| URI uri( "file", "", "/tmp", "query", "frag" ); |
| CPPUNIT_ASSERT_MESSAGE( string( "Authority not null for URI: " ) + uri.toString(), |
| uri.getAuthority() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( "Host not null for URI " + uri.toString(), |
| uri.getHost() == "" ); |
| CPPUNIT_ASSERT_MESSAGE( "test C, toString() returned incorrect value", |
| string( "file:/tmp?query#frag" ) == uri.toString() ); |
| } |
| |
| // after normalization the host string info may be lost since the |
| // uri string is reconstructed |
| URI uri( "file", "www.google.com", "/tmp/a/../b/c", "query", "frag" ); |
| URI uri2 = uri.normalize(); |
| CPPUNIT_ASSERT_MESSAGE( string( "Authority not null for URI: " ) + uri2.toString(), |
| uri.getAuthority() == "www.google.com" ); |
| CPPUNIT_ASSERT_MESSAGE( string( "Host not null for URI " ) + uri2.toString(), |
| uri.getHost() == "www.google.com" ); |
| CPPUNIT_ASSERT_MESSAGE( "test D, toString() returned incorrect value: " + uri.toString(), |
| string( "file://www.google.com/tmp/a/../b/c?query#frag" ) == uri.toString() ); |
| CPPUNIT_ASSERT_MESSAGE( "test E, toString() returned incorrect value: " + uri2.toString(), |
| string( "file://www.google.com/tmp/b/c?query#frag" ) == uri2.toString() ); |
| |
| // the empty string host will give URISyntaxException |
| // for the 7 arg constructor |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "URISyntaxException expected but not received.", |
| URI("file", "user", "", 80, "/path", "query", "frag"), |
| URISyntaxException ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetFragment() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getFragmentResults[] = { |
| "fr^ ag", |
| "fr%5E%20ag", |
| "fr%C3%A4%C3%A8g", |
| "fr^ ag", |
| "f%rag", "", "", "", |
| "fragment", "", "", "" |
| }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getFragment(); |
| if( getFragmentResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI \"" ) + uris[i].toString() + |
| string( "\", getFragment() returned: " ) + result + |
| string( ", expected: " ) + getFragmentResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetHost() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getHostResults[] = { |
| "host", "host", "host", |
| "host", "host", "", |
| "", "", "", |
| "server.org", |
| "", "" }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getHost(); |
| if( getHostResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI \"" ) + uris[i].toString() + |
| string( "\", getHost() returned: " ) + result + |
| string( ", expected: " ) + getHostResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetPath() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getPathResults[] = { |
| "/a path", |
| "/a%20path", |
| "/a%E2%82%ACpath", |
| "/a path", |
| "/a%path", "", |
| "../adirectory/file.html", |
| "", "", "", "", |
| "/c:/temp/calculate.pl" |
| }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getPath(); |
| if( getPathResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI \"" ) + uris[i].toString() + |
| string( "\", getPath() returned: " ) + result + |
| string( ", expected: " ) + getPathResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetPort() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| int getPortResults[] = { |
| -1, 80, -1, 81, 0, -1, -1, -1, -1, -1, -1, -1 }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| int result = uris[i].getPort(); |
| CPPUNIT_ASSERT_MESSAGE( string( "Error: For URI \"" ) + uris[i].toString() + |
| string( "\", getPort() returned: " ) + |
| Integer::toString( result ) + |
| string( ", expected: " ) + |
| Integer::toString( getPortResults[i] ), |
| result == getPortResults[i] ); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetPort2() { |
| |
| // if port value is negative, the authority should be considered registry based. |
| |
| URI uri( "http://myhost:-8096/site/index.html" ); |
| CPPUNIT_ASSERT_MESSAGE( "TestA, returned wrong port value,", -1 == uri.getPort() ); |
| CPPUNIT_ASSERT_MESSAGE( "TestA, returned wrong host value,", uri.getHost() == "" ); |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "TestA - URISyntaxException expected but not received.", |
| uri.parseServerAuthority(), |
| URISyntaxException ); |
| |
| URI uri2( "http", "//myhost:-8096", "" ); |
| CPPUNIT_ASSERT_MESSAGE( "TestB returned wrong port value,", -1 == uri2.getPort() ); |
| CPPUNIT_ASSERT_MESSAGE( "TestB returned wrong host value,", uri2.getHost() == "" ); |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "TestB - URISyntaxException expected but not received.", |
| uri2.parseServerAuthority(), |
| URISyntaxException ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetQuery() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getQueryResults[] = { |
| "qu` ery", |
| "qu%60%20ery", |
| "qu%C2%A9%C2%AEery", |
| "qu` ery", |
| "que%ry", |
| "", "", "", "", "", |
| "query", |
| "" |
| }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getQuery(); |
| if( getQueryResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI \"" ) + uris[i].toString() + |
| string( "\", getQuery() returned: " ) + result + |
| string( ", expected: " ) + getQueryResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetRawAuthority() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getRawAuthorityResults[] = { |
| "user%60%20info@host", |
| "user%2560%2520info@host:80", |
| "user%25C3%259F%25C2%25A3info@host", |
| "user%60%20info@host:81", |
| "user%25info@host:0", |
| "", "", "", "", |
| "server.org", |
| "reg:istry", |
| "" }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getRawAuthority(); |
| if( getRawAuthorityResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI \"" ) + uris[i].toString() + |
| string( "\", getRawAuthority() returned: " ) + result + |
| string( ", expected: " ) + getRawAuthorityResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetRawFragment() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getRawFragmentResults[] = { |
| "fr%5E%20ag", |
| "fr%255E%2520ag", |
| "fr%25C3%25A4%25C3%25A8g", |
| "fr%5E%20ag", "f%25rag", |
| "", "", "", |
| "fragment", |
| "", "", "" |
| }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getRawFragment(); |
| if( getRawFragmentResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI \"" ) + uris[i].toString() + |
| string( "\", getRawFragment() returned: " ) + result + |
| string( ", expected: " ) + getRawFragmentResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetRawPath() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getRawPathResults[] = { |
| "/a%20path", |
| "/a%2520path", "/a%25E2%2582%25ACpath", |
| "/a%20path", "/a%25path", "", |
| "../adirectory/file.html", |
| "", "", "", "", |
| "/c:/temp/calculate.pl" }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getRawPath(); |
| if( getRawPathResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI \"" ) + uris[i].toString() + |
| string( "\", getRawPath() returned: " ) + result + |
| string( ", expected: " ) + getRawPathResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetRawQuery() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getRawQueryResults[] = { |
| "qu%60%20ery", |
| "qu%2560%2520ery", |
| "qu%25C2%25A9%25C2%25AEery", |
| "qu%60%20ery", "que%25ry", |
| "", "", "", "", "", |
| "query", "" |
| }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getRawQuery(); |
| if( getRawQueryResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI \"" ) + uris[i].toString() + |
| string( "\", getRawQuery() returned: " ) + result + |
| string( ", expected: " ) + getRawQueryResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetRawSchemeSpecificPart() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getRawSspResults[] = { |
| "//user%60%20info@host/a%20path?qu%60%20ery", |
| "//user%2560%2520info@host:80/a%2520path?qu%2560%2520ery", |
| "//user%25C3%259F%25C2%25A3info@host/a%25E2%2582%25ACpath?qu%25C2%25A9%25C2%25AEery", |
| "//user%60%20info@host:81/a%20path?qu%60%20ery", |
| "//user%25info@host:0/a%25path?que%25ry", |
| "user@domain.com", |
| "../adirectory/file.html", |
| "comp.infosystems.www.servers.unix", |
| "", |
| "//server.org", |
| "//reg:istry?query", |
| "///c:/temp/calculate.pl?" |
| }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getRawSchemeSpecificPart(); |
| if( getRawSspResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI[" ) + |
| Integer::toString( i ) + string( "] \"" ) + uris[i].toString() + |
| string( "\", getRawSchemeSpecificPart() returned: " ) + result + |
| string( ", expected: " ) + getRawSspResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetRawUserInfo() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getRawUserInfoResults[] = { |
| "user%60%20info", |
| "user%2560%2520info", |
| "user%25C3%259F%25C2%25A3info", |
| "user%60%20info", "user%25info", |
| "", "", "", "", "", "", "" }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getRawUserInfo(); |
| if( getRawUserInfoResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI[" ) + |
| Integer::toString( i ) + string( "] \"" ) + uris[i].toString() + |
| string( "\", getRawUserInfo() returned: " ) + result + |
| string( ", expected: " ) + getRawUserInfoResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetScheme() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getSchemeResults[] = { |
| "http", "http", |
| "http", "http", |
| "http", "mailto", |
| "", "news", |
| "", "telnet", |
| "http", "file" |
| }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getScheme(); |
| if( getSchemeResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI[" ) + |
| Integer::toString( i ) + string( "] \"" ) + uris[i].toString() + |
| string( "\", getScheme() returned: " ) + result + |
| string( ", expected: " ) + getSchemeResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetSchemeSpecificPart() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getSspResults[] = { |
| "//user` info@host/a path?qu` ery", |
| "//user%60%20info@host:80/a%20path?qu%60%20ery", |
| "//user%C3%9F%C2%A3info@host/a%E2%82%ACpath?qu%C2%A9%C2%AEery", |
| "//user` info@host:81/a path?qu` ery", |
| "//user%info@host:0/a%path?que%ry", |
| "user@domain.com", |
| "../adirectory/file.html", |
| "comp.infosystems.www.servers.unix", |
| "", |
| "//server.org", |
| "//reg:istry?query", |
| "///c:/temp/calculate.pl?" |
| }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getSchemeSpecificPart(); |
| if( getSspResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI[" ) + |
| Integer::toString( i ) + string( "] \"" ) + uris[i].toString() + |
| string( "\", getSchemeSpecificPart() returned: " ) + result + |
| string( ", expected: " ) + getSspResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testGetUserInfo() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* getUserInfoResults[] = { |
| "user` info", |
| "user%60%20info", |
| "user%C3%9F%C2%A3info", |
| "user` info", |
| "user%info", |
| "", "", "", "", "", "", "" |
| }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| string result = uris[i].getUserInfo(); |
| if( getUserInfoResults[i] != result ) { |
| CPPUNIT_FAIL( string( "Error: For URI[" ) + |
| Integer::toString( i ) + string( "] \"" ) + uris[i].toString() + |
| string( "\", getUserInfo() returned: " ) + result + |
| string( ", expected: " ) + getUserInfoResults[i] ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testIsAbsolute() { |
| |
| const char* isAbsoluteData[] = { |
| "mailto:user@ca.ibm.com", |
| "urn:isbn:123498989h", |
| "news:software.ibm.com", |
| "http://www.amazon.ca", |
| "file:///d:/temp/results.txt", |
| "scheme:ssp", |
| "calculate.pl?isbn=123498989h", |
| "?isbn=123498989h", |
| "//www.amazon.ca", |
| "a.html", |
| "#top", |
| "//pc1/", |
| "//user@host/path/file" |
| }; |
| |
| bool results[] = { |
| true, true, true, true, true, true, |
| false, false, false, false, false, false, false |
| }; |
| |
| for( unsigned int i = 0; i < 13; i++) { |
| bool result = URI( isAbsoluteData[i] ).isAbsolute(); |
| CPPUNIT_ASSERT_MESSAGE( string( "URI(" ) + isAbsoluteData[i] + |
| string( ").isAbsolute() = " ) + Boolean::toString( result ), |
| results[i] == result ); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testIsOpaque() { |
| |
| const char* isOpaqueData[] = { |
| "mailto:user@ca.ibm.com", |
| "urn:isbn:123498989h", |
| "news:software.ibm.com", |
| "http://www.amazon.ca", |
| "file:///d:/temp/results.txt", |
| "scheme:ssp", |
| "calculate.pl?isbn=123498989h", |
| "?isbn=123498989h", |
| "//www.amazon.ca", "a.html", "#top", |
| "//pc1/", "//user@host/path/file" }; |
| |
| bool results[] = { |
| true, true, true, false, false, |
| true, false, false, false, false, |
| false, false, false }; |
| |
| for( unsigned int i = 0; i < 13; i++) { |
| bool result = URI( isOpaqueData[i] ).isOpaque(); |
| CPPUNIT_ASSERT_MESSAGE( string( "URI(" ) + isOpaqueData[i] + |
| string( ").isOpaque() = " ) + Boolean::toString( result ), |
| results[i] == result ); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testNormalize() { |
| |
| const char* normalizeData[] = { |
| // normal |
| "/", |
| "/a", |
| "/a/b", |
| "/a/b/c", |
| // single, '.' |
| "/.", "/./", "/./.", "/././", |
| "/./a", |
| "/./a/", |
| "/././a", |
| "/././a/", |
| "/a/.", |
| "/a/./", |
| "/a/./.", |
| "/a/./b", |
| // double, '..' |
| "/a/..", "/a/../", "/a/../b", "/a/../b/..", "/a/../b/../", |
| "/a/../b/../c", "/..", "/../", "/../..", "/../../", "/../a", |
| "/../a/", "/../../a", "/../../a/", "/a/b/../../c", |
| "/a/b/../..", |
| "/a/b/../../", |
| "/a/b/../../c", |
| "/a/b/c/../../../d", |
| "/a/b/..", |
| "/a/b/../", |
| "/a/b/../c", |
| // miscellaneous |
| "/a/b/.././../../c/./d/../e", |
| "/a/../../.c././../././c/d/../g/..", |
| // '.' in the middle of segments |
| "/a./b", "/.a/b", "/a.b/c", "/a/b../c", |
| "/a/..b/c", |
| "/a/b..c/d", |
| // no leading slash, miscellaneous |
| "", "a", "a/b", "a/b/c", "../", ".", "..", "../g", |
| "g/a/../../b/c/./g", "a/b/.././../../c/./d/../e", |
| "a/../../.c././../././c/d/../g/..", }; |
| |
| const char* normalizeResults[] = { |
| "/", "/a", "/a/b", "/a/b/c", |
| "/", "/", "/", "/", "/a", "/a/", "/a", "/a/", "/a/", "/a/", |
| "/a/", "/a/b", "/", "/", "/b", "/", "/", "/c", "/..", "/../", |
| "/../..", "/../../", "/../a", "/../a/", "/../../a", |
| "/../../a/", "/c", "/", "/", "/c", "/d", "/a/", "/a/", "/a/c", |
| "/../c/e", "/../c/", "/a./b", "/.a/b", "/a.b/c", "/a/b../c", |
| "/a/..b/c", "/a/b..c/d", "", "a", "a/b", "a/b/c", "../", "", |
| "..", "../g", "b/c/g", "../c/e", "../c/", |
| }; |
| |
| for( unsigned int i = 0; i < 57; i++) { |
| URI test( normalizeData[i] ); |
| std::string result = test.normalize().toString(); |
| CPPUNIT_ASSERT_MESSAGE( string( "URI(" ) + normalizeData[i] + |
| string( ") normalized incorrectly to := " ) + result, |
| result == normalizeResults[i] ); |
| } |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testNormalize2() { |
| |
| URI uri1( "file:/D:/one/two/../../three" ); |
| URI uri2 = uri1.normalize(); |
| |
| CPPUNIT_ASSERT_MESSAGE( "Normalized to incorrect URI: " + uri2.toString(), |
| string( "file:/D:/three" ) == uri2.toString() ); |
| CPPUNIT_ASSERT_MESSAGE( "Resolved URI is not absolute", uri2.isAbsolute() ); |
| CPPUNIT_ASSERT_MESSAGE( "Resolved URI is opaque", !uri2.isOpaque() ); |
| CPPUNIT_ASSERT_MESSAGE( "Resolved URI has incorrect scheme specific part", |
| string( "/D:/three" ) == uri2.getRawSchemeSpecificPart() ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testNormalize3() { |
| |
| // return same URI if it has a normalized path already |
| URI uri1( "http://host/D:/one/two/three" ); |
| URI uri2 = uri1.normalize(); |
| CPPUNIT_ASSERT_MESSAGE( "Failed to return same URI after normalization", |
| uri1.toString() == uri2.toString() ); |
| |
| // try with empty path |
| URI uri3( "http", "host", "", "fragment" ); |
| URI uri4 = uri3.normalize(); |
| CPPUNIT_ASSERT_MESSAGE( "Failed to return same URI after normalization", |
| uri3.toString() == uri4.toString() ); |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testParseServerAuthority() { |
| |
| // registry based uris |
| std::vector<URI> uris; |
| |
| // port number not digits |
| uris.push_back( URI( "http://foo:bar/file#fragment" ) ); |
| uris.push_back( URI( "http", "//foo:bar/file", "fragment" ) ); |
| // escaped octets in host name |
| uris.push_back( URI( "http://host%20name/" ) ); |
| uris.push_back( URI( "http", "//host%20name/", "" ) ); |
| // missing host name, port number |
| uris.push_back( URI( "http://joe@:80" ) ); |
| // missing host name, no port number |
| uris.push_back( URI( "http://user@/file?query#fragment" ) ); |
| uris.push_back( URI( "//host.com:80err") ); // malformed port number |
| uris.push_back( URI( "//host.com:81e%Abrr") ); |
| // malformed ipv4 address |
| uris.push_back( URI( "telnet", "//256.197.221.200", "" ) ); |
| uris.push_back( URI( "telnet://198.256.221.200") ); |
| uris.push_back( URI( "//te%ae.com") ); // misc .. |
| uris.push_back( URI( "//:port") ); |
| uris.push_back( URI( "//:80" ) ); |
| // last label has to start with alpha char |
| uris.push_back( URI( "//fgj234fkgj.jhj.123.") ); |
| uris.push_back( URI( "//fgj234fkgj.jhj.123") ); |
| // '-' cannot be first or last character in a label |
| uris.push_back( URI( "//-domain.name" ) ); |
| uris.push_back( URI( "//domain.name-" ) ); |
| uris.push_back( URI( "//domain-") ); |
| // illegal char in host name |
| uris.push_back( URI( "//doma*in") ); |
| // host expected |
| uris.push_back( URI( "http://:80/") ); |
| uris.push_back( URI( "http://user@/" ) ); |
| // ipv6 address not enclosed in "[]" |
| uris.push_back( URI( "http://3ffe:2a00:100:7031:22:1:80:89/" ) ); |
| // expected ipv6 addresses to be enclosed in "[]" |
| uris.push_back( URI( "http", "34::56:78", "/path", "query", "fragment" ) ); |
| // expected host |
| uris.push_back( URI( "http", "user@", "/path", "query", "fragment" ) ); |
| |
| // these URIs do not have valid server based authorities, |
| // but single arg, 3 and 5 arg constructors |
| // parse them as valid registry based authorities |
| |
| // exception should occur when parseServerAuthority is |
| // requested on these uris |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| try { |
| URI uri = uris[i].parseServerAuthority(); |
| CPPUNIT_FAIL( string( "URISyntaxException expected but not received for URI: " ) + |
| uris[i].toString()); |
| } catch( URISyntaxException& e ) { |
| // Expected |
| } |
| } |
| |
| // valid Server based authorities |
| URI( "http", "3ffe:2a00:100:7031:2e:1:80:80", "/path", "fragment" ).parseServerAuthority(); |
| URI( "http", "host:80", "/path", "query", "fragment" ).parseServerAuthority(); |
| URI( "http://[::3abc:4abc]:80/" ).parseServerAuthority(); |
| URI( "http", "34::56:78", "/path", "fragment" ).parseServerAuthority(); |
| URI( "http", "[34:56::78]:80", "/path", "fragment" ).parseServerAuthority(); |
| |
| // invalid authorities (neither server nor registry) |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException for URI ", |
| URI( "http://us[er@host:80/" ), |
| URISyntaxException ); |
| |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException for URI ", |
| URI( "http://[ddd::hgghh]/" ), |
| URISyntaxException ); |
| |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException for URI ", |
| URI( "http", "[3ffe:2a00:100:7031:2e:1:80:80]a:80", "/path", "fragment" ), |
| URISyntaxException ); |
| |
| CPPUNIT_ASSERT_THROW_MESSAGE( |
| "Expected URISyntaxException for URI ", |
| URI( "http", "host:80", "/path", "fragment" ), |
| URISyntaxException ); |
| |
| CPPUNIT_ASSERT_NO_THROW( URI::create("file://C:/1.txt").parseServerAuthority() ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testRelativizeLURI() { |
| |
| // relativization tests |
| const char* relativizeData[][2] = { |
| // first is base, second is the one to relativize |
| { "http://www.google.com/dir1/dir2", "mailto:test" }, // rel = opaque |
| { "mailto:test", "http://www.google.com" }, // base = opaque |
| // different authority |
| { "http://www.eclipse.org/dir1", |
| "http://www.google.com/dir1/dir2" }, |
| // different scheme |
| { "http://www.google.com", "ftp://www.google.com" }, |
| |
| { "http://www.google.com/dir1/dir2/", |
| "http://www.google.com/dir3/dir4/file.txt" }, |
| { "http://www.google.com/dir1/", |
| "http://www.google.com/dir1/dir2/file.txt" }, |
| { "./dir1/", "./dir1/hi" }, |
| { "/dir1/./dir2", "/dir1/./dir2/hi" }, |
| { "/dir1/dir2/..", "/dir1/dir2/../hi" }, |
| { "/dir1/dir2/..", "/dir1/dir2/hi" }, |
| { "/dir1/dir2/", "/dir1/dir3/../dir2/text" }, |
| { "//www.google.com", "//www.google.com/dir1/file" }, |
| { "/dir1", "/dir1/hi" }, { "/dir1/", "/dir1/hi" }, |
| }; |
| |
| // expected results |
| const char* relativizeResults[] = { |
| "mailto:test", |
| "http://www.google.com", |
| "http://www.google.com/dir1/dir2", |
| "ftp://www.google.com", |
| "http://www.google.com/dir3/dir4/file.txt", |
| "dir2/file.txt", |
| "hi", |
| "hi", |
| "hi", |
| "dir2/hi", |
| "text", |
| "dir1/file", |
| "hi", |
| "hi", |
| }; |
| |
| for( unsigned int i = 0; i < 14; i++ ) { |
| |
| try { |
| |
| URI b( relativizeData[i][0] ); |
| URI r( relativizeData[i][1] ); |
| |
| if( ( b.relativize( r ) ).toString() != relativizeResults[i] ) { |
| CPPUNIT_FAIL( string( "Error: relativize, " ) + relativizeData[i][0] + |
| string( ", " ) + relativizeData[i][1] + " returned: " + |
| b.relativize( r ).toString() + ", expected:" + |
| relativizeResults[i] ); |
| } |
| |
| } catch( URISyntaxException& e ) { |
| CPPUNIT_FAIL( string( "Exception on relativize test on data " ) + |
| relativizeData[i][0] + ", " + relativizeData[i][1] + |
| string( ": " ) + e.getMessage() ); |
| } |
| } |
| |
| { |
| URI a( "http://host/dir" ); |
| URI b( "http://host/dir/file?query" ); |
| CPPUNIT_ASSERT_MESSAGE( |
| string( "Assert 0: URI relativized incorrectly: " ) + a.relativize( b ).toString(), |
| URI( "file?query" ).equals( a.relativize( b ) ) ); |
| } |
| { |
| // One URI with empty host |
| URI a( "file:///~/first" ); |
| URI b( "file://tools/~/first" ); |
| CPPUNIT_ASSERT_MESSAGE("Assert 1: URI relativized incorrectly,", |
| URI( "file://tools/~/first" ).equals( a.relativize( b ) ) ); |
| CPPUNIT_ASSERT_MESSAGE("Assert 2: URI relativized incorrectly,", |
| URI( "file:///~/first" ).equals( b.relativize( a ) ) ); |
| } |
| { |
| // Both URIs with empty hosts |
| URI a( "file:///~/first" ); |
| URI b( "file:///~/second" ); |
| CPPUNIT_ASSERT_MESSAGE( "Assert 3: URI relativized incorrectly,", |
| URI( "file:///~/second").equals( a.relativize( b ) ) ); |
| CPPUNIT_ASSERT_MESSAGE("Assert 4: URI relativized incorrectly,", |
| URI( "file:///~/first").equals( b.relativize( a ) ) ); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testRelativize2() { |
| |
| { |
| URI a( "http://host/dir" ); |
| URI b( "http://host/dir/file?query" ); |
| CPPUNIT_ASSERT_MESSAGE( "relativized incorrectly,", |
| URI( "file?query" ).equals( a.relativize( b ) ) ); |
| } |
| { |
| // one URI with empty host |
| URI a( "file:///~/dictionary" ); |
| URI b( "file://tools/~/dictionary" ); |
| CPPUNIT_ASSERT_MESSAGE( "relativized incorrectly,", |
| URI( "file://tools/~/dictionary" ).equals( a.relativize( b ) ) ); |
| CPPUNIT_ASSERT_MESSAGE("relativized incorrectly,", |
| URI( "file:///~/dictionary" ).equals( b.relativize( a ) ) ); |
| } |
| { |
| // two URIs with empty hosts |
| URI a( "file:///~/dictionary" ); |
| URI b( "file:///~/therasus" ); |
| CPPUNIT_ASSERT_MESSAGE( "relativized incorrectly,", |
| URI( "file:///~/therasus" ).equals( a.relativize( b ) ) ); |
| CPPUNIT_ASSERT_MESSAGE( "relativized incorrectly,", |
| URI( "file:///~/dictionary").equals( b.relativize( a ) ) ); |
| } |
| |
| { |
| URI one( "file:/C:/test/ws" ); |
| URI two( "file:/C:/test/ws" ); |
| URI empty(""); |
| CPPUNIT_ASSERT( empty.equals( one.relativize( two ) ) ); |
| } |
| { |
| URI one( "file:/C:/test/ws" ); |
| URI two( "file:/C:/test/ws/p1" ); |
| URI result( "p1" ); |
| CPPUNIT_ASSERT( result.equals( one.relativize( two ) ) ); |
| } |
| { |
| URI one( "file:/C:/test/ws/" ); |
| URI two( "file:/C:/test/ws/p1" ); |
| URI result( "p1" ); |
| CPPUNIT_ASSERT( result.equals( one.relativize( two ) ) ); |
| } |
| { |
| URI uri( "file", "", "/test/location", "" ); |
| URI base( "file", "", "/test", "" ); |
| |
| URI relative = base.relativize( uri ); |
| CPPUNIT_ASSERT( string( "location" ) == relative.getSchemeSpecificPart() ); |
| CPPUNIT_ASSERT( relative.getScheme() == "" ); |
| } |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testResolve() { |
| |
| URI uri1( "file:/D:/one/two/three" ); |
| URI uri2 = uri1.resolve( URI( ".." ) ); |
| |
| CPPUNIT_ASSERT_MESSAGE( |
| string( "Resolved to incorrect URI: " ) + uri2.toString(), |
| string( "file:/D:/one/" ) == uri2.toString() ); |
| CPPUNIT_ASSERT_MESSAGE( "Resolved URI is not absolute", uri2.isAbsolute()); |
| CPPUNIT_ASSERT_MESSAGE( "Resolved URI is opaque", !uri2.isOpaque() ); |
| CPPUNIT_ASSERT_MESSAGE( |
| string( "Resolved URI has incorrect scheme specific part" ) + |
| uri2.getRawSchemeSpecificPart(), |
| string( "/D:/one/" ) == uri2.getRawSchemeSpecificPart() ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testResolveURI() { |
| |
| // resolution tests |
| const char* resolveData[12][2] = { |
| // authority in given URI |
| { "http://www.test.com/dir", "//www.test.com/hello?query#fragment" }, |
| // no authority, absolute path |
| { "http://www.test.com/dir", "/abspath/file.txt" }, |
| // no authority, relative paths |
| { "/", "dir1/file.txt" }, |
| { "/dir1", "dir2/file.txt" }, |
| { "/dir1/", "dir2/file.txt" }, |
| { "", "dir1/file.txt" }, |
| { "dir1", "dir2/file.txt" }, |
| { "dir1/", "dir2/file.txt" }, |
| // normalization required |
| { "/dir1/dir2/../dir3/./", "dir4/./file.txt" }, |
| // allow a standalone fragment to be resolved |
| { "http://www.google.com/hey/joe?query#fragment", "#frag2" }, |
| // return given when base is opaque |
| { "mailto:idontexist@uk.ibm.com", "dir1/dir2" }, |
| // return given when given is absolute |
| { "http://www.google.com/hi/joe", "http://www.oogle.com" }, |
| }; |
| |
| // expected results |
| const char* resolveResults[] = { |
| "http://www.test.com/hello?query#fragment", |
| "http://www.test.com/abspath/file.txt", |
| "/dir1/file.txt", |
| "/dir2/file.txt", |
| "/dir1/dir2/file.txt", |
| "dir1/file.txt", |
| "dir2/file.txt", |
| "dir1/dir2/file.txt", |
| "/dir1/dir3/dir4/file.txt", |
| "http://www.google.com/hey/joe?query#frag2", |
| "dir1/dir2", |
| "http://www.oogle.com", |
| }; |
| |
| for( unsigned int i = 0; i < 12; i++ ) { |
| |
| try { |
| |
| URI b( resolveData[i][0] ); |
| URI r( resolveData[i][1] ); |
| URI result = b.resolve( r ); |
| |
| if( result.toString() != resolveResults[i] ) { |
| CPPUNIT_FAIL( string( "Error: resolve at iteration: " ) + |
| Integer::toString( i ) + ": \n" + |
| resolveData[i][0] + ", " + resolveData[i][1] + |
| string( "\nreturned: " ) + b.resolve( r ).toString() + |
| string( "\nexpected: " ) + resolveResults[i] ); |
| } |
| |
| if( !b.isOpaque() ) { |
| CPPUNIT_ASSERT_MESSAGE( b.toString() + " and " + result.toString() + |
| " incorrectly differ in absoluteness", |
| b.isAbsolute() == result.isAbsolute() ); |
| } |
| |
| } catch( URISyntaxException& e ) { |
| CPPUNIT_FAIL( string( "Exception on resolve test on data " ) + |
| resolveData[i][0] + ", " + resolveData[i][1] + |
| ": " + e.getMessage() ); |
| } |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testToString() { |
| |
| std::vector<URI> uris = getUris(); |
| |
| const char* toStringResults[] = { |
| "http://user%60%20info@host/a%20path?qu%60%20ery#fr%5E%20ag", |
| "http://user%2560%2520info@host:80/a%2520path?qu%2560%2520ery#fr%255E%2520ag", |
| "http://user%25C3%259F%25C2%25A3info@host/a%25E2%2582%25ACpath?qu%25C2%25A9%25C2%25AEery#fr%25C3%25A4%25C3%25A8g", |
| "http://user%60%20info@host:81/a%20path?qu%60%20ery#fr%5E%20ag", |
| "http://user%25info@host:0/a%25path?que%25ry#f%25rag", |
| "mailto:user@domain.com", |
| "../adirectory/file.html#", |
| "news:comp.infosystems.www.servers.unix", |
| "#fragment", |
| "telnet://server.org", |
| "http://reg:istry?query", |
| "file:///c:/temp/calculate.pl?" }; |
| |
| for( unsigned int i = 0; i < uris.size(); i++ ) { |
| std::string result = uris[i].toString(); |
| CPPUNIT_ASSERT_MESSAGE( string( "Error: For URI \"" ) + uris[i].toString() + |
| string( "\", toString() returned: \n" ) + result + |
| string( "\n, expected: \n" ) + toStringResults[i], |
| result == toStringResults[i] ); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| void URITest::testToURL() { |
| |
| const char* absoluteuris[] = { |
| "mailto:noreply@apache.org", |
| "urn:isbn:123498989h", |
| "news:software.ibm.com", |
| "http://www.apache.org", |
| "file:///d:/temp/results.txt", |
| "scheme:ssp", }; |
| |
| const char* relativeuris[] = { |
| "calculate.pl?isbn=123498989h", |
| "?isbn=123498989h", |
| "//www.apache.org", |
| "a.html", |
| "#top", |
| "//pc1/", |
| "//user@host/path/file" }; |
| |
| for( int i = 0; i < 6; i++ ) { |
| try { |
| URI( absoluteuris[i] ).toURL(); |
| } catch( MalformedURLException& e ) { |
| // not all the URIs can be translated into valid URLs |
| } |
| } |
| |
| for( int i = 0; i < 7; i++ ) { |
| try { |
| URI( relativeuris[i] ).toURL(); |
| CPPUNIT_FAIL( "Expected IllegalArgumentException not thrown" ); |
| } catch( IllegalArgumentException& e ) { |
| // Expected |
| } |
| } |
| } |