2 * tests for Microsoft Installer functionality
4 * Copyright 2005 Mike McCormack for CodeWeavers
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.
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.
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
26 #include "wine/test.h"
27 #include "wine/windef.h"
29 typedef struct test_MSIFILEHASHINFO
{
30 ULONG dwFileHashInfoSize
;
32 } test_MSIFILEHASHINFO
, *test_PMSIFILEHASHINFO
;
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
;
45 static void test_usefeature(void)
49 if (!pMsiUseFeatureExA
)
52 r
= MsiQueryFeatureState(NULL
,NULL
);
53 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return val\n");
55 r
= MsiQueryFeatureState("{9085040-6000-11d3-8cfe-0150048383c9}" ,NULL
);
56 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return val\n");
58 r
= pMsiUseFeatureExA(NULL
,NULL
,0,0);
59 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return val\n");
61 r
= pMsiUseFeatureExA(NULL
, "WORDVIEWFiles", -2, 1 );
62 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return val\n");
64 r
= pMsiUseFeatureExA("{90850409-6000-11d3-8cfe-0150048383c9}",
66 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return val\n");
68 r
= pMsiUseFeatureExA("{9085040-6000-11d3-8cfe-0150048383c9}",
69 "WORDVIEWFiles", -2, 0 );
70 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return val\n");
72 r
= pMsiUseFeatureExA("{0085040-6000-11d3-8cfe-0150048383c9}",
73 "WORDVIEWFiles", -2, 0 );
74 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return val\n");
76 r
= pMsiUseFeatureExA("{90850409-6000-11d3-8cfe-0150048383c9}",
77 "WORDVIEWFiles", -2, 1 );
78 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return val\n");
81 static void test_null(void)
86 r
= pMsiOpenPackageExW(NULL
, 0, &hpkg
);
87 ok( r
== ERROR_INVALID_PARAMETER
,"wrong error\n");
89 r
= MsiQueryProductStateW(NULL
);
90 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return\n");
92 r
= MsiEnumFeaturesW(NULL
,0,NULL
,NULL
);
93 ok( r
== ERROR_INVALID_PARAMETER
,"wrong error\n");
95 r
= MsiConfigureFeatureW(NULL
, NULL
, 0);
96 ok( r
== ERROR_INVALID_PARAMETER
, "wrong error\n");
98 r
= MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", NULL
, 0);
99 ok( r
== ERROR_INVALID_PARAMETER
, "wrong error\n");
101 r
= MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", "foo", 0);
102 ok( r
== ERROR_INVALID_PARAMETER
, "wrong error %d\n", r
);
104 r
= MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", "foo", INSTALLSTATE_DEFAULT
);
105 ok( r
== ERROR_UNKNOWN_PRODUCT
, "wrong error %d\n", r
);
108 static void test_getcomponentpath(void)
114 if(!pMsiGetComponentPathA
)
117 r
= pMsiGetComponentPathA( NULL
, NULL
, NULL
, NULL
);
118 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return value\n");
120 r
= pMsiGetComponentPathA( "bogus", "bogus", NULL
, NULL
);
121 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return value\n");
123 r
= pMsiGetComponentPathA( "bogus", "{00000000-0000-0000-000000000000}", NULL
, NULL
);
124 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return value\n");
128 r
= pMsiGetComponentPathA( "bogus", "{00000000-0000-0000-000000000000}", buffer
, &sz
);
129 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return value\n");
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");
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");
139 r
= pMsiGetComponentPathA( "{00000409-78E1-11D2-B60F-006097C998E7}",
140 "{029E403D-A86A-1D11-5B5B0006799C897E}", buffer
, &sz
);
141 ok( r
== INSTALLSTATE_INVALIDARG
, "wrong return value\n");
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");
148 static void test_filehash(void)
150 const char name
[] = "msitest.bin";
151 const char data
[] = {'a','b','c'};
154 test_MSIFILEHASHINFO hash
;
157 if (!pMsiGetFileHashA
)
162 memset(&hash
, 0, sizeof hash
);
163 r
= pMsiGetFileHashA(name
, 0, &hash
);
164 ok( r
== ERROR_INVALID_PARAMETER
, "wrong error %d\n", r
);
166 r
= pMsiGetFileHashA(name
, 0, NULL
);
167 ok( r
== ERROR_INVALID_PARAMETER
, "wrong error %d\n", r
);
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
);
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");
178 WriteFile(handle
, data
, sizeof data
, &count
, NULL
);
181 memset(&hash
, 0, sizeof hash
);
182 r
= pMsiGetFileHashA(name
, 0, &hash
);
183 ok( r
== ERROR_INVALID_PARAMETER
, "wrong error %d\n", r
);
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
);
190 r
= pMsiGetFileHashA(name
, 0, &hash
);
191 ok( r
== ERROR_SUCCESS
, "wrong error %d\n", r
);
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");
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" );
218 test_getcomponentpath();