diff --git a/tests/uris/ftp.cpp b/tests/uris/ftp.cpp index ba2aae3e27..7c3124e097 100644 --- a/tests/uris/ftp.cpp +++ b/tests/uris/ftp.cpp @@ -22,162 +22,124 @@ #include -#define FTP_ANONYMOUS - -#ifdef FTP_ANONYMOUS - static const char *hostname = "ftp.wxwidgets.org"; - static const char *directory = "/pub/2.8.11"; - static const char *invalid_filename = "a_file_which_does_not_exist"; - static const char *valid_filename = "MD5SUM"; - // NOTE: choose a small file or otherwise the FTPTestCase::Download() - // function will take (a lot of) time to complete! -#else - static const char *hostname = "localhost"; - static const char *user = "guest"; - static const char *password = ""; - static const char *directory = "/etc"; - static const char *invalid_filename = "issue"; - static const char *valid_filename = "hosts"; -#endif - -// ---------------------------------------------------------------------------- -// test class -// ---------------------------------------------------------------------------- - -class FTPTestCase : public CppUnit::TestCase +// For this to run, the following environment variables need to be defined: +// +// - WX_FTP_TEST_HOST: the host to use for testing (e.g. ftp.example.com) +// - WX_FTP_TEST_DIR: the directory in which to perform most of the tests +// - WX_FTP_TEST_FILE: name of an existing file in this directory +// +// Optionally, WX_FTP_TEST_USER and WX_FTP_TEST_PASS may also be defined, +// otherwise anonymous FTP is used. +TEST_CASE("FTP", "[net][.]") { -public: - FTPTestCase() {} + wxString hostname, + directory, + valid_filename; + if ( !wxGetEnv("WX_FTP_TEST_HOST", &hostname) || + !wxGetEnv("WX_FTP_TEST_DIR", &directory) || + !wxGetEnv("WX_FTP_TEST_FILE", &valid_filename) ) + { + WARN("Skipping FTPTestCase because required WX_FTP_TEST_XXX " + "environment variables are not defined."); + return; + } - virtual void setUp(); - virtual void tearDown(); + const wxString user = wxGetenv("WX_FTP_TEST_USER"); + const wxString password = wxGetenv("WX_FTP_TEST_PASS"); -private: - CPPUNIT_TEST_SUITE( FTPTestCase ); - CPPUNIT_TEST( List ); - CPPUNIT_TEST( Download ); - CPPUNIT_TEST( FileSize ); - CPPUNIT_TEST( Pwd ); - CPPUNIT_TEST( Misc ); -#ifndef FTP_ANONYMOUS - CPPUNIT_TEST( Upload ); -#endif - CPPUNIT_TEST_SUITE_END(); - - void List(); - void Download(); - void FileSize(); - void Pwd(); - void Misc(); - void Upload(); - - wxFTP *m_ftp; - - wxDECLARE_NO_COPY_CLASS(FTPTestCase); -}; - -// NOTE: we do not run FTPTestCase suite by default because buildslaves typically -// do not have FTP connectivity enabled by default... -//CPPUNIT_TEST_SUITE_REGISTRATION( FTPTestCase ); - -// also include in its own registry so that these tests can be run alone -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( FTPTestCase, "FTPTestCase" ); - - -void FTPTestCase::setUp() -{ - wxSocketBase::Initialize(); + class SocketInit + { + public: + SocketInit() { wxSocketBase::Initialize(); } + ~SocketInit() { wxSocketBase::Shutdown(); } + } socketInit; // wxFTP cannot be a static variable as its ctor needs to access // wxWidgets internals after it has been initialized - m_ftp = new wxFTP; + wxFTP ftp; -#ifndef FTP_ANONYMOUS - m_ftp->SetUser(user); - m_ftp->SetPassword(password); -#endif // FTP_ANONYMOUS/!FTP_ANONYMOUS + if ( !user.empty() ) + { + ftp.SetUser(user); + ftp.SetPassword(password); + } - CPPUNIT_ASSERT( m_ftp->Connect(hostname) ); + REQUIRE( ftp.Connect(hostname) ); + + SECTION("List") + { + // test CWD + CPPUNIT_ASSERT( ftp.ChDir(directory) ); + + // test NLIST and LIST + wxArrayString files; + CPPUNIT_ASSERT( ftp.GetFilesList(files) ); + CPPUNIT_ASSERT( ftp.GetDirList(files) ); + + CPPUNIT_ASSERT( ftp.ChDir(wxT("..")) ); + } + + SECTION("Download") + { + CPPUNIT_ASSERT( ftp.ChDir(directory) ); + + // test RETR + wxInputStream *in1 = ftp.GetInputStream("bloordyblop"); + CPPUNIT_ASSERT( in1 == NULL ); + delete in1; + + wxInputStream *in2 = ftp.GetInputStream(valid_filename); + CPPUNIT_ASSERT( in2 != NULL ); + + size_t size = in2->GetSize(); + wxChar *data = new wxChar[size]; + CPPUNIT_ASSERT( in2->Read(data, size).GetLastError() == wxSTREAM_NO_ERROR ); + + delete [] data; + delete in2; + } + + SECTION("FileSize") + { + CPPUNIT_ASSERT( ftp.ChDir(directory) ); + + CPPUNIT_ASSERT( ftp.FileExists(valid_filename) ); + + int size = ftp.GetFileSize(valid_filename); + CPPUNIT_ASSERT( size != -1 ); + } + + SECTION("Pwd") + { + CPPUNIT_ASSERT_EQUAL( "/", ftp.Pwd() ); + + CPPUNIT_ASSERT( ftp.ChDir(directory) ); + CPPUNIT_ASSERT_EQUAL( directory, ftp.Pwd() ); + } + + SECTION("Misc") + { + CPPUNIT_ASSERT( ftp.SendCommand(wxT("STAT")) == '2' ); + CPPUNIT_ASSERT( ftp.SendCommand(wxT("HELP SITE")) == '2' ); + } + + SECTION("Upload") + { + if ( user.empty() ) + { + WARN("Skipping upload test when using anonymous FTP."); + return; + } + + // upload a file + static const wxChar *file1 = wxT("test1"); + wxOutputStream *out = ftp.GetOutputStream(file1); + CPPUNIT_ASSERT( out != NULL ); + CPPUNIT_ASSERT( out->Write("First hello", 11).GetLastError() == wxSTREAM_NO_ERROR ); + delete out; + + // send a command to check the remote file + CPPUNIT_ASSERT( ftp.SendCommand(wxString(wxT("STAT ")) + file1) == '2' ); + CPPUNIT_ASSERT( ftp.GetLastResult() == "11" ); + } } - -void FTPTestCase::tearDown() -{ - delete m_ftp; - - wxSocketBase::Shutdown(); -} - -void FTPTestCase::List() -{ - // test CWD - CPPUNIT_ASSERT( m_ftp->ChDir(directory) ); - - // test NLIST and LIST - wxArrayString files; - CPPUNIT_ASSERT( m_ftp->GetFilesList(files) ); - CPPUNIT_ASSERT( m_ftp->GetDirList(files) ); - - CPPUNIT_ASSERT( m_ftp->ChDir(wxT("..")) ); -} - -void FTPTestCase::Download() -{ - CPPUNIT_ASSERT( m_ftp->ChDir(directory) ); - - // test RETR - wxInputStream *in1 = m_ftp->GetInputStream(invalid_filename); - CPPUNIT_ASSERT( in1 == NULL ); - delete in1; - - wxInputStream *in2 = m_ftp->GetInputStream(valid_filename); - CPPUNIT_ASSERT( in2 != NULL ); - - size_t size = in2->GetSize(); - wxChar *data = new wxChar[size]; - CPPUNIT_ASSERT( in2->Read(data, size).GetLastError() == wxSTREAM_NO_ERROR ); - - delete [] data; - delete in2; -} - -void FTPTestCase::FileSize() -{ - CPPUNIT_ASSERT( m_ftp->ChDir(directory) ); - - CPPUNIT_ASSERT( m_ftp->FileExists(valid_filename) ); - - int size = m_ftp->GetFileSize(valid_filename); - CPPUNIT_ASSERT( size != -1 ); -} - -void FTPTestCase::Pwd() -{ - CPPUNIT_ASSERT_EQUAL( "/", m_ftp->Pwd() ); - - CPPUNIT_ASSERT( m_ftp->ChDir(directory) ); - CPPUNIT_ASSERT_EQUAL( directory, m_ftp->Pwd() ); -} - -void FTPTestCase::Misc() -{ - CPPUNIT_ASSERT( m_ftp->SendCommand(wxT("STAT")) == '2' ); - CPPUNIT_ASSERT( m_ftp->SendCommand(wxT("HELP SITE")) == '2' ); -} - -#ifndef FTP_ANONYMOUS -void FTPTestCase::Upload() -{ - // upload a file - static const wxChar *file1 = wxT("test1"); - wxOutputStream *out = m_ftp->GetOutputStream(file1); - CPPUNIT_ASSERT( out != NULL ); - CPPUNIT_ASSERT( out->Write("First hello", 11).GetLastError() == wxSTREAM_NO_ERROR ); - delete out; - - // send a command to check the remote file - CPPUNIT_ASSERT( m_ftp->SendCommand(wxString(wxT("STAT ")) + file1) == '2' ); - CPPUNIT_ASSERT( m_ftp->GetLastResult() == "11" ); -} -#endif - -