Dmitry Timoshkov : kernel32/tests: Add DuplicateHandle test to the file access tests.
Alexandre Julliard
julliard at winehq.org
Wed Sep 25 14:18:00 CDT 2013
Module: wine
Branch: master
Commit: b4e375ecf4a1a21311634fb7a09c7e38dfcc2117
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b4e375ecf4a1a21311634fb7a09c7e38dfcc2117
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Wed Sep 25 18:31:50 2013 +0900
kernel32/tests: Add DuplicateHandle test to the file access tests.
---
dlls/kernel32/tests/file.c | 51 +++++++++++++++++++++++++++++++++++++++++--
1 files changed, 48 insertions(+), 3 deletions(-)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index a428672..dc69193 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -3890,11 +3890,27 @@ static void test_SetFileValidData(void)
DeleteFile(filename);
}
+static unsigned file_map_access(unsigned access)
+{
+ if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
+ if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
+ if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
+ if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
+ return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
+}
+
+static BOOL is_access_compatible(unsigned obj_access, unsigned desired_access)
+{
+ obj_access = file_map_access(obj_access);
+ desired_access = file_map_access(desired_access);
+ return (obj_access & desired_access) == desired_access;
+}
+
static void test_file_access(void)
{
static const struct
{
- int access, create_error, write_error, read_error;
+ unsigned access, create_error, write_error, read_error;
} td[] =
{
{ GENERIC_READ | GENERIC_WRITE, 0, 0, 0 },
@@ -3910,8 +3926,8 @@ static void test_file_access(void)
};
char path[MAX_PATH], fname[MAX_PATH];
unsigned char buf[16];
- HANDLE hfile;
- DWORD i, ret, bytes;
+ HANDLE hfile, hdup;
+ DWORD i, j, ret, bytes;
GetTempPath(MAX_PATH, path);
GetTempFileName(path, "foo", 0, fname);
@@ -3930,6 +3946,35 @@ static void test_file_access(void)
else
ok(hfile != INVALID_HANDLE_VALUE, "%d: CreateFile error %d\n", i, GetLastError());
+ for (j = 0; j < sizeof(td)/sizeof(td[0]); j++)
+ {
+ SetLastError(0xdeadbeef);
+ ret = DuplicateHandle(GetCurrentProcess(), hfile, GetCurrentProcess(), &hdup,
+ td[j].access, 0, 0);
+ if (is_access_compatible(td[i].access, td[j].access))
+ ok(ret, "DuplicateHandle(%#x => %#x) error %d\n", td[i].access, td[j].access, GetLastError());
+ else
+ {
+ /* FIXME: Remove once Wine is fixed */
+ if ((td[j].access & (GENERIC_READ | GENERIC_WRITE)) ||
+ (!(td[i].access & (GENERIC_WRITE | FILE_WRITE_DATA)) && (td[j].access & FILE_WRITE_DATA)) ||
+ (!(td[i].access & (GENERIC_READ | FILE_READ_DATA)) && (td[j].access & FILE_READ_DATA)) ||
+ (!(td[i].access & (GENERIC_WRITE)) && (td[j].access & FILE_APPEND_DATA)))
+ {
+todo_wine
+ ok(!ret, "DuplicateHandle(%#x => %#x) should fail\n", td[i].access, td[j].access);
+todo_wine
+ ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
+ }
+ else
+ {
+ ok(!ret, "DuplicateHandle(%#x => %#x) should fail\n", td[i].access, td[j].access);
+ ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
+ }
+ }
+ if (ret) CloseHandle(hdup);
+ }
+
SetLastError(0xdeadbeef);
bytes = 0xdeadbeef;
ret = WriteFile(hfile, "\x5e\xa7", 2, &bytes, NULL);
More information about the wine-cvs
mailing list