Vincent Povirk : kernel32/tests: Add named pipe test using i/ o completion ports.
Alexandre Julliard
julliard at winehq.org
Tue Mar 3 11:53:40 CST 2009
Module: wine
Branch: master
Commit: 392537bb338110c838d94e6beff7e916bccd2fe9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=392537bb338110c838d94e6beff7e916bccd2fe9
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Fri Feb 20 13:39:44 2009 -0600
kernel32/tests: Add named pipe test using i/o completion ports.
---
dlls/kernel32/tests/pipe.c | 111 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 111 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index 48d9e14..f4c5ad4 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -629,6 +629,112 @@ static DWORD CALLBACK serverThreadMain3(LPVOID arg)
return 0;
}
+/** Trivial byte echo server - uses i/o completion ports */
+static DWORD CALLBACK serverThreadMain4(LPVOID arg)
+{
+ int i;
+ HANDLE hcompletion;
+
+ trace("serverThreadMain4\n");
+ /* Set up a simple echo server */
+ hnp = CreateNamedPipe(PIPENAME "serverThreadMain4", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
+ PIPE_TYPE_BYTE | PIPE_WAIT,
+ /* nMaxInstances */ 1,
+ /* nOutBufSize */ 1024,
+ /* nInBufSize */ 1024,
+ /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT,
+ /* lpSecurityAttrib */ NULL);
+ ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n");
+
+ hcompletion = CreateIoCompletionPort(hnp, NULL, 12345, 1);
+ ok(hcompletion != NULL, "CreateIoCompletionPort failed, error=%i\n", GetLastError());
+
+ for (i = 0; i < NB_SERVER_LOOPS; i++) {
+ char buf[512];
+ DWORD written;
+ DWORD readden;
+ DWORD dummy;
+ DWORD success;
+ OVERLAPPED oConnect;
+ OVERLAPPED oRead;
+ OVERLAPPED oWrite;
+ OVERLAPPED *oResult;
+ DWORD err;
+ ULONG_PTR compkey;
+
+ memset(&oConnect, 0, sizeof(oConnect));
+ memset(&oRead, 0, sizeof(oRead));
+ memset(&oWrite, 0, sizeof(oWrite));
+
+ /* Wait for client to connect */
+ trace("Server calling overlapped ConnectNamedPipe...\n");
+ success = ConnectNamedPipe(hnp, &oConnect);
+ err = GetLastError();
+ ok(!success && (err == ERROR_IO_PENDING || err == ERROR_PIPE_CONNECTED) , "overlapped ConnectNamedPipe\n");
+ trace("overlapped ConnectNamedPipe returned.\n");
+ if (!success && err == ERROR_IO_PENDING) {
+ trace("ConnectNamedPipe GetQueuedCompletionStatus\n");
+ success = GetQueuedCompletionStatus(hcompletion, &dummy, &compkey, &oResult, 0);
+ if (!success)
+ {
+ ok( GetLastError() == WAIT_TIMEOUT,
+ "ConnectNamedPipe GetQueuedCompletionStatus wrong error %u\n", GetLastError());
+ success = GetQueuedCompletionStatus(hcompletion, &dummy, &compkey, &oResult, 10000);
+ }
+ ok(success, "ConnectNamedPipe GetQueuedCompletionStatus failed, errno=%i\n", GetLastError());
+ if (success)
+ {
+ ok(compkey == 12345, "got completion key %i instead of 12345\n", (int)compkey);
+ ok(oResult == &oConnect, "got overlapped pointer %p instead of %p\n", oResult, &oConnect);
+ }
+ }
+ trace("overlapped ConnectNamedPipe operation complete.\n");
+
+ /* Echo bytes once */
+ memset(buf, 0, sizeof(buf));
+
+ trace("Server reading...\n");
+ success = ReadFile(hnp, buf, sizeof(buf), &readden, &oRead);
+ trace("Server ReadFile returned...\n");
+ err = GetLastError();
+ ok(success || err == ERROR_IO_PENDING, "overlapped ReadFile, err=%i\n", err);
+ success = GetQueuedCompletionStatus(hcompletion, &readden, &compkey,
+ &oResult, 10000);
+ ok(success, "ReadFile GetQueuedCompletionStatus failed, errno=%i\n", GetLastError());
+ if (success)
+ {
+ ok(compkey == 12345, "got completion key %i instead of 12345\n", (int)compkey);
+ ok(oResult == &oRead, "got overlapped pointer %p instead of %p\n", oResult, &oRead);
+ }
+ trace("Server done reading.\n");
+
+ trace("Server writing...\n");
+ success = WriteFile(hnp, buf, readden, &written, &oWrite);
+ trace("Server WriteFile returned...\n");
+ err = GetLastError();
+ ok(success || err == ERROR_IO_PENDING, "overlapped WriteFile\n");
+ success = GetQueuedCompletionStatus(hcompletion, &written, &compkey,
+ &oResult, 10000);
+ ok(success, "WriteFile GetQueuedCompletionStatus failed, errno=%i\n", GetLastError());
+ if (success)
+ {
+ ok(compkey == 12345, "got completion key %i instead of 12345\n", (int)compkey);
+ ok(oResult == &oWrite, "got overlapped pointer %p instead of %p\n", oResult, &oWrite);
+ ok(written == readden, "write file len\n");
+ }
+ trace("Server done writing.\n");
+
+ /* finish this connection, wait for next one */
+ ok(FlushFileBuffers(hnp), "FlushFileBuffers\n");
+ ok(DisconnectNamedPipe(hnp), "DisconnectNamedPipe\n");
+ }
+
+ ok(CloseHandle(hnp), "CloseHandle named pipe failed, err=%i\n", GetLastError());
+ ok(CloseHandle(hcompletion), "CloseHandle completion failed, err=%i\n", GetLastError());
+
+ return 0;
+}
+
static void exercizeServer(const char *pipename, HANDLE serverThread)
{
int i;
@@ -711,6 +817,11 @@ static void test_NamedPipe_2(void)
ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n");
exercizeServer(PIPENAME "serverThreadMain3", serverThread);
+ /* Try server #4 */
+ serverThread = CreateThread(NULL, 0, serverThreadMain4, 0, 0, &serverThreadId);
+ ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n");
+ exercizeServer(PIPENAME "serverThreadMain4", serverThread);
+
ok(SetEvent( alarm_event ), "SetEvent\n");
CloseHandle( alarm_event );
trace("test_NamedPipe_2 returning\n");
More information about the wine-cvs
mailing list