Add a bunch of tests for MsiEvaluateCondition and make them pass.
[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 static void test_doaction( void )
276 {
277     MSIHANDLE hpkg;
278     UINT r;
279
280     r = MsiDoAction( -1, NULL );
281     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
282
283     hpkg = package_from_db(create_package_db());
284     ok( hpkg, "failed to create package\n");
285
286     r = MsiDoAction(hpkg, NULL);
287     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
288
289     r = MsiDoAction(0, "boo");
290     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
291
292     r = MsiDoAction(hpkg, "boo");
293     ok( r == ERROR_FUNCTION_NOT_CALLED, "wrong return val\n");
294
295     MsiCloseHandle( hpkg );
296 }
297
298 static void test_gettargetpath_bad(void)
299 {
300     char buffer[0x80];
301     MSIHANDLE hpkg;
302     DWORD sz;
303     UINT r;
304
305     hpkg = package_from_db(create_package_db());
306     ok( hpkg, "failed to create package\n");
307
308     r = MsiGetTargetPath( 0, NULL, NULL, NULL );
309     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
310
311     r = MsiGetTargetPath( 0, NULL, NULL, &sz );
312     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
313
314     r = MsiGetTargetPath( 0, "boo", NULL, NULL );
315     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
316
317     r = MsiGetTargetPath( 0, "boo", NULL, NULL );
318     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
319
320     r = MsiGetTargetPath( hpkg, "boo", NULL, NULL );
321     ok( r == ERROR_DIRECTORY, "wrong return val\n");
322
323     r = MsiGetTargetPath( hpkg, "boo", buffer, NULL );
324     ok( r == ERROR_DIRECTORY, "wrong return val\n");
325
326     MsiCloseHandle( hpkg );
327 }
328
329 void test_condition(void)
330 {
331     MSICONDITION r;
332     MSIHANDLE hpkg;
333
334     hpkg = package_from_db(create_package_db());
335     ok( hpkg, "failed to create package\n");
336
337     r = MsiEvaluateCondition(0, NULL);
338     ok( r == MSICONDITION_ERROR, "wrong return val\n");
339
340     r = MsiEvaluateCondition(hpkg, NULL);
341     ok( r == MSICONDITION_NONE, "wrong return val\n");
342
343     r = MsiEvaluateCondition(hpkg, "");
344     ok( r == MSICONDITION_NONE, "wrong return val\n");
345
346     r = MsiEvaluateCondition(hpkg, "1");
347     ok( r == MSICONDITION_TRUE, "wrong return val\n");
348
349     r = MsiEvaluateCondition(hpkg, "0");
350     ok( r == MSICONDITION_FALSE, "wrong return val\n");
351
352     r = MsiEvaluateCondition(hpkg, "0 = 0");
353     ok( r == MSICONDITION_TRUE, "wrong return val\n");
354
355     r = MsiEvaluateCondition(hpkg, "0 <> 0");
356     ok( r == MSICONDITION_FALSE, "wrong return val\n");
357
358     r = MsiEvaluateCondition(hpkg, "0 = 1");
359     ok( r == MSICONDITION_FALSE, "wrong return val\n");
360
361     r = MsiEvaluateCondition(hpkg, "0 >= 1");
362     ok( r == MSICONDITION_FALSE, "wrong return val\n");
363
364     r = MsiEvaluateCondition(hpkg, "0 >=");
365     ok( r == MSICONDITION_ERROR, "wrong return val\n");
366
367     r = MsiEvaluateCondition(hpkg, " ");
368     ok( r == MSICONDITION_NONE, "wrong return val\n");
369
370     r = MsiEvaluateCondition(hpkg, "LicView <> \"1\"");
371     ok( r == MSICONDITION_TRUE, "wrong return val\n");
372
373     r = MsiEvaluateCondition(hpkg, "LicView <> \"0\"");
374     ok( r == MSICONDITION_TRUE, "wrong return val\n");
375
376     r = MsiEvaluateCondition(hpkg, "LicView <> LicView");
377     ok( r == MSICONDITION_FALSE, "wrong return val\n");
378
379     r = MsiEvaluateCondition(hpkg, "not 0");
380     ok( r == MSICONDITION_TRUE, "wrong return val\n");
381
382     r = MsiEvaluateCondition(hpkg, "not LicView");
383     ok( r == MSICONDITION_TRUE, "wrong return val\n");
384
385     r = MsiEvaluateCondition(hpkg, "not \"A\"");
386     ok( r == MSICONDITION_FALSE, "wrong return val\n");
387
388     r = MsiEvaluateCondition(hpkg, "~not \"A\"");
389     ok( r == MSICONDITION_ERROR, "wrong return val\n");
390
391     r = MsiEvaluateCondition(hpkg, "\"0\"");
392     ok( r == MSICONDITION_TRUE, "wrong return val\n");
393
394     r = MsiEvaluateCondition(hpkg, "1 and 2");
395     ok( r == MSICONDITION_TRUE, "wrong return val\n");
396
397     r = MsiEvaluateCondition(hpkg, "not 0 and 3");
398     ok( r == MSICONDITION_TRUE, "wrong return val\n");
399
400     r = MsiEvaluateCondition(hpkg, "not 0 and 0");
401     ok( r == MSICONDITION_FALSE, "wrong return val\n");
402
403     r = MsiEvaluateCondition(hpkg, "not 0 or 1");
404     ok( r == MSICONDITION_TRUE, "wrong return val\n");
405
406     r = MsiEvaluateCondition(hpkg, "(0)");
407     ok( r == MSICONDITION_FALSE, "wrong return val\n");
408
409     r = MsiEvaluateCondition(hpkg, "(((((1))))))");
410     ok( r == MSICONDITION_ERROR, "wrong return val\n");
411
412     r = MsiEvaluateCondition(hpkg, "(((((1)))))");
413     ok( r == MSICONDITION_TRUE, "wrong return val\n");
414
415     r = MsiEvaluateCondition(hpkg, " \"A\" < \"B\" ");
416     ok( r == MSICONDITION_TRUE, "wrong return val\n");
417
418     r = MsiEvaluateCondition(hpkg, " \"A\" > \"B\" ");
419     ok( r == MSICONDITION_FALSE, "wrong return val\n");
420
421     r = MsiEvaluateCondition(hpkg, " \"1\" > \"12\" ");
422     ok( r == MSICONDITION_FALSE, "wrong return val\n");
423
424     r = MsiEvaluateCondition(hpkg, " \"100\" < \"21\" ");
425     ok( r == MSICONDITION_TRUE, "wrong return val\n");
426
427     r = MsiEvaluateCondition(hpkg, "0 < > 0");
428     ok( r == MSICONDITION_ERROR, "wrong return val\n");
429
430     r = MsiEvaluateCondition(hpkg, "(1<<1) == 2");
431     ok( r == MSICONDITION_ERROR, "wrong return val\n");
432
433     r = MsiEvaluateCondition(hpkg, " \"A\" = \"a\" ");
434     ok( r == MSICONDITION_FALSE, "wrong return val\n");
435
436     r = MsiEvaluateCondition(hpkg, " \"A\" ~ = \"a\" ");
437     ok( r == MSICONDITION_ERROR, "wrong return val\n");
438
439     r = MsiEvaluateCondition(hpkg, " \"A\" ~= \"a\" ");
440     ok( r == MSICONDITION_TRUE, "wrong return val\n");
441
442     r = MsiEvaluateCondition(hpkg, " \"A\" ~= 1 ");
443     ok( r == MSICONDITION_FALSE, "wrong return val\n");
444
445     r = MsiEvaluateCondition(hpkg, " \"A\" = 1 ");
446     ok( r == MSICONDITION_FALSE, "wrong return val\n");
447
448     r = MsiEvaluateCondition(hpkg, " 1 ~= 1 ");
449     ok( r == MSICONDITION_TRUE, "wrong return val\n");
450
451     r = MsiEvaluateCondition(hpkg, " 1 ~= \"1\" ");
452     ok( r == MSICONDITION_FALSE, "wrong return val\n");
453
454     r = MsiEvaluateCondition(hpkg, " 1 = \"1\" ");
455     ok( r == MSICONDITION_FALSE, "wrong return val\n");
456
457     r = MsiEvaluateCondition(hpkg, " 0 = \"1\" ");
458     ok( r == MSICONDITION_FALSE, "wrong return val\n");
459
460     r = MsiEvaluateCondition(hpkg, " 0 < \"100\" ");
461     ok( r == MSICONDITION_FALSE, "wrong return val\n");
462
463     r = MsiEvaluateCondition(hpkg, " 100 > \"0\" ");
464     ok( r == MSICONDITION_FALSE, "wrong return val\n");
465
466     r = MsiEvaluateCondition(hpkg, "1 XOR 1");
467     ok( r == MSICONDITION_FALSE, "wrong return val\n");
468
469     r = MsiEvaluateCondition(hpkg, "1 IMP 1");
470     ok( r == MSICONDITION_TRUE, "wrong return val\n");
471
472     r = MsiEvaluateCondition(hpkg, "1 IMP 0");
473     ok( r == MSICONDITION_FALSE, "wrong return val\n");
474
475     r = MsiEvaluateCondition(hpkg, "0 IMP 0");
476     ok( r == MSICONDITION_TRUE, "wrong return val\n");
477
478     r = MsiEvaluateCondition(hpkg, "0 EQV 0");
479     ok( r == MSICONDITION_TRUE, "wrong return val\n");
480
481     r = MsiEvaluateCondition(hpkg, "0 EQV 1");
482     ok( r == MSICONDITION_FALSE, "wrong return val\n");
483
484     r = MsiEvaluateCondition(hpkg, "1 IMP 1 OR 0");
485     ok( r == MSICONDITION_TRUE, "wrong return val\n");
486
487     r = MsiEvaluateCondition(hpkg, "1 IMPL 1");
488     ok( r == MSICONDITION_ERROR, "wrong return val\n");
489
490     r = MsiEvaluateCondition(hpkg, "\"ASFD\" >< \"S\" ");
491     ok( r == MSICONDITION_TRUE, "wrong return val\n");
492
493     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"s\" ");
494     ok( r == MSICONDITION_TRUE, "wrong return val\n");
495
496     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"\" ");
497     ok( r == MSICONDITION_TRUE, "wrong return val\n");
498
499     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"sss\" ");
500     ok( r == MSICONDITION_FALSE, "wrong return val\n");
501
502     MsiSetProperty(hpkg, "mm", "5" );
503
504     r = MsiEvaluateCondition(hpkg, "mm = 5");
505     ok( r == MSICONDITION_TRUE, "wrong return val\n");
506
507     r = MsiEvaluateCondition(hpkg, "mm < 6");
508     ok( r == MSICONDITION_TRUE, "wrong return val\n");
509
510     r = MsiEvaluateCondition(hpkg, "mm <= 5");
511     ok( r == MSICONDITION_TRUE, "wrong return val\n");
512
513     r = MsiEvaluateCondition(hpkg, "mm > 4");
514     ok( r == MSICONDITION_TRUE, "wrong return val\n");
515
516     r = MsiEvaluateCondition(hpkg, "mm < 12");
517     ok( r == MSICONDITION_TRUE, "wrong return val\n");
518
519     r = MsiEvaluateCondition(hpkg, "mm = \"5\"");
520     ok( r == MSICONDITION_TRUE, "wrong return val\n");
521
522     r = MsiEvaluateCondition(hpkg, "0 = \"\"");
523     ok( r == MSICONDITION_FALSE, "wrong return val\n");
524
525     r = MsiEvaluateCondition(hpkg, "0 AND \"\"");
526     ok( r == MSICONDITION_FALSE, "wrong return val\n");
527
528     r = MsiEvaluateCondition(hpkg, "1 AND \"\"");
529     ok( r == MSICONDITION_FALSE, "wrong return val\n");
530
531     r = MsiEvaluateCondition(hpkg, "1 AND \"1\"");
532     ok( r == MSICONDITION_TRUE, "wrong return val\n");
533
534     r = MsiEvaluateCondition(hpkg, "3 >< 1");
535     ok( r == MSICONDITION_TRUE, "wrong return val\n");
536
537     r = MsiEvaluateCondition(hpkg, "3 >< 4");
538     ok( r == MSICONDITION_FALSE, "wrong return val\n");
539
540     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 0");
541     ok( r == MSICONDITION_FALSE, "wrong return val\n");
542
543     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 1");
544     ok( r == MSICONDITION_TRUE, "wrong return val\n");
545
546     r = MsiEvaluateCondition(hpkg, "NOT 1 OR 0");
547     ok( r == MSICONDITION_FALSE, "wrong return val\n");
548
549     r = MsiEvaluateCondition(hpkg, "0 AND 1 OR 1");
550     ok( r == MSICONDITION_TRUE, "wrong return val\n");
551
552     r = MsiEvaluateCondition(hpkg, "0 AND 0 OR 1");
553     ok( r == MSICONDITION_TRUE, "wrong return val\n");
554
555     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 1 OR 0");
556     ok( r == MSICONDITION_TRUE, "wrong return val\n");
557
558     r = MsiEvaluateCondition(hpkg, "_1 = _1");
559     ok( r == MSICONDITION_TRUE, "wrong return val\n");
560
561     r = MsiEvaluateCondition(hpkg, "( 1 AND 1 ) = 2");
562     ok( r == MSICONDITION_ERROR, "wrong return val\n");
563
564     r = MsiEvaluateCondition(hpkg, "NOT ( 1 AND 1 )");
565     ok( r == MSICONDITION_FALSE, "wrong return val\n");
566
567     MsiCloseHandle( hpkg );
568 }
569
570 START_TEST(package)
571 {
572     test_createpackage();
573     test_getsourcepath_bad();
574     test_getsourcepath();
575     test_doaction();
576     test_gettargetpath_bad();
577 }