[PATCH v2 2/2] msi/tests: Move a test from format.c to package.c.
Zebediah Figura
z.figura12 at gmail.com
Tue Sep 19 10:50:15 CDT 2017
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/msi/tests/format.c | 511 -----------------------------------------------
dlls/msi/tests/package.c | 261 ++++++++++++++++++++++++
2 files changed, 261 insertions(+), 511 deletions(-)
diff --git a/dlls/msi/tests/format.c b/dlls/msi/tests/format.c
index b476c6b290..6cb52cf04d 100644
--- a/dlls/msi/tests/format.c
+++ b/dlls/msi/tests/format.c
@@ -28,206 +28,6 @@
#include "wine/test.h"
static const char msifile[] = "winetest-format.msi";
-static const WCHAR msifileW[] =
- {'w','i','n','e','t','e','s','t','-','f','o','r','m','a','t','.','m','s','i',0};
-
-static UINT run_query( MSIHANDLE hdb, const char *query )
-{
- MSIHANDLE hview = 0;
- UINT r;
-
- r = MsiDatabaseOpenViewA(hdb, query, &hview);
- if( r != ERROR_SUCCESS )
- return r;
-
- r = MsiViewExecute(hview, 0);
- if( r == ERROR_SUCCESS )
- r = MsiViewClose(hview);
- MsiCloseHandle(hview);
- return r;
-}
-
-static UINT create_feature_table( MSIHANDLE hdb )
-{
- return run_query( hdb,
- "CREATE TABLE `Feature` ( "
- "`Feature` CHAR(38) NOT NULL, "
- "`Feature_Parent` CHAR(38), "
- "`Title` CHAR(64), "
- "`Description` CHAR(255), "
- "`Display` SHORT NOT NULL, "
- "`Level` SHORT NOT NULL, "
- "`Directory_` CHAR(72), "
- "`Attributes` SHORT NOT NULL "
- "PRIMARY KEY `Feature`)" );
-}
-
-static UINT create_component_table( MSIHANDLE hdb )
-{
- return run_query( hdb,
- "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,
- "CREATE TABLE `FeatureComponents` ( "
- "`Feature_` CHAR(38) NOT NULL, "
- "`Component_` CHAR(72) NOT NULL "
- "PRIMARY KEY `Feature_`, `Component_` )" );
-}
-
-static UINT create_file_table( MSIHANDLE hdb )
-{
- return run_query( hdb,
- "CREATE TABLE `File` ("
- "`File` CHAR(72) NOT NULL, "
- "`Component_` CHAR(72) NOT NULL, "
- "`FileName` CHAR(255) NOT NULL, "
- "`FileSize` LONG NOT NULL, "
- "`Version` CHAR(72), "
- "`Language` CHAR(20), "
- "`Attributes` SHORT, "
- "`Sequence` SHORT NOT NULL "
- "PRIMARY KEY `File`)" );
-}
-
-static UINT create_custom_action_table( MSIHANDLE hdb )
-{
- return run_query( hdb,
- "CREATE TABLE `CustomAction` ("
- "`Action` CHAR(72) NOT NULL, "
- "`Type` SHORT NOT NULL, "
- "`Source` CHAR(75), "
- "`Target` CHAR(255) "
- "PRIMARY KEY `Action`)" );
-}
-
-#define make_add_entry(type, qtext) \
- static UINT add##_##type##_##entry( MSIHANDLE hdb, const char *values ) \
- { \
- char insert[] = qtext; \
- 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; \
- }
-
-make_add_entry(feature,
- "INSERT INTO `Feature` "
- "(`Feature`, `Feature_Parent`, `Title`, `Description`, "
- "`Display`, `Level`, `Directory_`, `Attributes`) VALUES( %s )")
-
-make_add_entry(component,
- "INSERT INTO `Component` "
- "(`Component`, `ComponentId`, `Directory_`, "
- "`Attributes`, `Condition`, `KeyPath`) VALUES( %s )")
-
-make_add_entry(feature_components,
- "INSERT INTO `FeatureComponents` "
- "(`Feature_`, `Component_`) VALUES( %s )")
-
-make_add_entry(file,
- "INSERT INTO `File` "
- "(`File`, `Component_`, `FileName`, `FileSize`, "
- "`Version`, `Language`, `Attributes`, `Sequence`) VALUES( %s )")
-
-make_add_entry(directory,
- "INSERT INTO `Directory` "
- "(`Directory`,`Directory_Parent`,`DefaultDir`) VALUES( %s )")
-
-make_add_entry(custom_action,
- "INSERT INTO `CustomAction` "
- "(`Action`, `Type`, `Source`, `Target`) VALUES( %s )")
-
-static UINT set_summary_info(MSIHANDLE hdb)
-{
- UINT res;
- MSIHANDLE suminfo;
-
- /* build summary info */
- res = MsiGetSummaryInformationA(hdb, NULL, 7, &suminfo);
- ok( res == ERROR_SUCCESS , "Failed to open summaryinfo\n" );
-
- res = MsiSummaryInfoSetPropertyA(suminfo,2, VT_LPSTR, 0,NULL,
- "Installation Database");
- ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
-
- res = MsiSummaryInfoSetPropertyA(suminfo,3, VT_LPSTR, 0,NULL,
- "Installation Database");
- ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
-
- res = MsiSummaryInfoSetPropertyA(suminfo,4, VT_LPSTR, 0,NULL,
- "Wine Hackers");
- ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
-
- res = MsiSummaryInfoSetPropertyA(suminfo,7, VT_LPSTR, 0,NULL,
- ";1033");
- ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
-
- res = MsiSummaryInfoSetPropertyA(suminfo,9, VT_LPSTR, 0,NULL,
- "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}");
- ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
-
- res = MsiSummaryInfoSetPropertyA(suminfo, 14, VT_I4, 100, NULL, NULL);
- ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
-
- res = MsiSummaryInfoSetPropertyA(suminfo, 15, VT_I4, 0, NULL, NULL);
- ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
-
- res = MsiSummaryInfoPersist(suminfo);
- ok( res == ERROR_SUCCESS , "Failed to make summary info persist\n" );
-
- res = MsiCloseHandle( suminfo);
- ok( res == ERROR_SUCCESS , "Failed to close suminfo\n" );
-
- return res;
-}
-
-static MSIHANDLE create_package_db(void)
-{
- MSIHANDLE hdb = 0;
- UINT res;
-
- DeleteFileW(msifileW);
-
- /* create an empty database */
- res = MsiOpenDatabaseW(msifileW, MSIDBOPEN_CREATEDIRECT, &hdb );
- ok( res == ERROR_SUCCESS , "Failed to create database %u\n", res );
- if( res != ERROR_SUCCESS )
- return 0;
-
- res = MsiDatabaseCommit( hdb );
- ok( res == ERROR_SUCCESS , "Failed to commit database\n" );
- if( res != ERROR_SUCCESS )
- return 0;
-
- res = set_summary_info(hdb);
- ok( res == ERROR_SUCCESS , "Failed to set summary info %u\n", res );
- if( res != ERROR_SUCCESS )
- return 0;
-
- res = run_query( hdb,
- "CREATE TABLE `Directory` ( "
- "`Directory` CHAR(255) NOT NULL, "
- "`Directory_Parent` CHAR(255), "
- "`DefaultDir` CHAR(255) NOT NULL "
- "PRIMARY KEY `Directory`)" );
- ok( res == ERROR_SUCCESS , "Failed to create directory table %u\n", res );
-
- return hdb;
-}
static UINT package_from_db(MSIHANDLE hdb, MSIHANDLE *handle)
{
@@ -251,18 +51,6 @@ static UINT package_from_db(MSIHANDLE hdb, MSIHANDLE *handle)
return ERROR_SUCCESS;
}
-static void create_test_file(const CHAR *name)
-{
- HANDLE file;
- DWORD written;
-
- file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
- ok(file != INVALID_HANDLE_VALUE, "Failure to open file %s\n", name);
- WriteFile(file, name, strlen(name), &written, NULL);
- WriteFile(file, "\n", strlen("\n"), &written, NULL);
- CloseHandle(file);
-}
-
static UINT helper_createpackage( const char *szName, MSIHANDLE *handle )
{
MSIHANDLE hPackage, suminfo, hdb = 0;
@@ -2482,304 +2270,6 @@ static void test_formatrecord_package(void)
DeleteFileA( msifile );
}
-static void test_formatrecord_tables(void)
-{
- MSIHANDLE hdb, hrec, hpkg = 0;
- CHAR buf[MAX_PATH];
- CHAR curr_dir[MAX_PATH];
- CHAR expected[MAX_PATH];
- CHAR root[MAX_PATH];
- DWORD size;
- UINT r;
-
- GetCurrentDirectoryA( MAX_PATH, curr_dir );
-
- hdb = create_package_db();
- ok ( hdb, "failed to create package database\n");
-
- r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'" );
- ok( r == ERROR_SUCCESS, "cannot add directory: %d\n", r);
-
- r = add_directory_entry( hdb, "'ReallyLongDir', 'TARGETDIR', "
- "'I am a really long directory'" );
- ok( r == ERROR_SUCCESS, "cannot add directory: %d\n", r);
-
- r = create_feature_table( hdb );
- ok( r == ERROR_SUCCESS, "cannot create Feature table: %d\n", r);
-
- r = add_feature_entry( hdb, "'occipitofrontalis', '', '', '', 2, 1, '', 0" );
- ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
-
- r = create_component_table( hdb );
- ok( r == ERROR_SUCCESS, "cannot create Component table: %d\n", r);
-
- r = add_component_entry( hdb, "'frontal', '', 'TARGETDIR', 0, '', 'frontal_file'" );
- ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r);
-
- r = add_component_entry( hdb, "'parietal', '', 'TARGETDIR', 1, '', 'parietal_file'" );
- ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r);
-
- r = add_component_entry( hdb, "'temporal', '', 'ReallyLongDir', 0, '', 'temporal_file'" );
- 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, "'occipitofrontalis', 'frontal'" );
- ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r);
-
- r = add_feature_components_entry( hdb, "'occipitofrontalis', 'parietal'" );
- ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r);
-
- r = add_feature_components_entry( hdb, "'occipitofrontalis', 'temporal'" );
- ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r);
-
- r = create_file_table( hdb );
- ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r);
-
- r = add_file_entry( hdb, "'frontal_file', 'frontal', 'frontal.txt', 0, '', '1033', 8192, 1" );
- ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
-
- r = add_file_entry( hdb, "'parietal_file', 'parietal', 'parietal.txt', 0, '', '1033', 8192, 1" );
- ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
-
- r = add_file_entry( hdb, "'temporal_file', 'temporal', 'temporal.txt', 0, '', '1033', 8192, 1" );
- ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
-
- r = create_custom_action_table( hdb );
- ok( r == ERROR_SUCCESS, "cannot create CustomAction table: %d\n", r);
-
- r = add_custom_action_entry( hdb, "'MyCustom', 51, 'prop', '[!temporal_file]'" );
- ok( r == ERROR_SUCCESS, "cannot add custom action: %d\n", r);
-
- r = add_custom_action_entry( hdb, "'EscapeIt1', 51, 'prop', '[\\[]Bracket Text[\\]]'" );
- ok( r == ERROR_SUCCESS, "cannot add custom action: %d\n", r);
-
- r = add_custom_action_entry( hdb, "'EscapeIt2', 51, 'prop', '[\\xabcd]'" );
- ok( r == ERROR_SUCCESS, "cannot add custom action: %d\n", r);
-
- r = add_custom_action_entry( hdb, "'EscapeIt3', 51, 'prop', '[abcd\\xefgh]'" );
- ok( r == ERROR_SUCCESS, "cannot add custom action: %d\n", r);
-
- r = add_custom_action_entry( hdb, "'EmbedNull', 51, 'prop', '[~]np'" );
- ok( r == ERROR_SUCCESS, "cannot add custom action: %d\n", r);
-
- r = package_from_db( hdb, &hpkg );
- if (r == ERROR_INSTALL_PACKAGE_REJECTED)
- {
- skip("Not enough rights to perform tests\n");
- MsiCloseHandle( hdb );
- DeleteFileA( msifile );
- return;
- }
- ok( r == ERROR_SUCCESS, "failed to create package %u\n", r );
-
- MsiCloseHandle( hdb );
-
- r = MsiSetPropertyA( hpkg, "imaprop", "ringer" );
- ok( r == ERROR_SUCCESS, "cannot set property: %d\n", r);
-
- hrec = MsiCreateRecord( 1 );
-
- /* property doesn't exist */
- size = MAX_PATH;
- /*MsiRecordSetStringA( hrec, 0, "[1]" ); */
- MsiRecordSetStringA( hrec, 1, "[idontexist]" );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, "1: " ), "Expected '1: ', got %s\n", buf );
-
- /* property exists */
- size = MAX_PATH;
- MsiRecordSetStringA( hrec, 1, "[imaprop]" );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, "1: ringer " ), "Expected '1: ringer ', got %s\n", buf );
-
- size = MAX_PATH;
- MsiRecordSetStringA( hrec, 0, "1: [1] " );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, "1: ringer " ), "Expected '1: ringer ', got %s\n", buf );
-
- /* environment variable doesn't exist */
- size = MAX_PATH;
- MsiRecordSetStringA( hrec, 1, "[%idontexist]" );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, "1: " ), "Expected '1: ', got %s\n", buf );
-
- /* environment variable exists */
- size = MAX_PATH;
- SetEnvironmentVariableA( "crazyvar", "crazyval" );
- MsiRecordSetStringA( hrec, 1, "[%crazyvar]" );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, "1: crazyval " ), "Expected '1: crazyval ', got %s\n", buf );
-
- /* file key before CostInitialize */
- size = MAX_PATH;
- MsiRecordSetStringA( hrec, 1, "[#frontal_file]" );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, "1: " ), "Expected '1: ', got %s\n", buf );
-
- MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
-
- r = MsiDoActionA(hpkg, "CostInitialize");
- ok( r == ERROR_SUCCESS, "CostInitialize failed: %d\n", r);
-
- r = MsiDoActionA(hpkg, "FileCost");
- ok( r == ERROR_SUCCESS, "FileCost failed: %d\n", r);
-
- r = MsiDoActionA(hpkg, "CostFinalize");
- ok( r == ERROR_SUCCESS, "CostFinalize failed: %d\n", r);
-
- size = MAX_PATH;
- MsiGetPropertyA( hpkg, "ROOTDRIVE", root, &size );
-
- sprintf( expected, "1: %sfrontal.txt ", root);
-
- /* frontal full file key */
- size = MAX_PATH;
- MsiRecordSetStringA( hrec, 1, "[#frontal_file]" );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
-
- /* frontal short file key */
- size = MAX_PATH;
- MsiRecordSetStringA( hrec, 1, "[!frontal_file]" );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
-
- sprintf( expected, "1: %sI am a really long directory\\temporal.txt ", root);
-
- /* temporal full file key */
- size = MAX_PATH;
- MsiRecordSetStringA( hrec, 1, "[#temporal_file]" );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
-
- /* temporal short file key */
- size = MAX_PATH;
- MsiRecordSetStringA( hrec, 1, "[!temporal_file]" );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
-
- /* custom action 51, files don't exist */
- r = MsiDoActionA( hpkg, "MyCustom" );
- ok( r == ERROR_SUCCESS, "MyCustom failed: %d\n", r);
-
- sprintf( expected, "%sI am a really long directory\\temporal.txt", root);
-
- size = MAX_PATH;
- r = MsiGetPropertyA( hpkg, "prop", buf, &size );
- ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
- ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
-
- sprintf( buf, "%sI am a really long directory", root );
- CreateDirectoryA( buf, NULL );
-
- lstrcatA( buf, "\\temporal.txt" );
- create_test_file( buf );
-
- /* custom action 51, files exist */
- r = MsiDoActionA( hpkg, "MyCustom" );
- ok( r == ERROR_SUCCESS, "MyCustom failed: %d\n", r);
-
- size = MAX_PATH;
- r = MsiGetPropertyA( hpkg, "prop", buf, &size );
- ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
- todo_wine
- {
- ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
- }
-
- /* custom action 51, escaped text 1 */
- r = MsiDoActionA( hpkg, "EscapeIt1" );
- ok( r == ERROR_SUCCESS, "EscapeIt1 failed: %d\n", r);
-
- size = MAX_PATH;
- r = MsiGetPropertyA( hpkg, "prop", buf, &size );
- ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
- ok( !lstrcmpA( buf, "[Bracket Text]" ), "Expected '[Bracket Text]', got %s\n", buf);
-
- /* custom action 51, escaped text 2 */
- r = MsiDoActionA( hpkg, "EscapeIt2" );
- ok( r == ERROR_SUCCESS, "EscapeIt2 failed: %d\n", r);
-
- size = MAX_PATH;
- r = MsiGetPropertyA( hpkg, "prop", buf, &size );
- ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
- ok( !lstrcmpA( buf, "x" ), "Expected 'x', got %s\n", buf);
-
- /* custom action 51, escaped text 3 */
- r = MsiDoActionA( hpkg, "EscapeIt3" );
- ok( r == ERROR_SUCCESS, "EscapeIt3 failed: %d\n", r);
-
- size = MAX_PATH;
- r = MsiGetPropertyA( hpkg, "prop", buf, &size );
- ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
- ok( !lstrcmpA( buf, "" ), "Expected '', got %s\n", buf);
-
- /* custom action 51, embedded null */
- r = MsiDoActionA( hpkg, "EmbedNull" );
- ok( r == ERROR_SUCCESS, "EmbedNull failed: %d\n", r);
-
- size = MAX_PATH;
- memset( buf, 'a', sizeof(buf) );
- r = MsiGetPropertyA( hpkg, "prop", buf, &size );
- ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
- ok( !memcmp( buf, "\0np", sizeof("\0np") ), "wrong value\n");
- ok( size == sizeof("\0np") - 1, "got %u\n", size );
-
- r = MsiSetPropertyA( hpkg, "prop", "[~]np" );
- ok( r == ERROR_SUCCESS, "cannot set property: %d\n", r);
-
- size = MAX_PATH;
- memset( buf, 'a', sizeof(buf) );
- r = MsiGetPropertyA( hpkg, "prop", buf, &size );
- ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
- ok( !lstrcmpA( buf, "[~]np" ), "Expected '[~]np', got %s\n", buf);
-
- sprintf( expected, "1: %sI am a really long directory\\ ", root);
-
- /* component with INSTALLSTATE_LOCAL */
- size = MAX_PATH;
- MsiRecordSetStringA( hrec, 1, "[$temporal]" );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
-
- r = MsiSetComponentStateA( hpkg, "temporal", INSTALLSTATE_SOURCE );
- ok( r == ERROR_SUCCESS, "failed to set install state: %d\n", r);
-
- /* component with INSTALLSTATE_SOURCE */
- lstrcpyA( expected, "1: " );
- lstrcatA( expected, curr_dir );
- if (strlen(curr_dir) > 3) lstrcatA( expected, "\\" );
- lstrcatA( expected, " " );
- size = MAX_PATH;
- MsiRecordSetStringA( hrec, 1, "[$parietal]" );
- r = MsiFormatRecordA( hpkg, hrec, buf, &size );
- ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- ok( !lstrcmpA( buf, expected ), "Expected '%s', got '%s'\n", expected, buf);
-
- sprintf( buf, "%sI am a really long directory\\temporal.txt", root );
- DeleteFileA( buf );
-
- sprintf( buf, "%sI am a really long directory", root );
- RemoveDirectoryA( buf );
-
- MsiCloseHandle( hrec );
- MsiCloseHandle( hpkg );
- DeleteFileA( msifile );
-}
-
static void test_processmessage(void)
{
MSIHANDLE hrec, package;
@@ -2851,6 +2341,5 @@ START_TEST(format)
test_createpackage();
test_formatrecord();
test_formatrecord_package();
- test_formatrecord_tables();
test_processmessage();
}
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index f112541e3e..78ec1ccd62 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -2732,6 +2732,266 @@ static void test_formatrecord2(void)
DeleteFileA(msifile);
}
+static void test_formatrecord_tables(void)
+{
+ MSIHANDLE hdb, hrec, hpkg = 0;
+ CHAR buf[MAX_PATH];
+ CHAR curr_dir[MAX_PATH];
+ CHAR expected[MAX_PATH];
+ CHAR root[MAX_PATH];
+ DWORD size;
+ UINT r;
+
+ GetCurrentDirectoryA( MAX_PATH, curr_dir );
+
+ hdb = create_package_db();
+ ok ( hdb, "failed to create package database\n");
+
+ add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'" );
+ add_directory_entry( hdb, "'ReallyLongDir', 'TARGETDIR', "
+ "'I am a really long directory'" );
+
+ create_feature_table( hdb );
+ add_feature_entry( hdb, "'occipitofrontalis', '', '', '', 2, 1, '', 0" );
+
+ create_component_table( hdb );
+ add_component_entry( hdb, "'frontal', '', 'TARGETDIR', 0, '', 'frontal_file'" );
+ add_component_entry( hdb, "'parietal', '', 'TARGETDIR', 1, '', 'parietal_file'" );
+ add_component_entry( hdb, "'temporal', '', 'ReallyLongDir', 0, '', 'temporal_file'" );
+
+ create_feature_components_table( hdb );
+ add_feature_components_entry( hdb, "'occipitofrontalis', 'frontal'" );
+ add_feature_components_entry( hdb, "'occipitofrontalis', 'parietal'" );
+ add_feature_components_entry( hdb, "'occipitofrontalis', 'temporal'" );
+
+ create_file_table( hdb );
+ add_file_entry( hdb, "'frontal_file', 'frontal', 'frontal.txt', 0, '', '1033', 8192, 1" );
+ add_file_entry( hdb, "'parietal_file', 'parietal', 'parietal.txt', 0, '', '1033', 8192, 1" );
+ add_file_entry( hdb, "'temporal_file', 'temporal', 'temporal.txt', 0, '', '1033', 8192, 1" );
+
+ create_custom_action_table( hdb );
+ add_custom_action_entry( hdb, "'MyCustom', 51, 'prop', '[!temporal_file]'" );
+ add_custom_action_entry( hdb, "'EscapeIt1', 51, 'prop', '[\\[]Bracket Text[\\]]'" );
+ add_custom_action_entry( hdb, "'EscapeIt2', 51, 'prop', '[\\xabcd]'" );
+ add_custom_action_entry( hdb, "'EscapeIt3', 51, 'prop', '[abcd\\xefgh]'" );
+ add_custom_action_entry( hdb, "'EmbedNull', 51, 'prop', '[~]np'" );
+
+ r = package_from_db( hdb, &hpkg );
+ if (r == ERROR_INSTALL_PACKAGE_REJECTED)
+ {
+ skip("Not enough rights to perform tests\n");
+ MsiCloseHandle( hdb );
+ DeleteFileA( msifile );
+ return;
+ }
+ ok( r == ERROR_SUCCESS, "failed to create package %u\n", r );
+
+ MsiCloseHandle( hdb );
+
+ r = MsiSetPropertyA( hpkg, "imaprop", "ringer" );
+ ok( r == ERROR_SUCCESS, "cannot set property: %d\n", r);
+
+ hrec = MsiCreateRecord( 1 );
+
+ /* property doesn't exist */
+ size = MAX_PATH;
+ /*MsiRecordSetStringA( hrec, 0, "[1]" ); */
+ MsiRecordSetStringA( hrec, 1, "[idontexist]" );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, "1: " ), "Expected '1: ', got %s\n", buf );
+
+ /* property exists */
+ size = MAX_PATH;
+ MsiRecordSetStringA( hrec, 1, "[imaprop]" );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, "1: ringer " ), "Expected '1: ringer ', got %s\n", buf );
+
+ size = MAX_PATH;
+ MsiRecordSetStringA( hrec, 0, "1: [1] " );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, "1: ringer " ), "Expected '1: ringer ', got %s\n", buf );
+
+ /* environment variable doesn't exist */
+ size = MAX_PATH;
+ MsiRecordSetStringA( hrec, 1, "[%idontexist]" );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, "1: " ), "Expected '1: ', got %s\n", buf );
+
+ /* environment variable exists */
+ size = MAX_PATH;
+ SetEnvironmentVariableA( "crazyvar", "crazyval" );
+ MsiRecordSetStringA( hrec, 1, "[%crazyvar]" );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, "1: crazyval " ), "Expected '1: crazyval ', got %s\n", buf );
+
+ /* file key before CostInitialize */
+ size = MAX_PATH;
+ MsiRecordSetStringA( hrec, 1, "[#frontal_file]" );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, "1: " ), "Expected '1: ', got %s\n", buf );
+
+ MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
+
+ r = MsiDoActionA(hpkg, "CostInitialize");
+ ok( r == ERROR_SUCCESS, "CostInitialize failed: %d\n", r);
+
+ r = MsiDoActionA(hpkg, "FileCost");
+ ok( r == ERROR_SUCCESS, "FileCost failed: %d\n", r);
+
+ r = MsiDoActionA(hpkg, "CostFinalize");
+ ok( r == ERROR_SUCCESS, "CostFinalize failed: %d\n", r);
+
+ size = MAX_PATH;
+ MsiGetPropertyA( hpkg, "ROOTDRIVE", root, &size );
+
+ sprintf( expected, "1: %sfrontal.txt ", root);
+
+ /* frontal full file key */
+ size = MAX_PATH;
+ MsiRecordSetStringA( hrec, 1, "[#frontal_file]" );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
+
+ /* frontal short file key */
+ size = MAX_PATH;
+ MsiRecordSetStringA( hrec, 1, "[!frontal_file]" );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
+
+ sprintf( expected, "1: %sI am a really long directory\\temporal.txt ", root);
+
+ /* temporal full file key */
+ size = MAX_PATH;
+ MsiRecordSetStringA( hrec, 1, "[#temporal_file]" );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
+
+ /* temporal short file key */
+ size = MAX_PATH;
+ MsiRecordSetStringA( hrec, 1, "[!temporal_file]" );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
+
+ /* custom action 51, files don't exist */
+ r = MsiDoActionA( hpkg, "MyCustom" );
+ ok( r == ERROR_SUCCESS, "MyCustom failed: %d\n", r);
+
+ sprintf( expected, "%sI am a really long directory\\temporal.txt", root);
+
+ size = MAX_PATH;
+ r = MsiGetPropertyA( hpkg, "prop", buf, &size );
+ ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
+ ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
+
+ sprintf( buf, "%sI am a really long directory", root );
+ CreateDirectoryA( buf, NULL );
+
+ lstrcatA( buf, "\\temporal.txt" );
+ create_test_file( buf );
+
+ /* custom action 51, files exist */
+ r = MsiDoActionA( hpkg, "MyCustom" );
+ ok( r == ERROR_SUCCESS, "MyCustom failed: %d\n", r);
+
+ size = MAX_PATH;
+ r = MsiGetPropertyA( hpkg, "prop", buf, &size );
+ ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
+ todo_wine
+ {
+ ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
+ }
+
+ /* custom action 51, escaped text 1 */
+ r = MsiDoActionA( hpkg, "EscapeIt1" );
+ ok( r == ERROR_SUCCESS, "EscapeIt1 failed: %d\n", r);
+
+ size = MAX_PATH;
+ r = MsiGetPropertyA( hpkg, "prop", buf, &size );
+ ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
+ ok( !lstrcmpA( buf, "[Bracket Text]" ), "Expected '[Bracket Text]', got %s\n", buf);
+
+ /* custom action 51, escaped text 2 */
+ r = MsiDoActionA( hpkg, "EscapeIt2" );
+ ok( r == ERROR_SUCCESS, "EscapeIt2 failed: %d\n", r);
+
+ size = MAX_PATH;
+ r = MsiGetPropertyA( hpkg, "prop", buf, &size );
+ ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
+ ok( !lstrcmpA( buf, "x" ), "Expected 'x', got %s\n", buf);
+
+ /* custom action 51, escaped text 3 */
+ r = MsiDoActionA( hpkg, "EscapeIt3" );
+ ok( r == ERROR_SUCCESS, "EscapeIt3 failed: %d\n", r);
+
+ size = MAX_PATH;
+ r = MsiGetPropertyA( hpkg, "prop", buf, &size );
+ ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
+ ok( !lstrcmpA( buf, "" ), "Expected '', got %s\n", buf);
+
+ /* custom action 51, embedded null */
+ r = MsiDoActionA( hpkg, "EmbedNull" );
+ ok( r == ERROR_SUCCESS, "EmbedNull failed: %d\n", r);
+
+ size = MAX_PATH;
+ memset( buf, 'a', sizeof(buf) );
+ r = MsiGetPropertyA( hpkg, "prop", buf, &size );
+ ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
+ ok( !memcmp( buf, "\0np", sizeof("\0np") ), "wrong value\n");
+ ok( size == sizeof("\0np") - 1, "got %u\n", size );
+
+ r = MsiSetPropertyA( hpkg, "prop", "[~]np" );
+ ok( r == ERROR_SUCCESS, "cannot set property: %d\n", r);
+
+ size = MAX_PATH;
+ memset( buf, 'a', sizeof(buf) );
+ r = MsiGetPropertyA( hpkg, "prop", buf, &size );
+ ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
+ ok( !lstrcmpA( buf, "[~]np" ), "Expected '[~]np', got %s\n", buf);
+
+ sprintf( expected, "1: %sI am a really long directory\\ ", root);
+
+ /* component with INSTALLSTATE_LOCAL */
+ size = MAX_PATH;
+ MsiRecordSetStringA( hrec, 1, "[$temporal]" );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, expected ), "Expected \"%s\", got \"%s\"\n", expected, buf);
+
+ r = MsiSetComponentStateA( hpkg, "temporal", INSTALLSTATE_SOURCE );
+ ok( r == ERROR_SUCCESS, "failed to set install state: %d\n", r);
+
+ /* component with INSTALLSTATE_SOURCE */
+ lstrcpyA( expected, "1: " );
+ lstrcatA( expected, curr_dir );
+ if (strlen(curr_dir) > 3) lstrcatA( expected, "\\" );
+ lstrcatA( expected, " " );
+ size = MAX_PATH;
+ MsiRecordSetStringA( hrec, 1, "[$parietal]" );
+ r = MsiFormatRecordA( hpkg, hrec, buf, &size );
+ ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
+ ok( !lstrcmpA( buf, expected ), "Expected '%s', got '%s'\n", expected, buf);
+
+ sprintf( buf, "%sI am a really long directory\\temporal.txt", root );
+ DeleteFileA( buf );
+
+ sprintf( buf, "%sI am a really long directory", root );
+ RemoveDirectoryA( buf );
+
+ MsiCloseHandle( hrec );
+ MsiCloseHandle( hpkg );
+ DeleteFileA( msifile );
+}
+
static void test_feature_states( UINT line, MSIHANDLE package, const char *feature, UINT error,
INSTALLSTATE expected_state, INSTALLSTATE expected_action, BOOL todo )
{
@@ -9337,6 +9597,7 @@ START_TEST(package)
test_condition();
test_msipackage();
test_formatrecord2();
+ test_formatrecord_tables();
test_states();
test_getproperty();
test_removefiles();
--
2.14.1
More information about the wine-patches
mailing list