MSI: test cases for summary information

Mike McCormack mike at codeweavers.com
Fri Mar 18 23:50:48 CST 2005


ChangeLog:
* test cases for summary information
* fix memory leaks
-------------- next part --------------
Index: dlls/msi/suminfo.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/suminfo.c,v
retrieving revision 1.15
diff -u -p -r1.15 suminfo.c
--- dlls/msi/suminfo.c	18 Mar 2005 14:01:39 -0000	1.15
+++ dlls/msi/suminfo.c	19 Mar 2005 05:49:32 -0000
@@ -98,9 +98,20 @@ typedef struct tagMSISUMMARYINFO
 static const WCHAR szSumInfo[] = { 5 ,'S','u','m','m','a','r','y',
                        'I','n','f','o','r','m','a','t','i','o','n',0 };
 
+static void free_prop( PROPVARIANT *prop )
+{
+    if (prop->vt == VT_LPSTR )
+        HeapFree( GetProcessHeap(), 0, prop->u.pszVal );
+    prop->vt = VT_EMPTY;
+}
+
 static void MSI_CloseSummaryInfo( MSIOBJECTHDR *arg )
 {
     MSISUMMARYINFO *si = (MSISUMMARYINFO *) arg;
+    DWORD i;
+
+    for( i = 0; i < MSI_MAX_PROPS; i++ )
+        free_prop( &si->property[i] );
     msiobj_release( &si->db->hdr );
 }
 
@@ -142,7 +153,7 @@ static UINT get_property_count( PROPVARI
 
     if( !property )
         return n;
-    for( i=0; i<MSI_MAX_PROPS; i++ )
+    for( i = 0; i < MSI_MAX_PROPS; i++ )
         if( property[i].vt != VT_EMPTY )
             n++;
     return n;
@@ -645,11 +656,12 @@ static UINT set_prop( MSIHANDLE handle, 
             goto end;
         }
         si->update_count--;
-        prop->vt = type;
     }
     else if( prop->vt != type )
         goto end;
 
+    free_prop( prop );
+    prop->vt = type;
     switch( type )
     {
     case VT_I4:
@@ -662,7 +674,6 @@ static UINT set_prop( MSIHANDLE handle, 
         memcpy( &prop->u.filetime, pftValue, sizeof prop->u.filetime );
         break;
     case VT_LPSTR:
-        HeapFree( GetProcessHeap(), 0, prop->u.pszVal );
         if( str->unicode )
         {
             len = WideCharToMultiByte( CP_ACP, 0, str->str.w, -1,
Index: dlls/msi/tests/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/msi/tests/Makefile.in,v
retrieving revision 1.2
diff -u -p -r1.2 Makefile.in
--- dlls/msi/tests/Makefile.in	6 Jan 2005 20:42:48 -0000	1.2
+++ dlls/msi/tests/Makefile.in	19 Mar 2005 05:49:32 -0000
@@ -7,7 +7,8 @@ IMPORTS   = msi kernel32
 
 CTESTS = \
 	db.c \
-	record.c
+	record.c \
+	suminfo.c
 
 @MAKE_TEST_RULES@
 
--- /dev/null	2005-02-25 01:31:53.000000000 +0900
+++ dlls/msi/tests/suminfo.c	2005-03-19 14:48:29.000000000 +0900
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2005 Mike McCormack for CodeWeavers
+ *
+ * A test program for MSI database files.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#define COBJMACROS
+
+#include <stdio.h>
+#include <windows.h>
+#include <msi.h>
+#include <msiquery.h>
+
+#include "wine/test.h"
+
+/*
+ * The following are defined in Windows SDK's msidefs.h
+ * but that file doesn't exist in the msvc6 header set.
+ *
+ * Some are already defined in PropIdl.h - undefine them
+ */
+#undef PID_DICTIONARY
+#undef PID_CODEPAGE
+#undef PID_SUBJECT
+#undef PID_SECURITY
+
+#define PID_DICTIONARY 0
+#define PID_CODEPAGE 1
+#define PID_TITLE 2
+#define PID_SUBJECT 3
+#define PID_AUTHOR 4
+#define PID_KEYWORDS 5
+#define PID_COMMENTS 6
+#define PID_TEMPLATE 7
+#define PID_LASTAUTHOR 8
+#define PID_REVNUMBER 9
+#define PID_EDITTINE 10
+#define PID_LASTPRINTED 11
+#define PID_CREATE_DTM 12
+#define PID_LASTSAVE_DTM 13
+#define PID_PAGECOUNT 14
+#define PID_WORDCOUNT 15
+#define PID_CHARCOUNT 16
+#define PID_THUMBNAIL 17
+#define PID_APPNAME 18
+#define PID_SECURITY 19
+#define PID_MSIVERSION PID_PAGECOUNT
+#define PID_MSISOURCE PID_WORDCOUNT
+#define PID_MSIRESTRICT PID_CHARCOUNT
+
+START_TEST(suminfo)
+{
+    const char *msifile = "winetest.msi";
+    MSIHANDLE hdb = 0, hsuminfo;
+    UINT r, count, type;
+    INT val;
+    FILETIME ft;
+
+    DeleteFile(msifile);
+
+    /* just MsiOpenDatabase should not create a file */
+    r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
+    ok(r == ERROR_SUCCESS, "MsiOpenDatabase failed\n");
+
+    r = MsiGetSummaryInformation(hdb, NULL, 0, NULL);
+    ok(r == ERROR_INVALID_PARAMETER, "MsiGetSummaryInformation wrong error\n");
+
+    r = MsiGetSummaryInformation(hdb, NULL, 0, &hsuminfo);
+    ok(r == ERROR_SUCCESS, "MsiGetSummaryInformation failed\n");
+
+    r = MsiSummaryInfoGetPropertyCount(0, NULL);
+    ok(r == ERROR_INVALID_HANDLE, "getpropcount failed\n");
+
+    r = MsiSummaryInfoGetPropertyCount(hsuminfo, NULL);
+    ok(r == ERROR_SUCCESS, "getpropcount failed\n");
+
+    count = -1;
+    r = MsiSummaryInfoGetPropertyCount(hsuminfo, &count);
+    ok(r == ERROR_SUCCESS, "getpropcount failed\n");
+    ok(count == 0, "count should be zero\n");
+
+    r = MsiSummaryInfoGetProperty(hsuminfo, 0, NULL, NULL, NULL, 0, NULL);
+    ok(r == ERROR_SUCCESS, "getpropcount failed\n");
+
+    type = -1;
+    r = MsiSummaryInfoGetProperty(hsuminfo, 0, &type, NULL, NULL, 0, NULL);
+    ok(r == ERROR_SUCCESS, "getpropcount failed\n");
+    ok(type == 0, "wrong type\n");
+
+    type = -1;
+    val = 1234;
+    r = MsiSummaryInfoGetProperty(hsuminfo, 0, &type, &val, NULL, 0, NULL);
+    ok(r == ERROR_SUCCESS, "getpropcount failed\n");
+    ok(type == 0, "wrong type\n");
+    ok(val == 1234, "wrong val\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_TITLE, VT_LPSTR, 0, NULL, "Mike");
+    ok(r == ERROR_FUNCTION_FAILED, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_TITLE, VT_LPSTR, 1, NULL, "JungAh");
+    ok(r == ERROR_FUNCTION_FAILED, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_TITLE, VT_LPSTR, 1, &ft, "Mike");
+    ok(r == ERROR_FUNCTION_FAILED, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_CODEPAGE, VT_I2, 1, &ft, "JungAh");
+    ok(r == ERROR_FUNCTION_FAILED, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiCloseHandle(hsuminfo);
+    ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
+
+    /* try again with the update count set */
+    r = MsiGetSummaryInformation(hdb, NULL, 1, &hsuminfo);
+    ok(r == ERROR_SUCCESS, "MsiGetSummaryInformation failed\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, 0, VT_LPSTR, 1, NULL, NULL);
+    ok(r == ERROR_DATATYPE_MISMATCH, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_CODEPAGE, VT_LPSTR, 1, NULL, NULL);
+    ok(r == ERROR_DATATYPE_MISMATCH, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_TITLE, VT_I4, 0, NULL, "Mike");
+    ok(r == ERROR_DATATYPE_MISMATCH, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_AUTHOR, VT_I4, 0, NULL, "JungAh");
+    ok(r == ERROR_DATATYPE_MISMATCH, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_KEYWORDS, VT_I2, 0, NULL, "Mike");
+    ok(r == ERROR_DATATYPE_MISMATCH, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_COMMENTS, VT_FILETIME, 0, NULL, "JungAh");
+    ok(r == ERROR_DATATYPE_MISMATCH, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_TEMPLATE, VT_I2, 0, NULL, "Mike");
+    ok(r == ERROR_DATATYPE_MISMATCH, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_LASTAUTHOR, VT_LPSTR, 0, NULL, NULL);
+    ok(r == ERROR_INVALID_PARAMETER, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_LASTSAVE_DTM, VT_FILETIME, 0, NULL, NULL);
+    ok(r == ERROR_INVALID_PARAMETER, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_LASTAUTHOR, VT_LPWSTR, 0, NULL, "h\0i\0\0");
+    ok(r == ERROR_DATATYPE_MISMATCH, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_REVNUMBER, VT_I4, 0, NULL, "Jungah");
+    ok(r == ERROR_DATATYPE_MISMATCH, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_PAGECOUNT, VT_LPSTR, 1, NULL, NULL);
+    ok(r == ERROR_DATATYPE_MISMATCH, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_TITLE, VT_LPSTR, 0, NULL, "Mike");
+    ok(r == ERROR_SUCCESS, "MsiSummaryInfoSetProperty failed\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_TITLE, VT_LPSTR, 0, NULL, "JungAh");
+    ok(r == ERROR_SUCCESS, "MsiSummaryInfoSetProperty failed\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_CODEPAGE, VT_I2, 1, &ft, "Mike");
+    ok(r == ERROR_FUNCTION_FAILED, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiCloseHandle(hsuminfo);
+    ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
+
+    /* try again with a higher update count */
+    r = MsiGetSummaryInformation(hdb, NULL, 10, &hsuminfo);
+    ok(r == ERROR_SUCCESS, "MsiGetSummaryInformation failed\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_TITLE, VT_LPSTR, 0, NULL, "JungAh");
+    ok(r == ERROR_SUCCESS, "MsiSummaryInfoSetProperty failed\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_CODEPAGE, VT_LPSTR, 1, NULL, NULL);
+    ok(r == ERROR_DATATYPE_MISMATCH, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_CODEPAGE, VT_I2, 1, NULL, NULL);
+    ok(r == ERROR_SUCCESS, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_CODEPAGE, VT_I2, 1, &ft, "Mike");
+    ok(r == ERROR_SUCCESS, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoSetProperty(hsuminfo, PID_AUTHOR, VT_LPSTR, 1, &ft, "Mike");
+    ok(r == ERROR_SUCCESS, "MsiSummaryInfoSetProperty wrong error\n");
+
+    r = MsiSummaryInfoPersist(hsuminfo);
+    ok(r == ERROR_SUCCESS, "MsiSummaryInfoPersist failed\n");
+
+    MsiDatabaseCommit(hdb);
+
+    r = MsiCloseHandle(hsuminfo);
+    ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
+
+    r = MsiCloseHandle(hdb);
+    ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
+
+    r = DeleteFile(msifile);
+    ok(r, "DeleteFile failed\n");
+}


More information about the wine-patches mailing list