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

View File

@ -49,17 +49,17 @@ public:
//@{
//! Opens a TCP socket only allowing local connections.
void listen();
virtual void listen();
//! 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
//@{
//! 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:
typedef std::list<IpcClientProxy*> ClientList;
TCPListenSocket m_socket;
bool m_mock;
IEventQueue* m_events;
SocketMultiplexer* m_socketMultiplexer;
TCPListenSocket* m_socket;
NetworkAddress m_address;
ClientList m_clients;
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);
}