Module: wine Branch: master Commit: 52e5087aece2505caf311f6e0af89ffef89e95bf URL: http://source.winehq.org/git/wine.git/?a=commit;h=52e5087aece2505caf311f6e0a...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Dec 16 01:02:41 2010 +0100
kernel32: Added more ReadDirectoryChangesW tests.
---
dlls/kernel32/tests/change.c | 174 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 174 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/tests/change.c b/dlls/kernel32/tests/change.c index 49dbb88..0e8804f 100644 --- a/dlls/kernel32/tests/change.c +++ b/dlls/kernel32/tests/change.c @@ -784,6 +784,179 @@ static void test_readdirectorychanges_filedir(void) ok( r == TRUE, "failed to remove directory\n"); }
+static void CALLBACK readdirectorychanges_cr(DWORD error, DWORD len, LPOVERLAPPED ov) +{ + ok(error == 0, "ReadDirectoryChangesW error %d\n", error); + ok(ov->hEvent == (void*)0xdeadbeef, "hEvent should not have changed\n"); +} + +static void test_readdirectorychanges_cr(void) +{ + static const WCHAR szBoo[] = { '\','b','o','o','\',0 }; + static const WCHAR szDir[] = { 'd','i','r',0 }; + static const WCHAR szFile[] = { 'f','i','l','e',0 }; + + WCHAR path[MAX_PATH], file[MAX_PATH], dir[MAX_PATH]; + FILE_NOTIFY_INFORMATION fni[1024], *fni_next; + OVERLAPPED ov; + HANDLE hdir, hfile; + NTSTATUS r; + + if (!pReadDirectoryChangesW) + { + win_skip("ReadDirectoryChangesW is not available\n"); + return; + } + + SetLastError(0xdeadbeef); + r = GetTempPathW(MAX_PATH, path); + if (!r && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) + { + win_skip("GetTempPathW is not implemented\n"); + return; + } + ok(r != 0, "temp path failed\n"); + if (!r) + return; + + lstrcatW(path, szBoo); + lstrcpyW(dir, path); + lstrcatW(dir, szDir); + lstrcpyW(file, path); + lstrcatW(file, szFile); + + DeleteFileW(file); + RemoveDirectoryW(dir); + RemoveDirectoryW(path); + + r = CreateDirectoryW(path, NULL); + ok(r == TRUE, "failed to create directory\n"); + + hdir = CreateFileW(path, GENERIC_READ, + FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL); + ok(hdir != INVALID_HANDLE_VALUE, "failed to open directory\n"); + + memset(&ov, 0, sizeof(ov)); + ov.hEvent = (void*)0xdeadbeef; + r = pReadDirectoryChangesW(hdir, fni, sizeof(fni), FALSE, + FILE_NOTIFY_CHANGE_FILE_NAME, NULL, &ov, readdirectorychanges_cr); + ok(r == TRUE, "pReadDirectoryChangesW failed\n"); + + hfile = CreateFileW(file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + ok(hfile != INVALID_HANDLE_VALUE, "failed to create file\n"); + CloseHandle(hfile); + + r = SleepEx(1000, TRUE); + ok(r != 0, "failed to receive file creation event\n"); + ok(fni->NextEntryOffset == 0, "there should be no more events in buffer\n"); + ok(fni->Action == FILE_ACTION_ADDED, "Action = %d\n", fni->Action); + ok(fni->FileNameLength == lstrlenW(szFile)*sizeof(WCHAR), + "FileNameLength = %d\n", fni->FileNameLength); + ok(!memcmp(fni->FileName, szFile, lstrlenW(szFile)*sizeof(WCHAR)), + "FileName = %s\n", wine_dbgstr_w(fni->FileName)); + + r = pReadDirectoryChangesW(hdir, fni, sizeof(fni), FALSE, + FILE_NOTIFY_CHANGE_FILE_NAME, NULL, &ov, readdirectorychanges_cr); + ok(r == TRUE, "pReadDirectoryChangesW failed\n"); + + /* This event will not be reported */ + r = CreateDirectoryW(dir, NULL); + ok(r == TRUE, "failed to create directory\n"); + + r = DeleteFileW(file); + ok(r == TRUE, "failed to delete file\n"); + + r = SleepEx(1000, TRUE); + ok(r != 0, "failed to receive file removal event\n"); + ok(fni->NextEntryOffset == 0, "there should be no more events in buffer\n"); + ok(fni->Action == FILE_ACTION_REMOVED, "Action = %d\n", fni->Action); + ok(fni->FileNameLength == lstrlenW(szFile)*sizeof(WCHAR), + "FileNameLength = %d\n", fni->FileNameLength); + ok(!memcmp(fni->FileName, szFile, lstrlenW(szFile)*sizeof(WCHAR)), + "FileName = %s\n", wine_dbgstr_w(fni->FileName)); + + CloseHandle(hdir); + + hdir = CreateFileW(path, GENERIC_READ, + FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL); + ok(hdir != INVALID_HANDLE_VALUE, "failed to open directory\n"); + + r = pReadDirectoryChangesW(hdir, fni, sizeof(fni), FALSE, + FILE_NOTIFY_CHANGE_DIR_NAME, NULL, &ov, readdirectorychanges_cr); + ok(r == TRUE, "pReadDirectoryChangesW failed\n"); + + r = MoveFileW(dir, file); + ok(r == TRUE, "failed to move directory\n"); + + r = SleepEx(1000, TRUE); + ok(r != 0, "failed to receive directory move event\n"); + ok(fni->Action == FILE_ACTION_RENAMED_OLD_NAME, "Action = %d\n", fni->Action); + ok(fni->FileNameLength == lstrlenW(szDir)*sizeof(WCHAR), + "FileNameLength = %d\n", fni->FileNameLength); + ok(!memcmp(fni->FileName, szDir, lstrlenW(szDir)*sizeof(WCHAR)), + "FileName = %s\n", wine_dbgstr_w(fni->FileName)); + if (fni->NextEntryOffset) + fni_next = (FILE_NOTIFY_INFORMATION*)((char*)fni+fni->NextEntryOffset); + else + { + r = pReadDirectoryChangesW(hdir, fni, sizeof(fni), FALSE, + FILE_NOTIFY_CHANGE_DIR_NAME, NULL, &ov, readdirectorychanges_cr); + ok(r == TRUE, "pReadDirectoryChangesW failed\n"); + + r = SleepEx(1000, TRUE); + ok(r != 0, "failed to receive directory move event\n"); + fni_next = fni; + } + ok(fni_next->NextEntryOffset == 0, "there should be no more events in buffer\n"); + ok(fni_next->Action == FILE_ACTION_RENAMED_NEW_NAME, "Action = %d\n", fni_next->Action); + ok(fni_next->FileNameLength == lstrlenW(szFile)*sizeof(WCHAR), + "FileNameLength = %d\n", fni_next->FileNameLength); + ok(!memcmp(fni_next->FileName, szFile, lstrlenW(szFile)*sizeof(WCHAR)), + "FileName = %s\n", wine_dbgstr_w(fni_next->FileName)); + + r = CreateDirectoryW(dir, NULL); + ok(r == TRUE, "failed to create directory\n"); + + r = RemoveDirectoryW(dir); + ok(r == TRUE, "failed to remove directory\n"); + + r = pReadDirectoryChangesW(hdir, fni, sizeof(fni), FALSE, + FILE_NOTIFY_CHANGE_DIR_NAME, NULL, &ov, readdirectorychanges_cr); + ok(r == TRUE, "pReadDirectoryChangesW failed\n"); + + r = SleepEx(1000, TRUE); + ok(r != 0, "failed to receive directory creation event\n"); + ok(fni->Action == FILE_ACTION_ADDED, "Action = %d\n", fni->Action); + ok(fni->FileNameLength == lstrlenW(szDir)*sizeof(WCHAR), + "FileNameLength = %d\n", fni->FileNameLength); + ok(!memcmp(fni->FileName, szDir, lstrlenW(szDir)*sizeof(WCHAR)), + "FileName = %s\n", wine_dbgstr_w(fni->FileName)); + if (fni->NextEntryOffset) + fni_next = (FILE_NOTIFY_INFORMATION*)((char*)fni+fni->NextEntryOffset); + else + { + r = pReadDirectoryChangesW(hdir, fni, sizeof(fni), FALSE, + FILE_NOTIFY_CHANGE_DIR_NAME, NULL, &ov, readdirectorychanges_cr); + ok(r == TRUE, "pReadDirectoryChangesW failed\n"); + + r = SleepEx(1000, TRUE); + ok(r != 0, "failed to receive directory removal event\n"); + fni_next = fni; + } + ok(fni_next->NextEntryOffset == 0, "there should be no more events in buffer\n"); + ok(fni_next->Action == FILE_ACTION_REMOVED, "Action = %d\n", fni_next->Action); + ok(fni_next->FileNameLength == lstrlenW(szDir)*sizeof(WCHAR), + "FileNameLength = %d\n", fni_next->FileNameLength); + ok(!memcmp(fni_next->FileName, szDir, lstrlenW(szDir)*sizeof(WCHAR)), + "FileName = %s\n", wine_dbgstr_w(fni_next->FileName)); + + CloseHandle(hdir); + RemoveDirectoryW(file); + RemoveDirectoryW(path); +} + static void test_ffcn_directory_overlap(void) { HANDLE parent_watch, child_watch, parent_thread, child_thread; @@ -884,5 +1057,6 @@ START_TEST(change) test_readdirectorychanges(); test_readdirectorychanges_null(); test_readdirectorychanges_filedir(); + test_readdirectorychanges_cr(); test_ffcn_directory_overlap(); }