[PATCH 1/3] kernel32/tests: Add tests for consecutive calls to CreateFile.

Daniel Lehman dlehman25 at gmail.com
Fri Oct 23 00:53:14 CDT 2020


Signed-off-by: Daniel Lehman <dlehman25 at gmail.com>
---
 dlls/kernel32/tests/file.c | 58 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 57 insertions(+), 1 deletion(-)

diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index 9327d0319dd..cc7a518b9c3 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -3978,10 +3978,40 @@ static void test_CreateFile(void)
     /* 25*/ { TRUNCATE_EXISTING, GENERIC_READ|GENERIC_WRITE, 0, 0 },
     /* 26*/ { TRUNCATE_EXISTING, FILE_WRITE_DATA, ERROR_INVALID_PARAMETER, 0 }
     };
+    static const struct test_data2
+    {
+        DWORD disposition, access, share, share2, error;
+    } td2[] =
+    {
+    /* roughly matches dlls/ntdll/tests/file.c minus FILE_SUPERSEDE */
+    /*  0 */ { CREATE_ALWAYS, GENERIC_READ, 0, FILE_SHARE_READ, ERROR_SHARING_VIOLATION },
+    /*  1 */ { CREATE_ALWAYS, GENERIC_READ, FILE_SHARE_READ, 0, ERROR_SHARING_VIOLATION },
+    /*  2 */ { CREATE_ALWAYS, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_SHARE_READ, ERROR_ALREADY_EXISTS },
+    /*  3 */ { CREATE_ALWAYS, GENERIC_WRITE, 0, FILE_SHARE_WRITE, ERROR_SHARING_VIOLATION },
+    /*  4 */ { CREATE_ALWAYS, GENERIC_WRITE, FILE_SHARE_WRITE, 0, ERROR_ALREADY_EXISTS },
+    /*  5 */ { CREATE_NEW, GENERIC_READ, 0, FILE_SHARE_READ, ERROR_FILE_EXISTS },
+    /*  6 */ { CREATE_NEW, GENERIC_READ, FILE_SHARE_READ, 0, ERROR_FILE_EXISTS },
+    /*  7 */ { CREATE_NEW, GENERIC_WRITE, 0, FILE_SHARE_WRITE, ERROR_FILE_EXISTS },
+    /*  8 */ { CREATE_NEW, GENERIC_WRITE, FILE_SHARE_WRITE, 0, ERROR_FILE_EXISTS },
+    /*  9 */ { OPEN_ALWAYS, GENERIC_READ, 0, FILE_SHARE_READ, ERROR_SHARING_VIOLATION },
+    /* 10 */ { OPEN_ALWAYS, GENERIC_READ, FILE_SHARE_READ, 0, ERROR_ALREADY_EXISTS },
+    /* 11 */ { OPEN_ALWAYS, GENERIC_WRITE, 0, FILE_SHARE_WRITE, ERROR_SHARING_VIOLATION },
+    /* 12 */ { OPEN_ALWAYS, GENERIC_WRITE, FILE_SHARE_WRITE, 0, ERROR_ALREADY_EXISTS },
+    /* 13 */ { OPEN_EXISTING, GENERIC_READ, 0, FILE_SHARE_READ, ERROR_SHARING_VIOLATION },
+    /* 14 */ { OPEN_EXISTING, GENERIC_READ, FILE_SHARE_READ, 0, 0 },
+    /* 15 */ { OPEN_EXISTING, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_SHARE_READ, ERROR_SHARING_VIOLATION },
+    /* 16 */ { OPEN_EXISTING, GENERIC_WRITE, 0, FILE_SHARE_WRITE, ERROR_SHARING_VIOLATION },
+    /* 17 */ { OPEN_EXISTING, GENERIC_WRITE, FILE_SHARE_WRITE, 0, 0 },
+    /* 18 */ { TRUNCATE_EXISTING, GENERIC_READ, 0, FILE_SHARE_READ, ERROR_INVALID_PARAMETER },
+    /* 19 */ { TRUNCATE_EXISTING, GENERIC_READ, FILE_SHARE_READ, 0, ERROR_INVALID_PARAMETER },
+    /* 20 */ { TRUNCATE_EXISTING, GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE, ERROR_SHARING_VIOLATION },
+    /* 21 */ { TRUNCATE_EXISTING, GENERIC_WRITE, 0, FILE_SHARE_WRITE, ERROR_SHARING_VIOLATION },
+    /* 22 */ { TRUNCATE_EXISTING, GENERIC_WRITE, FILE_SHARE_WRITE, 0, 0 },
+    };
     char temp_path[MAX_PATH];
     char file_name[MAX_PATH];
     DWORD i, ret, written;
-    HANDLE hfile;
+    HANDLE hfile, hfile2;
 
     GetTempPathA(MAX_PATH, temp_path);
     GetTempFileNameA(temp_path, "tmp", 0, file_name);
@@ -4074,6 +4104,32 @@ todo_wine_if (i == 1)
     }
 
     DeleteFileA(file_name);
+
+    /* test consecutive calls to CreateFile */
+    for (i = 0; i < ARRAY_SIZE(td2); i++)
+    {
+        SetLastError(0xdeadbeef);
+        hfile  = CreateFileA(file_name, td2[i].access, td2[i].share, NULL, CREATE_NEW, 0, 0);
+        ok(GetLastError() == ERROR_SUCCESS, "%d: expected 0, got %d\n", i, GetLastError());
+        ok(hfile != INVALID_HANDLE_VALUE, "%d: CreateFile error %d\n", i, GetLastError());
+
+        SetLastError(0xdeadbeef);
+        hfile2 = CreateFileA(file_name, td2[i].access, td2[i].share2 ? td2[i].share2 : td2[i].share,
+                             NULL, td2[i].disposition, 0, 0);
+todo_wine_if(i == 1 || i == 18 || i == 19)
+        ok(GetLastError() == td2[i].error, "%d: expected %d, got %d\n", i, td2[i].error, GetLastError());
+todo_wine_if(i == 1 || i == 19)
+{
+        if (td2[i].error && (td2[i].error != ERROR_ALREADY_EXISTS))
+            ok(hfile2 == INVALID_HANDLE_VALUE, "%d: CreateFile should fail\n", i);
+        else
+            ok(hfile2 != INVALID_HANDLE_VALUE, "%d: CreateFile error %d\n", i, GetLastError());
+}
+        if (hfile2 != INVALID_HANDLE_VALUE)
+            CloseHandle(hfile2);
+        CloseHandle(hfile);
+        DeleteFileA(file_name);
+    }
 }
 
 static void test_GetFileInformationByHandleEx(void)
-- 
2.25.1




More information about the wine-devel mailing list