X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dd65d8c83003ebbf9ab3275957fefa8cd7c87cc3..b50e81c696f97c5ca8c4d1375cb79fc2192a57e2:/tests/uris/uris.cpp diff --git a/tests/uris/uris.cpp b/tests/uris/uris.cpp index 69a9128d9c..e4920fcec6 100644 --- a/tests/uris/uris.cpp +++ b/tests/uris/uris.cpp @@ -11,7 +11,7 @@ // headers // ---------------------------------------------------------------------------- -#include "wx/wxprec.h" +#include "testprec.h" #ifdef __BORLANDC__ #pragma hdrstop @@ -22,8 +22,15 @@ #endif // WX_PRECOMP #include "wx/uri.h" +#include "wx/url.h" -#include "wx/cppunit.h" +// Test wxURL & wxURI compat? +#define TEST_URL wxUSE_URL + +// Define this as 1 to test network connections, this is disabled by default as +// some machines running automatic builds don't allow outgoing connections and +// so the tests fail +#define TEST_NETWORK 0 // ---------------------------------------------------------------------------- // test class @@ -38,6 +45,7 @@ private: CPPUNIT_TEST_SUITE( URITestCase ); CPPUNIT_TEST( IPv4 ); CPPUNIT_TEST( IPv6 ); + CPPUNIT_TEST( Server ); CPPUNIT_TEST( Paths ); CPPUNIT_TEST( NormalResolving ); CPPUNIT_TEST( ComplexResolving ); @@ -46,10 +54,19 @@ private: CPPUNIT_TEST( BackwardsResolving ); CPPUNIT_TEST( Assignment ); CPPUNIT_TEST( Comparison ); + CPPUNIT_TEST( Unescaping ); + CPPUNIT_TEST( FileScheme ); +#if TEST_URL + CPPUNIT_TEST( URLCompat ); +#if 0 && wxUSE_PROTOCOL_HTTP + CPPUNIT_TEST( URLProxy ); +#endif +#endif CPPUNIT_TEST_SUITE_END(); void IPv4(); void IPv6(); + void Server(); void Paths(); void NormalResolving(); void ComplexResolving(); @@ -58,6 +75,15 @@ private: void BackwardsResolving(); void Assignment(); void Comparison(); + void Unescaping(); + void FileScheme(); + +#if TEST_URL + void URLCompat(); +#if 0 && wxUSE_PROTOCOL_HTTP + void URLProxy(); +#endif +#endif DECLARE_NO_COPY_CLASS(URITestCase) }; @@ -72,41 +98,34 @@ URITestCase::URITestCase() { } +// apply the given accessor to the URI, check that the result is as expected +#define URI_ASSERT_PART_EQUAL(uri, expected, accessor) \ + CPPUNIT_ASSERT_EQUAL(expected, wxURI(uri).accessor) -#define URI_TEST(uristring, cond) \ - uri = new wxURI(wxT(uristring));\ - CPPUNIT_ASSERT(cond);\ - delete uri; +#define URI_ASSERT_HOSTTYPE_EQUAL(uri, expected) \ + URI_ASSERT_PART_EQUAL((uri), (expected), GetHostType()) -#define URI_PRINT(uri)\ - wxPrintf(wxT("SCHEME:%s\n"), uri.GetScheme());\ - wxPrintf(wxT("USER:%s\n"), uri.GetUser());\ - wxPrintf(wxT("SERVER:%s\n"), uri.GetServer());\ - wxPrintf(wxT("PORT:%s\n"), uri.GetPort());\ - wxPrintf(wxT("PATH:%s\n"), uri.GetPath());\ - wxPrintf(wxT("QUERY:%s\n"), uri.GetQuery());\ - wxPrintf(wxT("FRAGMENT:%s\n"), uri.GetFragment()); +#define URI_ASSERT_SERVER_EQUAL(uri, expected) \ + URI_ASSERT_PART_EQUAL((uri), (expected), GetServer()) + +#define URI_ASSERT_PATH_EQUAL(uri, expected) \ + URI_ASSERT_PART_EQUAL((uri), (expected), GetPath()) void URITestCase::IPv4() { - wxURI* uri; - + URI_ASSERT_HOSTTYPE_EQUAL("http://user:password@192.168.1.100:5050/path", + wxURI_IPV4ADDRESS); - URI_TEST("http://user:password@192.168.1.100:5050/path", - uri->GetHostType() == wxURI_IPV4ADDRESS); + URI_ASSERT_HOSTTYPE_EQUAL("http://user:password@192.255.1.100:5050/path", + wxURI_IPV4ADDRESS); - URI_TEST("http://user:password@192.255.1.100:5050/path", - uri->GetHostType() == wxURI_IPV4ADDRESS); - - //bogus ipv4 - URI_TEST("http://user:password@192.256.1.100:5050/path", - uri->GetHostType() != wxURI_IPV4ADDRESS); + // bogus ipv4 + CPPUNIT_ASSERT( wxURI("http://user:password@192.256.1.100:5050/path"). + GetHostType() != wxURI_IPV4ADDRESS); } void URITestCase::IPv6() { - wxURI* uri; - // IPv6address = 6( h16 ":" ) ls32 // / "::" 5( h16 ":" ) ls32 // / [ h16 ] "::" 4( h16 ":" ) ls32 @@ -117,150 +136,311 @@ void URITestCase::IPv6() // / [ *5( h16 ":" ) h16 ] "::" h16 // / [ *6( h16 ":" ) h16 ] "::" // ls32 = ( h16 ":" h16 ) / IPv4address - - URI_TEST("http://user:password@[aa:aa:aa:aa:aa:aa:192.168.1.100]:5050/path", - uri->GetHostType() == wxURI_IPV6ADDRESS); - URI_TEST("http://user:password@[aa:aa:aa:aa:aa:aa:aa:aa]:5050/path", - uri->GetHostType() == wxURI_IPV6ADDRESS); - - URI_TEST("http://user:password@[aa:aa:aa:aa::192.168.1.100]:5050/path", - uri->GetHostType() == wxURI_IPV6ADDRESS); + URI_ASSERT_HOSTTYPE_EQUAL + ( + "http://user:password@[aa:aa:aa:aa:aa:aa:192.168.1.100]:5050/path", + wxURI_IPV6ADDRESS + ); + + URI_ASSERT_HOSTTYPE_EQUAL + ( + "http://user:password@[aa:aa:aa:aa:aa:aa:aa:aa]:5050/path", + wxURI_IPV6ADDRESS + ); + + URI_ASSERT_HOSTTYPE_EQUAL + ( + "http://user:password@[aa:aa:aa:aa::192.168.1.100]:5050/path", + wxURI_IPV6ADDRESS + ); + + URI_ASSERT_HOSTTYPE_EQUAL + ( + "http://user:password@[aa:aa:aa:aa::aa:aa]:5050/path", + wxURI_IPV6ADDRESS + ); +} - URI_TEST("http://user:password@[aa:aa:aa:aa::aa:aa]:5050/path", - uri->GetHostType() == wxURI_IPV6ADDRESS); +void URITestCase::Server() +{ + URI_ASSERT_SERVER_EQUAL("http://foo/", "foo"); + URI_ASSERT_SERVER_EQUAL("http://foo-bar/", "foo-bar"); + URI_ASSERT_SERVER_EQUAL("http://foo/bar/", "foo"); + URI_ASSERT_SERVER_EQUAL("http://192.168.1.0/", "192.168.1.0"); + URI_ASSERT_SERVER_EQUAL("http://192.168.1.17/", "192.168.1.17"); + URI_ASSERT_SERVER_EQUAL("http://192.168.1.255/", "192.168.1.255"); + URI_ASSERT_SERVER_EQUAL("http://192.168.1.1/index.html", "192.168.1.1"); + URI_ASSERT_SERVER_EQUAL("http://[aa:aa:aa:aa::aa:aa]/foo", "aa:aa:aa:aa::aa:aa"); } void URITestCase::Paths() { - wxURI* uri; + URI_ASSERT_PATH_EQUAL("http://user:password@192.256.1.100:5050/../path", + "/path"); - //path tests - URI_TEST("http://user:password@192.256.1.100:5050/../path", - uri->GetPath() == wxT("/path")); + URI_ASSERT_PATH_EQUAL("http://user:password@192.256.1.100:5050/path/../", + "/"); - URI_TEST("http://user:password@192.256.1.100:5050/path/../", - uri->GetPath() == wxT("/")); + URI_ASSERT_PATH_EQUAL("http://user:password@192.256.1.100:5050/path/.", + "/path/"); - URI_TEST("http://user:password@192.256.1.100:5050/path/.", - uri->GetPath() == wxT("/path/")); + URI_ASSERT_PATH_EQUAL("http://user:password@192.256.1.100:5050/path/./", + "/path/"); - URI_TEST("http://user:password@192.256.1.100:5050/path/./", - uri->GetPath() == wxT("/path/")); - - URI_TEST("path/john/../../../joe", - uri->Get() == wxT("../joe")); + URI_ASSERT_PART_EQUAL("path/john/../../../joe", + "../joe", BuildURI()); } -#undef URI_TEST -#define URI_TEST_RESOLVE(string, eq, strict) \ - uri = new wxURI(wxT(string));\ - uri->Resolve(masteruri, strict);\ - CPPUNIT_ASSERT(uri->Get() == wxT(eq));\ - delete uri; +#define URI_TEST_RESOLVE_IMPL(string, eq, strict) \ + { \ + wxURI uri(string); \ + uri.Resolve(masteruri, strict); \ + CPPUNIT_ASSERT_EQUAL(eq, uri.BuildURI()); \ + } + +#define URI_TEST_RESOLVE(string, eq) \ + URI_TEST_RESOLVE_IMPL(string, eq, true); -#define URI_TEST(string, eq) \ - URI_TEST_RESOLVE(string, eq, true); +#define URI_TEST_RESOLVE_LAX(string, eq) \ + URI_TEST_RESOLVE_IMPL(string, eq, false); //examples taken from RFC 2396.bis void URITestCase::NormalResolving() { - wxURI masteruri(wxT("http://a/b/c/d;p?q")); - wxURI* uri; - - URI_TEST("g:h" ,"g:h") - URI_TEST("g" ,"http://a/b/c/g") - URI_TEST("./g" ,"http://a/b/c/g") - URI_TEST("g/" ,"http://a/b/c/g/") - URI_TEST("/g" ,"http://a/g") - URI_TEST("//g" ,"http://g") - URI_TEST("?y" ,"http://a/b/c/d;p?y") - URI_TEST("g?y" ,"http://a/b/c/g?y") - URI_TEST("#s" ,"http://a/b/c/d;p?q#s") - URI_TEST("g#s" ,"http://a/b/c/g#s") - URI_TEST("g?y#s","http://a/b/c/g?y#s") - URI_TEST(";x" ,"http://a/b/c/;x") - URI_TEST("g;x" ,"http://a/b/c/g;x") - URI_TEST("g;x?y#s","http://a/b/c/g;x?y#s") - - URI_TEST("" ,"http://a/b/c/d;p?q") - URI_TEST("." ,"http://a/b/c/") - URI_TEST("./" ,"http://a/b/c/") - URI_TEST(".." ,"http://a/b/") - URI_TEST("../" ,"http://a/b/") - URI_TEST("../g" ,"http://a/b/g") - URI_TEST("../..","http://a/") - URI_TEST("../../" , "http://a/") - URI_TEST("../../g" , "http://a/g") + wxURI masteruri("http://a/b/c/d;p?q"); + + URI_TEST_RESOLVE("g:h" ,"g:h") + URI_TEST_RESOLVE("g" ,"http://a/b/c/g") + URI_TEST_RESOLVE("./g" ,"http://a/b/c/g") + URI_TEST_RESOLVE("g/" ,"http://a/b/c/g/") + URI_TEST_RESOLVE("/g" ,"http://a/g") + URI_TEST_RESOLVE("//g" ,"http://g") + URI_TEST_RESOLVE("?y" ,"http://a/b/c/d;p?y") + URI_TEST_RESOLVE("g?y" ,"http://a/b/c/g?y") + URI_TEST_RESOLVE("#s" ,"http://a/b/c/d;p?q#s") + URI_TEST_RESOLVE("g#s" ,"http://a/b/c/g#s") + URI_TEST_RESOLVE("g?y#s","http://a/b/c/g?y#s") + URI_TEST_RESOLVE(";x" ,"http://a/b/c/;x") + URI_TEST_RESOLVE("g;x" ,"http://a/b/c/g;x") + URI_TEST_RESOLVE("g;x?y#s","http://a/b/c/g;x?y#s") + + URI_TEST_RESOLVE("" ,"http://a/b/c/d;p?q") + URI_TEST_RESOLVE("." ,"http://a/b/c/") + URI_TEST_RESOLVE("./" ,"http://a/b/c/") + URI_TEST_RESOLVE(".." ,"http://a/b/") + URI_TEST_RESOLVE("../" ,"http://a/b/") + URI_TEST_RESOLVE("../g" ,"http://a/b/g") + URI_TEST_RESOLVE("../..","http://a/") + URI_TEST_RESOLVE("../../" , "http://a/") + URI_TEST_RESOLVE("../../g" , "http://a/g") } void URITestCase::ComplexResolving() { - wxURI masteruri(wxT("http://a/b/c/d;p?q")); - wxURI* uri; + wxURI masteruri("http://a/b/c/d;p?q"); //odd path examples - URI_TEST("/./g" ,"http://a/g") - URI_TEST("/../g" ,"http://a/g") - URI_TEST("g." ,"http://a/b/c/g.") - URI_TEST(".g" ,"http://a/b/c/.g") - URI_TEST("g.." ,"http://a/b/c/g..") - URI_TEST("..g" ,"http://a/b/c/..g") + URI_TEST_RESOLVE("../../../g" , "http://a/g") + URI_TEST_RESOLVE("../../../../g", "http://a/g") + + URI_TEST_RESOLVE("/./g" ,"http://a/g") + URI_TEST_RESOLVE("/../g" ,"http://a/g") + URI_TEST_RESOLVE("g." ,"http://a/b/c/g.") + URI_TEST_RESOLVE(".g" ,"http://a/b/c/.g") + URI_TEST_RESOLVE("g.." ,"http://a/b/c/g..") + URI_TEST_RESOLVE("..g" ,"http://a/b/c/..g") } - //Should Fail - //"../../../g" = "http://a/g" - //"../../../../g" = "http://a/g" void URITestCase::ReallyComplexResolving() { - wxURI masteruri(wxT("http://a/b/c/d;p?q")); - wxURI* uri; + wxURI masteruri("http://a/b/c/d;p?q"); //even more odder path examples - URI_TEST("./../g" ,"http://a/b/g") - URI_TEST("./g/." ,"http://a/b/c/g/") - URI_TEST("g/./h" ,"http://a/b/c/g/h") - URI_TEST("g/../h" ,"http://a/b/c/h") - URI_TEST("g;x=1/./y" , "http://a/b/c/g;x=1/y") - URI_TEST("g;x=1/../y" , "http://a/b/c/y") + URI_TEST_RESOLVE("./../g" ,"http://a/b/g") + URI_TEST_RESOLVE("./g/." ,"http://a/b/c/g/") + URI_TEST_RESOLVE("g/./h" ,"http://a/b/c/g/h") + URI_TEST_RESOLVE("g/../h" ,"http://a/b/c/h") + URI_TEST_RESOLVE("g;x=1/./y" , "http://a/b/c/g;x=1/y") + URI_TEST_RESOLVE("g;x=1/../y" , "http://a/b/c/y") } void URITestCase::QueryFragmentResolving() { - wxURI masteruri(wxT("http://a/b/c/d;p?q")); - wxURI* uri; - - //query/fragment ambigiousness - URI_TEST("g?y/./x","http://a/b/c/g?y/./x") - URI_TEST("g?y/../x" , "http://a/b/c/g?y/../x") - URI_TEST("g#s/./x","http://a/b/c/g#s/./x") - URI_TEST("g#s/../x" , "http://a/b/c/g#s/../x") + wxURI masteruri("http://a/b/c/d;p?q"); + + //query/fragment ambigiousness + URI_TEST_RESOLVE("g?y/./x","http://a/b/c/g?y/./x") + URI_TEST_RESOLVE("g?y/../x" , "http://a/b/c/g?y/../x") + URI_TEST_RESOLVE("g#s/./x","http://a/b/c/g#s/./x") + URI_TEST_RESOLVE("g#s/../x" , "http://a/b/c/g#s/../x") } void URITestCase::BackwardsResolving() { - wxURI masteruri(wxT("http://a/b/c/d;p?q")); - wxURI* uri; + wxURI masteruri("http://a/b/c/d;p?q"); - //"NEW" - URI_TEST("http:g" , "http:g") //strict - //bw compat - URI_TEST_RESOLVE("http:g", "http://a/b/c/g", false); + //"NEW" + URI_TEST_RESOLVE("http:g" , "http:g") //strict + //bw compat + URI_TEST_RESOLVE_LAX("http:g", "http://a/b/c/g"); } void URITestCase::Assignment() { - wxURI uri1(wxT("http://mysite.com")), - uri2(wxT("http://mysite2.com")); + wxURI uri1("http://mysite.com"), + uri2("http://mysite2.com"); uri2 = uri1; - CPPUNIT_ASSERT(uri1.Get() == uri2.Get()); + CPPUNIT_ASSERT_EQUAL(uri1.BuildURI(), uri2.BuildURI()); } void URITestCase::Comparison() { - CPPUNIT_ASSERT(wxURI(wxT("http://mysite.com")) == wxURI(wxT("http://mysite.com"))); + CPPUNIT_ASSERT(wxURI("http://mysite.com") == wxURI("http://mysite.com")); +} + +void URITestCase::Unescaping() +{ + wxString escaped, + unescaped; + + escaped = "http://test.com/of/file%3A%2F%2FC%3A%5Curi%5C" + "escaping%5Cthat%5Cseems%5Cbroken%5Csadly%5B1%5D.rss"; + + unescaped = wxURI(escaped).BuildUnescapedURI(); + + CPPUNIT_ASSERT_EQUAL( "http://test.com/of/file://C:\\uri\\" + "escaping\\that\\seems\\broken\\sadly[1].rss", + unescaped ); + + CPPUNIT_ASSERT_EQUAL( unescaped, wxURI::Unescape(escaped) ); + + + escaped = "http://ru.wikipedia.org/wiki/" + "%D0%A6%D0%B5%D0%BB%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE"; + + unescaped = wxURI::Unescape(escaped); + + CPPUNIT_ASSERT_EQUAL( wxString::FromUTF8( + "http://ru.wikipedia.org/wiki/" + "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5_" + "\xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE" + ), + unescaped ); +} + +void URITestCase::FileScheme() +{ + //file:// variety (NOT CONFORMING TO THE RFC) + URI_ASSERT_PATH_EQUAL( "file://e:/wxcode/script1.xml", + "e:/wxcode/script1.xml" ); + + //file:/// variety + URI_ASSERT_PATH_EQUAL( "file:///e:/wxcode/script1.xml", + "/e:/wxcode/script1.xml" ); + + //file:/ variety + URI_ASSERT_PATH_EQUAL( "file:/e:/wxcode/script1.xml", + "/e:/wxcode/script1.xml" ); + + //file: variety + URI_ASSERT_PATH_EQUAL( "file:e:/wxcode/script1.xml", + "e:/wxcode/script1.xml" ); +} + +#if TEST_URL + +#include "wx/url.h" +#include "wx/file.h" + +void URITestCase::URLCompat() +{ + wxURL url("http://user:password@wxwidgets.org"); + + CPPUNIT_ASSERT(url.GetError() == wxURL_NOERR); + +#if TEST_NETWORK + wxInputStream* pInput = url.GetInputStream(); + + CPPUNIT_ASSERT( pInput != NULL ); +#endif + + CPPUNIT_ASSERT( url == wxURL("http://user:password@wxwidgets.org") ); + + wxURI uri("http://user:password@wxwidgets.org"); + + CPPUNIT_ASSERT( url == uri ); + + wxURL urlcopy(uri); + + CPPUNIT_ASSERT( urlcopy == url ); + CPPUNIT_ASSERT( urlcopy == uri ); + + wxURI uricopy(url); + + CPPUNIT_ASSERT( uricopy == url ); + CPPUNIT_ASSERT( uricopy == urlcopy ); + CPPUNIT_ASSERT( uricopy == uri ); + CPPUNIT_ASSERT_EQUAL( " A ", wxURI::Unescape("%20%41%20") ); + + wxURI test("file:\"myf\"ile.txt"); + + CPPUNIT_ASSERT_EQUAL( "file:%22myf%22ile.txt" , test.BuildURI() ); + CPPUNIT_ASSERT_EQUAL( "file", test.GetScheme() ); + CPPUNIT_ASSERT_EQUAL( "%22myf%22ile.txt", test.GetPath() ); + + // these could be put under a named registry since they take some + // time to complete +#if 0 + // Test problem urls (reported not to work some time ago by a user...) + const wxChar* pszProblemUrls[] = { "http://www.csdn.net", + "http://www.163.com", + "http://www.sina.com.cn" }; + + for ( size_t i = 0; i < WXSIZEOF(pszProblemUrls); ++i ) + { + wxURL urlProblem(pszProblemUrls[i]); + CPPUNIT_ASSERT(urlProblem.GetError() == wxURL_NOERR); + + wxInputStream* is = urlProblem.GetInputStream(); + CPPUNIT_ASSERT(is != NULL); + + wxFile fOut(_T("test.html"), wxFile::write); + wxASSERT(fOut.IsOpened()); + + char buf[1001]; + for( ;; ) + { + is->Read(buf, 1000); + size_t n = is->LastRead(); + if ( n == 0 ) + break; + buf[n] = 0; + fOut.Write(buf, n); + } + + delete is; + } +#endif } + +// the purpose of this test is unclear, it seems to be unfinished so disabling +// it for now +#if 0 && wxUSE_PROTOCOL_HTTP +void URITestCase::URLProxy() +{ + wxURL url(wxT("http://www.asite.com/index.html")); + url.SetProxy(wxT("pserv:3122")); + + wxURL::SetDefaultProxy(wxT("fol.singnet.com.sg:8080")); + wxURL url2(wxT("http://server-name/path/to/file?query_data=value")); + wxInputStream *data = url2.GetInputStream(); + CPPUNIT_ASSERT(data != NULL); +} +#endif // wxUSE_PROTOCOL_HTTP + +#endif // TEST_URL