msi 1: Add tests for MSI SQL join queries
James Hawkins
truiken at gmail.com
Thu Sep 7 17:34:01 CDT 2006
Hi,
Changelog:
* Add tests for MSI SQL join queries.
dlls/msi/tests/db.c | 366 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 350 insertions(+), 16 deletions(-)
--
James Hawkins
-------------- next part --------------
From bbbee9417b567f4fbb0196fb2f574a047b9f2c5a Mon Sep 17 00:00:00 2001
From: James Hawkins <jhawkins at sphere.smo.corp.google.com>
Date: Thu, 7 Sep 2006 15:29:02 -0700
Subject: [PATCH] * Add tests for MSI SQL join queries.
---
dlls/msi/tests/db.c | 366 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 350 insertions(+), 16 deletions(-)
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c
index 58fda00..7316fb4 100644
--- a/dlls/msi/tests/db.c
+++ b/dlls/msi/tests/db.c
@@ -76,6 +76,126 @@ static UINT do_query(MSIHANDLE hdb, cons
return ret;
}
+static UINT run_query( MSIHANDLE hdb, MSIHANDLE hrec, const char *query )
+{
+ MSIHANDLE hview = 0;
+ UINT r;
+
+ r = MsiDatabaseOpenView(hdb, query, &hview);
+ if( r != ERROR_SUCCESS )
+ return r;
+
+ r = MsiViewExecute(hview, hrec);
+ if( r == ERROR_SUCCESS )
+ r = MsiViewClose(hview);
+ MsiCloseHandle(hview);
+ return r;
+}
+
+static UINT create_component_table( MSIHANDLE hdb )
+{
+ return run_query( hdb, 0,
+ "CREATE TABLE `Component` ( "
+ "`Component` CHAR(72) NOT NULL, "
+ "`ComponentId` CHAR(38), "
+ "`Directory_` CHAR(72) NOT NULL, "
+ "`Attributes` SHORT NOT NULL, "
+ "`Condition` CHAR(255), "
+ "`KeyPath` CHAR(72) "
+ "PRIMARY KEY `Component`)" );
+}
+
+static UINT create_feature_components_table( MSIHANDLE hdb )
+{
+ return run_query( hdb, 0,
+ "CREATE TABLE `FeatureComponents` ( "
+ "`Feature_` CHAR(38) NOT NULL, "
+ "`Component_` CHAR(72) NOT NULL "
+ "PRIMARY KEY `Feature_`, `Component_` )" );
+}
+
+static UINT create_std_dlls_table( MSIHANDLE hdb )
+{
+ return run_query( hdb, 0,
+ "CREATE TABLE `StdDlls` ( "
+ "`File` CHAR(255) NOT NULL, "
+ "`Binary_` CHAR(72) NOT NULL "
+ "PRIMARY KEY `File` )" );
+}
+
+static UINT create_binary_table( MSIHANDLE hdb )
+{
+ return run_query( hdb, 0,
+ "CREATE TABLE `Binary` ( "
+ "`Name` CHAR(72) NOT NULL, "
+ "`Data` CHAR(72) NOT NULL "
+ "PRIMARY KEY `Name` )" );
+}
+
+static UINT add_component_entry( MSIHANDLE hdb, const char *values )
+{
+ char insert[] = "INSERT INTO `Component` "
+ "(`Component`, `ComponentId`, `Directory_`, `Attributes`, `Condition`, `KeyPath`) "
+ "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, 0, query );
+ HeapFree(GetProcessHeap(), 0, query);
+ return r;
+}
+
+static UINT add_feature_components_entry( MSIHANDLE hdb, const char *values )
+{
+ char insert[] = "INSERT INTO `FeatureComponents` "
+ "(`Feature_`, `Component_`) "
+ "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, 0, query );
+ HeapFree(GetProcessHeap(), 0, query);
+ return r;
+}
+
+static UINT add_std_dlls_entry( MSIHANDLE hdb, const char *values )
+{
+ char insert[] = "INSERT INTO `StdDlls` "
+ "(`File`, `Binary_`) "
+ "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, 0, query );
+ HeapFree(GetProcessHeap(), 0, query);
+ return r;
+}
+
+static UINT add_binary_entry( MSIHANDLE hdb, const char *values )
+{
+ char insert[] = "INSERT INTO `Binary` "
+ "(`Name`, `Data`) "
+ "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, 0, query );
+ HeapFree(GetProcessHeap(), 0, query);
+ return r;
+}
+
static void test_msiinsert(void)
{
MSIHANDLE hdb = 0, hview = 0, hrec = 0;
@@ -458,22 +578,6 @@ static void test_msibadqueries(void)
ok(r == TRUE, "file didn't exist after commit\n");
}
-static UINT run_query( MSIHANDLE hdb, MSIHANDLE hrec, const char *query )
-{
- MSIHANDLE hview = 0;
- UINT r;
-
- r = MsiDatabaseOpenView(hdb, query, &hview);
- if( r != ERROR_SUCCESS )
- return r;
-
- r = MsiViewExecute(hview, hrec);
- if( r == ERROR_SUCCESS )
- r = MsiViewClose(hview);
- MsiCloseHandle(hview);
- return r;
-}
-
static void test_viewmodify(void)
{
MSIHANDLE hdb = 0, hview = 0, hrec = 0;
@@ -1545,6 +1649,235 @@ static void test_generate_transform(void
DeleteFile(mstfile);
}
+struct join_res
+{
+ const CHAR one[MAX_PATH];
+ const CHAR two[MAX_PATH];
+};
+
+static const struct join_res join_res_first[] =
+{
+ { "alveolar", "procerus" },
+ { "septum", "procerus" },
+ { "septum", "nasalis" },
+ { "ramus", "nasalis" },
+ { "malar", "mentalis" },
+};
+
+static const struct join_res join_res_second[] =
+{
+ { "nasal", "septum" },
+ { "mandible", "ramus" },
+};
+
+static const struct join_res join_res_third[] =
+{
+ { "msvcp.dll", "abcdefgh" },
+ { "msvcr.dll", "ijklmnop" },
+};
+
+static void test_join(void)
+{
+ MSIHANDLE hdb, hview, hrec;
+ LPCSTR query;
+ CHAR buf[MAX_PATH];
+ UINT r, count;
+ DWORD size, i;
+
+ hdb = create_db();
+ ok( hdb, "failed to create db\n");
+
+ r = create_component_table( hdb );
+ ok( r == ERROR_SUCCESS, "cannot create Component table: %d\n", r );
+
+ r = add_component_entry( hdb, "'zygomatic', 'malar', 'INSTALLDIR', 0, '', ''" );
+ ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
+
+ r = add_component_entry( hdb, "'maxilla', 'alveolar', 'INSTALLDIR', 0, '', ''" );
+ ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
+
+ r = add_component_entry( hdb, "'nasal', 'septum', 'INSTALLDIR', 0, '', ''" );
+ ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
+
+ r = add_component_entry( hdb, "'mandible', 'ramus', 'INSTALLDIR', 0, '', ''" );
+ ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
+
+ r = create_feature_components_table( hdb );
+ ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r );
+
+ r = add_feature_components_entry( hdb, "'procerus', 'maxilla'" );
+ ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
+
+ r = add_feature_components_entry( hdb, "'procerus', 'nasal'" );
+ ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
+
+ r = add_feature_components_entry( hdb, "'nasalis', 'nasal'" );
+ ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
+
+ r = add_feature_components_entry( hdb, "'nasalis', 'mandible'" );
+ ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
+
+ r = add_feature_components_entry( hdb, "'nasalis', 'notacomponent'" );
+ ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
+
+ r = add_feature_components_entry( hdb, "'mentalis', 'zygomatic'" );
+ ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
+
+ r = create_std_dlls_table( hdb );
+ ok( r == ERROR_SUCCESS, "cannot create StdDlls table: %d\n", r );
+
+ r = add_std_dlls_entry( hdb, "'msvcp.dll', 'msvcp.dll.01234'" );
+ ok( r == ERROR_SUCCESS, "cannot add std dlls: %d\n", r );
+
+ r = add_std_dlls_entry( hdb, "'msvcr.dll', 'msvcr.dll.56789'" );
+ ok( r == ERROR_SUCCESS, "cannot add std dlls: %d\n", r );
+
+ r = create_binary_table( hdb );
+ ok( r == ERROR_SUCCESS, "cannot create Binary table: %d\n", r );
+
+ r = add_binary_entry( hdb, "'msvcp.dll.01234', 'abcdefgh'" );
+ ok( r == ERROR_SUCCESS, "cannot add binary: %d\n", r );
+
+ r = add_binary_entry( hdb, "'msvcr.dll.56789', 'ijklmnop'" );
+ ok( r == ERROR_SUCCESS, "cannot add binary: %d\n", r );
+
+ query = "SELECT `Component`.`ComponentId`, `FeatureComponents`.`Feature_` "
+ "FROM `Component`, `FeatureComponents` "
+ "WHERE `Component`.`Component` = `FeatureComponents`.`Component_` "
+ "ORDER BY `Feature_`";
+ r = MsiDatabaseOpenView(hdb, query, &hview);
+ ok( r == ERROR_SUCCESS, "failed to open view: %d\n", r );
+
+ r = MsiViewExecute(hview, 0);
+ ok( r == ERROR_SUCCESS, "failed to execute view: %d\n", r );
+
+ i = 0;
+ while ((r = MsiViewFetch(hview, &hrec)) == ERROR_SUCCESS)
+ {
+ count = MsiRecordGetFieldCount( hrec );
+ ok( count == 2, "Expected 2 record fields, got %d\n", count );
+
+ size = MAX_PATH;
+ r = MsiRecordGetString( hrec, 1, buf, &size );
+ ok( r == ERROR_SUCCESS, "failed to get record string: %d\n", r );
+ if (i == 2 || i == 3) todo_wine
+ {
+ ok( !lstrcmp( buf, join_res_first[i].one ),
+ "Expected '%s', got %s\n", join_res_first[i].one, buf );
+ }
+
+ size = MAX_PATH;
+ r = MsiRecordGetString( hrec, 2, buf, &size );
+ ok( r == ERROR_SUCCESS, "failed to get record string: %d\n", r );
+ if (i == 3) todo_wine
+ {
+ ok( !lstrcmp( buf, join_res_first[i].two ),
+ "Expected '%s', got %s\n", join_res_first[i].two, buf );
+ }
+
+ i++;
+ MsiCloseHandle(hrec);
+ }
+
+ ok( r == ERROR_NO_MORE_ITEMS, "expected no more items: %d\n", r );
+
+ MsiViewClose(hview);
+ MsiCloseHandle(hview);
+
+ query = "SELECT DISTINCT Component, ComponentId FROM FeatureComponents, Component "
+ "WHERE FeatureComponents.Component_=Component.Component "
+ "AND (Feature_='nasalis') ORDER BY Feature_";
+ r = MsiDatabaseOpenView(hdb, query, &hview);
+ todo_wine
+ {
+ ok( r == ERROR_SUCCESS, "failed to open view: %d\n", r );
+ }
+
+ r = MsiViewExecute(hview, 0);
+ todo_wine
+ {
+ ok( r == ERROR_SUCCESS, "failed to execute view: %d\n", r );
+ }
+
+ i = 0;
+ while ((r = MsiViewFetch(hview, &hrec)) == ERROR_SUCCESS)
+ {
+ count = MsiRecordGetFieldCount( hrec );
+ ok( count == 2, "Expected 2 record fields, got %d\n", count );
+
+ size = MAX_PATH;
+ r = MsiRecordGetString( hrec, 1, buf, &size );
+ ok( r == ERROR_SUCCESS, "failed to get record string: %d\n", r );
+ ok( !lstrcmp( buf, join_res_second[i].one ),
+ "Expected '%s', got %s\n", join_res_second[i].one, buf );
+
+ size = MAX_PATH;
+ r = MsiRecordGetString( hrec, 2, buf, &size );
+ ok( r == ERROR_SUCCESS, "failed to get record string: %d\n", r );
+ ok( !lstrcmp( buf, join_res_second[i].two ),
+ "Expected '%s', got %s\n", join_res_second[i].two, buf );
+
+ i++;
+ MsiCloseHandle(hrec);
+ }
+
+ todo_wine
+ {
+ ok( r == ERROR_NO_MORE_ITEMS, "expected no more items: %d\n", r );
+ }
+
+ MsiViewClose(hview);
+ MsiCloseHandle(hview);
+
+ query = "SELECT `StdDlls`.`File`, `Binary`.`Data` "
+ "FROM `StdDlls`, `Binary` "
+ "WHERE `StdDlls`.`Binary_` = `Binary`.`Name` "
+ "ORDER BY `File`";
+ r = MsiDatabaseOpenView(hdb, query, &hview);
+ todo_wine
+ {
+ ok( r == ERROR_SUCCESS, "failed to open view: %d\n", r );
+ }
+
+ r = MsiViewExecute(hview, 0);
+ todo_wine
+ {
+ ok( r == ERROR_SUCCESS, "failed to execute view: %d\n", r );
+ }
+
+ i = 0;
+ while ((r = MsiViewFetch(hview, &hrec)) == ERROR_SUCCESS)
+ {
+ count = MsiRecordGetFieldCount( hrec );
+ ok( count == 2, "Expected 2 record fields, got %d\n", count );
+
+ size = MAX_PATH;
+ r = MsiRecordGetString( hrec, 1, buf, &size );
+ ok( r == ERROR_SUCCESS, "failed to get record string: %d\n", r );
+ ok( !lstrcmp( buf, join_res_third[i].one ),
+ "Expected '%s', got %s\n", join_res_third[i].one, buf );
+
+ size = MAX_PATH;
+ r = MsiRecordGetString( hrec, 2, buf, &size );
+ ok( r == ERROR_SUCCESS, "failed to get record string: %d\n", r );
+ ok( !lstrcmp( buf, join_res_third[i].two ),
+ "Expected '%s', got %s\n", join_res_third[i].two, buf );
+
+ i++;
+ MsiCloseHandle(hrec);
+ }
+
+ todo_wine
+ {
+ ok( r == ERROR_NO_MORE_ITEMS, "expected no more items: %d\n", r );
+ }
+
+ MsiViewClose(hview);
+ MsiCloseHandle(hview);
+ MsiCloseHandle(hdb);
+ DeleteFile(msifile);
+}
+
START_TEST(db)
{
test_msidatabase();
@@ -1562,4 +1895,5 @@ START_TEST(db)
test_markers();
test_handle_limit();
test_generate_transform();
+ test_join();
}
--
1.4.2
More information about the wine-patches
mailing list