diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index 4730ec4..4e12800 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -2186,6 +2186,113 @@ static void test_ReplaceFileW(void) "DeleteFileW: error (backup) %d\n", GetLastError()); } +struct access_res +{ + BOOL gothandle; + DWORD lasterr; +}; + +struct access_res create[16] = +{ + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { FALSE, ERROR_SHARING_VIOLATION }, + { FALSE, ERROR_SHARING_VIOLATION }, + { FALSE, ERROR_SHARING_VIOLATION }, + { TRUE, ERROR_SUCCESS }, + { FALSE, ERROR_SHARING_VIOLATION }, + { FALSE, ERROR_SHARING_VIOLATION }, + { FALSE, ERROR_SHARING_VIOLATION }, + { TRUE, ERROR_SUCCESS }, + { FALSE, ERROR_SHARING_VIOLATION }, + { FALSE, ERROR_SHARING_VIOLATION }, + { FALSE, ERROR_SHARING_VIOLATION }, + { TRUE, ERROR_SUCCESS } +}; + +struct access_res create_close[16] = +{ + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS }, + { TRUE, ERROR_SUCCESS } +}; + +static void _test_file_access(LPCSTR file, struct access_res *ares, DWORD line) +{ + DWORD access = 0, share = 0; + DWORD lasterr; + HANDLE hfile; + int i, j, idx = 0; + + for (i = 0; i < 4; i++) + { + if (i == 0) access = 0; + if (i == 1) access = GENERIC_READ; + if (i == 2) access = GENERIC_WRITE; + if (i == 3) access = GENERIC_READ | GENERIC_WRITE; + + for (j = 0; j < 4; j++) + { + if (j == 0) share = 0; + if (j == 1) share = FILE_SHARE_READ; + if (j == 2) share = FILE_SHARE_WRITE; + if (j == 3) share = FILE_SHARE_READ | FILE_SHARE_WRITE; + + SetLastError(0xdeadbeef); + hfile = CreateFileA(file, access, share, NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, 0); + lasterr = GetLastError(); + + ok((hfile != INVALID_HANDLE_VALUE) == ares[idx].gothandle, + "(%d, handle, %d): Expected %d, got %d\n", + line, idx, ares[idx].gothandle, + (hfile != INVALID_HANDLE_VALUE)); + + ok(lasterr == ares[idx].lasterr, + "(%d, lasterr, %d): Expected %d, got %d\n", + line, idx, ares[idx].lasterr, lasterr); + + CloseHandle(hfile); + idx++; + } + } +} + +#define test_file_access(file, ares) _test_file_access(file, ares, __LINE__) + +static void test_access(void) +{ + HANDLE hfile; + + hfile = CreateFileA("winetest", GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, + FILE_ATTRIBUTE_NORMAL, 0); + ok(hfile != INVALID_HANDLE_VALUE, "Expected valid handle\n"); + + test_file_access("winetest", create); + + CloseHandle(hfile); + + test_file_access("winetest", create_close); + + DeleteFileA("winetest"); +} + START_TEST(file) { InitFunctionPointers(); @@ -2222,4 +2329,5 @@ START_TEST(file) test_RemoveDirectory(); test_ReplaceFileA(); test_ReplaceFileW(); + test_access(); } -- 1.5.4.3