James Hawkins : msi: Properly add a storage to the database and verify its contents.
Alexandre Julliard
julliard at winehq.org
Tue Jul 8 06:11:08 CDT 2008
Module: wine
Branch: master
Commit: ae9b57913534a68e51aae10a7ef0334fe64c9d06
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ae9b57913534a68e51aae10a7ef0334fe64c9d06
Author: James Hawkins <jhawkins at codeweavers.com>
Date: Mon Jul 7 23:58:11 2008 -0500
msi: Properly add a storage to the database and verify its contents.
---
dlls/msi/tests/db.c | 97 ++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 85 insertions(+), 12 deletions(-)
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c
index 5d5eb08..0b2dac4 100644
--- a/dlls/msi/tests/db.c
+++ b/dlls/msi/tests/db.c
@@ -5996,11 +5996,47 @@ static void test_where_viewmodify(void)
MsiCloseHandle(hdb);
}
+static BOOL create_storage(LPCSTR name)
+{
+ WCHAR nameW[MAX_PATH];
+ IStorage *stg;
+ IStream *stm;
+ HRESULT hr;
+ DWORD count;
+ BOOL res = FALSE;
+
+ MultiByteToWideChar(CP_ACP, 0, name, -1, nameW, MAX_PATH);
+ hr = StgCreateDocfile(nameW, STGM_CREATE | STGM_READWRITE |
+ STGM_DIRECT | STGM_SHARE_EXCLUSIVE, 0, &stg);
+ if (FAILED(hr))
+ return FALSE;
+
+ hr = IStorage_CreateStream(stg, nameW, STGM_WRITE | STGM_SHARE_EXCLUSIVE,
+ 0, 0, &stm);
+ if (FAILED(hr))
+ goto done;
+
+ hr = IStream_Write(stm, "stgdata", 8, &count);
+ if (SUCCEEDED(hr))
+ res = TRUE;
+
+done:
+ IStream_Release(stm);
+ IStorage_Release(stg);
+
+ return res;
+}
+
static void test_storages_table(void)
{
MSIHANDLE hdb, hview, hrec;
+ IStorage *stg, *inner;
+ IStream *stm;
char file[MAX_PATH];
char buf[MAX_PATH];
+ WCHAR name[MAX_PATH];
+ LPCSTR query;
+ HRESULT hr;
DWORD size;
UINT r;
@@ -6037,19 +6073,18 @@ static void test_storages_table(void)
MsiCloseHandle(hrec);
- /* insert a file into the _Storages table */
- create_file("test.txt");
+ create_storage("storage.bin");
hrec = MsiCreateRecord(2);
- MsiRecordSetString(hrec, 1, "data");
+ MsiRecordSetString(hrec, 1, "stgname");
- r = MsiRecordSetStream(hrec, 2, "test.txt");
+ r = MsiRecordSetStream(hrec, 2, "storage.bin");
ok(r == ERROR_SUCCESS, "Failed to add stream data to the hrecord: %d\n", r);
- DeleteFile("test.txt");
+ DeleteFileA("storage.bin");
- r = MsiDatabaseOpenView(hdb,
- "INSERT INTO `_Storages` (`Name`, `Data`) VALUES (?, ?)", &hview);
+ query = "INSERT INTO `_Storages` (`Name`, `Data`) VALUES (?, ?)";
+ r = MsiDatabaseOpenView(hdb, query, &hview);
todo_wine
{
ok(r == ERROR_SUCCESS, "Failed to open database hview: %d\n", r);
@@ -6062,10 +6097,11 @@ static void test_storages_table(void)
}
MsiCloseHandle(hrec);
+ MsiViewClose(hview);
MsiCloseHandle(hview);
- r = MsiDatabaseOpenView(hdb,
- "SELECT `Name`, `Data` FROM `_Storages`", &hview);
+ query = "SELECT `Name`, `Data` FROM `_Storages`";
+ r = MsiDatabaseOpenView(hdb, query, &hview);
todo_wine
{
ok(r == ERROR_SUCCESS, "Failed to open database hview: %d\n", r);
@@ -6088,7 +6124,7 @@ static void test_storages_table(void)
todo_wine
{
ok(r == ERROR_SUCCESS, "Failed to get string: %d\n", r);
- ok(!lstrcmp(file, "data"), "Expected 'data', got %s\n", file);
+ ok(!lstrcmp(file, "stgname"), "Expected \"stgname\", got \"%s\"\n", file);
}
size = MAX_PATH;
@@ -6097,7 +6133,7 @@ static void test_storages_table(void)
ok(!lstrcmp(buf, "apple"), "Expected buf to be unchanged, got %s\n", buf);
todo_wine
{
- ok(r == ERROR_SUCCESS, "Failed to get stream: %d\n", r);
+ ok(r == ERROR_INVALID_DATA, "Expected ERROR_INVALID_DATA, got %d\n", r);
ok(size == 0, "Expected 0, got %d\n", size);
}
@@ -6109,9 +6145,46 @@ static void test_storages_table(void)
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
}
+ MsiViewClose(hview);
MsiCloseHandle(hview);
+
+ MsiDatabaseCommit(hdb);
MsiCloseHandle(hdb);
- DeleteFile(msifile);
+
+ MultiByteToWideChar(CP_ACP, 0, msifile, -1, name, MAX_PATH);
+ hr = StgOpenStorage(name, NULL, STGM_DIRECT | STGM_READ |
+ STGM_SHARE_DENY_WRITE, NULL, 0, &stg);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+ ok(stg != NULL, "Expected non-NULL storage\n");
+
+ MultiByteToWideChar(CP_ACP, 0, "stgname", -1, name, MAX_PATH);
+ hr = IStorage_OpenStorage(stg, name, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE,
+ NULL, 0, &inner);
+ todo_wine
+ {
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+ ok(inner != NULL, "Expected non-NULL storage\n");
+ }
+
+ /* FIXME: remove when wine is fixed */
+ if (inner)
+ {
+ MultiByteToWideChar(CP_ACP, 0, "storage.bin", -1, name, MAX_PATH);
+ hr = IStorage_OpenStream(inner, name, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stm);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+ ok(stm != NULL, "Expected non-NULL stream\n");
+
+ hr = IStream_Read(stm, buf, MAX_PATH, &size);
+ ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
+ ok(size == 8, "Expected 8, got %d\n", size);
+ ok(!lstrcmpA(buf, "stgdata"), "Expected \"stgdata\", got \"%s\"\n", buf);
+
+ IStream_Release(stm);
+ IStorage_Release(inner);
+ }
+
+ IStorage_Release(stg);
+ DeleteFileA(msifile);
}
START_TEST(db)
More information about the wine-cvs
mailing list