fix msi winetest
[reactos.git] / rostests / winetests / msi / msi.c
1 /*
2 * tests for Microsoft Installer functionality
3 *
4 * Copyright 2005 Mike McCormack for CodeWeavers
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21 #include <stdio.h>
22 #include <windows.h>
23 #include <msi.h>
24 #include <msiquery.h>
25
26 #include "wine/test.h"
27
28 typedef struct test_MSIFILEHASHINFO {
29 ULONG dwFileHashInfoSize;
30 ULONG dwData[4];
31 } test_MSIFILEHASHINFO, *test_PMSIFILEHASHINFO;
32
33 typedef INSTALLSTATE (WINAPI *fnMsiUseFeatureExA)(LPCSTR, LPCSTR ,DWORD, DWORD );
34 fnMsiUseFeatureExA pMsiUseFeatureExA;
35 typedef UINT (WINAPI *fnMsiOpenPackageExA)(LPCSTR, DWORD, MSIHANDLE*);
36 fnMsiOpenPackageExA pMsiOpenPackageExA;
37 typedef UINT (WINAPI *fnMsiOpenPackageExW)(LPCWSTR, DWORD, MSIHANDLE*);
38 fnMsiOpenPackageExW pMsiOpenPackageExW;
39 typedef INSTALLSTATE (WINAPI *fnMsiGetComponentPathA)(LPCSTR, LPCSTR, LPSTR, DWORD*);
40 fnMsiGetComponentPathA pMsiGetComponentPathA;
41 typedef UINT (WINAPI *fnMsiGetFileHashA)(LPCSTR, DWORD, test_PMSIFILEHASHINFO);
42 fnMsiGetFileHashA pMsiGetFileHashA;
43
44 static void test_usefeature(void)
45 {
46 UINT r;
47
48 if (!pMsiUseFeatureExA)
49 return;
50
51 r = MsiQueryFeatureState(NULL,NULL);
52 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
53
54 r = MsiQueryFeatureState("{9085040-6000-11d3-8cfe-0150048383c9}" ,NULL);
55 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
56
57 r = pMsiUseFeatureExA(NULL,NULL,0,0);
58 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
59
60 r = pMsiUseFeatureExA(NULL, "WORDVIEWFiles", -2, 1 );
61 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
62
63 r = pMsiUseFeatureExA("{90850409-6000-11d3-8cfe-0150048383c9}",
64 NULL, -2, 0 );
65 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
66
67 r = pMsiUseFeatureExA("{9085040-6000-11d3-8cfe-0150048383c9}",
68 "WORDVIEWFiles", -2, 0 );
69 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
70
71 r = pMsiUseFeatureExA("{0085040-6000-11d3-8cfe-0150048383c9}",
72 "WORDVIEWFiles", -2, 0 );
73 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
74
75 r = pMsiUseFeatureExA("{90850409-6000-11d3-8cfe-0150048383c9}",
76 "WORDVIEWFiles", -2, 1 );
77 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
78 }
79
80 static void test_null(void)
81 {
82 MSIHANDLE hpkg;
83 UINT r;
84
85 r = pMsiOpenPackageExW(NULL, 0, &hpkg);
86 ok( r == ERROR_INVALID_PARAMETER,"wrong error\n");
87
88 r = MsiQueryProductStateW(NULL);
89 ok( r == INSTALLSTATE_INVALIDARG, "wrong return\n");
90
91 r = MsiEnumFeaturesW(NULL,0,NULL,NULL);
92 ok( r == ERROR_INVALID_PARAMETER,"wrong error\n");
93
94 r = MsiConfigureFeatureW(NULL, NULL, 0);
95 ok( r == ERROR_INVALID_PARAMETER, "wrong error\n");
96
97 r = MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", NULL, 0);
98 ok( r == ERROR_INVALID_PARAMETER, "wrong error\n");
99
100 r = MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", "foo", 0);
101 ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r);
102
103 r = MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", "foo", INSTALLSTATE_DEFAULT);
104 ok( r == ERROR_UNKNOWN_PRODUCT, "wrong error %d\n", r);
105 }
106
107 static void test_getcomponentpath(void)
108 {
109 INSTALLSTATE r;
110 char buffer[0x100];
111 DWORD sz;
112
113 if(!pMsiGetComponentPathA)
114 return;
115
116 r = pMsiGetComponentPathA( NULL, NULL, NULL, NULL );
117 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
118
119 r = pMsiGetComponentPathA( "bogus", "bogus", NULL, NULL );
120 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
121
122 r = pMsiGetComponentPathA( "bogus", "{00000000-0000-0000-000000000000}", NULL, NULL );
123 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
124
125 sz = sizeof buffer;
126 buffer[0]=0;
127 r = pMsiGetComponentPathA( "bogus", "{00000000-0000-0000-000000000000}", buffer, &sz );
128 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
129
130 r = pMsiGetComponentPathA( "{00000000-78E1-11D2-B60F-006097C998E7}",
131 "{00000000-0000-0000-0000-000000000000}", buffer, &sz );
132 ok( r == INSTALLSTATE_UNKNOWN, "wrong return value\n");
133
134 r = pMsiGetComponentPathA( "{00000409-78E1-11D2-B60F-006097C998E7}",
135 "{00000000-0000-0000-0000-00000000}", buffer, &sz );
136 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
137
138 r = pMsiGetComponentPathA( "{00000409-78E1-11D2-B60F-006097C998E7}",
139 "{029E403D-A86A-1D11-5B5B0006799C897E}", buffer, &sz );
140 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
141
142 r = pMsiGetComponentPathA( "{00000000-78E1-11D2-B60F-006097C9987e}",
143 "{00000000-A68A-11d1-5B5B-0006799C897E}", buffer, &sz );
144 ok( r == INSTALLSTATE_UNKNOWN, "wrong return value\n");
145 }
146
147 static void test_filehash(void)
148 {
149 const char name[] = "msitest.bin";
150 const char data[] = {'a','b','c'};
151 HANDLE handle;
152 UINT r;
153 test_MSIFILEHASHINFO hash;
154 DWORD count = 0;
155
156 if (!pMsiGetFileHashA)
157 return;
158
159 DeleteFile(name);
160
161 memset(&hash, 0, sizeof hash);
162 r = pMsiGetFileHashA(name, 0, &hash);
163 ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r);
164
165 r = pMsiGetFileHashA(name, 0, NULL);
166 ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r);
167
168 memset(&hash, 0, sizeof hash);
169 hash.dwFileHashInfoSize = sizeof hash;
170 r = pMsiGetFileHashA(name, 0, &hash);
171 ok( r == ERROR_FILE_NOT_FOUND, "wrong error %d\n", r);
172
173 handle = CreateFile(name, GENERIC_READ|GENERIC_WRITE, 0, NULL,
174 CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);
175 ok(handle != INVALID_HANDLE_VALUE, "failed to create file\n");
176
177 WriteFile(handle, data, sizeof data, &count, NULL);
178 CloseHandle(handle);
179
180 memset(&hash, 0, sizeof hash);
181 r = pMsiGetFileHashA(name, 0, &hash);
182 ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r);
183
184 memset(&hash, 0, sizeof hash);
185 hash.dwFileHashInfoSize = sizeof hash;
186 r = pMsiGetFileHashA(name, 1, &hash);
187 ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r);
188
189 r = pMsiGetFileHashA(name, 0, &hash);
190 ok( r == ERROR_SUCCESS, "wrong error %d\n", r);
191
192 ok(hash.dwFileHashInfoSize == sizeof hash, "hash size changed\n");
193 ok(hash.dwData[0] == 0x98500190 &&
194 hash.dwData[1] == 0xb04fd23c &&
195 hash.dwData[2] == 0x7d3f96d6 &&
196 hash.dwData[3] == 0x727fe128, "hash of abc incorrect\n");
197
198 DeleteFile(name);
199 }
200
201 START_TEST(msi)
202 {
203 HMODULE hmod = GetModuleHandle("msi.dll");
204 pMsiUseFeatureExA = (fnMsiUseFeatureExA)
205 GetProcAddress(hmod, "MsiUseFeatureExA");
206 pMsiOpenPackageExA = (fnMsiOpenPackageExA)
207 GetProcAddress(hmod, "MsiOpenPackageExA");
208 pMsiOpenPackageExW = (fnMsiOpenPackageExW)
209 GetProcAddress(hmod, "MsiOpenPackageExW");
210 pMsiGetComponentPathA = (fnMsiGetComponentPathA)
211 GetProcAddress(hmod, "MsiGetComponentPathA" );
212 pMsiGetFileHashA = (fnMsiGetFileHashA)
213 GetProcAddress(hmod, "MsiGetFileHashA" );
214
215 test_usefeature();
216 test_null();
217 test_getcomponentpath();
218 test_filehash();
219 }