[KERNEL32_WINETEST]
[reactos.git] / rostests / winetests / kernel32 / version.c
1 /*
2 * Unit test suite for version functions
3 *
4 * Copyright 2006 Robert Shearman
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 /* Needed for PRODUCT_* defines and GetProductInfo() */
22 #define _WIN32_WINNT 0x0600
23
24 #include "wine/test.h"
25 #include "winbase.h"
26
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);
30
31 #define KERNEL32_GET_PROC(func) \
32 p##func = (void *)GetProcAddress(hKernel32, #func);
33
34 static void init_function_pointers(void)
35 {
36 HMODULE hKernel32;
37
38 hKernel32 = GetModuleHandleA("kernel32.dll");
39
40 KERNEL32_GET_PROC(GetProductInfo);
41 KERNEL32_GET_PROC(VerifyVersionInfoA);
42 KERNEL32_GET_PROC(VerSetConditionMask);
43 }
44
45 static void test_GetProductInfo(void)
46 {
47 DWORD product;
48 DWORD res;
49 DWORD table[] = {9,8,7,6,
50 7,0,0,0,
51 6,2,0,0,
52 6,1,2,0,
53 6,1,1,0,
54 6,1,0,2,
55 6,1,0,0,
56 6,0,3,0,
57 6,0,2,0,
58 6,0,1,5,
59 6,0,1,0,
60 6,0,0,0,
61 5,3,0,0,
62 5,2,0,0,
63 5,1,0,0,
64 5,0,0,0,
65 0};
66
67 DWORD *entry = table;
68
69 if (!pGetProductInfo)
70 {
71 /* Not present before Vista */
72 win_skip("GetProductInfo() not available\n");
73 return;
74 }
75
76 while (*entry)
77 {
78 /* SetLastError() / GetLastError(): value is untouched */
79 product = 0xdeadbeef;
80 SetLastError(0xdeadbeef);
81 res = pGetProductInfo(entry[0], entry[1], entry[2], entry[3], &product);
82
83 if (entry[0] >= 6)
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);
86 else
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());
90
91 entry+= 4;
92 }
93
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());
99 }
100
101 static void test_GetVersionEx(void)
102 {
103 OSVERSIONINFOA infoA;
104 OSVERSIONINFOEXA infoExA;
105 BOOL ret;
106
107 if (0)
108 {
109 /* Silently crashes on XP */
110 GetVersionExA(NULL);
111 }
112
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",
120 GetLastError());
121
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",
129 GetLastError());
130
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",
138 GetLastError());
139
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());
146
147 SetLastError(0xdeadbeef);
148 infoExA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
149 ret = GetVersionExA((OSVERSIONINFOA *)&infoExA);
150 ok(ret ||
151 broken(ret == 0), /* win95 */
152 "Expected GetVersionExA to succeed\n");
153 }
154
155 static void test_VerifyVersionInfo(void)
156 {
157 OSVERSIONINFOEXA info;
158 BOOL ret;
159 DWORD servicepack, error;
160
161 if(!pVerifyVersionInfoA || !pVerSetConditionMask)
162 {
163 win_skip("Needed functions not available\n");
164 return;
165 }
166
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.
169 */
170 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
171 GetVersionExA((OSVERSIONINFOA *)&info);
172 servicepack = info.wServicePackMajor;
173 memset(&info, 0, sizeof(info));
174
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());
178
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);
188
189 /* tests special handling of VER_SUITENAME */
190
191 ret = pVerifyVersionInfoA(&info, VER_SUITENAME,
192 pVerSetConditionMask(0, VER_SUITENAME, VER_AND));
193 ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
194
195 ret = pVerifyVersionInfoA(&info, VER_SUITENAME,
196 pVerSetConditionMask(0, VER_SUITENAME, VER_OR));
197 ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
198
199 /* test handling of version numbers */
200
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());
209
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());
216
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());
223
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);
234
235 if (servicepack == 0)
236 {
237 skip("There is no ServicePack on this system\n");
238 }
239 else
240 {
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());
247
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());
254 }
255
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());
262
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());
269
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);
280
281 /* test the failure hierarchy for the four version fields */
282
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);
293
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);
304
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);
315
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());
319
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);
330
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());
334
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());
342 }
343
344 START_TEST(version)
345 {
346 init_function_pointers();
347
348 test_GetProductInfo();
349 test_GetVersionEx();
350 test_VerifyVersionInfo();
351 }