add simple (and disabled by default) wxSocket client test
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56252 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
178
tests/net/socket.cpp
Normal file
178
tests/net/socket.cpp
Normal file
@@ -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
|
Reference in New Issue
Block a user