kernel32/tests: Add named pipe test using i/o completion ports.
This commit is contained in:
parent
c47e32a7cc
commit
392537bb33
|
@ -629,6 +629,112 @@ static DWORD CALLBACK serverThreadMain3(LPVOID arg)
|
||||||
return 0;
|
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)
|
static void exercizeServer(const char *pipename, HANDLE serverThread)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -711,6 +817,11 @@ static void test_NamedPipe_2(void)
|
||||||
ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n");
|
ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n");
|
||||||
exercizeServer(PIPENAME "serverThreadMain3", serverThread);
|
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");
|
ok(SetEvent( alarm_event ), "SetEvent\n");
|
||||||
CloseHandle( alarm_event );
|
CloseHandle( alarm_event );
|
||||||
trace("test_NamedPipe_2 returning\n");
|
trace("test_NamedPipe_2 returning\n");
|
||||||
|
|
Loading…
Reference in New Issue