--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// Name: tests/net/socket.cpp
+// Purpose: wxSocket unit tests
+// Author: Vadim Zeitlin
+// RCS-ID: $Id$
+// Copyright: (c) 2008 Vadim Zeitlin
+// Licence: wxWidgets 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 <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:
+ CPPUNIT_TEST_SUITE( SocketTestCase );
+ CPPUNIT_TEST( BlockingConnect );
+ CPPUNIT_TEST( NonblockingConnect );
+ CPPUNIT_TEST( ReadNormal );
+ CPPUNIT_TEST( ReadNowait );
+ CPPUNIT_TEST( ReadWaitall );
+ CPPUNIT_TEST_SUITE_END();
+
+ // 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 BlockingConnect();
+ void NonblockingConnect();
+ void ReadNormal();
+ void ReadNowait();
+ void ReadWaitall();
+
+ DECLARE_NO_COPY_CLASS(SocketTestCase)
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION( SocketTestCase );
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( SocketTestCase, "SocketTestCase" );
+
+wxSockAddressPtr SocketTestCase::GetServer() const
+{
+ wxSockAddressPtr ptr;
+ if ( !gs_serverHost.empty() )
+ {
+ wxIPV4address *addr = new wxIPV4address;
+ addr->Hostname(gs_serverHost);
+ addr->Service("www");
+
+ ptr.reset(addr);
+ }
+
+ return ptr;
+}
+
+wxSocketClientPtr SocketTestCase::GetHTTPSocket(int flags) const
+{
+ wxSocketClientPtr ptr;
+
+ wxSockAddressPtr addr = GetServer();
+ if ( !addr.get() )
+ return ptr;
+
+ 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, httpGetRoot.length());
+
+ ptr.reset(sock);
+ return ptr;
+}
+
+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;
+
+ wxSocketClient sock;
+ sock.Connect(*addr, false);
+ sock.WaitOnConnect(10);
+
+ CPPUNIT_ASSERT( sock.IsConnected() );
+}
+
+void SocketTestCase::ReadNormal()
+{
+ 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), sock->LastCount() );
+
+
+ char bufBig[1024*1024];
+ sock->Read(bufBig, WXSIZEOF(bufBig));
+
+ CPPUNIT_ASSERT_EQUAL( wxSOCKET_NOERROR, sock->LastError() );
+ CPPUNIT_ASSERT( WXSIZEOF(bufBig) >= sock->LastCount() );
+}
+
+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()
+{
+ 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), sock->LastCount() );
+}
+
+#endif // wxUSE_SOCKETS