James Hawkins : ole32: Test the file access and share modes of StgCreateDocFile.
Alexandre Julliard
julliard at winehq.org
Tue Aug 19 08:46:35 CDT 2008
Module: wine
Branch: master
Commit: 48524c9b92bf56d12627d03062e164f0c8138ccb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=48524c9b92bf56d12627d03062e164f0c8138ccb
Author: James Hawkins <jhawkins at codeweavers.com>
Date: Mon Aug 18 22:50:52 2008 -0500
ole32: Test the file access and share modes of StgCreateDocFile.
---
dlls/ole32/tests/storage32.c | 180 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 180 insertions(+), 0 deletions(-)
diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c
index 7dc633c..d0b60e8 100644
--- a/dlls/ole32/tests/storage32.c
+++ b/dlls/ole32/tests/storage32.c
@@ -999,6 +999,185 @@ static void test_ReadClassStm(void)
ok(IsEqualCLSID(&clsid, &test_stg_cls), "clsid should have been set to CLSID_WineTest\n");
}
+struct access_res
+{
+ BOOL gothandle;
+ DWORD lasterr;
+ BOOL todo;
+};
+
+struct access_res create[16] =
+{
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { TRUE, ERROR_SUCCESS, TRUE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { TRUE, ERROR_SUCCESS, TRUE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { TRUE, ERROR_SUCCESS, TRUE }
+};
+
+struct access_res create_commit[16] =
+{
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { TRUE, ERROR_SUCCESS, TRUE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { TRUE, ERROR_SUCCESS, TRUE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { FALSE, ERROR_SHARING_VIOLATION, FALSE },
+ { TRUE, ERROR_SUCCESS, TRUE }
+};
+
+struct access_res create_close[16] =
+{
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE },
+ { TRUE, ERROR_SUCCESS, FALSE }
+};
+
+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();
+ if (ares[idx].todo)
+ {
+ todo_wine
+ {
+ 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));
+ }
+ }
+ else
+ 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));
+
+ if (ares[idx].todo)
+ {
+ todo_wine
+ {
+ ok(lasterr == ares[idx].lasterr,
+ "(%d, lasterr, %d): Expected %d, got %d\n",
+ line, idx, ares[idx].lasterr, lasterr);
+ }
+ }
+ else
+ {
+ 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)
+{
+ IStorage *stg;
+ HRESULT hr;
+
+ static const WCHAR fileW[] = {'w','i','n','e','t','e','s','t',0};
+
+ /* STGM_TRANSACTED */
+
+ hr = StgCreateDocfile(fileW, STGM_CREATE | STGM_READWRITE |
+ STGM_SHARE_EXCLUSIVE | STGM_TRANSACTED, 0, &stg);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+ test_file_access("winetest", create);
+
+ hr = IStorage_Commit(stg, STGC_DEFAULT);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+ test_file_access("winetest", create_commit);
+
+ IStorage_Release(stg);
+
+ test_file_access("winetest", create_close);
+
+ DeleteFileA("winetest");
+
+ /* STGM_DIRECT */
+
+ hr = StgCreateDocfile(fileW, STGM_CREATE | STGM_READWRITE |
+ STGM_SHARE_EXCLUSIVE | STGM_DIRECT, 0, &stg);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+ test_file_access("winetest", create);
+
+ hr = IStorage_Commit(stg, STGC_DEFAULT);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+ test_file_access("winetest", create_commit);
+
+ IStorage_Release(stg);
+
+ test_file_access("winetest", create_close);
+
+ DeleteFileA("winetest");
+
+}
+
START_TEST(storage32)
{
test_hglobal_storage_stat();
@@ -1010,4 +1189,5 @@ START_TEST(storage32)
test_streamenum();
test_transact();
test_ReadClassStm();
+ test_access();
}
More information about the wine-cvs
mailing list