James Hawkins : msi: Fix current _Property table tests and add more
tests.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jul 11 07:50:56 CDT 2007
Module: wine
Branch: master
Commit: 5a8e0e8c1dad256c1b47885b889e63472879d516
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5a8e0e8c1dad256c1b47885b889e63472879d516
Author: James Hawkins <truiken at gmail.com>
Date: Wed Jul 11 00:10:20 2007 -0700
msi: Fix current _Property table tests and add more tests.
---
dlls/msi/tests/package.c | 181 +++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 161 insertions(+), 20 deletions(-)
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 2844a26..e30a0db 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -30,6 +30,28 @@
static const char msifile[] = "winetest.msi";
+static UINT do_query(MSIHANDLE hdb, const char *query, MSIHANDLE *phrec)
+{
+ MSIHANDLE hview = 0;
+ UINT r, ret;
+
+ /* open a select query */
+ r = MsiDatabaseOpenView(hdb, query, &hview);
+ if (r != ERROR_SUCCESS)
+ return r;
+ r = MsiViewExecute(hview, 0);
+ if (r != ERROR_SUCCESS)
+ return r;
+ ret = MsiViewFetch(hview, phrec);
+ r = MsiViewClose(hview);
+ if (r != ERROR_SUCCESS)
+ return r;
+ r = MsiCloseHandle(hview);
+ if (r != ERROR_SUCCESS)
+ return r;
+ return ret;
+}
+
static UINT run_query( MSIHANDLE hdb, const char *query )
{
MSIHANDLE hview = 0;
@@ -156,6 +178,15 @@ static UINT create_launchcondition_table( MSIHANDLE hdb )
"PRIMARY KEY `Condition`)" );
}
+static UINT create_property_table( MSIHANDLE hdb )
+{
+ return run_query( hdb,
+ "CREATE TABLE `Property` ("
+ "`Property` CHAR(72) NOT NULL, "
+ "`Value` CHAR(0) "
+ "PRIMARY KEY `Property`)" );
+}
+
static UINT add_component_entry( MSIHANDLE hdb, const char *values )
{
char insert[] = "INSERT INTO `Component` "
@@ -284,6 +315,22 @@ static UINT add_launchcondition_entry( MSIHANDLE hdb, const char *values )
return r;
}
+static UINT add_property_entry( MSIHANDLE hdb, const char *values )
+{
+ char insert[] = "INSERT INTO `Property` "
+ "(`Property`, `Value`) "
+ "VALUES( %s )";
+ char *query;
+ UINT sz, r;
+
+ sz = strlen(values) + sizeof insert;
+ query = HeapAlloc(GetProcessHeap(),0,sz);
+ sprintf(query,insert,values);
+ r = run_query( hdb, query );
+ HeapFree(GetProcessHeap(), 0, query);
+ return r;
+}
+
static UINT set_summary_info(MSIHANDLE hdb)
{
UINT res;
@@ -366,10 +413,12 @@ static MSIHANDLE package_from_db(MSIHANDLE hdb)
sprintf(szPackage,"#%li",hdb);
res = MsiOpenPackage(szPackage,&hPackage);
- ok( res == ERROR_SUCCESS , "Failed to open package\n" );
+ if (res != ERROR_SUCCESS)
+ return 0;
res = MsiCloseHandle(hdb);
- ok( res == ERROR_SUCCESS , "Failed to close db handle\n" );
+ if (res != ERROR_SUCCESS)
+ return 0;
return hPackage;
}
@@ -1568,13 +1617,52 @@ static void test_props(void)
DeleteFile(msifile);
}
-static void test_properties_table(void)
+static BOOL find_prop_in_property(MSIHANDLE hdb, LPCSTR prop, LPCSTR val)
+{
+ MSIHANDLE hview, hrec;
+ BOOL found;
+ CHAR buffer[MAX_PATH];
+ DWORD sz;
+ UINT r;
+
+ r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Property`", &hview);
+ ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
+ r = MsiViewExecute(hview, 0);
+ ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n");
+
+ found = FALSE;
+ while (r == ERROR_SUCCESS && !found)
+ {
+ r = MsiViewFetch(hview, &hrec);
+ if (r != ERROR_SUCCESS) break;
+
+ sz = MAX_PATH;
+ r = MsiRecordGetString(hrec, 1, buffer, &sz);
+ if (r == ERROR_SUCCESS && !lstrcmpA(buffer, prop))
+ {
+ sz = MAX_PATH;
+ r = MsiRecordGetString(hrec, 2, buffer, &sz);
+ if (r == ERROR_SUCCESS && !lstrcmpA(buffer, val))
+ found = TRUE;
+ }
+
+ MsiCloseHandle(hrec);
+ }
+
+ MsiViewClose(hview);
+ MsiCloseHandle(hview);
+
+ return found;
+}
+
+static void test_property_table(void)
{
const char *query;
UINT r;
- MSIHANDLE hpkg, hdb;
- char buffer[0x10];
+ MSIHANDLE hpkg, hdb, hrec;
+ char buffer[MAX_PATH];
DWORD sz;
+ BOOL found;
hdb = create_package_db();
ok( hdb, "failed to create package\n");
@@ -1582,45 +1670,98 @@ static void test_properties_table(void)
hpkg = package_from_db(hdb);
ok( hpkg, "failed to create package\n");
- query = "CREATE TABLE `_Properties` ( "
+ MsiCloseHandle(hdb);
+
+ hdb = MsiGetActiveDatabase(hpkg);
+
+ query = "CREATE TABLE `_Property` ( "
"`foo` INT NOT NULL, `bar` INT LOCALIZABLE PRIMARY KEY `foo`)";
r = run_query(hdb, query);
- ok(r == ERROR_INVALID_HANDLE, "failed to create table\n");
+ ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
- MsiCloseHandle( hpkg );
+ MsiCloseHandle(hdb);
+ MsiCloseHandle(hpkg);
DeleteFile(msifile);
hdb = create_package_db();
ok( hdb, "failed to create package\n");
- query = "CREATE TABLE `_Properties` ( "
+ query = "CREATE TABLE `_Property` ( "
"`foo` INT NOT NULL, `bar` INT LOCALIZABLE PRIMARY KEY `foo`)";
r = run_query(hdb, query);
ok(r == ERROR_SUCCESS, "failed to create table\n");
- query = "ALTER `_Properties` ADD `foo` INTEGER";
+ query = "ALTER `_Property` ADD `foo` INTEGER";
r = run_query(hdb, query);
ok(r == ERROR_BAD_QUERY_SYNTAX, "failed to add column\n");
- query = "ALTER TABLE `_Properties` ADD `foo` INTEGER";
+ query = "ALTER TABLE `_Property` ADD `foo` INTEGER";
r = run_query(hdb, query);
ok(r == ERROR_BAD_QUERY_SYNTAX, "failed to add column\n");
- query = "ALTER TABLE `_Properties` ADD `extra` INTEGER";
+ query = "ALTER TABLE `_Property` ADD `extra` INTEGER";
r = run_query(hdb, query);
todo_wine ok(r == ERROR_SUCCESS, "failed to add column\n");
hpkg = package_from_db(hdb);
- ok( hpkg, "failed to create package\n");
+ todo_wine
+ {
+ ok(!hpkg, "package should not be created\n");
+ }
- r = MsiSetProperty( hpkg, "foo", "bar");
- ok(r == ERROR_SUCCESS, "failed to create table\n");
+ MsiCloseHandle(hdb);
+ MsiCloseHandle(hpkg);
+ DeleteFile(msifile);
- sz = sizeof buffer;
- r = MsiGetProperty( hpkg, "foo", buffer, &sz);
- ok(r == ERROR_SUCCESS, "failed to create table\n");
+ hdb = create_package_db();
+ ok (hdb, "failed to create package database\n");
- MsiCloseHandle( hpkg );
+ r = create_property_table(hdb);
+ ok(r == ERROR_SUCCESS, "cannot create Property table: %d\n", r);
+
+ r = add_property_entry(hdb, "'prop', 'val'");
+ ok(r == ERROR_SUCCESS, "cannot add property: %d\n", r);
+
+ hpkg = package_from_db(hdb);
+ ok(hpkg, "failed to create package\n");
+
+ MsiCloseHandle(hdb);
+
+ sz = MAX_PATH;
+ r = MsiGetProperty(hpkg, "prop", buffer, &sz);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(!lstrcmp(buffer, "val"), "Expected val, got %s\n", buffer);
+
+ hdb = MsiGetActiveDatabase(hpkg);
+
+ found = find_prop_in_property(hdb, "prop", "val");
+ ok(found, "prop should be in the _Property table\n");
+
+ r = add_property_entry(hdb, "'dantes', 'mercedes'");
+ ok(r == ERROR_SUCCESS, "cannot add property: %d\n", r);
+
+ query = "SELECT * FROM `_Property` WHERE `Property` = 'dantes'";
+ r = do_query(hdb, query, &hrec);
+ ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
+
+ found = find_prop_in_property(hdb, "dantes", "mercedes");
+ ok(found == FALSE, "dantes should not be in the _Property table\n");
+
+ sz = MAX_PATH;
+ lstrcpy(buffer, "aaa");
+ r = MsiGetProperty(hpkg, "dantes", buffer, &sz);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(lstrlenA(buffer) == 0, "Expected empty string, got %s\n", buffer);
+
+ r = MsiSetProperty(hpkg, "dantes", "mercedes");
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+ found = find_prop_in_property(hdb, "dantes", "mercedes");
+ ok(found == TRUE, "dantes should be in the _Property table\n");
+
+ MsiCloseHandle(hdb);
+ MsiCloseHandle(hrec);
+ MsiCloseHandle(hpkg);
DeleteFile(msifile);
}
@@ -3307,7 +3448,7 @@ START_TEST(package)
test_gettargetpath_bad();
test_settargetpath();
test_props();
- test_properties_table();
+ test_property_table();
test_condition();
test_msipackage();
test_formatrecord2();
More information about the wine-cvs
mailing list