2 * tests for Microsoft Installer functionality
4 * Copyright 2005 Mike McCormack for CodeWeavers
5 * Copyright 2005 Aric Stewart for CodeWeavers
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.
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.
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
29 #include "wine/test.h"
31 static UINT run_query( MSIHANDLE hdb, const char *query )
36 r = MsiDatabaseOpenView(hdb, query, &hview);
37 if( r != ERROR_SUCCESS )
40 r = MsiViewExecute(hview, 0);
41 if( r == ERROR_SUCCESS )
42 r = MsiViewClose(hview);
43 MsiCloseHandle(hview);
47 static UINT set_summary_info(MSIHANDLE hdb)
52 /* build summmary info */
53 res = MsiGetSummaryInformation(hdb, NULL, 7, &suminfo);
54 ok( res == ERROR_SUCCESS , "Failed to open summaryinfo\n" );
56 res = MsiSummaryInfoSetProperty(suminfo,2, VT_LPSTR, 0,NULL,
57 "Installation Database");
58 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
60 res = MsiSummaryInfoSetProperty(suminfo,3, VT_LPSTR, 0,NULL,
61 "Installation Database");
62 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
64 res = MsiSummaryInfoSetProperty(suminfo,4, VT_LPSTR, 0,NULL,
66 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
68 res = MsiSummaryInfoSetProperty(suminfo,7, VT_LPSTR, 0,NULL,
70 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
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" );
76 res = MsiSummaryInfoSetProperty(suminfo, 14, VT_I4, 100, NULL, NULL);
77 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
79 res = MsiSummaryInfoSetProperty(suminfo, 15, VT_I4, 0, NULL, NULL);
80 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
82 res = MsiSummaryInfoPersist(suminfo);
83 ok( res == ERROR_SUCCESS , "Failed to make summary info persist\n" );
85 res = MsiCloseHandle( suminfo);
86 ok( res == ERROR_SUCCESS , "Failed to close suminfo\n" );
92 MSIHANDLE create_package_db(void)
95 CHAR szName[] = "winetest.msi";
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 )
106 res = MsiDatabaseCommit( hdb );
107 ok( res == ERROR_SUCCESS , "Failed to commit database\n" );
109 res = set_summary_info(hdb);
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" );
122 MSIHANDLE package_from_db(MSIHANDLE hdb)
128 sprintf(szPackage,"#%li",hdb);
129 res = MsiOpenPackage(szPackage,&hPackage);
130 ok( res == ERROR_SUCCESS , "Failed to open package\n" );
132 res = MsiCloseHandle(hdb);
133 ok( res == ERROR_SUCCESS , "Failed to close db handle\n" );
138 static void test_createpackage(void)
140 MSIHANDLE hPackage = 0;
143 hPackage = package_from_db(create_package_db());
144 ok( hPackage != 0, " Failed to create package\n");
146 res = MsiCloseHandle( hPackage);
147 ok( res == ERROR_SUCCESS , "Failed to close package\n" );
150 static void test_getsourcepath_bad( void )
152 static const char str[] = { 0 };
157 r = MsiGetSourcePath( -1, NULL, NULL, NULL );
158 ok( r == ERROR_INVALID_PARAMETER, "return value wrong\n");
161 r = MsiGetSourcePath( -1, NULL, buffer, &sz );
162 ok( r == ERROR_INVALID_PARAMETER, "return value wrong\n");
165 r = MsiGetSourcePath( -1, str, NULL, &sz );
166 ok( r == ERROR_INVALID_HANDLE, "return value wrong\n");
169 r = MsiGetSourcePath( -1, str, NULL, NULL );
170 ok( r == ERROR_INVALID_HANDLE, "return value wrong\n");
173 r = MsiGetSourcePath( -1, str, buffer, &sz );
174 ok( r == ERROR_INVALID_HANDLE, "return value wrong\n");
177 static UINT add_directory_entry( MSIHANDLE hdb, char *values )
179 char insert[] = "INSERT INTO `Directory` (`Directory`,`Directory_Parent`,`DefaultDir`) VALUES( %s )";
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);
191 static void test_getsourcepath( void )
193 static const char str[] = { 0 };
199 hpkg = package_from_db(create_package_db());
200 ok( hpkg, "failed to create package\n");
204 r = MsiGetSourcePath( hpkg, str, buffer, &sz );
205 ok( r == ERROR_DIRECTORY, "return value wrong\n");
206 ok( buffer[0] == 'x', "buffer modified\n");
210 r = MsiGetSourcePath( hpkg, str, buffer, &sz );
211 ok( r == ERROR_DIRECTORY, "return value wrong\n");
212 ok( buffer[0] == 'x', "buffer modified\n");
214 MsiCloseHandle( hpkg );
217 /* another test but try create a directory this time */
218 hdb = create_package_db();
219 ok( hdb, "failed to create database\n");
221 r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'");
222 ok( r == S_OK, "failed\n");
224 hpkg = package_from_db(hdb);
225 ok( hpkg, "failed to create package\n");
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");
233 r = MsiDoAction( hpkg, "CostInitialize");
234 ok( r == ERROR_SUCCESS, "cost init failed\n");
236 r = MsiDoAction( hpkg, "CostFinalize");
237 ok( r == ERROR_SUCCESS, "cost finalize failed\n");
240 sz = sizeof buffer -1;
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");
247 strcpy(buffer,"x bad");
248 r = MsiGetSourcePath( hpkg, "TARGETDIR", buffer, &sz );
249 ok( r == ERROR_MORE_DATA, "return value wrong\n");
251 ok( buffer[0] == 'x', "buffer modified\n");
254 r = MsiGetSourcePath( hpkg, "TARGETDIR", NULL, NULL );
255 ok( r == ERROR_SUCCESS, "return value wrong\n");
258 r = MsiGetSourcePath( hpkg, "TARGETDIR ", NULL, NULL );
259 ok( r == ERROR_DIRECTORY, "return value wrong\n");
261 r = MsiGetSourcePath( hpkg, "targetdir", NULL, NULL );
262 ok( r == ERROR_DIRECTORY, "return value wrong\n");
264 r = MsiGetSourcePath( hpkg, "TARGETDIR", buffer, NULL );
265 ok( r == ERROR_INVALID_PARAMETER, "return value wrong\n");
268 r = MsiGetSourcePath( hpkg, "TARGETDIR", NULL, &sz );
269 ok( r == ERROR_SUCCESS, "return value wrong\n");
272 MsiCloseHandle( hpkg );
275 static void test_doaction( void )
280 r = MsiDoAction( -1, NULL );
281 ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
283 hpkg = package_from_db(create_package_db());
284 ok( hpkg, "failed to create package\n");
286 r = MsiDoAction(hpkg, NULL);
287 ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
289 r = MsiDoAction(0, "boo");
290 ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
292 r = MsiDoAction(hpkg, "boo");
293 ok( r == ERROR_FUNCTION_NOT_CALLED, "wrong return val\n");
295 MsiCloseHandle( hpkg );
298 static void test_gettargetpath_bad(void)
305 hpkg = package_from_db(create_package_db());
306 ok( hpkg, "failed to create package\n");
308 r = MsiGetTargetPath( 0, NULL, NULL, NULL );
309 ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
311 r = MsiGetTargetPath( 0, NULL, NULL, &sz );
312 ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
314 r = MsiGetTargetPath( 0, "boo", NULL, NULL );
315 ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
317 r = MsiGetTargetPath( 0, "boo", NULL, NULL );
318 ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
320 r = MsiGetTargetPath( hpkg, "boo", NULL, NULL );
321 ok( r == ERROR_DIRECTORY, "wrong return val\n");
323 r = MsiGetTargetPath( hpkg, "boo", buffer, NULL );
324 ok( r == ERROR_DIRECTORY, "wrong return val\n");
326 MsiCloseHandle( hpkg );
329 void test_condition(void)
334 hpkg = package_from_db(create_package_db());
335 ok( hpkg, "failed to create package\n");
337 r = MsiEvaluateCondition(0, NULL);
338 ok( r == MSICONDITION_ERROR, "wrong return val\n");
340 r = MsiEvaluateCondition(hpkg, NULL);
341 ok( r == MSICONDITION_NONE, "wrong return val\n");
343 r = MsiEvaluateCondition(hpkg, "");
344 ok( r == MSICONDITION_NONE, "wrong return val\n");
346 r = MsiEvaluateCondition(hpkg, "1");
347 ok( r == MSICONDITION_TRUE, "wrong return val\n");
349 r = MsiEvaluateCondition(hpkg, "0");
350 ok( r == MSICONDITION_FALSE, "wrong return val\n");
352 r = MsiEvaluateCondition(hpkg, "0 = 0");
353 ok( r == MSICONDITION_TRUE, "wrong return val\n");
355 r = MsiEvaluateCondition(hpkg, "0 <> 0");
356 ok( r == MSICONDITION_FALSE, "wrong return val\n");
358 r = MsiEvaluateCondition(hpkg, "0 = 1");
359 ok( r == MSICONDITION_FALSE, "wrong return val\n");
361 r = MsiEvaluateCondition(hpkg, "0 >= 1");
362 ok( r == MSICONDITION_FALSE, "wrong return val\n");
364 r = MsiEvaluateCondition(hpkg, "0 >=");
365 ok( r == MSICONDITION_ERROR, "wrong return val\n");
367 r = MsiEvaluateCondition(hpkg, " ");
368 ok( r == MSICONDITION_NONE, "wrong return val\n");
370 r = MsiEvaluateCondition(hpkg, "LicView <> \"1\"");
371 ok( r == MSICONDITION_TRUE, "wrong return val\n");
373 r = MsiEvaluateCondition(hpkg, "LicView <> \"0\"");
374 ok( r == MSICONDITION_TRUE, "wrong return val\n");
376 r = MsiEvaluateCondition(hpkg, "LicView <> LicView");
377 ok( r == MSICONDITION_FALSE, "wrong return val\n");
379 r = MsiEvaluateCondition(hpkg, "not 0");
380 ok( r == MSICONDITION_TRUE, "wrong return val\n");
382 r = MsiEvaluateCondition(hpkg, "not LicView");
383 ok( r == MSICONDITION_TRUE, "wrong return val\n");
385 r = MsiEvaluateCondition(hpkg, "not \"A\"");
386 ok( r == MSICONDITION_FALSE, "wrong return val\n");
388 r = MsiEvaluateCondition(hpkg, "~not \"A\"");
389 ok( r == MSICONDITION_ERROR, "wrong return val\n");
391 r = MsiEvaluateCondition(hpkg, "\"0\"");
392 ok( r == MSICONDITION_TRUE, "wrong return val\n");
394 r = MsiEvaluateCondition(hpkg, "1 and 2");
395 ok( r == MSICONDITION_TRUE, "wrong return val\n");
397 r = MsiEvaluateCondition(hpkg, "not 0 and 3");
398 ok( r == MSICONDITION_TRUE, "wrong return val\n");
400 r = MsiEvaluateCondition(hpkg, "not 0 and 0");
401 ok( r == MSICONDITION_FALSE, "wrong return val\n");
403 r = MsiEvaluateCondition(hpkg, "not 0 or 1");
404 ok( r == MSICONDITION_TRUE, "wrong return val\n");
406 r = MsiEvaluateCondition(hpkg, "(0)");
407 ok( r == MSICONDITION_FALSE, "wrong return val\n");
409 r = MsiEvaluateCondition(hpkg, "(((((1))))))");
410 ok( r == MSICONDITION_ERROR, "wrong return val\n");
412 r = MsiEvaluateCondition(hpkg, "(((((1)))))");
413 ok( r == MSICONDITION_TRUE, "wrong return val\n");
415 r = MsiEvaluateCondition(hpkg, " \"A\" < \"B\" ");
416 ok( r == MSICONDITION_TRUE, "wrong return val\n");
418 r = MsiEvaluateCondition(hpkg, " \"A\" > \"B\" ");
419 ok( r == MSICONDITION_FALSE, "wrong return val\n");
421 r = MsiEvaluateCondition(hpkg, " \"1\" > \"12\" ");
422 ok( r == MSICONDITION_FALSE, "wrong return val\n");
424 r = MsiEvaluateCondition(hpkg, " \"100\" < \"21\" ");
425 ok( r == MSICONDITION_TRUE, "wrong return val\n");
427 r = MsiEvaluateCondition(hpkg, "0 < > 0");
428 ok( r == MSICONDITION_ERROR, "wrong return val\n");
430 r = MsiEvaluateCondition(hpkg, "(1<<1) == 2");
431 ok( r == MSICONDITION_ERROR, "wrong return val\n");
433 r = MsiEvaluateCondition(hpkg, " \"A\" = \"a\" ");
434 ok( r == MSICONDITION_FALSE, "wrong return val\n");
436 r = MsiEvaluateCondition(hpkg, " \"A\" ~ = \"a\" ");
437 ok( r == MSICONDITION_ERROR, "wrong return val\n");
439 r = MsiEvaluateCondition(hpkg, " \"A\" ~= \"a\" ");
440 ok( r == MSICONDITION_TRUE, "wrong return val\n");
442 r = MsiEvaluateCondition(hpkg, " \"A\" ~= 1 ");
443 ok( r == MSICONDITION_FALSE, "wrong return val\n");
445 r = MsiEvaluateCondition(hpkg, " \"A\" = 1 ");
446 ok( r == MSICONDITION_FALSE, "wrong return val\n");
448 r = MsiEvaluateCondition(hpkg, " 1 ~= 1 ");
449 ok( r == MSICONDITION_TRUE, "wrong return val\n");
451 r = MsiEvaluateCondition(hpkg, " 1 ~= \"1\" ");
452 ok( r == MSICONDITION_FALSE, "wrong return val\n");
454 r = MsiEvaluateCondition(hpkg, " 1 = \"1\" ");
455 ok( r == MSICONDITION_FALSE, "wrong return val\n");
457 r = MsiEvaluateCondition(hpkg, " 0 = \"1\" ");
458 ok( r == MSICONDITION_FALSE, "wrong return val\n");
460 r = MsiEvaluateCondition(hpkg, " 0 < \"100\" ");
461 ok( r == MSICONDITION_FALSE, "wrong return val\n");
463 r = MsiEvaluateCondition(hpkg, " 100 > \"0\" ");
464 ok( r == MSICONDITION_FALSE, "wrong return val\n");
466 r = MsiEvaluateCondition(hpkg, "1 XOR 1");
467 ok( r == MSICONDITION_FALSE, "wrong return val\n");
469 r = MsiEvaluateCondition(hpkg, "1 IMP 1");
470 ok( r == MSICONDITION_TRUE, "wrong return val\n");
472 r = MsiEvaluateCondition(hpkg, "1 IMP 0");
473 ok( r == MSICONDITION_FALSE, "wrong return val\n");
475 r = MsiEvaluateCondition(hpkg, "0 IMP 0");
476 ok( r == MSICONDITION_TRUE, "wrong return val\n");
478 r = MsiEvaluateCondition(hpkg, "0 EQV 0");
479 ok( r == MSICONDITION_TRUE, "wrong return val\n");
481 r = MsiEvaluateCondition(hpkg, "0 EQV 1");
482 ok( r == MSICONDITION_FALSE, "wrong return val\n");
484 r = MsiEvaluateCondition(hpkg, "1 IMP 1 OR 0");
485 ok( r == MSICONDITION_TRUE, "wrong return val\n");
487 r = MsiEvaluateCondition(hpkg, "1 IMPL 1");
488 ok( r == MSICONDITION_ERROR, "wrong return val\n");
490 r = MsiEvaluateCondition(hpkg, "\"ASFD\" >< \"S\" ");
491 ok( r == MSICONDITION_TRUE, "wrong return val\n");
493 r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"s\" ");
494 ok( r == MSICONDITION_TRUE, "wrong return val\n");
496 r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"\" ");
497 ok( r == MSICONDITION_TRUE, "wrong return val\n");
499 r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"sss\" ");
500 ok( r == MSICONDITION_FALSE, "wrong return val\n");
502 MsiSetProperty(hpkg, "mm", "5" );
504 r = MsiEvaluateCondition(hpkg, "mm = 5");
505 ok( r == MSICONDITION_TRUE, "wrong return val\n");
507 r = MsiEvaluateCondition(hpkg, "mm < 6");
508 ok( r == MSICONDITION_TRUE, "wrong return val\n");
510 r = MsiEvaluateCondition(hpkg, "mm <= 5");
511 ok( r == MSICONDITION_TRUE, "wrong return val\n");
513 r = MsiEvaluateCondition(hpkg, "mm > 4");
514 ok( r == MSICONDITION_TRUE, "wrong return val\n");
516 r = MsiEvaluateCondition(hpkg, "mm < 12");
517 ok( r == MSICONDITION_TRUE, "wrong return val\n");
519 r = MsiEvaluateCondition(hpkg, "mm = \"5\"");
520 ok( r == MSICONDITION_TRUE, "wrong return val\n");
522 r = MsiEvaluateCondition(hpkg, "0 = \"\"");
523 ok( r == MSICONDITION_FALSE, "wrong return val\n");
525 r = MsiEvaluateCondition(hpkg, "0 AND \"\"");
526 ok( r == MSICONDITION_FALSE, "wrong return val\n");
528 r = MsiEvaluateCondition(hpkg, "1 AND \"\"");
529 ok( r == MSICONDITION_FALSE, "wrong return val\n");
531 r = MsiEvaluateCondition(hpkg, "1 AND \"1\"");
532 ok( r == MSICONDITION_TRUE, "wrong return val\n");
534 r = MsiEvaluateCondition(hpkg, "3 >< 1");
535 ok( r == MSICONDITION_TRUE, "wrong return val\n");
537 r = MsiEvaluateCondition(hpkg, "3 >< 4");
538 ok( r == MSICONDITION_FALSE, "wrong return val\n");
540 r = MsiEvaluateCondition(hpkg, "NOT 0 AND 0");
541 ok( r == MSICONDITION_FALSE, "wrong return val\n");
543 r = MsiEvaluateCondition(hpkg, "NOT 0 AND 1");
544 ok( r == MSICONDITION_TRUE, "wrong return val\n");
546 r = MsiEvaluateCondition(hpkg, "NOT 1 OR 0");
547 ok( r == MSICONDITION_FALSE, "wrong return val\n");
549 r = MsiEvaluateCondition(hpkg, "0 AND 1 OR 1");
550 ok( r == MSICONDITION_TRUE, "wrong return val\n");
552 r = MsiEvaluateCondition(hpkg, "0 AND 0 OR 1");
553 ok( r == MSICONDITION_TRUE, "wrong return val\n");
555 r = MsiEvaluateCondition(hpkg, "NOT 0 AND 1 OR 0");
556 ok( r == MSICONDITION_TRUE, "wrong return val\n");
558 r = MsiEvaluateCondition(hpkg, "_1 = _1");
559 ok( r == MSICONDITION_TRUE, "wrong return val\n");
561 r = MsiEvaluateCondition(hpkg, "( 1 AND 1 ) = 2");
562 ok( r == MSICONDITION_ERROR, "wrong return val\n");
564 r = MsiEvaluateCondition(hpkg, "NOT ( 1 AND 1 )");
565 ok( r == MSICONDITION_FALSE, "wrong return val\n");
567 MsiCloseHandle( hpkg );
572 test_createpackage();
573 test_getsourcepath_bad();
574 test_getsourcepath();
576 test_gettargetpath_bad();