ole32: Test the file access and share modes of StgCreateDocFile.
This commit is contained in:
parent
5f2159e806
commit
48524c9b92
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue