Executing this test before the changes of the previous commit would result in test failure/crash/Valgrind errors. Now it passes. See #18744.
		
			
				
	
	
		
			230 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        tests/filesys/filesys.cpp
 | |
| // Purpose:     wxFileSystem unit test
 | |
| // Author:      Vaclav Slavik
 | |
| // Created:     2004-03-28
 | |
| // Copyright:   (c) 2004 Vaclav Slavik
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // headers
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| #include "testprec.h"
 | |
| 
 | |
| #ifdef __BORLANDC__
 | |
|     #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| #ifndef WX_PRECOMP
 | |
|     #include "wx/wx.h"
 | |
| #endif // WX_PRECOMP
 | |
| 
 | |
| #include "wx/filesys.h"
 | |
| 
 | |
| #if wxUSE_FILESYSTEM
 | |
| 
 | |
| #include "wx/fs_mem.h"
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // helpers
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| // a hack to let us use wxFileSystemHandler's protected methods:
 | |
| class UrlTester : public wxFileSystemHandler
 | |
| {
 | |
| public:
 | |
|     UrlTester() : wxFileSystemHandler() {}
 | |
| 
 | |
|     wxString Protocol(const wxString& p) { return GetProtocol(p); }
 | |
|     wxString LeftLocation(const wxString& p) { return GetLeftLocation(p); }
 | |
|     wxString RightLocation(const wxString& p) { return GetRightLocation(p); }
 | |
|     wxString Anchor(const wxString& p) { return GetAnchor(p); }
 | |
| 
 | |
|     bool CanOpen(const wxString& WXUNUSED(url)) wxOVERRIDE { return false; }
 | |
|     wxFSFile *OpenFile(wxFileSystem& WXUNUSED(fs),
 | |
|                        const wxString& WXUNUSED(url)) wxOVERRIDE { return NULL; }
 | |
| 
 | |
| 
 | |
| };
 | |
| 
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // tests themselves
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| TEST_CASE("wxFileSystem::URLParsing", "[filesys][url][parse]")
 | |
| {
 | |
|     static const struct Data
 | |
|     {
 | |
|         const wxChar *url;
 | |
|         const wxChar *protocol, *left, *right, *anchor;
 | |
|     } data[] =
 | |
|     {
 | |
|         // simple case:
 | |
|         { wxT("http://www.root.cz/index.html"),
 | |
|                 wxT("http"), wxT(""), wxT("//www.root.cz/index.html"), wxT("")},
 | |
|         // anchors:
 | |
|         { wxT("http://www.root.cz/index.html#lbl"),
 | |
|                 wxT("http"), wxT(""), wxT("//www.root.cz/index.html"), wxT("lbl")},
 | |
|         // file is default protocol:
 | |
|         { wxT("testfile.html"),
 | |
|                 wxT("file"), wxT(""), wxT("testfile.html"), wxT("")},
 | |
|         // stacked protocols:
 | |
|         { wxT("file:myzipfile.zip#zip:index.htm"),
 | |
|                 wxT("zip"), wxT("file:myzipfile.zip"), wxT("index.htm"), wxT("")},
 | |
|         // changes to ':' parsing often break things:
 | |
|         { wxT("file:a#b:foo"),
 | |
|                 wxT("b"), wxT("file:a"), wxT("foo"), wxT("")},
 | |
|         { wxT("\\\\host\\C$\\path to\\foo.txt"),
 | |
|                 wxT("file"), wxT(""), wxT("\\\\host\\C$\\path to\\foo.txt"), wxT("")},
 | |
|         { wxT("C:\\path to\\foo.txt"),
 | |
|                 wxT("file"), wxT(""), wxT("C:\\path to\\foo.txt"), wxT("")},
 | |
|         { wxT("file:///etc/fsconf"),
 | |
|                 wxT("file"), wxT(""), wxT("/etc/fsconf"), wxT("")},
 | |
|         { wxT("file://etc/fsconf"),
 | |
|                 wxT("file"), wxT(""), wxT("//etc/fsconf"), wxT("")},
 | |
|         { wxT("file:/etc/fsconf"),
 | |
|                 wxT("file"), wxT(""), wxT("/etc/fsconf"), wxT("")},
 | |
|         { wxT("file:///dir/archive.tar.gz#tar:/foo.txt#anchor"),
 | |
|                 wxT("tar"), wxT("file:///dir/archive.tar.gz"),
 | |
|                 wxT("/foo.txt"), wxT("anchor")},
 | |
|         { wxT("file://dir/archive.tar.gz#tar:/foo.txt#anchor"),
 | |
|                 wxT("tar"), wxT("file://dir/archive.tar.gz"),
 | |
|                 wxT("/foo.txt"), wxT("anchor")},
 | |
|         { wxT("file:/dir/archive.tar.gz#tar:/foo.txt#anchor"),
 | |
|                 wxT("tar"), wxT("file:/dir/archive.tar.gz"),
 | |
|                 wxT("/foo.txt"), wxT("anchor")},
 | |
|         { wxT("file:dir/archive.tar.gz#tar:/foo.txt#anchor"),
 | |
|                 wxT("tar"), wxT("file:dir/archive.tar.gz"),
 | |
|                 wxT("/foo.txt"), wxT("anchor")},
 | |
|         { wxT("file:///dir/archive.tar.gz#tar:/foo.txt"),
 | |
|                 wxT("tar"), wxT("file:///dir/archive.tar.gz"),
 | |
|                 wxT("/foo.txt"), wxT("")},
 | |
|         { wxT("file://dir/archive.tar.gz#tar:/foo.txt"),
 | |
|                 wxT("tar"), wxT("file://dir/archive.tar.gz"),
 | |
|                 wxT("/foo.txt"), wxT("")},
 | |
|         { wxT("file:/dir/archive.tar.gz#tar:/foo.txt"),
 | |
|                 wxT("tar"), wxT("file:/dir/archive.tar.gz"),
 | |
|                 wxT("/foo.txt"), wxT("")},
 | |
|         { wxT("file:dir/archive.tar.gz#tar:/foo.txt"),
 | |
|                 wxT("tar"), wxT("file:dir/archive.tar.gz"),
 | |
|                 wxT("/foo.txt"), wxT("")},
 | |
|         { wxT("file://host/C:/path%20to/file.txt"),
 | |
|                 wxT("file"), wxT(""), wxT("//host/C:/path%20to/file.txt"), wxT("")},
 | |
|         { wxT("file:///C:/path%20to/file.txt"),
 | |
|                 wxT("file"), wxT(""), wxT("C:/path%20to/file.txt"), wxT("")},
 | |
|         { wxT("file:///C"),
 | |
|                 wxT("file"), wxT(""), wxT("/C"), wxT("")},
 | |
|         { wxT("file://C"),
 | |
|                 wxT("file"), wxT(""), wxT("//C"), wxT("")},
 | |
|         { wxT("file:/C"),
 | |
|                 wxT("file"), wxT(""), wxT("/C"), wxT("")},
 | |
|         { wxT("file:C"),
 | |
|                 wxT("file"), wxT(""), wxT("C"), wxT("")}
 | |
|     };
 | |
| 
 | |
|     UrlTester tst;
 | |
|     for ( size_t n = 0; n < WXSIZEOF(data); n++ )
 | |
|     {
 | |
|         const Data& d = data[n];
 | |
|         INFO( "Testing URL " << wxString(d.url) );
 | |
|         CHECK( tst.Protocol(d.url) == d.protocol );
 | |
|         CHECK( tst.LeftLocation(d.url) == d.left );
 | |
|         CHECK( tst.RightLocation(d.url) == d.right );
 | |
|         CHECK( tst.Anchor(d.url) == d.anchor );
 | |
|     }
 | |
| }
 | |
| 
 | |
| TEST_CASE("wxFileSystem::FileNameToUrlConversion", "[filesys][url][filename]")
 | |
| {
 | |
|     const static struct Data {
 | |
|         const wxChar *input, *expected;
 | |
|     } data[] =
 | |
|     {
 | |
| #ifdef __WINDOWS__
 | |
|         { wxT("\\\\host\\C$\\path to\\file.txt"),
 | |
|                 wxT("file://host/C$/path%20to/file.txt")},
 | |
|         { wxT("C:\\path to\\file.txt"), wxT("file:///C:/path%20to/file.txt")}
 | |
| #else
 | |
|         { wxT("/path to/file.txt"), wxT("file:///path%20to/file.txt")}
 | |
| #endif
 | |
|     };
 | |
| 
 | |
|     for ( size_t n = 0; n < WXSIZEOF(data); n++ )
 | |
|     {
 | |
|         const Data& d = data[n];
 | |
|         wxFileName fn1(d.input);
 | |
|         wxString url1 = wxFileSystem::FileNameToURL(fn1);
 | |
| 
 | |
|         INFO( "Testing URL " << wxString(d.input) );
 | |
|         CHECK( url1 == d.expected );
 | |
|         CHECK( fn1.SameAs(wxFileName::URLToFileName(url1)) );
 | |
|     }
 | |
| }
 | |
| 
 | |
| TEST_CASE("wxFileSystem::UnicodeFileNameToUrlConversion", "[filesys][url][filename][unicode]")
 | |
| {
 | |
|     const unsigned char filename_utf8[] = {
 | |
|               0x4b, 0x72, 0xc3, 0xa1, 0x73, 0x79, 0x50, 0xc5,
 | |
|               0x99, 0xc3, 0xad, 0x72, 0x6f, 0x64, 0x79, 0x2e,
 | |
|               0x6a, 0x70, 0x67, 0x00
 | |
|               // KrásyPřírody.jpg
 | |
|         };
 | |
|     wxFileName filename(wxString::FromUTF8((const char*)filename_utf8));
 | |
| 
 | |
|     wxString url = wxFileSystem::FileNameToURL(filename);
 | |
| 
 | |
|     CHECK( filename.SameAs(wxFileName::URLToFileName(url)) );
 | |
| }
 | |
| 
 | |
| // Test that using FindFirst() after removing a previously found URL works:
 | |
| // this used to be broken, see https://trac.wxwidgets.org/ticket/18744
 | |
| TEST_CASE("wxFileSystem::MemoryFSHandler", "[filesys][memoryfshandler][find]")
 | |
| {
 | |
|     // Install wxMemoryFSHandler just for the duration of this test.
 | |
|     class AutoMemoryFSHandler
 | |
|     {
 | |
|     public:
 | |
|         AutoMemoryFSHandler()
 | |
|             : m_handler(new wxMemoryFSHandler())
 | |
|         {
 | |
|             wxFileSystem::AddHandler(m_handler);
 | |
|         }
 | |
| 
 | |
|         ~AutoMemoryFSHandler()
 | |
|         {
 | |
|             wxFileSystem::RemoveHandler(m_handler);
 | |
|         }
 | |
| 
 | |
|     private:
 | |
|         wxMemoryFSHandler* const m_handler;
 | |
|     } autoMemoryFSHandler;
 | |
| 
 | |
|     wxMemoryFSHandler::AddFile("foo.txt", "foo contents");
 | |
|     wxMemoryFSHandler::AddFile("bar.txt", "bar contents");
 | |
|     wxFileSystem fs;
 | |
| 
 | |
|     wxString const url = fs.FindFirst("memory:*.txt");
 | |
|     INFO("Found URL was: " << url);
 | |
| 
 | |
|     wxString filename;
 | |
|     REQUIRE( url.StartsWith("memory:", &filename) );
 | |
| 
 | |
|     // We don't know which of the two files will be found, this depends on the
 | |
|     // details of the hash table implementation and varies across builds, so
 | |
|     // handle both cases and remove the other file, which should certainly
 | |
|     // invalidate the iterator pointing to it.
 | |
|     if ( filename == "foo.txt" )
 | |
|         wxMemoryFSHandler::RemoveFile("bar.txt");
 | |
|     else if ( filename == "bar.txt" )
 | |
|         wxMemoryFSHandler::RemoveFile("foo.txt");
 | |
|     else
 | |
|         FAIL("Unexpected filename: " << filename);
 | |
| 
 | |
|     CHECK( fs.FindFirst(url) == url );
 | |
|     CHECK( fs.FindNext() == "" );
 | |
| }
 | |
| 
 | |
| #endif // wxUSE_FILESYSTEM
 |