Modified IpcServer to be mockable #4651

Also started IpcLogOutputterTests
This commit is contained in:
Nick Bolton 2015-05-14 18:01:39 +01:00
parent 8c82996fc4
commit 134a15ea8d
4 changed files with 112 additions and 16 deletions

View File

@ -33,17 +33,20 @@
// //
IpcServer::IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer) : IpcServer::IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer) :
m_socket(events, socketMultiplexer), m_mock(false),
m_address(NetworkAddress(IPC_HOST, IPC_PORT)), m_events(events),
m_events(events) m_socketMultiplexer(socketMultiplexer),
m_socket(nullptr),
m_address(NetworkAddress(IPC_HOST, IPC_PORT))
{ {
init(); init();
} }
IpcServer::IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer, int port) : IpcServer::IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer, int port) :
m_socket(events, socketMultiplexer), m_mock(false),
m_address(NetworkAddress(IPC_HOST, port)), m_events(events),
m_events(events) m_socketMultiplexer(socketMultiplexer),
m_address(NetworkAddress(IPC_HOST, port))
{ {
init(); init();
} }
@ -51,17 +54,27 @@ IpcServer::IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer,
void void
IpcServer::init() IpcServer::init()
{ {
m_socket = new TCPListenSocket(m_events, m_socketMultiplexer);
m_clientsMutex = ARCH->newMutex(); m_clientsMutex = ARCH->newMutex();
m_address.resolve(); m_address.resolve();
m_events->adoptHandler( m_events->adoptHandler(
m_events->forIListenSocket().connecting(), &m_socket, m_events->forIListenSocket().connecting(), m_socket,
new TMethodEventJob<IpcServer>( new TMethodEventJob<IpcServer>(
this, &IpcServer::handleClientConnecting)); this, &IpcServer::handleClientConnecting));
} }
IpcServer::~IpcServer() IpcServer::~IpcServer()
{ {
if (m_mock) {
return;
}
if (m_socket != nullptr) {
delete m_socket;
}
ARCH->lockMutex(m_clientsMutex); ARCH->lockMutex(m_clientsMutex);
ClientList::iterator it; ClientList::iterator it;
for (it = m_clients.begin(); it != m_clients.end(); it++) { for (it = m_clients.begin(); it != m_clients.end(); it++) {
@ -71,19 +84,19 @@ IpcServer::~IpcServer()
ARCH->unlockMutex(m_clientsMutex); ARCH->unlockMutex(m_clientsMutex);
ARCH->closeMutex(m_clientsMutex); ARCH->closeMutex(m_clientsMutex);
m_events->removeHandler(m_events->forIListenSocket().connecting(), &m_socket); m_events->removeHandler(m_events->forIListenSocket().connecting(), m_socket);
} }
void void
IpcServer::listen() IpcServer::listen()
{ {
m_socket.bind(m_address); m_socket->bind(m_address);
} }
void void
IpcServer::handleClientConnecting(const Event&, void*) IpcServer::handleClientConnecting(const Event&, void*)
{ {
synergy::IStream* stream = m_socket.accept(); synergy::IStream* stream = m_socket->accept();
if (stream == NULL) { if (stream == NULL) {
return; return;
} }

View File

@ -49,17 +49,17 @@ public:
//@{ //@{
//! Opens a TCP socket only allowing local connections. //! Opens a TCP socket only allowing local connections.
void listen(); virtual void listen();
//! Send a message to all clients matching the filter type. //! Send a message to all clients matching the filter type.
void send(const IpcMessage& message, EIpcClientType filterType); virtual void send(const IpcMessage& message, EIpcClientType filterType);
//@} //@}
//! @name accessors //! @name accessors
//@{ //@{
//! Returns true when there are clients of the specified type connected. //! Returns true when there are clients of the specified type connected.
bool hasClients(EIpcClientType clientType) const; virtual bool hasClients(EIpcClientType clientType) const;
//@} //@}
@ -72,10 +72,21 @@ private:
private: private:
typedef std::list<IpcClientProxy*> ClientList; typedef std::list<IpcClientProxy*> ClientList;
TCPListenSocket m_socket; bool m_mock;
IEventQueue* m_events;
SocketMultiplexer* m_socketMultiplexer;
TCPListenSocket* m_socket;
NetworkAddress m_address; NetworkAddress m_address;
ClientList m_clients; ClientList m_clients;
ArchMutex m_clientsMutex; ArchMutex m_clientsMutex;
IEventQueue* m_events;
#ifdef TEST_ENV
public:
IpcServer() :
m_mock(true),
m_events(nullptr),
m_socketMultiplexer(nullptr),
m_socket(nullptr) { }
#endif
}; };

View File

@ -0,0 +1,35 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015 Synergy Si Ltd.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "ipc/IpcServer.h"
#include "ipc/IpcMessage.h"
#include "test/global/gmock.h"
class IEventQueue;
class MockIpcServer : public IpcServer
{
public:
MockIpcServer() { }
MOCK_METHOD0(listen, void());
MOCK_METHOD2(send, void(const IpcMessage&, EIpcClientType));
MOCK_CONST_METHOD1(hasClients, bool(EIpcClientType));
};

View File

@ -0,0 +1,37 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015 Synergy Si Ltd.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define TEST_ENV
#include "ipc/IpcLogOutputter.h"
#include "base/String.h"
#include "test/mock/ipc/MockIpcServer.h"
#include "test/global/gtest.h"
using namespace synergy;
TEST(IpcLogOutputterTests, write_bufferSizeWrapping)
{
MockIpcServer mockServer;
IpcLogOutputter outputter(mockServer);
outputter.write(kNOTE, "hello world", false);
EXPECT_EQ(true, true);
}