| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: tests/filetype/filetype.cpp
- // Purpose: Test wxGetFileKind and wxStreamBase::IsSeekable
- // Author: Mike Wetherell
- // Copyright: (c) 2005 Mike Wetherell
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #include "testprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- // for all others, include the necessary headers
- #ifndef WX_PRECOMP
- #include "wx/wx.h"
- #endif
- #if wxUSE_STREAMS
- #ifdef __UNIX__
- #include <sys/socket.h>
- #endif
- #include "wx/file.h"
- #include "wx/ffile.h"
- #include "wx/wfstream.h"
- #include "wx/filename.h"
- #include "wx/socket.h"
- #include "wx/sckstrm.h"
- #include "wx/mstream.h"
- #ifdef __VISUALC__
- #define isatty _isatty
- #define fdopen _fdopen
- #define fileno _fileno
- #endif
- ///////////////////////////////////////////////////////////////////////////////
- // The test case
- class FileKindTestCase : public CppUnit::TestCase
- {
- CPPUNIT_TEST_SUITE(FileKindTestCase);
- CPPUNIT_TEST(File);
- #if defined __UNIX__ || defined _MSC_VER || defined __MINGW32__
- CPPUNIT_TEST(Pipe);
- #endif
- #if defined __UNIX__
- CPPUNIT_TEST(Socket);
- #endif
- CPPUNIT_TEST(Stdin);
- CPPUNIT_TEST(MemoryStream);
- #if wxUSE_SOCKETS
- CPPUNIT_TEST(SocketStream);
- #endif
- CPPUNIT_TEST_SUITE_END();
- void File();
- void Pipe();
- void Socket();
- void Stdin();
- void MemoryStream();
- #if wxUSE_SOCKETS
- void SocketStream();
- #endif
- void TestFILE(wxFFile& file, bool expected);
- void TestFd(wxFile& file, bool expected);
- };
- // test a wxFFile and wxFFileInput/OutputStreams of a known type
- //
- void FileKindTestCase::TestFILE(wxFFile& file, bool expected)
- {
- CPPUNIT_ASSERT(file.IsOpened());
- CPPUNIT_ASSERT((wxGetFileKind(file.fp()) == wxFILE_KIND_DISK) == expected);
- CPPUNIT_ASSERT((file.GetKind() == wxFILE_KIND_DISK) == expected);
- wxFFileInputStream inStream(file);
- CPPUNIT_ASSERT(inStream.IsSeekable() == expected);
- wxFFileOutputStream outStream(file);
- CPPUNIT_ASSERT(outStream.IsSeekable() == expected);
- }
- // test a wxFile and wxFileInput/OutputStreams of a known type
- //
- void FileKindTestCase::TestFd(wxFile& file, bool expected)
- {
- CPPUNIT_ASSERT(file.IsOpened());
- CPPUNIT_ASSERT((wxGetFileKind(file.fd()) == wxFILE_KIND_DISK) == expected);
- CPPUNIT_ASSERT((file.GetKind() == wxFILE_KIND_DISK) == expected);
- wxFileInputStream inStream(file);
- CPPUNIT_ASSERT(inStream.IsSeekable() == expected);
- wxFileOutputStream outStream(file);
- CPPUNIT_ASSERT(outStream.IsSeekable() == expected);
- }
- struct TempFile
- {
- ~TempFile() { if (!m_name.IsEmpty()) wxRemoveFile(m_name); }
- wxString m_name;
- };
- // test with an ordinary file
- //
- void FileKindTestCase::File()
- {
- TempFile tmp; // put first
- wxFile file;
- tmp.m_name = wxFileName::CreateTempFileName(wxT("wxft"), &file);
- TestFd(file, true);
- file.Close();
- wxFFile ffile(tmp.m_name);
- TestFILE(ffile, true);
- }
- // test with a pipe
- //
- #if defined __UNIX__ || defined _MSC_VER || defined __MINGW32__
- void FileKindTestCase::Pipe()
- {
- int afd[2];
- int rc;
- #ifdef __UNIX__
- rc = pipe(afd);
- #else
- rc = _pipe(afd, 256, O_BINARY);
- #endif
- CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed to create pipe", 0, rc);
- wxFile file0(afd[0]);
- wxFile file1(afd[1]);
- TestFd(file0, false);
- file0.Detach();
- wxFFile ffile(fdopen(afd[0], "r"));
- TestFILE(ffile, false);
- }
- #endif
- // test with a socket
- //
- #if defined __UNIX__
- void FileKindTestCase::Socket()
- {
- int s = socket(PF_INET, SOCK_STREAM, 0);
- wxFile file(s);
- TestFd(file, false);
- file.Detach();
- wxFFile ffile(fdopen(s, "r"));
- TestFILE(ffile, false);
- }
- #endif
- // Socket streams should be non-seekable
- //
- #if wxUSE_SOCKETS
- void FileKindTestCase::SocketStream()
- {
- wxSocketClient client;
- wxSocketInputStream inStream(client);
- CPPUNIT_ASSERT(!inStream.IsSeekable());
- wxSocketOutputStream outStream(client);
- CPPUNIT_ASSERT(!outStream.IsSeekable());
- wxBufferedInputStream nonSeekableBufferedInput(inStream);
- CPPUNIT_ASSERT(!nonSeekableBufferedInput.IsSeekable());
- wxBufferedOutputStream nonSeekableBufferedOutput(outStream);
- CPPUNIT_ASSERT(!nonSeekableBufferedOutput.IsSeekable());
- }
- #endif
- // Memory streams should be seekable
- //
- void FileKindTestCase::MemoryStream()
- {
- char buf[20];
- wxMemoryInputStream inStream(buf, sizeof(buf));
- CPPUNIT_ASSERT(inStream.IsSeekable());
- wxMemoryOutputStream outStream(buf, sizeof(buf));
- CPPUNIT_ASSERT(outStream.IsSeekable());
- wxBufferedInputStream seekableBufferedInput(inStream);
- CPPUNIT_ASSERT(seekableBufferedInput.IsSeekable());
- wxBufferedOutputStream seekableBufferedOutput(outStream);
- CPPUNIT_ASSERT(seekableBufferedOutput.IsSeekable());
- }
- // Stdin will usually be a terminal, if so then test it
- //
- void FileKindTestCase::Stdin()
- {
- if (isatty(0))
- CPPUNIT_ASSERT(wxGetFileKind(0) == wxFILE_KIND_TERMINAL);
- if (isatty(fileno(stdin)))
- CPPUNIT_ASSERT(wxGetFileKind(stdin) == wxFILE_KIND_TERMINAL);
- }
- // register in the unnamed registry so that these tests are run by default
- CPPUNIT_TEST_SUITE_REGISTRATION(FileKindTestCase);
- // also include in its own registry so that these tests can be run alone
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(FileKindTestCase, "FileKindTestCase");
- #endif // wxUSE_STREAMS
|