| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: tests/net/ipc.cpp
- // Purpose: IPC classes unit tests
- // Author: Vadim Zeitlin
- // Copyright: (c) 2008 Vadim Zeitlin
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- // For compilers that support precompilation, includes "wx/wx.h".
- // and "wx/cppunit.h"
- #include "testprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- // FIXME: this tests currently sometimes hangs in Connect() for unknown reason
- // and this prevents buildbot builds from working so disabling it, but
- // the real problem needs to be fixed, of course
- #if 0
- // this test needs threads as it runs the test server in a secondary thread
- #if wxUSE_THREADS
- // for all others, include the necessary headers
- #ifndef WX_PRECOMP
- #include "wx/app.h"
- #endif
- #include "wx/ipc.h"
- #include "wx/thread.h"
- #define wxUSE_SOCKETS_FOR_IPC (!wxUSE_DDE_FOR_IPC)
- namespace
- {
- const char *IPC_TEST_PORT = "4242";
- const char *IPC_TEST_TOPIC = "IPC TEST";
- } // anonymous namespace
- // ----------------------------------------------------------------------------
- // test connection class used by IPCTestServer
- // ----------------------------------------------------------------------------
- class IPCTestConnection : public wxConnection
- {
- public:
- IPCTestConnection() { }
- virtual bool OnExec(const wxString& topic, const wxString& data)
- {
- if ( topic != IPC_TEST_TOPIC )
- return false;
- return data == "Date";
- }
- private:
- DECLARE_NO_COPY_CLASS(IPCTestConnection)
- };
- // ----------------------------------------------------------------------------
- // event dispatching thread class
- // ----------------------------------------------------------------------------
- class EventThread : public wxThread
- {
- public:
- EventThread()
- : wxThread(wxTHREAD_JOINABLE)
- {
- Create();
- Run();
- }
- protected:
- virtual void *Entry()
- {
- wxTheApp->MainLoop();
- return NULL;
- }
- DECLARE_NO_COPY_CLASS(EventThread)
- };
- // ----------------------------------------------------------------------------
- // test server class
- // ----------------------------------------------------------------------------
- class IPCTestServer : public wxServer
- {
- public:
- IPCTestServer()
- {
- m_conn = NULL;
- #if wxUSE_SOCKETS_FOR_IPC
- // we must call this from the main thread
- wxSocketBase::Initialize();
- #endif // wxUSE_SOCKETS_FOR_IPC
- // we need event dispatching to work for IPC server to work
- m_thread = new EventThread;
- Create(IPC_TEST_PORT);
- }
- virtual ~IPCTestServer()
- {
- wxTheApp->ExitMainLoop();
- m_thread->Wait();
- delete m_thread;
- delete m_conn;
- #if wxUSE_SOCKETS_FOR_IPC
- wxSocketBase::Shutdown();
- #endif // wxUSE_SOCKETS_FOR_IPC
- }
- virtual wxConnectionBase *OnAcceptConnection(const wxString& topic)
- {
- if ( topic != IPC_TEST_TOPIC )
- return NULL;
- m_conn = new IPCTestConnection;
- return m_conn;
- }
- private:
- EventThread *m_thread;
- IPCTestConnection *m_conn;
- DECLARE_NO_COPY_CLASS(IPCTestServer)
- };
- static IPCTestServer *gs_server = NULL;
- // ----------------------------------------------------------------------------
- // test client class
- // ----------------------------------------------------------------------------
- class IPCTestClient : public wxClient
- {
- public:
- IPCTestClient()
- {
- m_conn = NULL;
- }
- virtual ~IPCTestClient()
- {
- Disconnect();
- }
- bool
- Connect(const wxString& host, const wxString& service, const wxString& topic)
- {
- m_conn = MakeConnection(host, service, topic);
- return m_conn != NULL;
- }
- void Disconnect()
- {
- if ( m_conn )
- {
- delete m_conn;
- m_conn = NULL;
- }
- }
- wxConnectionBase& GetConn() const
- {
- CPPUNIT_ASSERT( m_conn );
- return *m_conn;
- }
- private:
- wxConnectionBase *m_conn;
- DECLARE_NO_COPY_CLASS(IPCTestClient)
- };
- static IPCTestClient *gs_client = NULL;
- // ----------------------------------------------------------------------------
- // the test code itself
- // ----------------------------------------------------------------------------
- class IPCTestCase : public CppUnit::TestCase
- {
- public:
- IPCTestCase() { }
- private:
- CPPUNIT_TEST_SUITE( IPCTestCase );
- CPPUNIT_TEST( Connect );
- CPPUNIT_TEST( Execute );
- CPPUNIT_TEST( Disconnect );
- CPPUNIT_TEST_SUITE_END();
- void Connect();
- void Execute();
- void Disconnect();
- DECLARE_NO_COPY_CLASS(IPCTestCase)
- };
- CPPUNIT_TEST_SUITE_REGISTRATION( IPCTestCase );
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( IPCTestCase, "IPCTestCase" );
- void IPCTestCase::Connect()
- {
- gs_server = new IPCTestServer;
- gs_client = new IPCTestClient;
- // connecting to the wrong port should fail
- CPPUNIT_ASSERT( !gs_client->Connect("localhost", "2424", IPC_TEST_TOPIC) );
- // connecting using an unsupported topic should fail (unless the server
- // expects a ROT-13'd topic name...)
- CPPUNIT_ASSERT( !gs_client->Connect("localhost", IPC_TEST_PORT, "VCP GRFG") );
- // connecting to the right port on the right topic should succeed
- CPPUNIT_ASSERT( gs_client->Connect("localhost", IPC_TEST_PORT, IPC_TEST_TOPIC) );
- }
- void IPCTestCase::Execute()
- {
- wxConnectionBase& conn = gs_client->GetConn();
- const wxString s("Date");
- CPPUNIT_ASSERT( conn.Execute(s) );
- CPPUNIT_ASSERT( conn.Execute(s.mb_str(), s.length() + 1) );
- char bytes[] = { 1, 2, 3 };
- CPPUNIT_ASSERT( conn.Execute(bytes, WXSIZEOF(bytes)) );
- }
- void IPCTestCase::Disconnect()
- {
- if ( gs_client )
- {
- gs_client->Disconnect();
- delete gs_client;
- gs_client = NULL;
- }
- if ( gs_server )
- {
- delete gs_server;
- gs_server = NULL;
- }
- }
- #endif // wxUSE_THREADS
- #endif // !__WINDOWS__
|