Stefan Dösinger : kernel32: Add a test for BindIoCompletionCallback.

Alexandre Julliard julliard at winehq.org
Tue Dec 18 07:34:51 CST 2007


Module: wine
Branch: master
Commit: 70868dfa610320074d513c06c82442c7e9ba189a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=70868dfa610320074d513c06c82442c7e9ba189a

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Mon Dec 17 18:16:49 2007 +0100

kernel32: Add a test for BindIoCompletionCallback.

---

 dlls/kernel32/tests/sync.c |  108 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 108 insertions(+), 0 deletions(-)

diff --git a/dlls/kernel32/tests/sync.c b/dlls/kernel32/tests/sync.c
index 616404e..e402fed 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();
 }




More information about the wine-cvs mailing list