| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 | 
							- ///////////////////////////////////////////////////////////////////////////////
 
- // Name:        tests/net/socket.cpp
 
- // Purpose:     wxSocket unit tests
 
- // Author:      Vadim Zeitlin
 
- // Copyright:   (c) 2008 Vadim Zeitlin
 
- // Licence:     wxWindows licence
 
- ///////////////////////////////////////////////////////////////////////////////
 
- /*
 
-     IMPORTANT NOTE: the environment variable WX_TEST_SERVER must be set to the
 
-     hostname of the server to use for the tests below, if it is not set all
 
-     tests are silently skipped (rationale: this makes it possible to run the
 
-     test in the restricted environments (e.g. sandboxes) without any network
 
-     connectivity).
 
-  */
 
- // For compilers that support precompilation, includes "wx/wx.h".
 
- // and "wx/cppunit.h"
 
- #include "testprec.h"
 
- #ifdef __BORLANDC__
 
-     #pragma hdrstop
 
- #endif
 
- #if wxUSE_SOCKETS
 
- #include "wx/socket.h"
 
- #include "wx/url.h"
 
- #include "wx/sstream.h"
 
- #include "wx/evtloop.h"
 
- #include <memory>
 
- typedef std::auto_ptr<wxSockAddress> wxSockAddressPtr;
 
- typedef std::auto_ptr<wxSocketClient> wxSocketClientPtr;
 
- static wxString gs_serverHost(wxGetenv("WX_TEST_SERVER"));
 
- class SocketTestCase : public CppUnit::TestCase
 
- {
 
- public:
 
-     SocketTestCase() { }
 
- private:
 
-     // we need to repeat the tests twice as the sockets behave differently when
 
-     // there is an active event loop and without it
 
-     #define ALL_SOCKET_TESTS() \
 
-         CPPUNIT_TEST( BlockingConnect ); \
 
-         CPPUNIT_TEST( NonblockingConnect ); \
 
-         CPPUNIT_TEST( ReadNormal ); \
 
-         CPPUNIT_TEST( ReadBlock ); \
 
-         CPPUNIT_TEST( ReadNowait ); \
 
-         CPPUNIT_TEST( ReadWaitall ); \
 
-         CPPUNIT_TEST( UrlTest )
 
-     CPPUNIT_TEST_SUITE( SocketTestCase );
 
-         ALL_SOCKET_TESTS();
 
-         CPPUNIT_TEST( PseudoTest_SetUseEventLoop );
 
-         ALL_SOCKET_TESTS();
 
-     CPPUNIT_TEST_SUITE_END();
 
-     // helper event loop class which sets itself as active only if we pass it
 
-     // true in ctor
 
-     class SocketTestEventLoop : public wxEventLoop
 
-     {
 
-     public:
 
-         SocketTestEventLoop(bool useLoop)
 
-         {
 
-             m_useLoop = useLoop;
 
-             if ( useLoop )
 
-             {
 
-                 m_evtLoopOld = wxEventLoopBase::GetActive();
 
-                 SetActive(this);
 
-             }
 
-         }
 
-         virtual ~SocketTestEventLoop()
 
-         {
 
-             if ( m_useLoop )
 
-             {
 
-                 wxEventLoopBase::SetActive(m_evtLoopOld);
 
-             }
 
-         }
 
-     private:
 
-         bool m_useLoop;
 
-         wxEventLoopBase *m_evtLoopOld;
 
-     };
 
-     // get the address to connect to, if NULL is returned it means that the
 
-     // test is disabled and shouldn't run at all
 
-     wxSockAddressPtr GetServer() const;
 
-     // get the socket to read HTTP reply from, returns NULL if the test is
 
-     // disabled
 
-     wxSocketClientPtr GetHTTPSocket(int flags = wxSOCKET_NONE) const;
 
-     void PseudoTest_SetUseEventLoop() { ms_useLoop = true; }
 
-     void BlockingConnect();
 
-     void NonblockingConnect();
 
-     void ReadNormal();
 
-     void ReadBlock();
 
-     void ReadNowait();
 
-     void ReadWaitall();
 
-     void UrlTest();
 
-     static bool ms_useLoop;
 
-     DECLARE_NO_COPY_CLASS(SocketTestCase)
 
- };
 
- bool SocketTestCase::ms_useLoop = false;
 
- CPPUNIT_TEST_SUITE_REGISTRATION( SocketTestCase );
 
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( SocketTestCase, "SocketTestCase" );
 
- wxSockAddressPtr SocketTestCase::GetServer() const
 
- {
 
-     if ( gs_serverHost.empty() )
 
-         return wxSockAddressPtr();
 
-     wxIPV4address *addr = new wxIPV4address;
 
-     addr->Hostname(gs_serverHost);
 
-     addr->Service("www");
 
-     return wxSockAddressPtr(addr);
 
- }
 
- wxSocketClientPtr SocketTestCase::GetHTTPSocket(int flags) const
 
- {
 
-     wxSockAddressPtr addr = GetServer();
 
-     if ( !addr.get() )
 
-         return wxSocketClientPtr();
 
-     wxSocketClient *sock = new wxSocketClient(flags);
 
-     sock->SetTimeout(1);
 
-     CPPUNIT_ASSERT( sock->Connect(*addr) );
 
-     const wxString httpGetRoot =
 
-         "GET / HTTP/1.1\r\n"
 
-         "Host: " + gs_serverHost + "\r\n"
 
-         "\r\n";
 
-     sock->Write(httpGetRoot.ToAscii(), httpGetRoot.length());
 
-     return wxSocketClientPtr(sock);
 
- }
 
- void SocketTestCase::BlockingConnect()
 
- {
 
-     wxSockAddressPtr addr = GetServer();
 
-     if ( !addr.get() )
 
-         return;
 
-     wxSocketClient sock;
 
-     CPPUNIT_ASSERT( sock.Connect(*addr) );
 
- }
 
- void SocketTestCase::NonblockingConnect()
 
- {
 
-     wxSockAddressPtr addr = GetServer();
 
-     if ( !addr.get() )
 
-         return;
 
-     SocketTestEventLoop loop(ms_useLoop);
 
-     wxSocketClient sock;
 
-     sock.Connect(*addr, false);
 
-     sock.WaitOnConnect(10);
 
-     CPPUNIT_ASSERT( sock.IsConnected() );
 
- }
 
- void SocketTestCase::ReadNormal()
 
- {
 
-     SocketTestEventLoop loop(ms_useLoop);
 
-     wxSocketClientPtr sock(GetHTTPSocket());
 
-     if ( !sock.get() )
 
-         return;
 
-     char bufSmall[128];
 
-     sock->Read(bufSmall, WXSIZEOF(bufSmall));
 
-     CPPUNIT_ASSERT_EQUAL( wxSOCKET_NOERROR, sock->LastError() );
 
-     CPPUNIT_ASSERT_EQUAL( WXSIZEOF(bufSmall), (size_t)sock->LastCount() );
 
-     CPPUNIT_ASSERT_EQUAL( WXSIZEOF(bufSmall), (size_t)sock->LastReadCount() );
 
-     char bufBig[102400];
 
-     sock->Read(bufBig, WXSIZEOF(bufBig));
 
-     CPPUNIT_ASSERT_EQUAL( wxSOCKET_NOERROR, sock->LastError() );
 
-     CPPUNIT_ASSERT( WXSIZEOF(bufBig) >= sock->LastCount() );
 
-     CPPUNIT_ASSERT( WXSIZEOF(bufBig) >= sock->LastReadCount() );
 
- }
 
- void SocketTestCase::ReadBlock()
 
- {
 
-     wxSocketClientPtr sock(GetHTTPSocket(wxSOCKET_BLOCK));
 
-     if ( !sock.get() )
 
-         return;
 
-     char bufSmall[128];
 
-     sock->Read(bufSmall, WXSIZEOF(bufSmall));
 
-     CPPUNIT_ASSERT_EQUAL( wxSOCKET_NOERROR, sock->LastError() );
 
-     CPPUNIT_ASSERT_EQUAL( WXSIZEOF(bufSmall), (size_t)sock->LastCount() );
 
-     CPPUNIT_ASSERT_EQUAL( WXSIZEOF(bufSmall), (size_t)sock->LastReadCount() );
 
-     char bufBig[102400];
 
-     sock->Read(bufBig, WXSIZEOF(bufBig));
 
-     CPPUNIT_ASSERT_EQUAL( wxSOCKET_NOERROR, sock->LastError() );
 
-     CPPUNIT_ASSERT( WXSIZEOF(bufBig) >= sock->LastCount() );
 
-     CPPUNIT_ASSERT( WXSIZEOF(bufBig) >= sock->LastReadCount() );
 
- }
 
- void SocketTestCase::ReadNowait()
 
- {
 
-     wxSocketClientPtr sock(GetHTTPSocket(wxSOCKET_NOWAIT));
 
-     if ( !sock.get() )
 
-         return;
 
-     char buf[1024];
 
-     sock->Read(buf, WXSIZEOF(buf));
 
-     if ( sock->LastError() != wxSOCKET_WOULDBLOCK )
 
-     {
 
-         CPPUNIT_ASSERT_EQUAL( wxSOCKET_NOERROR, sock->LastError() );
 
-     }
 
- }
 
- void SocketTestCase::ReadWaitall()
 
- {
 
-     SocketTestEventLoop loop(ms_useLoop);
 
-     wxSocketClientPtr sock(GetHTTPSocket(wxSOCKET_WAITALL));
 
-     if ( !sock.get() )
 
-         return;
 
-     char buf[128];
 
-     sock->Read(buf, WXSIZEOF(buf));
 
-     CPPUNIT_ASSERT_EQUAL( wxSOCKET_NOERROR, sock->LastError() );
 
-     CPPUNIT_ASSERT_EQUAL( WXSIZEOF(buf), (size_t)sock->LastCount() );
 
-     CPPUNIT_ASSERT_EQUAL( WXSIZEOF(buf), (size_t)sock->LastReadCount() );
 
- }
 
- void SocketTestCase::UrlTest()
 
- {
 
-     if ( gs_serverHost.empty() )
 
-         return;
 
-     SocketTestEventLoop loop(ms_useLoop);
 
-     wxURL url("http://" + gs_serverHost);
 
-     const std::auto_ptr<wxInputStream> in(url.GetInputStream());
 
-     CPPUNIT_ASSERT( in.get() );
 
-     wxStringOutputStream out;
 
-     CPPUNIT_ASSERT_EQUAL( wxSTREAM_EOF, in->Read(out).GetLastError() );
 
- }
 
- #endif // wxUSE_SOCKETS
 
 
  |