msi: Test the file access and share modes of MsiOpenDatabase.
This commit is contained in:
parent
e64a699b07
commit
0e6bfb3b43
|
@ -6358,6 +6358,176 @@ static void test_sourcedir(void)
|
|||
DeleteFileA(msifile);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
MSIHANDLE hdb;
|
||||
UINT r;
|
||||
|
||||
r = MsiOpenDatabaseA(msifile, MSIDBOPEN_CREATE, &hdb);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
test_file_access(msifile, create);
|
||||
|
||||
r = MsiDatabaseCommit(hdb);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
test_file_access(msifile, create_commit);
|
||||
|
||||
MsiCloseHandle(hdb);
|
||||
|
||||
test_file_access(msifile, create_close);
|
||||
|
||||
DeleteFileA(msifile);
|
||||
|
||||
r = MsiOpenDatabaseA(msifile, MSIDBOPEN_CREATEDIRECT, &hdb);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
test_file_access(msifile, create);
|
||||
|
||||
r = MsiDatabaseCommit(hdb);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
test_file_access(msifile, create_commit);
|
||||
|
||||
MsiCloseHandle(hdb);
|
||||
|
||||
test_file_access(msifile, create_close);
|
||||
|
||||
DeleteFileA(msifile);
|
||||
}
|
||||
|
||||
START_TEST(package)
|
||||
{
|
||||
GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
|
||||
|
@ -6383,4 +6553,5 @@ START_TEST(package)
|
|||
test_MsiGetSourcePath();
|
||||
test_shortlongsource();
|
||||
test_sourcedir();
|
||||
test_access();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue