1
0

Begin to add mock siad for testing

This commit is contained in:
Scott E. Graves
2017-02-21 18:27:42 -06:00
parent 19fb34b18f
commit c72722fa82
4 changed files with 170 additions and 4 deletions

136
UnitTests/MockSiad.cpp Normal file
View File

@@ -0,0 +1,136 @@
#include "stdafx.h"
#include "MockSiad.h"
class CMockClient
{
public:
CMockClient(SOCKET socket, std::function<void(CMockClient* client)> removedCallback) :
_socket(socket)
{
_clientThread.reset(new std::thread([this]()
{
Run();
}));
}
public:
~CMockClient()
{
::SetEvent(_stopEvent);
_clientThread->join();
::CloseHandle(_stopEvent);
}
private:
SOCKET _socket;
HANDLE _stopEvent;
std::function<void(CMockClient* client)> NotifyClientRemoved;
std::unique_ptr<std::thread> _clientThread;
private:
void Run()
{
bool connected = true;
bool stopRequested;
while (connected && !(stopRequested = (::WaitForSingleObject(_stopEvent, 1) == WAIT_TIMEOUT)))
{
timeval tv = { 1, 0 };
FD_SET readFds, exceptFds;
FD_ZERO(&readFds);
FD_ZERO(&exceptFds);
FD_SET(_socket, &readFds);
FD_SET(_socket, &exceptFds);
int selectResult = ::select(0, &readFds, nullptr, &exceptFds, &tv);
if (selectResult != SOCKET_ERROR)
{
if (FD_ISSET(_socket, &readFds))
{
}
else if (FD_ISSET(_socket, &exceptFds))
{
connected = false;
}
}
}
closesocket(_socket);
NotifyClientRemoved(this);
}
};
CMockSiad::CMockSiad(const SiaHostConfig& hostConfig) :
_hostConfig(hostConfig),
_stopEvent(::CreateEvent(nullptr, FALSE, FALSE, nullptr))
{
const WORD ver = MAKEWORD(2, 2);
::WSAStartup(ver, nullptr);
}
CMockSiad::~CMockSiad()
{
Stop();
CloseHandle(_stopEvent);
::WSACleanup();
}
void CMockSiad::Start()
{
if (!_serverThread)
{
_serverThread.reset(new std::thread([this]()
{
bool stopRequested = false;
std::mutex clientMutex;
do
{
SOCKET listenSocket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in sockAddr = { 0 };
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = inet_addr("localhost");
sockAddr.sin_port = htons(5150);
bool listening = ((listenSocket != INVALID_SOCKET) && (::bind(listenSocket, reinterpret_cast<const struct sockaddr *>(&sockAddr), sizeof(sockAddr)) != SOCKET_ERROR));
while (listening && !(stopRequested = (::WaitForSingleObject(_stopEvent, 1) == WAIT_TIMEOUT)))
{
{
std::lock_guard<std::mutex> l(clientMutex);
}
timeval tv = { 1, 0 };
FD_SET readFds, exceptFds;
FD_ZERO(&readFds);
FD_ZERO(&exceptFds);
FD_SET(listenSocket, &readFds);
FD_SET(listenSocket, &exceptFds);
int selectResult = ::select(0, &readFds, nullptr, &exceptFds, &tv);
if (selectResult != SOCKET_ERROR)
{
if (FD_ISSET(listenSocket, &readFds))
{
SOCKET clientSocket = ::accept(listenSocket, nullptr, nullptr);
CMockClient* client = new CMockClient(clientSocket, [this, &clientMutex](CMockClient* removedClient)
{
std::lock_guard<std::mutex> l(clientMutex);
});
}
else if (FD_ISSET(listenSocket, &exceptFds))
{
listening = false;
}
}
}
closesocket(listenSocket);
} while (!stopRequested);
}));
}
}
void CMockSiad::Stop()
{
}

22
UnitTests/MockSiad.h Normal file
View File

@@ -0,0 +1,22 @@
#pragma once
#include <SiaApi.h>
using namespace Sia::Api;
class CMockSiad
{
public:
CMockSiad(const SiaHostConfig& hostConfig);
~CMockSiad();
private:
SiaHostConfig _hostConfig;
HANDLE _stopEvent;
std::unique_ptr<std::thread> _serverThread;
public:
void Start();
void Stop();
};

View File

@@ -97,8 +97,7 @@
<Link>
<SubSystem>Windows</SubSystem>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>
</AdditionalDependencies>
<AdditionalDependencies>Ws2_32.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -113,6 +112,7 @@
<Link>
<SubSystem>Windows</SubSystem>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Ws2_32.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -131,8 +131,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>
</AdditionalDependencies>
<AdditionalDependencies>Ws2_32.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -151,14 +150,17 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Ws2_32.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="MockSiad.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="UnitTestConfig.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="MockSiad.cpp" />
<ClCompile Include="SiaApiFileTreeTests.cpp">
<SubType>
</SubType>

View File

@@ -24,6 +24,9 @@
<ClInclude Include="UnitTestConfig.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="MockSiad.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">
@@ -47,5 +50,8 @@
<ClCompile Include="UnitTestConfig.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MockSiad.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>