From 70868dfa610320074d513c06c82442c7e9ba189a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20D=C3=B6singer?= Date: Mon, 17 Dec 2007 18:16:49 +0100 Subject: [PATCH] kernel32: Add a test for BindIoCompletionCallback. --- dlls/kernel32/tests/sync.c | 108 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/dlls/kernel32/tests/sync.c b/dlls/kernel32/tests/sync.c index 616404e8241..e402fede9a5 100644 --- a/dlls/kernel32/tests/sync.c +++ b/dlls/kernel32/tests/sync.c @@ -282,10 +282,118 @@ static void test_event_security(void) CloseHandle(handle); } +static HANDLE sem = 0; + +static void CALLBACK iocp_callback(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped) +{ + ReleaseSemaphore(sem, 1, NULL); +} + +static BOOL WINAPI (*p_BindIoCompletionCallback)( HANDLE FileHandle, LPOVERLAPPED_COMPLETION_ROUTINE Function, ULONG Flags) = NULL; + +static void test_iocp_callback(void) +{ + char temp_path[MAX_PATH]; + char filename[MAX_PATH]; + DWORD ret; + BOOL retb; + static const char prefix[] = "pfx"; + HANDLE hFile; + HMODULE hmod = GetModuleHandleA("kernel32.dll"); + DWORD bytesWritten; + const char *buffer = "12345678123456781234567812345678"; + OVERLAPPED overlapped; + + p_BindIoCompletionCallback = (void*)GetProcAddress(hmod, "BindIoCompletionCallback"); + if(!p_BindIoCompletionCallback) { + skip("BindIoCompletionCallback not found in this DLL\n"); + return; + } + + sem = CreateSemaphore(NULL, 0, 1, NULL); + ok(sem != INVALID_HANDLE_VALUE, "Creating a semaphore failed\n"); + + ret = GetTempPathA(MAX_PATH, temp_path); + ok(ret != 0, "GetTempPathA error %d\n", GetLastError()); + ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n"); + + ret = GetTempFileNameA(temp_path, prefix, 0, filename); + ok(ret != 0, "GetTempFileNameA error %d\n", GetLastError()); + + hFile = CreateFileA(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_FLAG_RANDOM_ACCESS, 0); + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA: error %d\n", GetLastError()); + + retb = p_BindIoCompletionCallback(hFile, iocp_callback, 0); + ok(retb == FALSE, "BindIoCompletionCallback succeeded on a file that wasn't created with FILE_FLAG_OVERLAPPED\n"); + if(retb == FALSE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { + todo_wine ok (0, "BindIoCompletionCallback returned ERROR_CALL_NOT_IMPLEMENTED\n"); + return; + } + ok(GetLastError() == ERROR_INVALID_PARAMETER, "Last error is %d\n", GetLastError()); + + ret = CloseHandle(hFile); + ok( ret, "CloseHandle: error %d\n", GetLastError()); + ret = DeleteFileA(filename); + ok( ret, "DeleteFileA: error %d\n", GetLastError()); + + hFile = CreateFileA(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_FLAG_RANDOM_ACCESS | FILE_FLAG_OVERLAPPED, 0); + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA: error %d\n", GetLastError()); + + retb = p_BindIoCompletionCallback(hFile, iocp_callback, 0); + ok(retb == TRUE, "BindIoCompletionCallback failed\n"); + + memset(&overlapped, 0, sizeof(overlapped)); + retb = WriteFile(hFile, (const void *) buffer, 4, &bytesWritten, &overlapped); + ok(retb == TRUE || GetLastError() == ERROR_IO_PENDING, "WriteFile failed, lastError = %d\n", GetLastError()); + + ret = WaitForSingleObject(sem, 5000); + ok(ret == WAIT_OBJECT_0, "Wait for the IO completion callback failed\n"); + CloseHandle(sem); + + retb = p_BindIoCompletionCallback(hFile, iocp_callback, 0); + ok(retb == FALSE, "BindIoCompletionCallback succeeded when setting the same callback on the file again\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "Last error is %d\n", GetLastError()); + retb = p_BindIoCompletionCallback(hFile, NULL, 0); + ok(retb == FALSE, "BindIoCompletionCallback succeeded when setting the callback to NULL\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "Last error is %d\n", GetLastError()); + + ret = CloseHandle(hFile); + ok( ret, "CloseHandle: error %d\n", GetLastError()); + ret = DeleteFileA(filename); + ok( ret, "DeleteFileA: error %d\n", GetLastError()); + + hFile = CreateFileA(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_FLAG_RANDOM_ACCESS | FILE_FLAG_OVERLAPPED, 0); + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA: error %d\n", GetLastError()); + retb = p_BindIoCompletionCallback(hFile, NULL, 0); + ok(retb == TRUE, "BindIoCompletionCallback failed with a NULL callback(first time set)\n"); + ret = CloseHandle(hFile); + ok( ret, "CloseHandle: error %d\n", GetLastError()); + ret = DeleteFileA(filename); + ok( ret, "DeleteFileA: error %d\n", GetLastError()); + + hFile = CreateFileA(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_FLAG_RANDOM_ACCESS | FILE_FLAG_OVERLAPPED, 0); + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA: error %d\n", GetLastError()); + retb = p_BindIoCompletionCallback(hFile, iocp_callback, 12345); + ok(retb == TRUE, "BindIoCompletionCallback failed with Flags != 0\n"); + ret = CloseHandle(hFile); + ok( ret, "CloseHandle: error %d\n", GetLastError()); + ret = DeleteFileA(filename); + ok( ret, "DeleteFileA: error %d\n", GetLastError()); + + retb = p_BindIoCompletionCallback(NULL, iocp_callback, 0); + ok(retb == FALSE, "BindIoCompletionCallback succeeded on a NULL file\n"); + ok(GetLastError() == ERROR_INVALID_HANDLE, "Last error is %d\n", GetLastError()); +} + START_TEST(sync) { test_signalandwait(); test_mutex(); test_slist(); test_event_security(); + test_iocp_callback(); } -- 2.11.4.GIT