12using namespace Microsoft::VisualStudio::CppUnitTestFramework;
14#define PIPE_NAME _T ("TEST_PIPE")
22 TEST_CLASS_INITIALIZE (ClassInitialize)
24 Logger::WriteMessage (
"NamedPipeTest class initialize.\n");
27 TEST_CLASS_CLEANUP (ClassCleanup)
29 Logger::WriteMessage (
"NamedPipeTest class cleanup.\n");
32 TEST_METHOD_INITIALIZE (MethodInitialize)
34 Logger::WriteMessage (
"NamedPipeTest method initialize.\n");
37 TEST_METHOD_CLEANUP (MethodCleanup)
39 Logger::WriteMessage (
"NamedPipeTest method cleanup.\n");
42 TEST_METHOD (NamedPipeStreamTest1)
44 auto serverFunc = [](LPVOID lpvParam)->DWORD
52 Assert::IsTrue (ret, _T (
"S)NamedPipe::Create() failed.\n"));
55 Assert::IsTrue (ret, _T (
"S)NamedPipe::Connect() failed.\n"));
62 Assert::Fail (_T (
"S)NamedPipe::PeekRemain() failed.\n"));
67 Logger::WriteMessage (
"S)メッセージが到着していません。\n");
72 Assert::AreEqual<DWORD> (6 *
sizeof (TCHAR), dwRet, _T (
"S)NamedPipe::PeekRemain() invalid size.\n"));
74 ZeroMemory (tszBuff,
sizeof (tszBuff));
77 Assert::IsTrue (ret, _T (
"S)NamedPipe::PeekData() failed.\n"));
78 Assert::AreNotEqual<DWORD> (0, dwRet, _T (
"S)NamedPipe::PeekData() invalid size.\n"));
79 Assert::AreEqual<int> (0, lstrcmp (_T (
"12345"), tszBuff), _T (
"S)受信(Peek)内容が想定外です。"));
81 ZeroMemory (tszBuff,
sizeof (tszBuff));
83 Assert::AreEqual<DWORD> (6 *
sizeof (TCHAR), dwRet, _T(
"NamedPipe::Read() failed.\n"));
84 Assert::AreEqual<int> (0, lstrcmp (_T (
"12345"), tszBuff), _T (
"S)受信(Read)内容が想定外です。"));
87 Assert::IsTrue (ret, _T (
"S)NamedPipe::Close() failed.\n"));
92 auto clientFunc = [](LPVOID lpvParam)->DWORD
100 Assert::IsTrue (ret, _T (
"C)NamedPipe::Wait() failed.\n"));
103 Assert::IsTrue (ret, _T (
"C)NamedPipe::Open() failed.\n"));
105 wsprintf (tszBuf, _T (
"%s"), _T (
"12345"));
106 dwRet = pipe.
Write (tszBuf, 6 *
sizeof (TCHAR));
107 Assert::AreEqual<DWORD> (6 *
sizeof (TCHAR), dwRet, _T (
"C)NamedPipe::Write() failed.\n"));
110 Assert::IsTrue (ret, _T (
"C)NamedPipe::Close() failed.\n"));
116 serverThread->
Create (serverFunc);
121 clientThread->
Create (clientFunc);
123 clientThread->
Wait ();
124 serverThread->
Wait ();
133 ServerPipe (
int instanceNo) { _instanceNo = instanceNo; };
137 BOOL ret = _pipe.Create (
PIPE_NAME, TRUE);
138 Assert::IsTrue (ret, _T (
"S)NamedPipe::Create() failed.\n"));
145 BOOL ret = _pipe.Connect ();
146 Assert::IsTrue (ret, _T (
"S)NamedPipe::Connect() failed.\n"));
153 BOOL ret = _pipe.Disconnect ();
154 Assert::IsTrue (ret, _T (
"S)NamedPipe::Disconnect() failed.\n"));
159 BOOL MessagePeek (LPTSTR lptszBuff, DWORD dwSize)
165 dwCheck = _pipe.PeekRemain ();
166 if (dwCheck == 0) Sleep (1000);
167 else if (dwSize > 0)
break;
168 else Assert::Fail (_T (
"S)NamedPipe::PeekRemain() failed.\n"));
171 dwCheck = _pipe.PeekData (lptszBuff, dwSize);
172 Assert::AreNotEqual<DWORD> (0, dwCheck, _T (
"S)NamedPipe::Peek() return 0.\n"));
174 return (dwCheck > 0);
179 BOOL ret = _pipe.Close ();
180 Assert::IsTrue (ret, _T (
"S)NamedPipe::Close() failed.\n"));
186 ServerPipe () { _instanceNo = -1; };
188 DWORD Invoke (LPVOID lpvParam)
197 if (dwSize == (DWORD)-1)
199 message.
Format (_T (
" S%d)Maybe disconnect.\n"), _instanceNo);
200 Logger::WriteMessage (message.
Ctr ());
205 byBuffer[dwSize] =
'\0';
208 wsprintf (tszBuf, _T (
" S%d)Received:%s %s\n"), _instanceNo, message.
Ctr (), (LPCTSTR)byBuffer);
209 Logger::WriteMessage (tszBuf);
213 message = _T (
"NEXT");
214 _pipe.Write (message.
Ctr (), message.
Byte ());
232 ClientPipe (
int instanceNo) { _instanceNo = instanceNo; };
237 Assert::IsTrue (ret, _T (
"C)NamedPipe::Wait() failed.\n"));
244 BOOL ret = _pipe.Open (_T (
"TEST_PIPE"));
245 Assert::IsTrue (ret, _T (
"C)NamedPipe::Open() failed.\n"));
252 BOOL ret = _pipe.Close ();
253 Assert::IsTrue (ret, _T (
"C)NamedPipe::Close() failed.\n"));
259 ClientPipe () { _instanceNo = -1; };
261 DWORD Read (LPVOID lpvBuf, DWORD dwSize)
263 return _pipe.Read (lpvBuf, dwSize);
266 DWORD Write (LPVOID lpvBuf, DWORD dwSize)
268 return _pipe.Write (lpvBuf, dwSize);
271 DWORD Invoke (LPVOID lpvParam)
276 for (
int i = 0; i < 10; i++)
279 wsprintf (tszBuff, _T (
"C%d)%03d %s"), _instanceNo, i, message.
Ctr ());
280 DWORD dwWrite = this->Write (tszBuff, lstrlen (tszBuff) *
sizeof (TCHAR));
283 ZeroMemory (tszBuff,
sizeof (tszBuff));
285 tszBuff[dwRead/2] = NULL;
286 message.
Format (_T (
" C%d)Received %s.\n"), _instanceNo, tszBuff);
287 Logger::WriteMessage (message.
Ctr());
301 TEST_METHOD (NamedPipeStreamTest2)
303 auto serverFunc = [](LPVOID lpvParam)->DWORD
307 TCHAR tszBuff[10] = { 0 };
309 for (
int i = 1; i <= 10; i++)
311 ServerPipe* pServerPipe =
new ServerPipe (i);
312 pServerPipe->Create ();
313 pServerPipe->Connect ();
314 pipes.
Add (*pServerPipe);
316 pServerPipe->MessagePeek (tszBuff,
sizeof (tszBuff));
317 if (!_memicmp (
"EXIT", tszBuff, 4))
319 Logger::WriteMessage (_T (
"S)Loop escaped.\n"));
325 container.
Add (*pThread);
331 auto clientFunc = [](LPVOID lpvParam)->DWORD
333 int clientNo = *((
int*)(lpvParam));
334 ClientPipe clientPipe (clientNo);
346 serverThread->
Create (serverFunc);
359 clientThread1->
Create (clientFunc, &client1);
361 clientThread2->
Create (clientFunc, &client2);
363 clientThread3->
Create (clientFunc, &client3);
365 clientThread1->
Wait ();
366 clientThread2->
Wait ();
367 clientThread3->
Wait ();
369 delete clientThread1;
370 delete clientThread2;
371 delete clientThread3;
376 terminator.
Write (
"EXIT", 4);
377 Logger::WriteMessage (
"'EXIT' send to server pipe.\n");
379 serverThread->
Wait (3000);
名前付きパイプに関するWindowsAPIを集約したクラス
スレッドに関するWindowsAPIを集約したクラス
BOOL APIENTRY Close()
使用しなくなったハンドルはこれでクローズします。
名前付きパイプに関するWindowsAPIを集約したクラス
BOOL APIENTRY Open(LPCTSTR lpctszName)
パイプをオープンします。
BOOL APIENTRY Connect() const
サーバー側でクライアント接続を待機します。
BOOL APIENTRY Wait(LPCTSTR lpctszName, DWORD dwTimeout=NMPWAIT_USE_DEFAULT_WAIT) const
クライアント側でサーバー接続を待機します。
DWORD APIENTRY PeekRemain() const
バッファ内に残っているメッセージサイズを取得します。
BOOL APIENTRY Create(LPCTSTR lpctszName, BOOL bStreamMode)
パイプを作成します。
DWORD APIENTRY PeekData(LPVOID lpvData, DWORD dwSize) const
メッセージ内容を取り出さずに読み取ります。
DWORD APIENTRY Read(LPVOID lpvBuffer, DWORD dwSize) const
HANDLEを使ってデータを読み込みます。
DWORD APIENTRY Write(LPCVOID lpcvBuffer, DWORD dwSize) const
HANDLEを使ってデータを書き込みます。
文字列に関するWindowsAPIを集約したクラス
TString &APIENTRY Format(LPCTSTR format,...)
フォーマットに従ってパラメータを文字列化します。
INT APIENTRY Byte() const
内部で確保している文字列(バイト数)を取得します。
LPCTSTR APIENTRY Ctr() const
内部で確保している文字列ポインタを取得します。
スレッドに関するWindowsAPIを集約したクラス
BOOL APIENTRY Create(PTHREAD_START_ROUTINE function=NULL, LPVOID lpvParam=NULL, DWORD dwCreationFlag=0)
スレッドを作成します。
static SYSTEMTIME APIENTRY GetLocalTime()
ローカル時間の取得
static TString APIENTRY GetFormatTime(const SYSTEMTIME &systemTime)
SYSTEMTIME構造体の値を文字列化
DWORD APIENTRY Wait(DWORD dwWaitTime=INFINITE) const
シグナル状態になるとブロックを解除します。
VOID APIENTRY Add(T &item)
Array<T>へ値を追加
Threadクラスのスレッド実行関数を設定します。