push 514b285b0c98f6a7a84c63e51c3091a87ae6d177
[wine/hacks.git] / dlls / mstask / tests / task_trigger.c
blob398494fa7cc986a85592b9b3a346b87bb5e3f2fc
1 /*
2 * Test suite for Task interface
4 * Copyright (C) 2008 Google (Roy Shea)
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 #define COBJMACROS
23 #include <corerror.h>
25 #include "mstask.h"
26 #include "wine/test.h"
28 static ITaskScheduler *test_task_scheduler;
29 static ITask *test_task;
30 static ITaskTrigger *test_trigger;
31 static WORD trigger_index;
33 static BOOL setup_trigger(void)
35 HRESULT hres;
36 const WCHAR task_name[] = {'T','e','s','t','i','n','g', 0};
38 hres = CoCreateInstance(&CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER,
39 &IID_ITaskScheduler, (void **) &test_task_scheduler);
40 if(hres != S_OK)
41 return FALSE;
42 hres = ITaskScheduler_NewWorkItem(test_task_scheduler, task_name,
43 &CLSID_CTask, &IID_ITask, (IUnknown**)&test_task);
44 if(hres != S_OK)
46 ITaskScheduler_Release(test_task_scheduler);
47 return FALSE;
49 hres = ITask_CreateTrigger(test_task, &trigger_index, &test_trigger);
50 if(hres != S_OK)
52 ITask_Release(test_task);
53 ITaskScheduler_Release(test_task_scheduler);
54 return FALSE;
56 return TRUE;
59 static void cleanup_trigger(void)
61 ITaskTrigger_Release(test_trigger);
62 ITask_Release(test_task);
63 ITaskScheduler_Release(test_task_scheduler);
66 static BOOL compare_trigger_state(TASK_TRIGGER found_state,
67 TASK_TRIGGER expected_state)
69 todo_wine ok(found_state.cbTriggerSize == expected_state.cbTriggerSize,
70 "cbTriggerSize: Found %d but expected %d\n",
71 found_state.cbTriggerSize, expected_state.cbTriggerSize);
73 todo_wine ok(found_state.Reserved1 == expected_state.Reserved1,
74 "Reserved1: Found %d but expected %d\n",
75 found_state.Reserved1, expected_state.Reserved1);
77 todo_wine ok(found_state.wBeginYear == expected_state.wBeginYear,
78 "wBeginYear: Found %d but expected %d\n",
79 found_state.wBeginYear, expected_state.wBeginYear);
81 todo_wine ok(found_state.wBeginMonth == expected_state.wBeginMonth,
82 "wBeginMonth: Found %d but expected %d\n",
83 found_state.wBeginMonth, expected_state.wBeginMonth);
85 todo_wine ok(found_state.wBeginDay == expected_state.wBeginDay,
86 "wBeginDay: Found %d but expected %d\n",
87 found_state.wBeginDay, expected_state.wBeginDay);
89 todo_wine ok(found_state.wEndYear == expected_state.wEndYear,
90 "wEndYear: Found %d but expected %d\n",
91 found_state.wEndYear, expected_state.wEndYear);
93 todo_wine ok(found_state.wEndMonth == expected_state.wEndMonth,
94 "wEndMonth: Found %d but expected %d\n",
95 found_state.wEndMonth, expected_state.wEndMonth);
97 todo_wine ok(found_state.wEndDay == expected_state.wEndDay,
98 "wEndDay: Found %d but expected %d\n",
99 found_state.wEndDay, expected_state.wEndDay);
101 todo_wine ok(found_state.wStartHour == expected_state.wStartHour,
102 "wStartHour: Found %d but expected %d\n",
103 found_state.wStartHour, expected_state.wStartHour);
105 todo_wine ok(found_state.wStartMinute == expected_state.wStartMinute,
106 "wStartMinute: Found %d but expected %d\n",
107 found_state.wStartMinute, expected_state.wStartMinute);
109 todo_wine ok(found_state.MinutesDuration == expected_state.MinutesDuration,
110 "MinutesDuration: Found %d but expected %d\n",
111 found_state.MinutesDuration, expected_state.MinutesDuration);
113 todo_wine ok(found_state.MinutesInterval == expected_state.MinutesInterval,
114 "MinutesInterval: Found %d but expected %d\n",
115 found_state.MinutesInterval, expected_state.MinutesInterval);
117 todo_wine ok(found_state.rgFlags == expected_state.rgFlags,
118 "rgFlags: Found %d but expected %d\n",
119 found_state.rgFlags, expected_state.rgFlags);
121 todo_wine ok(found_state.TriggerType == expected_state.TriggerType,
122 "TriggerType: Found %d but expected %d\n",
123 found_state.TriggerType, expected_state.TriggerType);
125 todo_wine ok(found_state.Type.Daily.DaysInterval == expected_state.Type.Daily.DaysInterval,
126 "Type.Daily.DaysInterval: Found %d but expected %d\n",
127 found_state.Type.Daily.DaysInterval, expected_state.Type.Daily.DaysInterval);
129 todo_wine ok(found_state.Reserved2 == expected_state.Reserved2,
130 "Reserved2: Found %d but expected %d\n",
131 found_state.Reserved2, expected_state.Reserved2);
133 todo_wine ok(found_state.wRandomMinutesInterval == expected_state.wRandomMinutesInterval,
134 "wRandomMinutesInterval: Found %d but expected %d\n",
135 found_state.wRandomMinutesInterval, expected_state.wRandomMinutesInterval);
137 return TRUE;
140 static void test_SetTrigger_GetTrigger(void)
142 BOOL setup;
143 HRESULT hres;
144 TASK_TRIGGER trigger_state;
145 TASK_TRIGGER empty_trigger_state = {
146 sizeof(trigger_state), 0,
147 0, 0, 0,
148 0, 0, 0,
149 0, 0, 0, 0,
150 TASK_TRIGGER_FLAG_DISABLED, TASK_TIME_TRIGGER_DAILY, {{1}},
151 0, 0
153 TASK_TRIGGER normal_trigger_state = {
154 sizeof(trigger_state), 0,
155 1980, 1, 1,
156 2980, 2, 2,
157 3, 3,
158 0, 0,
159 TASK_TRIGGER_FLAG_DISABLED, TASK_TIME_TRIGGER_DAILY, {{1}},
160 0, 0
162 SYSTEMTIME time;
164 setup = setup_trigger();
165 todo_wine ok(setup, "Failed to setup test_task\n");
166 if (!setup)
168 skip("Failed to create task. Skipping tests.\n");
169 return;
172 /* Setup a trigger with base values for this test run */
173 GetLocalTime(&time);
174 empty_trigger_state.wStartHour = time.wHour;
175 empty_trigger_state.wStartMinute = time.wMinute;
176 empty_trigger_state.wBeginYear = time.wYear;
177 empty_trigger_state.wBeginMonth = time.wMonth;
178 empty_trigger_state.wBeginDay = time.wDay;
180 /* Test trigger state after trigger creation but before setting * state */
181 memset(&trigger_state, 0xcf, sizeof(trigger_state));
182 trigger_state.cbTriggerSize = sizeof(trigger_state);
183 hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state);
184 todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres);
185 todo_wine ok(compare_trigger_state(trigger_state, empty_trigger_state),
186 "Invalid state\n");
188 /* Test setting basic empty trigger */
189 hres = ITaskTrigger_SetTrigger(test_trigger, &empty_trigger_state);
190 todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres);
191 memset(&trigger_state, 0xcf, sizeof(trigger_state));
192 trigger_state.cbTriggerSize = sizeof(trigger_state);
193 hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state);
194 todo_wine ok(hres == S_OK, "Failed to GetTrigger\n");
195 todo_wine ok(compare_trigger_state(trigger_state, empty_trigger_state),
196 "Invalid state\n");
198 /* Test setting basic non-empty trigger */
199 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
200 todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres);
201 memset(&trigger_state, 0xcf, sizeof(trigger_state));
202 trigger_state.cbTriggerSize = sizeof(trigger_state);
203 hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state);
204 todo_wine ok(hres == S_OK, "Failed to GetTrigger\n");
205 todo_wine ok(compare_trigger_state(trigger_state, normal_trigger_state),
206 "Invalid state\n");
208 /* The following tests modify the normal_trigger_state structure
209 * before each test, and return the normal_trigger_state structure
210 * back to its original valid state after each test. This keeps
211 * each test run independent. */
213 /* Test setting trigger with invalid cbTriggerSize */
214 normal_trigger_state.cbTriggerSize = sizeof(trigger_state) - 1;
215 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
216 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
217 normal_trigger_state.cbTriggerSize = sizeof(trigger_state) + 1;
218 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
219 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
220 normal_trigger_state.cbTriggerSize = sizeof(trigger_state);
222 /* Test setting trigger with invalid Reserved fields */
223 normal_trigger_state.Reserved1 = 80;
224 normal_trigger_state.Reserved2 = 80;
225 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
226 todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres);
227 memset(&trigger_state, 0xcf, sizeof(trigger_state));
228 trigger_state.cbTriggerSize = sizeof(trigger_state);
229 hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state);
230 todo_wine ok(trigger_state.Reserved1 == 0 && trigger_state.Reserved2 == 0,
231 "Reserved fields should be set to zero\n");
232 normal_trigger_state.Reserved1 = 0;
233 normal_trigger_state.Reserved2 = 0;
235 /* Test setting trigger with invalid month */
236 normal_trigger_state.wBeginMonth = 0;
237 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
238 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
239 normal_trigger_state.wBeginMonth = 13;
240 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
241 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
242 normal_trigger_state.wBeginMonth = 1;
244 /* Test setting trigger with invalid begin date */
245 normal_trigger_state.wBeginDay = 0;
246 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
247 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
248 normal_trigger_state.wBeginDay = 32;
249 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
250 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
251 normal_trigger_state.wBeginMonth = 2;
252 normal_trigger_state.wBeginDay = 30;
253 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
254 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
255 normal_trigger_state.wBeginMonth = 1;
256 normal_trigger_state.wBeginDay = 1;
258 /* Test setting trigger invalid end date */
259 normal_trigger_state.wEndYear = 0;
260 normal_trigger_state.wEndMonth = 200;
261 normal_trigger_state.wEndDay = 200;
262 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
263 todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres);
264 memset(&trigger_state, 0xcf, sizeof(trigger_state));
265 trigger_state.cbTriggerSize = sizeof(trigger_state);
266 hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state);
267 todo_wine ok(trigger_state.wEndYear == 0, "End year should be 0: %d\n",
268 trigger_state.wEndYear);
269 todo_wine ok(trigger_state.wEndMonth == 200, "End month should be 200: %d\n",
270 trigger_state.wEndMonth);
271 todo_wine ok(trigger_state.wEndDay == 200, "End day should be 200: %d\n",
272 trigger_state.wEndDay);
273 normal_trigger_state.rgFlags =
274 TASK_TRIGGER_FLAG_DISABLED | TASK_TRIGGER_FLAG_HAS_END_DATE;
275 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
276 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
277 normal_trigger_state.rgFlags = TASK_TRIGGER_FLAG_DISABLED;
278 normal_trigger_state.wEndYear = 2980;
279 normal_trigger_state.wEndMonth = 1;
280 normal_trigger_state.wEndDay = 1;
282 /* Test setting trigger with invalid hour or minute*/
283 normal_trigger_state.wStartHour = 24;
284 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
285 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
286 normal_trigger_state.wStartHour = 3;
287 normal_trigger_state.wStartHour = 60;
288 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
289 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
290 normal_trigger_state.wStartHour = 3;
292 /* Test setting trigger with invalid duration / interval pairs */
293 normal_trigger_state.MinutesDuration = 5;
294 normal_trigger_state.MinutesInterval = 5;
295 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
296 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
297 normal_trigger_state.MinutesDuration = 5;
298 normal_trigger_state.MinutesInterval = 6;
299 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
300 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
301 normal_trigger_state.MinutesDuration = 0;
302 normal_trigger_state.MinutesInterval = 6;
303 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
304 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
305 normal_trigger_state.MinutesDuration = 5;
306 normal_trigger_state.MinutesInterval = 0;
307 todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres);
308 normal_trigger_state.MinutesDuration = 0;
309 normal_trigger_state.MinutesInterval = 0;
311 /* Test setting trigger with end date before start date */
312 normal_trigger_state.wEndYear = 1979;
313 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
314 todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres);
315 normal_trigger_state.rgFlags =
316 TASK_TRIGGER_FLAG_DISABLED | TASK_TRIGGER_FLAG_HAS_END_DATE;
317 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
318 todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres);
319 normal_trigger_state.rgFlags = TASK_TRIGGER_FLAG_DISABLED;
320 normal_trigger_state.wEndYear = 2980;
321 normal_trigger_state.wEndMonth = 1;
322 normal_trigger_state.wEndDay = 1;
325 /* Test setting trigger with invalid TriggerType and Type */
326 normal_trigger_state.TriggerType = TASK_TIME_TRIGGER_ONCE;
327 normal_trigger_state.Type.Weekly.WeeksInterval = 2;
328 normal_trigger_state.Type.Weekly.rgfDaysOfTheWeek = (TASK_MONDAY | TASK_TUESDAY);
329 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
330 todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres);
331 memset(&trigger_state, 0xcf, sizeof(trigger_state));
332 trigger_state.cbTriggerSize = sizeof(trigger_state);
333 hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state);
334 todo_wine ok(trigger_state.Type.Weekly.WeeksInterval == 0xcfcf,
335 "Expected WeeksInterval set remain untouched: %d\n",
336 trigger_state.Type.Weekly.WeeksInterval);
337 todo_wine ok(trigger_state.Type.Weekly.rgfDaysOfTheWeek == 0xcfcf,
338 "Expected WeeksInterval set remain untouched: %d\n",
339 trigger_state.Type.Weekly.rgfDaysOfTheWeek);
340 normal_trigger_state.TriggerType = TASK_TIME_TRIGGER_DAILY;
341 normal_trigger_state.Type.Daily.DaysInterval = 1;
342 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
344 /* Test setting trigger with set wRandomMinutesInterval */
345 normal_trigger_state.wRandomMinutesInterval = 5;
346 hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state);
347 todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres);
348 memset(&trigger_state, 0xcf, sizeof(trigger_state));
349 trigger_state.cbTriggerSize = sizeof(trigger_state);
350 hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state);
351 todo_wine ok(trigger_state.wRandomMinutesInterval == 0,
352 "wRandomMinutesInterval should be set to zero\n");
353 normal_trigger_state.wRandomMinutesInterval = 0;
355 cleanup_trigger();
356 return;
360 START_TEST(task_trigger)
362 CoInitialize(NULL);
363 test_SetTrigger_GetTrigger();
364 CoUninitialize();