]> git.saurik.com Git - wxWidgets.git/blobdiff - tests/net/socket.cpp
add simple (and disabled by default) wxSocket client test
[wxWidgets.git] / tests / net / socket.cpp
diff --git a/tests/net/socket.cpp b/tests/net/socket.cpp
new file mode 100644 (file)
index 0000000..9145c27
--- /dev/null
@@ -0,0 +1,178 @@
+///////////////////////////////////////////////////////////////////////////////
+// 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