Remove redundant check.
[wine] / dlls / msi / tests / package.c
1 /*
2  * tests for Microsoft Installer functionality
3  *
4  * Copyright 2005 Mike McCormack for CodeWeavers
5  * Copyright 2005 Aric Stewart for CodeWeavers
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #define COBJMACROS
23
24 #include <stdio.h>
25 #include <windows.h>
26 #include <msi.h>
27 #include <msiquery.h>
28
29 #include "wine/test.h"
30
31 static UINT run_query( MSIHANDLE hdb, const char *query )
32 {
33     MSIHANDLE hview = 0;
34     UINT r;
35
36     r = MsiDatabaseOpenView(hdb, query, &hview);
37     if( r != ERROR_SUCCESS )
38         return r;
39
40     r = MsiViewExecute(hview, 0);
41     if( r == ERROR_SUCCESS )
42         r = MsiViewClose(hview);
43     MsiCloseHandle(hview);
44     return r;
45 }
46
47 static UINT set_summary_info(MSIHANDLE hdb)
48 {
49     UINT res;
50     MSIHANDLE suminfo;
51
52     /* build summmary info */
53     res = MsiGetSummaryInformation(hdb, NULL, 7, &suminfo);
54     ok( res == ERROR_SUCCESS , "Failed to open summaryinfo\n" );
55
56     res = MsiSummaryInfoSetProperty(suminfo,2, VT_LPSTR, 0,NULL,
57                         "Installation Database");
58     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
59
60     res = MsiSummaryInfoSetProperty(suminfo,3, VT_LPSTR, 0,NULL,
61                         "Installation Database");
62     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
63
64     res = MsiSummaryInfoSetProperty(suminfo,4, VT_LPSTR, 0,NULL,
65                         "Wine Hackers");
66     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
67
68     res = MsiSummaryInfoSetProperty(suminfo,7, VT_LPSTR, 0,NULL,
69                     ";1033");
70     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
71
72     res = MsiSummaryInfoSetProperty(suminfo,9, VT_LPSTR, 0,NULL,
73                     "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}");
74     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
75
76     res = MsiSummaryInfoSetProperty(suminfo, 14, VT_I4, 100, NULL, NULL);
77     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
78
79     res = MsiSummaryInfoSetProperty(suminfo, 15, VT_I4, 0, NULL, NULL);
80     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
81
82     res = MsiSummaryInfoPersist(suminfo);
83     ok( res == ERROR_SUCCESS , "Failed to make summary info persist\n" );
84
85     res = MsiCloseHandle( suminfo);
86     ok( res == ERROR_SUCCESS , "Failed to close suminfo\n" );
87
88     return res;
89 }
90
91
92 MSIHANDLE create_package_db(void)
93 {
94     MSIHANDLE hdb = 0;
95     CHAR szName[] = "winetest.msi";
96     UINT res;
97
98     DeleteFile(szName);
99
100     /* create an empty database */
101     res = MsiOpenDatabase(szName, MSIDBOPEN_CREATE, &hdb );
102     ok( res == ERROR_SUCCESS , "Failed to create database\n" );
103     if( res != ERROR_SUCCESS )
104         return hdb;
105
106     res = MsiDatabaseCommit( hdb );
107     ok( res == ERROR_SUCCESS , "Failed to commit database\n" );
108
109     res = set_summary_info(hdb);
110
111     res = run_query( hdb,
112             "CREATE TABLE `Directory` ( "
113             "`Directory` CHAR(255) NOT NULL, "
114             "`Directory_Parent` CHAR(255), "
115             "`DefaultDir` CHAR(255) NOT NULL "
116             "PRIMARY KEY `Directory`)" );
117     ok( res == ERROR_SUCCESS , "Failed to create directory table\n" );
118
119     return hdb;
120 }
121
122 MSIHANDLE package_from_db(MSIHANDLE hdb)
123 {
124     UINT res;
125     CHAR szPackage[10];
126     MSIHANDLE hPackage;
127
128     sprintf(szPackage,"#%li",hdb);
129     res = MsiOpenPackage(szPackage,&hPackage);
130     ok( res == ERROR_SUCCESS , "Failed to open package\n" );
131
132     res = MsiCloseHandle(hdb);
133     ok( res == ERROR_SUCCESS , "Failed to close db handle\n" );
134
135     return hPackage;
136 }
137
138 static void test_createpackage(void)
139 {
140     MSIHANDLE hPackage = 0;
141     UINT res;
142
143     hPackage = package_from_db(create_package_db());
144     ok( hPackage != 0, " Failed to create package\n");
145
146     res = MsiCloseHandle( hPackage);
147     ok( res == ERROR_SUCCESS , "Failed to close package\n" );
148 }
149
150 static void test_getsourcepath_bad( void )
151 {
152     static const char str[] = { 0 };
153     char buffer[0x80];
154     DWORD sz;
155     UINT r;
156
157     r = MsiGetSourcePath( -1, NULL, NULL, NULL );
158     ok( r == ERROR_INVALID_PARAMETER, "return value wrong\n");
159
160     sz = 0;
161     r = MsiGetSourcePath( -1, NULL, buffer, &sz );
162     ok( r == ERROR_INVALID_PARAMETER, "return value wrong\n");
163
164     sz = 0;
165     r = MsiGetSourcePath( -1, str, NULL, &sz );
166     ok( r == ERROR_INVALID_HANDLE, "return value wrong\n");
167
168     sz = 0;
169     r = MsiGetSourcePath( -1, str, NULL, NULL );
170     ok( r == ERROR_INVALID_HANDLE, "return value wrong\n");
171
172     sz = 0;
173     r = MsiGetSourcePath( -1, str, buffer, &sz );
174     ok( r == ERROR_INVALID_HANDLE, "return value wrong\n");
175 }
176
177 static UINT add_directory_entry( MSIHANDLE hdb, char *values )
178 {
179     char insert[] = "INSERT INTO `Directory` (`Directory`,`Directory_Parent`,`DefaultDir`) VALUES( %s )";
180     char *query;
181     UINT sz, r;
182
183     sz = strlen(values) + sizeof insert;
184     query = HeapAlloc(GetProcessHeap(),0,sz);
185     sprintf(query,insert,values);
186     r = run_query( hdb, query );
187     HeapFree(GetProcessHeap(), 0, query);
188     return r;
189 }
190
191 static void test_getsourcepath( void )
192 {
193     static const char str[] = { 0 };
194     char buffer[0x80];
195     DWORD sz;
196     UINT r;
197     MSIHANDLE hpkg, hdb;
198
199     hpkg = package_from_db(create_package_db());
200     ok( hpkg, "failed to create package\n");
201
202     sz = 0;
203     buffer[0] = 'x';
204     r = MsiGetSourcePath( hpkg, str, buffer, &sz );
205     ok( r == ERROR_DIRECTORY, "return value wrong\n");
206     ok( buffer[0] == 'x', "buffer modified\n");
207
208     sz = 1;
209     buffer[0] = 'x';
210     r = MsiGetSourcePath( hpkg, str, buffer, &sz );
211     ok( r == ERROR_DIRECTORY, "return value wrong\n");
212     ok( buffer[0] == 'x', "buffer modified\n");
213
214     MsiCloseHandle( hpkg );
215
216
217     /* another test but try create a directory this time */
218     hdb = create_package_db();
219     ok( hdb, "failed to create database\n");
220     
221     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'");
222     ok( r == S_OK, "failed\n");
223
224     hpkg = package_from_db(hdb);
225     ok( hpkg, "failed to create package\n");
226
227     sz = sizeof buffer -1;
228     strcpy(buffer,"x bad");
229     r = MsiGetSourcePath( hpkg, "TARGETDIR", buffer, &sz );
230     ok( r == ERROR_DIRECTORY, "return value wrong\n");
231
232     todo_wine {
233     r = MsiDoAction( hpkg, "CostInitialize");
234     ok( r == ERROR_SUCCESS, "cost init failed\n");
235     }
236     r = MsiDoAction( hpkg, "CostFinalize");
237     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
238
239     todo_wine {
240     sz = sizeof buffer -1;
241     buffer[0] = 'x';
242     r = MsiGetSourcePath( hpkg, "TARGETDIR", buffer, &sz );
243     ok( r == ERROR_SUCCESS, "return value wrong\n");
244     ok( sz == strlen(buffer), "returned length wrong\n");
245
246     sz = 0;
247     strcpy(buffer,"x bad");
248     r = MsiGetSourcePath( hpkg, "TARGETDIR", buffer, &sz );
249     ok( r == ERROR_MORE_DATA, "return value wrong\n");
250     }
251     ok( buffer[0] == 'x', "buffer modified\n");
252
253     todo_wine {
254     r = MsiGetSourcePath( hpkg, "TARGETDIR", NULL, NULL );
255     ok( r == ERROR_SUCCESS, "return value wrong\n");
256     }
257
258     r = MsiGetSourcePath( hpkg, "TARGETDIR ", NULL, NULL );
259     ok( r == ERROR_DIRECTORY, "return value wrong\n");
260
261     r = MsiGetSourcePath( hpkg, "targetdir", NULL, NULL );
262     ok( r == ERROR_DIRECTORY, "return value wrong\n");
263
264     r = MsiGetSourcePath( hpkg, "TARGETDIR", buffer, NULL );
265     ok( r == ERROR_INVALID_PARAMETER, "return value wrong\n");
266
267     todo_wine {
268     r = MsiGetSourcePath( hpkg, "TARGETDIR", NULL, &sz );
269     ok( r == ERROR_SUCCESS, "return value wrong\n");
270     }
271
272     MsiCloseHandle( hpkg );
273 }
274
275 START_TEST(package)
276 {
277     test_createpackage();
278     test_getsourcepath_bad();
279     test_getsourcepath();
280 }