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
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)
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
);
42 hres
= ITaskScheduler_NewWorkItem(test_task_scheduler
, task_name
,
43 &CLSID_CTask
, &IID_ITask
, (IUnknown
**)&test_task
);
46 ITaskScheduler_Release(test_task_scheduler
);
49 hres
= ITask_CreateTrigger(test_task
, &trigger_index
, &test_trigger
);
52 ITask_Release(test_task
);
53 ITaskScheduler_Release(test_task_scheduler
);
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
);
140 static void test_SetTrigger_GetTrigger(void)
144 TASK_TRIGGER trigger_state
;
145 TASK_TRIGGER empty_trigger_state
= {
146 sizeof(trigger_state
), 0,
150 TASK_TRIGGER_FLAG_DISABLED
, TASK_TIME_TRIGGER_DAILY
, {{1}},
153 TASK_TRIGGER normal_trigger_state
= {
154 sizeof(trigger_state
), 0,
159 TASK_TRIGGER_FLAG_DISABLED
, TASK_TIME_TRIGGER_DAILY
, {{1}},
164 setup
= setup_trigger();
165 todo_wine
ok(setup
, "Failed to setup test_task\n");
168 skip("Failed to create task. Skipping tests.\n");
172 /* Setup a trigger with base values for this test run */
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
),
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
),
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
),
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;
360 START_TEST(task_trigger
)
363 test_SetTrigger_GetTrigger();