Begin to add mock siad for testing
This commit is contained in:
136
UnitTests/MockSiad.cpp
Normal file
136
UnitTests/MockSiad.cpp
Normal 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
22
UnitTests/MockSiad.h
Normal 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();
|
||||||
|
};
|
||||||
|
|
@@ -97,8 +97,7 @@
|
|||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>
|
<AdditionalDependencies>Ws2_32.lib</AdditionalDependencies>
|
||||||
</AdditionalDependencies>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
@@ -113,6 +112,7 @@
|
|||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>Ws2_32.lib</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
@@ -131,8 +131,7 @@
|
|||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>
|
<AdditionalDependencies>Ws2_32.lib</AdditionalDependencies>
|
||||||
</AdditionalDependencies>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@@ -151,14 +150,17 @@
|
|||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>Ws2_32.lib</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClInclude Include="MockSiad.h" />
|
||||||
<ClInclude Include="stdafx.h" />
|
<ClInclude Include="stdafx.h" />
|
||||||
<ClInclude Include="targetver.h" />
|
<ClInclude Include="targetver.h" />
|
||||||
<ClInclude Include="UnitTestConfig.h" />
|
<ClInclude Include="UnitTestConfig.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="MockSiad.cpp" />
|
||||||
<ClCompile Include="SiaApiFileTreeTests.cpp">
|
<ClCompile Include="SiaApiFileTreeTests.cpp">
|
||||||
<SubType>
|
<SubType>
|
||||||
</SubType>
|
</SubType>
|
||||||
|
@@ -24,6 +24,9 @@
|
|||||||
<ClInclude Include="UnitTestConfig.h">
|
<ClInclude Include="UnitTestConfig.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="MockSiad.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="stdafx.cpp">
|
<ClCompile Include="stdafx.cpp">
|
||||||
@@ -47,5 +50,8 @@
|
|||||||
<ClCompile Include="UnitTestConfig.cpp">
|
<ClCompile Include="UnitTestConfig.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="MockSiad.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
Reference in New Issue
Block a user