2 * Unit test suite for version functions
4 * Copyright 2006 Robert Shearman
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
21 /* Needed for PRODUCT_* defines and GetProductInfo() */
22 #define _WIN32_WINNT 0x0600
24 #include "wine/test.h"
27 static BOOL (WINAPI
* pGetProductInfo
)(DWORD
, DWORD
, DWORD
, DWORD
, DWORD
*);
28 static BOOL (WINAPI
* pVerifyVersionInfoA
)(LPOSVERSIONINFOEXA
, DWORD
, DWORDLONG
);
29 static ULONGLONG (WINAPI
* pVerSetConditionMask
)(ULONGLONG
, DWORD
, BYTE
);
31 #define KERNEL32_GET_PROC(func) \
32 p##func = (void *)GetProcAddress(hKernel32, #func);
34 static void init_function_pointers(void)
38 hKernel32
= GetModuleHandleA("kernel32.dll");
40 KERNEL32_GET_PROC(GetProductInfo
);
41 KERNEL32_GET_PROC(VerifyVersionInfoA
);
42 KERNEL32_GET_PROC(VerSetConditionMask
);
45 static void test_GetProductInfo(void)
49 DWORD table
[] = {9,8,7,6,
71 /* Not present before Vista */
72 win_skip("GetProductInfo() not available\n");
78 /* SetLastError() / GetLastError(): value is untouched */
80 SetLastError(0xdeadbeef);
81 res
= pGetProductInfo(entry
[0], entry
[1], entry
[2], entry
[3], &product
);
84 ok(res
&& (product
> PRODUCT_UNDEFINED
) && (product
<= PRODUCT_PROFESSIONAL_WMC
),
85 "got %d and 0x%x (expected TRUE and a valid PRODUCT_* value)\n", res
, product
);
87 ok(!res
&& !product
&& (GetLastError() == 0xdeadbeef),
88 "got %d and 0x%x with 0x%x (expected FALSE and PRODUCT_UNDEFINED with LastError untouched)\n",
89 res
, product
, GetLastError());
94 /* NULL pointer is not a problem */
95 SetLastError(0xdeadbeef);
96 res
= pGetProductInfo(6, 1, 0, 0, NULL
);
97 ok( (!res
) && (GetLastError() == 0xdeadbeef),
98 "got %d with 0x%x (expected FALSE with LastError untouched\n", res
, GetLastError());
101 static void test_GetVersionEx(void)
103 OSVERSIONINFOA infoA
;
104 OSVERSIONINFOEXA infoExA
;
109 /* Silently crashes on XP */
113 SetLastError(0xdeadbeef);
114 memset(&infoA
,0,sizeof infoA
);
115 ret
= GetVersionExA(&infoA
);
116 ok(!ret
, "Expected GetVersionExA to fail\n");
117 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
||
118 GetLastError() == 0xdeadbeef /* Win9x */,
119 "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
122 SetLastError(0xdeadbeef);
123 infoA
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOA
) / 2;
124 ret
= GetVersionExA(&infoA
);
125 ok(!ret
, "Expected GetVersionExA to fail\n");
126 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
||
127 GetLastError() == 0xdeadbeef /* Win9x */,
128 "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
131 SetLastError(0xdeadbeef);
132 infoA
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOA
) * 2;
133 ret
= GetVersionExA(&infoA
);
134 ok(!ret
, "Expected GetVersionExA to fail\n");
135 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
||
136 GetLastError() == 0xdeadbeef /* Win9x */,
137 "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
140 SetLastError(0xdeadbeef);
141 infoA
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOA
);
142 ret
= GetVersionExA(&infoA
);
143 ok(ret
, "Expected GetVersionExA to succeed\n");
144 ok(GetLastError() == 0xdeadbeef,
145 "Expected 0xdeadbeef, got %d\n", GetLastError());
147 SetLastError(0xdeadbeef);
148 infoExA
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
149 ret
= GetVersionExA((OSVERSIONINFOA
*)&infoExA
);
151 broken(ret
== 0), /* win95 */
152 "Expected GetVersionExA to succeed\n");
155 static void test_VerifyVersionInfo(void)
157 OSVERSIONINFOEXA info
;
159 DWORD servicepack
, error
;
161 if(!pVerifyVersionInfoA
|| !pVerSetConditionMask
)
163 win_skip("Needed functions not available\n");
167 /* Before we start doing some tests we should check what the version of
168 * the ServicePack is. Tests on a box with no ServicePack will fail otherwise.
170 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
171 GetVersionExA((OSVERSIONINFOA
*)&info
);
172 servicepack
= info
.wServicePackMajor
;
173 memset(&info
, 0, sizeof(info
));
175 ret
= pVerifyVersionInfoA(&info
, VER_MAJORVERSION
| VER_MINORVERSION
,
176 pVerSetConditionMask(0, VER_MAJORVERSION
, VER_GREATER_EQUAL
));
177 ok(ret
, "VerifyVersionInfoA failed with error %d\n", GetLastError());
179 SetLastError(0xdeadbeef);
180 ret
= pVerifyVersionInfoA(&info
, VER_BUILDNUMBER
| VER_MAJORVERSION
|
181 VER_MINORVERSION
/* | VER_PLATFORMID | VER_SERVICEPACKMAJOR |
182 VER_SERVICEPACKMINOR | VER_SUITENAME | VER_PRODUCT_TYPE */,
183 pVerSetConditionMask(0, VER_MAJORVERSION
, VER_GREATER_EQUAL
));
184 error
= GetLastError();
185 ok(!ret
, "VerifyVersionInfoA succeeded\n");
186 ok(error
== ERROR_OLD_WIN_VERSION
,
187 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error
);
189 /* tests special handling of VER_SUITENAME */
191 ret
= pVerifyVersionInfoA(&info
, VER_SUITENAME
,
192 pVerSetConditionMask(0, VER_SUITENAME
, VER_AND
));
193 ok(ret
, "VerifyVersionInfoA failed with error %d\n", GetLastError());
195 ret
= pVerifyVersionInfoA(&info
, VER_SUITENAME
,
196 pVerSetConditionMask(0, VER_SUITENAME
, VER_OR
));
197 ok(ret
, "VerifyVersionInfoA failed with error %d\n", GetLastError());
199 /* test handling of version numbers */
201 /* v3.10 is always less than v4.x even
202 * if the minor version is tested */
203 info
.dwMajorVersion
= 3;
204 info
.dwMinorVersion
= 10;
205 ret
= pVerifyVersionInfoA(&info
, VER_MAJORVERSION
| VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
206 pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER_EQUAL
),
207 VER_MAJORVERSION
, VER_GREATER_EQUAL
));
208 ok(ret
, "VerifyVersionInfoA failed with error %d\n", GetLastError());
210 info
.dwMinorVersion
= 0;
211 info
.wServicePackMajor
= 10;
212 ret
= pVerifyVersionInfoA(&info
, VER_MAJORVERSION
| VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
213 pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER_EQUAL
),
214 VER_MAJORVERSION
, VER_GREATER_EQUAL
));
215 ok(ret
, "VerifyVersionInfoA failed with error %d\n", GetLastError());
217 info
.wServicePackMajor
= 0;
218 info
.wServicePackMinor
= 10;
219 ret
= pVerifyVersionInfoA(&info
, VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
220 pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER_EQUAL
),
221 VER_MAJORVERSION
, VER_GREATER_EQUAL
));
222 ok(ret
, "VerifyVersionInfoA failed with error %d\n", GetLastError());
224 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
225 GetVersionExA((OSVERSIONINFOA
*)&info
);
226 info
.wServicePackMinor
++;
227 SetLastError(0xdeadbeef);
228 ret
= pVerifyVersionInfoA(&info
, VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
229 pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER_EQUAL
));
230 error
= GetLastError();
231 ok(!ret
, "VerifyVersionInfoA succeeded\n");
232 ok(error
== ERROR_OLD_WIN_VERSION
|| broken(error
== ERROR_BAD_ARGUMENTS
) /* some wink2 */,
233 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error
);
235 if (servicepack
== 0)
237 skip("There is no ServicePack on this system\n");
241 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
242 GetVersionExA((OSVERSIONINFOA
*)&info
);
243 info
.wServicePackMajor
--;
244 ret
= pVerifyVersionInfoA(&info
, VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
245 pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER
));
246 ok(ret
|| broken(!ret
) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
248 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
249 GetVersionExA((OSVERSIONINFOA
*)&info
);
250 info
.wServicePackMajor
--;
251 ret
= pVerifyVersionInfoA(&info
, VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
252 pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER_EQUAL
));
253 ok(ret
|| broken(!ret
) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
256 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
257 GetVersionExA((OSVERSIONINFOA
*)&info
);
258 info
.wServicePackMajor
++;
259 ret
= pVerifyVersionInfoA(&info
, VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
260 pVerSetConditionMask(0, VER_MINORVERSION
, VER_LESS
));
261 ok(ret
|| broken(!ret
) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
263 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
264 GetVersionExA((OSVERSIONINFOA
*)&info
);
265 info
.wServicePackMajor
++;
266 ret
= pVerifyVersionInfoA(&info
, VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
267 pVerSetConditionMask(0, VER_MINORVERSION
, VER_LESS_EQUAL
));
268 ok(ret
|| broken(!ret
) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
270 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
271 GetVersionExA((OSVERSIONINFOA
*)&info
);
272 info
.wServicePackMajor
--;
273 SetLastError(0xdeadbeef);
274 ret
= pVerifyVersionInfoA(&info
, VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
275 pVerSetConditionMask(0, VER_MINORVERSION
, VER_EQUAL
));
276 error
= GetLastError();
277 ok(!ret
, "VerifyVersionInfoA succeeded\n");
278 ok(error
== ERROR_OLD_WIN_VERSION
|| broken(error
== ERROR_BAD_ARGUMENTS
) /* some win2k */,
279 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error
);
281 /* test the failure hierarchy for the four version fields */
283 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
284 GetVersionExA((OSVERSIONINFOA
*)&info
);
285 info
.wServicePackMajor
++;
286 SetLastError(0xdeadbeef);
287 ret
= pVerifyVersionInfoA(&info
, VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
288 pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER_EQUAL
));
289 error
= GetLastError();
290 ok(!ret
, "VerifyVersionInfoA succeeded\n");
291 ok(error
== ERROR_OLD_WIN_VERSION
|| broken(error
== ERROR_BAD_ARGUMENTS
) /* some win2k */,
292 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error
);
294 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
295 GetVersionExA((OSVERSIONINFOA
*)&info
);
296 info
.dwMinorVersion
++;
297 SetLastError(0xdeadbeef);
298 ret
= pVerifyVersionInfoA(&info
, VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
299 pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER_EQUAL
));
300 error
= GetLastError();
301 ok(!ret
, "VerifyVersionInfoA succeeded\n");
302 ok(error
== ERROR_OLD_WIN_VERSION
|| broken(error
== ERROR_BAD_ARGUMENTS
) /* some win2k */,
303 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error
);
305 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
306 GetVersionExA((OSVERSIONINFOA
*)&info
);
307 info
.dwMajorVersion
++;
308 SetLastError(0xdeadbeef);
309 ret
= pVerifyVersionInfoA(&info
, VER_MAJORVERSION
| VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
310 pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER_EQUAL
));
311 error
= GetLastError();
312 ok(!ret
, "VerifyVersionInfoA succeeded\n");
313 ok(error
== ERROR_OLD_WIN_VERSION
|| broken(error
== ERROR_BAD_ARGUMENTS
) /* some win2k */,
314 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error
);
316 ret
= pVerifyVersionInfoA(&info
, VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
317 pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER_EQUAL
));
318 ok(ret
|| broken(!ret
) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
320 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
321 GetVersionExA((OSVERSIONINFOA
*)&info
);
322 info
.dwBuildNumber
++;
323 SetLastError(0xdeadbeef);
324 ret
= pVerifyVersionInfoA(&info
, VER_MAJORVERSION
| VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
325 pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER_EQUAL
));
326 error
= GetLastError();
327 ok(!ret
, "VerifyVersionInfoA succeeded\n");
328 ok(error
== ERROR_OLD_WIN_VERSION
|| broken(error
== ERROR_BAD_ARGUMENTS
) /* some win2k */,
329 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error
);
331 ret
= pVerifyVersionInfoA(&info
, VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
332 pVerSetConditionMask(0, VER_MINORVERSION
, VER_GREATER_EQUAL
));
333 ok(ret
|| broken(!ret
) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
335 /* test bad dwOSVersionInfoSize */
336 info
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXA
);
337 GetVersionExA((OSVERSIONINFOA
*)&info
);
338 info
.dwOSVersionInfoSize
= 0;
339 ret
= pVerifyVersionInfoA(&info
, VER_MAJORVERSION
| VER_MINORVERSION
| VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR
,
340 pVerSetConditionMask(0, VER_MAJORVERSION
, VER_GREATER_EQUAL
));
341 ok(ret
|| broken(!ret
) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
346 init_function_pointers();
348 test_GetProductInfo();
350 test_VerifyVersionInfo();