13using namespace Microsoft::VisualStudio::CppUnitTestFramework;
20 TEST_CLASS_INITIALIZE (ClassInitialize)
22 Logger::WriteMessage (
"TcpConnectorTest class initialize.\n");
25 TEST_CLASS_CLEANUP (ClassCleanup)
27 Logger::WriteMessage (
"TcpConnectorTest class cleanup.\n");
30 TEST_METHOD_INITIALIZE (MethodInitialize)
32 Logger::WriteMessage (
"TcpConnectorTest method initialize.\n");
35 TEST_METHOD_CLEANUP (MethodCleanup)
37 Logger::WriteMessage (
"TcpConnectorTest method cleanup.\n");
40 TEST_METHOD (TcpConnecorTest)
43 Assert::AreEqual(0, builder.
Startup (), _T(
"SocketBuilder::Startup() failed.\n"));
46 auto serverFunction = [](LPVOID lpvParam)->DWORD
48 Logger::WriteMessage (
"[Server]Now start server thread.\n");
51 Assert::IsTrue(pBuilder->
Prepare (50000), _T(
"[Server]SocketBuilder::Prepare() failed.\n"));
56 Assert::IsNotNull(connector, _T(
"[Server]SocketBuilder::Wait() failed.\n"));
61 message.
Format (_T (
"[Server]SocketBuilder::Wait() success. from %s:%d\n"), lpctszIPAddress, wPort);
62 Logger::WriteMessage (message.
Ctr());
65 auto connectorFunction = [](LPVOID lpvParam)->DWORD
69 BYTE byBuf[256] = { 0 };
72 Logger::WriteMessage (
"[ServerWorker]Now start worker thread.\n");
77 ret = connector->
Recv ((LPVOID)&iPacketSize,
sizeof (INT));
80 DWORD dwError = connector->
GetErrNo ();
81 message.
Format (_T (
"[ServerWorker]TcpConnector::Recv(1) return 0. [%d]\n"), dwError);
82 Logger::WriteMessage (message.
Ctr());
86 ret = connector->
Recv (byBuf, iPacketSize);
89 DWORD dwError = connector->
GetErrNo ();
90 message.
Format (_T (
"[ServerWorker]TcpConnector::Recv(2) return 0. [%d]\n"), dwError);
91 Logger::WriteMessage (message.
Ctr());
95 message = (LPTSTR)byBuf;
96 Logger::WriteMessage (message.
Ctr());
99 Logger::WriteMessage (
"[ServerWorker]Now finish worker thread.\n");
103 Assert::IsTrue(workerThread->
Create (connectorFunction, connector), _T(
"[Server]Thread::Create() failed.\n"));
104 Assert::AreEqual (WAIT_OBJECT_0, workerThread->
Wait (), _T (
"[Server]Thread::Wait() is not WAIT_OBJECT_0.\n"));
105 Assert::AreEqual(0, connector->
Close (), _T(
"[Server]TcpConnector::Close() failed.\n"));
106 Logger::WriteMessage (
"[Server]TcpConnector::Close()\n");
110 Logger::WriteMessage (
"[Server]Now finish server thread.\n");
115 auto clientFunction = [](LPVOID lpvParam)->DWORD
117 Logger::WriteMessage (
"[Client]Now start client thread.\n");
120 Assert::AreEqual(0, builder.
Startup (),_T(
"[Client]SocketBuilder::Startup() failed.\n"));
122 Assert::IsNotNull (connector, _T(
"[Client]SocketBuilder::CreateTcpConnector() failed.\n"));
127 message.
Format (_T (
"[Client]SocketBuilder::CreateTcpConnector() success. from %s:%d\n"), lpctszIPAddress, wPort);
128 Logger::WriteMessage (message.
Ctr());
132 CONST INT iLoop = 10;
135 for (
int i = 1; i <= iLoop; i++)
139 message.
Format (_T(
"[%2d]%s %s\n"), i, time.
Ctr(), guid.
Ctr());
140 iPacketSize = message.
Byte();
142 ret = connector->
Send ((LPVOID)&iPacketSize,
sizeof (INT));
143 Assert::AreNotEqual (SOCKET_ERROR, ret, _T(
"[Client]TcpConnector::Send() failed.\n"));
145 ret = connector->
Send ((LPVOID)message.
Ctr(), iPacketSize);
146 Assert::AreNotEqual (SOCKET_ERROR, ret, _T(
"[Client]TcpConnector::Send() failed.\n"));
151 Assert::AreEqual(0, connector->
Close (), _T(
"[Client]TcpConnector::Close() failed.\n"));
153 Logger::WriteMessage (
"[Client]Now finish client thread.\n");
157 Assert::IsTrue(serverThread->
Create (serverFunction, &builder), _T(
"serverThread.Create() failed.\n"));
159 Assert::IsTrue(clientThread->
Create (clientFunction, &builder), _T(
"clientThread.Create() failed.\n"));
162 Assert::AreEqual(WAIT_OBJECT_0, clientThread->
Wait (), _T(
"clientThread.Wait() failed.\n"));
163 Logger::WriteMessage (
"Client thread finished.\n");
164 Assert::AreEqual(WAIT_OBJECT_0, serverThread->
Wait (), _T(
"serverThread.Wait() failed.\n"));
165 Logger::WriteMessage (
"Server thread finished.\n");
169 Logger::WriteMessage (
"Finished.\n");
172 TEST_METHOD (TcpClientTest)
177 Assert::AreEqual(0, builder.
Startup (), _T(
"SocketBuilder::Startup() failed.\n"));
181 Assert::IsTrue(ret, _T(
"SocketBuilder::GetHostByName() failed.\n"));
184 Assert::IsNotNull(connector, _T(
"SocketBuilder::CreateTcpConnector() failed.\n"));
187 sendMessage += _T (
"Host: www.yahoo.co.jp\n");
188 sendMessage += _T (
"Connection: keep - alive\n");
189 sendMessage += _T (
"Upgrade - Insecure - Requests: 1\n");
190 sendMessage += _T (
"User - Agent: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 67.0.3396.99 Safari / 537.36\n");
191 sendMessage += _T (
"Accept: text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, image / apng, */*;q=0.8\n");
192 sendMessage += _T (
"Accept - Language: ja, en - US; q = 0.9, en; q = 0.8\n");
195 iRet = connector->
Send ((LPVOID)sendMessage.
Ctr (), sendMessage.
Len ());
200 iRet = connector->
Recv ((LPVOID)recvMessage.
Ptr (), 4096);
202 Logger::WriteMessage (readable.
Ctr ());
203 if (iRet == 0)
break;
207 TEST_METHOD (TcpClientTestNotExistHost)
211 Assert::AreEqual(0, builder.
Startup (), _T(
"SocketBuilder::Startup() failed.\n"));
214 Assert::IsNull(connector, _T(
"SocketBuilder::CreateTcpConnector() failed.\n"));
217 TEST_METHOD (GetHostByNameTest)
220 Assert::AreEqual(0, builder.
Startup (), _T(
"SocketBuilder::Startup() failed.\n"));
224 Assert::IsTrue (ret, _T(
"SocketBuilder::GetHostByName() failed.\n"));
225 Assert::AreEqual (_T (
"127.0.0.1"), buff1.
Ptr (), _T(
"SocketBuilder::GetHostByName() invalid response.\n"));
227 Logger::WriteMessage (buff1.
Ctr ());
231 Assert::IsTrue (ret, _T(
"SocketBuilder::GetHostByName() failed.\n"));
232 Assert::AreEqual (_T (
"133.243.3.26"), buff2.
Ptr (), _T(
"SocketBuilder::GetHostByName() invalid response.\n"));
234 Logger::WriteMessage (buff2.
Ctr ());
237 TEST_METHOD (TcpWaitBlockCancelTest)
240 Assert::AreEqual(0, builder.
Startup (), _T(
"SocketBuilder::Startup() failed.\n"));
243 auto serverFunction = [](LPVOID lpvParam)->DWORD
245 Logger::WriteMessage (
"[Server]Now start server thread.\n");
248 Assert::IsTrue(pBuilder->
Prepare (50000), _T(
"SocketBuilder::Prepare() failed.\n"));
250 Logger::WriteMessage (
"[Server]Now waiting.\n");
252 Assert::IsNull(connector, _T(
"SocketBuilder::Wait() failed.\n"));
254 Logger::WriteMessage (
"[Server]Now finish server thread.\n");
258 Assert::IsTrue(serverThread->
Create (serverFunction, &builder), _T(
"Thread::Create() failed.\n"));
262 auto clientFunction = [](LPVOID lpvParam)->DWORD
264 Logger::WriteMessage (
"[Client]Now start client thread.\n");
269 Logger::WriteMessage (
"[Client]fire cancel action.\n");
272 Logger::WriteMessage (
"[Client]Now finish client thread.\n");
276 Assert::IsTrue (clientThread->
Create (clientFunction, &builder), _T (
"Thread::Create() failed.\n"));
279 Assert::AreEqual(WAIT_OBJECT_0, serverThread->
Wait (60000), _T(
"Thread::Wait() failed.\n"));
280 Logger::WriteMessage (
"Server thread finished.\n");
283 Logger::WriteMessage (
"Finished.\n");
286 TEST_METHOD (TcpRecvBlockCancelTest)
291 auto serverFunction = [](LPVOID lpvParam)->DWORD
293 Logger::WriteMessage (
"[Server]Now start server thread.\n");
298 Assert::AreEqual(0, builder.
Startup (), _T(
"SocketBuilder::Startup() failed.\n"));
299 Assert::IsTrue(builder.
Prepare (50000), _T(
"SocketBuilder::Prepare() failed.\n"));
300 connector = builder.
Wait ();
301 Assert::IsNotNull(connector, _T(
"SocketBuilder::Wait() failed.\n"));
303 BYTE byBuf[1024]{ 0 };
305 Logger::WriteMessage (
"[Server]Now waiting.\n");
306 INT ret = connector->
Recv (byBuf,
sizeof (byBuf));
307 Logger::WriteMessage (
"[Server]Now unblocked.\n");
309 Logger::WriteMessage (
"[Server]Now finish server thread.\n");
314 auto clientFunction = [](LPVOID lpvParam)->DWORD
316 Logger::WriteMessage (
"[Client]Now start client thread.\n");
321 Assert::AreEqual(0, builder.
Startup (),_T(
"[Client]SocketBuilder::Startup() failed.\n"));
323 Assert::IsNotNull (connector, _T(
"[Client]SocketBuilder::CreateTcpConnector() failed.\n"));
328 message.
Format (_T (
"[Client]SocketBuilder::CreateTcpConnector() success. from %s:%d\n"), lpctszIPAddress, wPort);
329 Logger::WriteMessage (message.
Ctr());
332 Logger::WriteMessage (
"[Client]Now force unblocked by CancelRecv().\n");
335 Assert::AreEqual(0, connector->
Close (), _T(
"[Client]TcpConnector::Close() failed.\n"));
337 Logger::WriteMessage (
"[Client]Now finish client thread.\n");
341 Assert::IsTrue(serverThread->
Create (serverFunction, &connector), _T(
"serverThread.Create() failed.\n"));
343 Assert::IsTrue(clientThread->
Create (clientFunction, &connector), _T(
"clientThread.Create() failed.\n"));
346 Assert::AreEqual(WAIT_OBJECT_0, clientThread->
Wait (), _T(
"clientThread.Wait() failed.\n"));
347 Logger::WriteMessage (
"Client thread finished.\n");
348 Assert::AreEqual(WAIT_OBJECT_0, serverThread->
Wait (), _T(
"serverThread.Wait() failed.\n"));
349 Logger::WriteMessage (
"Server thread finished.\n");
353 Logger::WriteMessage (
"Finished.\n");
ソケットに関するWindowsAPIを集約したクラス
文字列に関するWindowsAPIを集約したクラス
TCP通信に関するWindowsAPIを集約したクラス
スレッドに関するWindowsAPIを集約したクラス
ソケットに関するWindowsAPIを集約したクラス
int APIENTRY Startup()
Windowsソケットの使用準備
BOOL APIENTRY Prepare(u_short portNo, LPCTSTR lpctszIpAddr=NULL)
TCPポートのlisten(),accept()の準備
BOOL CancelWait()
Wait()待機中のキャンセル処理
TcpConnector *APIENTRY CreateTcpConnector(LPCTSTR lpctszIpAddr, u_short portNo, int retryInterval, int retryCount)
TcpConnectorの作成
BOOL APIENTRY GetHostByName(LPCTSTR lpctszHostName, LPCTSTR lptszIpAddr) const
ホスト名からIPアドレスのDNS解決
TcpConnector *APIENTRY Wait()
TCP接続のlisten(),accept()待機関数
DWORD APIENTRY GetErrNo() const
WinSock API呼び出し時にエラーとなった時、 エラーの詳細を返します。
int APIENTRY Close()
ソケットが使用されていた場合、クローズします。
文字列に関するWindowsAPIを集約したクラス
TString &APIENTRY Format(LPCTSTR format,...)
フォーマットに従ってパラメータを文字列化します。
INT APIENTRY Byte() const
内部で確保している文字列(バイト数)を取得します。
INT APIENTRY Len() const
内部で確保している文字列数を取得します。
LPCTSTR APIENTRY Ctr() const
内部で確保している文字列ポインタを取得します。
LPTSTR APIENTRY Ptr() const
内部で確保している文字列ポインタを取得します。
BOOL APIENTRY FromMultiByte(LPCSTR lpcszSJIS, UINT codePage=CP_ACP)
マルチバイト文字列を取り込みます。
TCP通信に関するWindowsAPIを集約したクラス
INT APIENTRY Recv(LPVOID lpvBuf, DWORD dwSize, BOOL isBlocking=TRUE)
TCP受信処理
USHORT GetAcceptedPortNo()
受入先のポート番号を取得
BOOL CancelRecv()
Recv()待機中のキャンセル処理
LPCTSTR GetAcceptedAddress()
受け入れ先のIPアドレスを取得
INT APIENTRY Send(LPVOID lpvBuf, DWORD dwSize) const
TCP送信処理
スレッドに関するWindowsAPIを集約したクラス
BOOL APIENTRY Create(PTHREAD_START_ROUTINE function=NULL, LPVOID lpvParam=NULL, DWORD dwCreationFlag=0)
スレッドを作成します。
static const TString APIENTRY MakeGUID()
GUIDの作成
static SYSTEMTIME APIENTRY GetLocalTime()
ローカル時間の取得
static TString APIENTRY GetFormatTime(const SYSTEMTIME &systemTime)
SYSTEMTIME構造体の値を文字列化
DWORD APIENTRY Wait(DWORD dwWaitTime=INFINITE) const
シグナル状態になるとブロックを解除します。