Move and reshuffle reactos/regtetsts into rostests. 1/2
[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 #include "wine/windef.h"
28
29 typedef struct test_MSIFILEHASHINFO {
30 ULONG dwFileHashInfoSize;
31 ULONG dwData[4];
32 } test_MSIFILEHASHINFO, *test_PMSIFILEHASHINFO;
33
34 typedef INSTALLSTATE (WINAPI *fnMsiUseFeatureExA)(LPCSTR, LPCSTR ,DWORD, DWORD );
35 fnMsiUseFeatureExA pMsiUseFeatureExA;
36 typedef UINT (WINAPI *fnMsiOpenPackageExA)(LPCSTR, DWORD, MSIHANDLE*);
37 fnMsiOpenPackageExA pMsiOpenPackageExA;
38 typedef UINT (WINAPI *fnMsiOpenPackageExW)(LPCWSTR, DWORD, MSIHANDLE*);
39 fnMsiOpenPackageExW pMsiOpenPackageExW;
40 typedef INSTALLSTATE (WINAPI *fnMsiGetComponentPathA)(LPCSTR, LPCSTR, LPSTR, DWORD*);
41 fnMsiGetComponentPathA pMsiGetComponentPathA;
42 typedef UINT (WINAPI *fnMsiGetFileHashA)(LPCSTR, DWORD, test_PMSIFILEHASHINFO);
43 fnMsiGetFileHashA pMsiGetFileHashA;
44
45 static void test_usefeature(void)
46 {
47 UINT r;
48
49 if (!pMsiUseFeatureExA)
50 return;
51
52 r = MsiQueryFeatureState(NULL,NULL);
53 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
54
55 r = MsiQueryFeatureState("{9085040-6000-11d3-8cfe-0150048383c9}" ,NULL);
56 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
57
58 r = pMsiUseFeatureExA(NULL,NULL,0,0);
59 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
60
61 r = pMsiUseFeatureExA(NULL, "WORDVIEWFiles", -2, 1 );
62 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
63
64 r = pMsiUseFeatureExA("{90850409-6000-11d3-8cfe-0150048383c9}",
65 NULL, -2, 0 );
66 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
67
68 r = pMsiUseFeatureExA("{9085040-6000-11d3-8cfe-0150048383c9}",
69 "WORDVIEWFiles", -2, 0 );
70 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
71
72 r = pMsiUseFeatureExA("{0085040-6000-11d3-8cfe-0150048383c9}",
73 "WORDVIEWFiles", -2, 0 );
74 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
75
76 r = pMsiUseFeatureExA("{90850409-6000-11d3-8cfe-0150048383c9}",
77 "WORDVIEWFiles", -2, 1 );
78 ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n");
79 }
80
81 static void test_null(void)
82 {
83 MSIHANDLE hpkg;
84 UINT r;
85
86 r = pMsiOpenPackageExW(NULL, 0, &hpkg);
87 ok( r == ERROR_INVALID_PARAMETER,"wrong error\n");
88
89 r = MsiQueryProductStateW(NULL);
90 ok( r == INSTALLSTATE_INVALIDARG, "wrong return\n");
91
92 r = MsiEnumFeaturesW(NULL,0,NULL,NULL);
93 ok( r == ERROR_INVALID_PARAMETER,"wrong error\n");
94
95 r = MsiConfigureFeatureW(NULL, NULL, 0);
96 ok( r == ERROR_INVALID_PARAMETER, "wrong error\n");
97
98 r = MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", NULL, 0);
99 ok( r == ERROR_INVALID_PARAMETER, "wrong error\n");
100
101 r = MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", "foo", 0);
102 ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r);
103
104 r = MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", "foo", INSTALLSTATE_DEFAULT);
105 ok( r == ERROR_UNKNOWN_PRODUCT, "wrong error %d\n", r);
106 }
107
108 static void test_getcomponentpath(void)
109 {
110 INSTALLSTATE r;
111 char buffer[0x100];
112 DWORD sz;
113
114 if(!pMsiGetComponentPathA)
115 return;
116
117 r = pMsiGetComponentPathA( NULL, NULL, NULL, NULL );
118 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
119
120 r = pMsiGetComponentPathA( "bogus", "bogus", NULL, NULL );
121 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
122
123 r = pMsiGetComponentPathA( "bogus", "{00000000-0000-0000-000000000000}", NULL, NULL );
124 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
125
126 sz = sizeof buffer;
127 buffer[0]=0;
128 r = pMsiGetComponentPathA( "bogus", "{00000000-0000-0000-000000000000}", buffer, &sz );
129 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
130
131 r = pMsiGetComponentPathA( "{00000000-78E1-11D2-B60F-006097C998E7}",
132 "{00000000-0000-0000-0000-000000000000}", buffer, &sz );
133 ok( r == INSTALLSTATE_UNKNOWN, "wrong return value\n");
134
135 r = pMsiGetComponentPathA( "{00000409-78E1-11D2-B60F-006097C998E7}",
136 "{00000000-0000-0000-0000-00000000}", buffer, &sz );
137 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
138
139 r = pMsiGetComponentPathA( "{00000409-78E1-11D2-B60F-006097C998E7}",
140 "{029E403D-A86A-1D11-5B5B0006799C897E}", buffer, &sz );
141 ok( r == INSTALLSTATE_INVALIDARG, "wrong return value\n");
142
143 r = pMsiGetComponentPathA( "{00000000-78E1-11D2-B60F-006097C9987e}",
144 "{00000000-A68A-11d1-5B5B-0006799C897E}", buffer, &sz );
145 ok( r == INSTALLSTATE_UNKNOWN, "wrong return value\n");
146 }
147
148 static void test_filehash(void)
149 {
150 const char name[] = "msitest.bin";
151 const char data[] = {'a','b','c'};
152 HANDLE handle;
153 UINT r;
154 test_MSIFILEHASHINFO hash;
155 DWORD count = 0;
156
157 if (!pMsiGetFileHashA)
158 return;
159
160 DeleteFile(name);
161
162 memset(&hash, 0, sizeof hash);
163 r = pMsiGetFileHashA(name, 0, &hash);
164 ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r);
165
166 r = pMsiGetFileHashA(name, 0, NULL);
167 ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r);
168
169 memset(&hash, 0, sizeof hash);
170 hash.dwFileHashInfoSize = sizeof hash;
171 r = pMsiGetFileHashA(name, 0, &hash);
172 ok( r == ERROR_FILE_NOT_FOUND, "wrong error %d\n", r);
173
174 handle = CreateFile(name, GENERIC_READ|GENERIC_WRITE, 0, NULL,
175 CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);
176 ok(handle != INVALID_HANDLE_VALUE, "failed to create file\n");
177
178 WriteFile(handle, data, sizeof data, &count, NULL);
179 CloseHandle(handle);
180
181 memset(&hash, 0, sizeof hash);
182 r = pMsiGetFileHashA(name, 0, &hash);
183 ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r);
184
185 memset(&hash, 0, sizeof hash);
186 hash.dwFileHashInfoSize = sizeof hash;
187 r = pMsiGetFileHashA(name, 1, &hash);
188 ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r);
189
190 r = pMsiGetFileHashA(name, 0, &hash);
191 ok( r == ERROR_SUCCESS, "wrong error %d\n", r);
192
193 ok(hash.dwFileHashInfoSize == sizeof hash, "hash size changed\n");
194 ok(hash.dwData[0] == 0x98500190 &&
195 hash.dwData[1] == 0xb04fd23c &&
196 hash.dwData[2] == 0x7d3f96d6 &&
197 hash.dwData[3] == 0x727fe128, "hash of abc incorrect\n");
198
199 DeleteFile(name);
200 }
201
202 START_TEST(msi)
203 {
204 HMODULE hmod = GetModuleHandle("msi.dll");
205 pMsiUseFeatureExA = (fnMsiUseFeatureExA)
206 GetProcAddress(hmod, "MsiUseFeatureExA");
207 pMsiOpenPackageExA = (fnMsiOpenPackageExA)
208 GetProcAddress(hmod, "MsiOpenPackageExA");
209 pMsiOpenPackageExW = (fnMsiOpenPackageExW)
210 GetProcAddress(hmod, "MsiOpenPackageExW");
211 pMsiGetComponentPathA = (fnMsiGetComponentPathA)
212 GetProcAddress(hmod, "MsiGetComponentPathA" );
213 pMsiGetFileHashA = (fnMsiGetFileHashA)
214 GetProcAddress(hmod, "MsiGetFileHashA" );
215
216 test_usefeature();
217 test_null();
218 test_getcomponentpath();
219 test_filehash();
220 }