d3d8/tests: Avoid a shift overflow in render_state_test_data_init.
[wine/testsucceed.git] / dlls / kernel32 / tests / version.c
blob9f9b72e564ef7b5f62a576e36f2b89689adb236c
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 #include <assert.h>
23 #include "wine/test.h"
24 #include "winbase.h"
26 static BOOL (WINAPI * pVerifyVersionInfoA)(LPOSVERSIONINFOEXA, DWORD, DWORDLONG);
27 static ULONGLONG (WINAPI * pVerSetConditionMask)(ULONGLONG, DWORD, BYTE);
29 #define KERNEL32_GET_PROC(func) \
30 p##func = (void *)GetProcAddress(hKernel32, #func); \
31 if(!p##func) trace("GetProcAddress(hKernel32, '%s') failed\n", #func);
33 static void init_function_pointers(void)
35 HMODULE hKernel32;
37 pVerifyVersionInfoA = NULL;
38 pVerSetConditionMask = NULL;
40 hKernel32 = GetModuleHandleA("kernel32.dll");
41 assert(hKernel32);
42 KERNEL32_GET_PROC(VerifyVersionInfoA);
43 KERNEL32_GET_PROC(VerSetConditionMask);
46 static void test_GetVersionEx(void)
48 OSVERSIONINFOA infoA;
49 OSVERSIONINFOEXA infoExA;
50 BOOL ret;
52 if (0)
54 /* Silently crashes on XP */
55 GetVersionExA(NULL);
58 SetLastError(0xdeadbeef);
59 memset(&infoA,0,sizeof infoA);
60 ret = GetVersionExA(&infoA);
61 ok(!ret, "Expected GetVersionExA to fail\n");
62 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
63 GetLastError() == 0xdeadbeef /* Win9x */,
64 "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
65 GetLastError());
67 SetLastError(0xdeadbeef);
68 infoA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA) / 2;
69 ret = GetVersionExA(&infoA);
70 ok(!ret, "Expected GetVersionExA to fail\n");
71 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
72 GetLastError() == 0xdeadbeef /* Win9x */,
73 "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
74 GetLastError());
76 SetLastError(0xdeadbeef);
77 infoA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA) * 2;
78 ret = GetVersionExA(&infoA);
79 ok(!ret, "Expected GetVersionExA to fail\n");
80 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
81 GetLastError() == 0xdeadbeef /* Win9x */,
82 "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
83 GetLastError());
85 SetLastError(0xdeadbeef);
86 infoA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
87 ret = GetVersionExA(&infoA);
88 ok(ret, "Expected GetVersionExA to succeed\n");
89 ok(GetLastError() == 0xdeadbeef,
90 "Expected 0xdeadbeef, got %d\n", GetLastError());
92 SetLastError(0xdeadbeef);
93 infoExA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
94 ret = GetVersionExA((OSVERSIONINFOA *)&infoExA);
95 ok(ret ||
96 broken(ret == 0), /* win95 */
97 "Expected GetVersionExA to succeed\n");
98 ok(GetLastError() == 0xdeadbeef,
99 "Expected 0xdeadbeef, got %d\n", GetLastError());
102 static void test_VerifyVersionInfo(void)
104 OSVERSIONINFOEX info;
105 BOOL ret;
106 DWORD servicepack, error;
108 if(!pVerifyVersionInfoA || !pVerSetConditionMask)
110 win_skip("Needed functions not available\n");
111 return;
114 /* Before we start doing some tests we should check what the version of
115 * the ServicePack is. Tests on a box with no ServicePack will fail otherwise.
117 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
118 GetVersionExA((OSVERSIONINFO *)&info);
119 servicepack = info.wServicePackMajor;
120 memset(&info, 0, sizeof(info));
122 ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION,
123 pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL));
124 ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
126 SetLastError(0xdeadbeef);
127 ret = pVerifyVersionInfoA(&info, VER_BUILDNUMBER | VER_MAJORVERSION |
128 VER_MINORVERSION/* | VER_PLATFORMID | VER_SERVICEPACKMAJOR |
129 VER_SERVICEPACKMINOR | VER_SUITENAME | VER_PRODUCT_TYPE */,
130 pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL));
131 error = GetLastError();
132 ok(!ret, "VerifyVersionInfoA succeeded\n");
133 ok(error == ERROR_OLD_WIN_VERSION,
134 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
136 /* tests special handling of VER_SUITENAME */
138 ret = pVerifyVersionInfoA(&info, VER_SUITENAME,
139 pVerSetConditionMask(0, VER_SUITENAME, VER_AND));
140 ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
142 ret = pVerifyVersionInfoA(&info, VER_SUITENAME,
143 pVerSetConditionMask(0, VER_SUITENAME, VER_OR));
144 ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
146 /* test handling of version numbers */
148 /* v3.10 is always less than v4.x even
149 * if the minor version is tested */
150 info.dwMajorVersion = 3;
151 info.dwMinorVersion = 10;
152 ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
153 pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL),
154 VER_MAJORVERSION, VER_GREATER_EQUAL));
155 ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
157 info.dwMinorVersion = 0;
158 info.wServicePackMajor = 10;
159 ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
160 pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL),
161 VER_MAJORVERSION, VER_GREATER_EQUAL));
162 ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
164 info.wServicePackMajor = 0;
165 info.wServicePackMinor = 10;
166 ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
167 pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL),
168 VER_MAJORVERSION, VER_GREATER_EQUAL));
169 ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
171 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
172 GetVersionEx((OSVERSIONINFO *)&info);
173 info.wServicePackMinor++;
174 SetLastError(0xdeadbeef);
175 ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
176 pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
177 error = GetLastError();
178 ok(!ret, "VerifyVersionInfoA succeeded\n");
179 ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some wink2 */,
180 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
182 if (servicepack == 0)
184 skip("There is no ServicePack on this system\n");
186 else
188 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
189 GetVersionEx((OSVERSIONINFO *)&info);
190 info.wServicePackMajor--;
191 ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
192 pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER));
193 ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
195 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
196 GetVersionEx((OSVERSIONINFO *)&info);
197 info.wServicePackMajor--;
198 ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
199 pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
200 ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
203 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
204 GetVersionEx((OSVERSIONINFO *)&info);
205 info.wServicePackMajor++;
206 ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
207 pVerSetConditionMask(0, VER_MINORVERSION, VER_LESS));
208 ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
210 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
211 GetVersionEx((OSVERSIONINFO *)&info);
212 info.wServicePackMajor++;
213 ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
214 pVerSetConditionMask(0, VER_MINORVERSION, VER_LESS_EQUAL));
215 ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
217 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
218 GetVersionEx((OSVERSIONINFO *)&info);
219 info.wServicePackMajor--;
220 SetLastError(0xdeadbeef);
221 ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
222 pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL));
223 error = GetLastError();
224 ok(!ret, "VerifyVersionInfoA succeeded\n");
225 ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
226 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
228 /* test the failure hierarchy for the four version fields */
230 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
231 GetVersionEx((OSVERSIONINFO *)&info);
232 info.wServicePackMajor++;
233 SetLastError(0xdeadbeef);
234 ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
235 pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
236 error = GetLastError();
237 ok(!ret, "VerifyVersionInfoA succeeded\n");
238 ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
239 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
241 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
242 GetVersionEx((OSVERSIONINFO *)&info);
243 info.dwMinorVersion++;
244 SetLastError(0xdeadbeef);
245 ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
246 pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
247 error = GetLastError();
248 ok(!ret, "VerifyVersionInfoA succeeded\n");
249 ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
250 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
252 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
253 GetVersionEx((OSVERSIONINFO *)&info);
254 info.dwMajorVersion++;
255 SetLastError(0xdeadbeef);
256 ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
257 pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
258 error = GetLastError();
259 ok(!ret, "VerifyVersionInfoA succeeded\n");
260 ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
261 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
263 ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
264 pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
265 ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
267 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
268 GetVersionEx((OSVERSIONINFO *)&info);
269 info.dwBuildNumber++;
270 SetLastError(0xdeadbeef);
271 ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
272 pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
273 error = GetLastError();
274 ok(!ret, "VerifyVersionInfoA succeeded\n");
275 ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
276 "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
278 ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
279 pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
280 ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
282 /* test bad dwOSVersionInfoSize */
283 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
284 GetVersionEx((OSVERSIONINFO *)&info);
285 info.dwOSVersionInfoSize = 0;
286 ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
287 pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL));
288 ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
291 START_TEST(version)
293 init_function_pointers();
295 test_GetVersionEx();
296 test_VerifyVersionInfo();