dpnet/tests: Add a trailing '\n' to some ok() calls.
[wine.git] / dlls / kernel32 / tests / version.c
blobe27ea4c7984b77b14af13d3b44eba010cf61123c
1 /*
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"
25 #include "winbase.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)
36 HMODULE hKernel32;
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)
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};
67 DWORD *entry = table;
69 if (!pGetProductInfo)
71 /* Not present before Vista */
72 win_skip("GetProductInfo() not available\n");
73 return;
76 while (*entry)
78 /* SetLastError() / GetLastError(): value is untouched */
79 product = 0xdeadbeef;
80 SetLastError(0xdeadbeef);
81 res = pGetProductInfo(entry[0], entry[1], entry[2], entry[3], &product);
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());
91 entry+= 4;
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;
105 BOOL ret;
107 if (0)
109 /* Silently crashes on XP */
110 GetVersionExA(NULL);
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());
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());
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());
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);
150 ok(ret ||
151 broken(ret == 0), /* win95 */
152 "Expected GetVersionExA to succeed\n");
155 static void test_VerifyVersionInfo(void)
157 OSVERSIONINFOEXA info;
158 BOOL ret;
159 DWORD servicepack, error;
161 if(!pVerifyVersionInfoA || !pVerSetConditionMask)
163 win_skip("Needed functions not available\n");
164 return;
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");
239 else
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());
344 START_TEST(version)
346 init_function_pointers();
348 test_GetProductInfo();
349 test_GetVersionEx();
350 test_VerifyVersionInfo();