Add a test for opening an already opened file for writing in a not
compatible sharing mode.
diff --git a/dlls/kernel/tests/file.c b/dlls/kernel/tests/file.c
index 651763e..ef36a97 100644
--- a/dlls/kernel/tests/file.c
+++ b/dlls/kernel/tests/file.c
@@ -519,6 +519,8 @@
char temp_path[MAX_PATH];
char source[MAX_PATH], dest[MAX_PATH];
static const char prefix[] = "pfx";
+ HANDLE hfile;
+ char buf[10];
DWORD ret;
ret = GetTempPathA(MAX_PATH, temp_path);
@@ -528,15 +530,43 @@
ret = GetTempFileNameA(temp_path, prefix, 0, source);
ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
+ /* make the source have not zero size */
+ hfile = CreateFileA(source, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0 );
+ ok(hfile != INVALID_HANDLE_VALUE, "failed to open source file\n");
+ ok(WriteFile(hfile, prefix, sizeof(prefix), &ret, NULL ) && ret == sizeof(prefix),
+ "WriteFile error %ld\n", GetLastError());
+ ok(GetFileSize(hfile, NULL) == sizeof(prefix), "source file has wrong size\n");
+ CloseHandle(hfile);
+
ret = GetTempFileNameA(temp_path, prefix, 0, dest);
ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
+ SetLastError(0xdeadbeef);
ret = CopyFileA(source, dest, TRUE);
ok(!ret && GetLastError() == ERROR_FILE_EXISTS,
"CopyFileA: unexpected error %ld\n", GetLastError());
ret = CopyFileA(source, dest, FALSE);
- ok(ret, "CopyFileA: error %ld\n", GetLastError());
+ ok(ret, "CopyFileA: error %ld\n", GetLastError());
+
+ /* make sure that destination has correct size */
+ hfile = CreateFileA(dest, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
+ ok(hfile != INVALID_HANDLE_VALUE, "failed to open destination file\n");
+ ret = GetFileSize(hfile, NULL);
+ ok(ret == sizeof(prefix), "destination file has wrong size %ld\n", ret);
+
+ SetLastError(0xdeadbeef);
+ ret = CopyFileA(source, dest, FALSE);
+ ok(!ret && GetLastError() == ERROR_SHARING_VIOLATION,
+ "CopyFileA: ret = %ld, unexpected error %ld\n", ret, GetLastError());
+
+ /* make sure that destination still has correct size */
+ ret = GetFileSize(hfile, NULL);
+ ok(ret == sizeof(prefix), "destination file has wrong size %ld\n", ret);
+ ok(ReadFile(hfile, buf, sizeof(buf), &ret, NULL) && ret == sizeof(prefix),
+ "ReadFile: error %ld\n", GetLastError());
+ ok(!memcmp(prefix, buf, sizeof(prefix)), "buffer contents mismatch\n");
+ CloseHandle(hfile);
ret = DeleteFileA(source);
ok(ret, "DeleteFileA: error %ld\n", GetLastError());
@@ -568,7 +598,7 @@
"CopyFileW: unexpected error %ld\n", GetLastError());
ret = CopyFileW(source, dest, FALSE);
- ok(ret, "CopyFileW: error %ld\n", GetLastError());
+ ok(ret, "CopyFileW: error %ld\n", GetLastError());
ret = DeleteFileW(source);
ok(ret, "DeleteFileW: error %ld\n", GetLastError());