From c5536ef1ae494e2283e977ba702f863923900f15 Mon Sep 17 00:00:00 2001 From: Roy Shea Date: Wed, 20 Aug 2008 18:29:03 -0700 Subject: [PATCH] mstask/tests: Conformance test for (Set|Get)Trigger. --- dlls/mstask/tests/Makefile.in | 3 +- dlls/mstask/tests/task_trigger.c | 365 +++++++++++++++++++++++++++++++ 2 files changed, 367 insertions(+), 1 deletion(-) create mode 100644 dlls/mstask/tests/task_trigger.c diff --git a/dlls/mstask/tests/Makefile.in b/dlls/mstask/tests/Makefile.in index c1206d9a33d..32aafd082f0 100644 --- a/dlls/mstask/tests/Makefile.in +++ b/dlls/mstask/tests/Makefile.in @@ -7,7 +7,8 @@ IMPORTS = ole32 kernel32 CTESTS = \ task.c \ - task_scheduler.c + task_scheduler.c \ + task_trigger.c @MAKE_TEST_RULES@ diff --git a/dlls/mstask/tests/task_trigger.c b/dlls/mstask/tests/task_trigger.c new file mode 100644 index 00000000000..398494fa7cc --- /dev/null +++ b/dlls/mstask/tests/task_trigger.c @@ -0,0 +1,365 @@ +/* + * Test suite for Task interface + * + * Copyright (C) 2008 Google (Roy Shea) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS + +#include + +#include "mstask.h" +#include "wine/test.h" + +static ITaskScheduler *test_task_scheduler; +static ITask *test_task; +static ITaskTrigger *test_trigger; +static WORD trigger_index; + +static BOOL setup_trigger(void) +{ + HRESULT hres; + const WCHAR task_name[] = {'T','e','s','t','i','n','g', 0}; + + hres = CoCreateInstance(&CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER, + &IID_ITaskScheduler, (void **) &test_task_scheduler); + if(hres != S_OK) + return FALSE; + hres = ITaskScheduler_NewWorkItem(test_task_scheduler, task_name, + &CLSID_CTask, &IID_ITask, (IUnknown**)&test_task); + if(hres != S_OK) + { + ITaskScheduler_Release(test_task_scheduler); + return FALSE; + } + hres = ITask_CreateTrigger(test_task, &trigger_index, &test_trigger); + if(hres != S_OK) + { + ITask_Release(test_task); + ITaskScheduler_Release(test_task_scheduler); + return FALSE; + } + return TRUE; +} + +static void cleanup_trigger(void) +{ + ITaskTrigger_Release(test_trigger); + ITask_Release(test_task); + ITaskScheduler_Release(test_task_scheduler); +} + +static BOOL compare_trigger_state(TASK_TRIGGER found_state, + TASK_TRIGGER expected_state) +{ + todo_wine ok(found_state.cbTriggerSize == expected_state.cbTriggerSize, + "cbTriggerSize: Found %d but expected %d\n", + found_state.cbTriggerSize, expected_state.cbTriggerSize); + + todo_wine ok(found_state.Reserved1 == expected_state.Reserved1, + "Reserved1: Found %d but expected %d\n", + found_state.Reserved1, expected_state.Reserved1); + + todo_wine ok(found_state.wBeginYear == expected_state.wBeginYear, + "wBeginYear: Found %d but expected %d\n", + found_state.wBeginYear, expected_state.wBeginYear); + + todo_wine ok(found_state.wBeginMonth == expected_state.wBeginMonth, + "wBeginMonth: Found %d but expected %d\n", + found_state.wBeginMonth, expected_state.wBeginMonth); + + todo_wine ok(found_state.wBeginDay == expected_state.wBeginDay, + "wBeginDay: Found %d but expected %d\n", + found_state.wBeginDay, expected_state.wBeginDay); + + todo_wine ok(found_state.wEndYear == expected_state.wEndYear, + "wEndYear: Found %d but expected %d\n", + found_state.wEndYear, expected_state.wEndYear); + + todo_wine ok(found_state.wEndMonth == expected_state.wEndMonth, + "wEndMonth: Found %d but expected %d\n", + found_state.wEndMonth, expected_state.wEndMonth); + + todo_wine ok(found_state.wEndDay == expected_state.wEndDay, + "wEndDay: Found %d but expected %d\n", + found_state.wEndDay, expected_state.wEndDay); + + todo_wine ok(found_state.wStartHour == expected_state.wStartHour, + "wStartHour: Found %d but expected %d\n", + found_state.wStartHour, expected_state.wStartHour); + + todo_wine ok(found_state.wStartMinute == expected_state.wStartMinute, + "wStartMinute: Found %d but expected %d\n", + found_state.wStartMinute, expected_state.wStartMinute); + + todo_wine ok(found_state.MinutesDuration == expected_state.MinutesDuration, + "MinutesDuration: Found %d but expected %d\n", + found_state.MinutesDuration, expected_state.MinutesDuration); + + todo_wine ok(found_state.MinutesInterval == expected_state.MinutesInterval, + "MinutesInterval: Found %d but expected %d\n", + found_state.MinutesInterval, expected_state.MinutesInterval); + + todo_wine ok(found_state.rgFlags == expected_state.rgFlags, + "rgFlags: Found %d but expected %d\n", + found_state.rgFlags, expected_state.rgFlags); + + todo_wine ok(found_state.TriggerType == expected_state.TriggerType, + "TriggerType: Found %d but expected %d\n", + found_state.TriggerType, expected_state.TriggerType); + + todo_wine ok(found_state.Type.Daily.DaysInterval == expected_state.Type.Daily.DaysInterval, + "Type.Daily.DaysInterval: Found %d but expected %d\n", + found_state.Type.Daily.DaysInterval, expected_state.Type.Daily.DaysInterval); + + todo_wine ok(found_state.Reserved2 == expected_state.Reserved2, + "Reserved2: Found %d but expected %d\n", + found_state.Reserved2, expected_state.Reserved2); + + todo_wine ok(found_state.wRandomMinutesInterval == expected_state.wRandomMinutesInterval, + "wRandomMinutesInterval: Found %d but expected %d\n", + found_state.wRandomMinutesInterval, expected_state.wRandomMinutesInterval); + + return TRUE; +} + +static void test_SetTrigger_GetTrigger(void) +{ + BOOL setup; + HRESULT hres; + TASK_TRIGGER trigger_state; + TASK_TRIGGER empty_trigger_state = { + sizeof(trigger_state), 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, 0, + TASK_TRIGGER_FLAG_DISABLED, TASK_TIME_TRIGGER_DAILY, {{1}}, + 0, 0 + }; + TASK_TRIGGER normal_trigger_state = { + sizeof(trigger_state), 0, + 1980, 1, 1, + 2980, 2, 2, + 3, 3, + 0, 0, + TASK_TRIGGER_FLAG_DISABLED, TASK_TIME_TRIGGER_DAILY, {{1}}, + 0, 0 + }; + SYSTEMTIME time; + + setup = setup_trigger(); + todo_wine ok(setup, "Failed to setup test_task\n"); + if (!setup) + { + skip("Failed to create task. Skipping tests.\n"); + return; + } + + /* Setup a trigger with base values for this test run */ + GetLocalTime(&time); + empty_trigger_state.wStartHour = time.wHour; + empty_trigger_state.wStartMinute = time.wMinute; + empty_trigger_state.wBeginYear = time.wYear; + empty_trigger_state.wBeginMonth = time.wMonth; + empty_trigger_state.wBeginDay = time.wDay; + + /* Test trigger state after trigger creation but before setting * state */ + memset(&trigger_state, 0xcf, sizeof(trigger_state)); + trigger_state.cbTriggerSize = sizeof(trigger_state); + hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state); + todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres); + todo_wine ok(compare_trigger_state(trigger_state, empty_trigger_state), + "Invalid state\n"); + + /* Test setting basic empty trigger */ + hres = ITaskTrigger_SetTrigger(test_trigger, &empty_trigger_state); + todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres); + memset(&trigger_state, 0xcf, sizeof(trigger_state)); + trigger_state.cbTriggerSize = sizeof(trigger_state); + hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state); + todo_wine ok(hres == S_OK, "Failed to GetTrigger\n"); + todo_wine ok(compare_trigger_state(trigger_state, empty_trigger_state), + "Invalid state\n"); + + /* Test setting basic non-empty trigger */ + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres); + memset(&trigger_state, 0xcf, sizeof(trigger_state)); + trigger_state.cbTriggerSize = sizeof(trigger_state); + hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state); + todo_wine ok(hres == S_OK, "Failed to GetTrigger\n"); + todo_wine ok(compare_trigger_state(trigger_state, normal_trigger_state), + "Invalid state\n"); + + /* The following tests modify the normal_trigger_state structure + * before each test, and return the normal_trigger_state structure + * back to its original valid state after each test. This keeps + * each test run independent. */ + + /* Test setting trigger with invalid cbTriggerSize */ + normal_trigger_state.cbTriggerSize = sizeof(trigger_state) - 1; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.cbTriggerSize = sizeof(trigger_state) + 1; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.cbTriggerSize = sizeof(trigger_state); + + /* Test setting trigger with invalid Reserved fields */ + normal_trigger_state.Reserved1 = 80; + normal_trigger_state.Reserved2 = 80; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres); + memset(&trigger_state, 0xcf, sizeof(trigger_state)); + trigger_state.cbTriggerSize = sizeof(trigger_state); + hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state); + todo_wine ok(trigger_state.Reserved1 == 0 && trigger_state.Reserved2 == 0, + "Reserved fields should be set to zero\n"); + normal_trigger_state.Reserved1 = 0; + normal_trigger_state.Reserved2 = 0; + + /* Test setting trigger with invalid month */ + normal_trigger_state.wBeginMonth = 0; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.wBeginMonth = 13; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.wBeginMonth = 1; + + /* Test setting trigger with invalid begin date */ + normal_trigger_state.wBeginDay = 0; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.wBeginDay = 32; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.wBeginMonth = 2; + normal_trigger_state.wBeginDay = 30; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.wBeginMonth = 1; + normal_trigger_state.wBeginDay = 1; + + /* Test setting trigger invalid end date */ + normal_trigger_state.wEndYear = 0; + normal_trigger_state.wEndMonth = 200; + normal_trigger_state.wEndDay = 200; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres); + memset(&trigger_state, 0xcf, sizeof(trigger_state)); + trigger_state.cbTriggerSize = sizeof(trigger_state); + hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state); + todo_wine ok(trigger_state.wEndYear == 0, "End year should be 0: %d\n", + trigger_state.wEndYear); + todo_wine ok(trigger_state.wEndMonth == 200, "End month should be 200: %d\n", + trigger_state.wEndMonth); + todo_wine ok(trigger_state.wEndDay == 200, "End day should be 200: %d\n", + trigger_state.wEndDay); + normal_trigger_state.rgFlags = + TASK_TRIGGER_FLAG_DISABLED | TASK_TRIGGER_FLAG_HAS_END_DATE; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.rgFlags = TASK_TRIGGER_FLAG_DISABLED; + normal_trigger_state.wEndYear = 2980; + normal_trigger_state.wEndMonth = 1; + normal_trigger_state.wEndDay = 1; + + /* Test setting trigger with invalid hour or minute*/ + normal_trigger_state.wStartHour = 24; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.wStartHour = 3; + normal_trigger_state.wStartHour = 60; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.wStartHour = 3; + + /* Test setting trigger with invalid duration / interval pairs */ + normal_trigger_state.MinutesDuration = 5; + normal_trigger_state.MinutesInterval = 5; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.MinutesDuration = 5; + normal_trigger_state.MinutesInterval = 6; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.MinutesDuration = 0; + normal_trigger_state.MinutesInterval = 6; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.MinutesDuration = 5; + normal_trigger_state.MinutesInterval = 0; + todo_wine ok(hres == E_INVALIDARG, "Expected E_INVALIDARG: 0x%08x\n", hres); + normal_trigger_state.MinutesDuration = 0; + normal_trigger_state.MinutesInterval = 0; + + /* Test setting trigger with end date before start date */ + normal_trigger_state.wEndYear = 1979; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres); + normal_trigger_state.rgFlags = + TASK_TRIGGER_FLAG_DISABLED | TASK_TRIGGER_FLAG_HAS_END_DATE; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres); + normal_trigger_state.rgFlags = TASK_TRIGGER_FLAG_DISABLED; + normal_trigger_state.wEndYear = 2980; + normal_trigger_state.wEndMonth = 1; + normal_trigger_state.wEndDay = 1; + + + /* Test setting trigger with invalid TriggerType and Type */ + normal_trigger_state.TriggerType = TASK_TIME_TRIGGER_ONCE; + normal_trigger_state.Type.Weekly.WeeksInterval = 2; + normal_trigger_state.Type.Weekly.rgfDaysOfTheWeek = (TASK_MONDAY | TASK_TUESDAY); + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres); + memset(&trigger_state, 0xcf, sizeof(trigger_state)); + trigger_state.cbTriggerSize = sizeof(trigger_state); + hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state); + todo_wine ok(trigger_state.Type.Weekly.WeeksInterval == 0xcfcf, + "Expected WeeksInterval set remain untouched: %d\n", + trigger_state.Type.Weekly.WeeksInterval); + todo_wine ok(trigger_state.Type.Weekly.rgfDaysOfTheWeek == 0xcfcf, + "Expected WeeksInterval set remain untouched: %d\n", + trigger_state.Type.Weekly.rgfDaysOfTheWeek); + normal_trigger_state.TriggerType = TASK_TIME_TRIGGER_DAILY; + normal_trigger_state.Type.Daily.DaysInterval = 1; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + + /* Test setting trigger with set wRandomMinutesInterval */ + normal_trigger_state.wRandomMinutesInterval = 5; + hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + todo_wine ok(hres == S_OK, "Failed to set trigger: 0x%08x\n", hres); + memset(&trigger_state, 0xcf, sizeof(trigger_state)); + trigger_state.cbTriggerSize = sizeof(trigger_state); + hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state); + todo_wine ok(trigger_state.wRandomMinutesInterval == 0, + "wRandomMinutesInterval should be set to zero\n"); + normal_trigger_state.wRandomMinutesInterval = 0; + + cleanup_trigger(); + return; +} + + +START_TEST(task_trigger) +{ + CoInitialize(NULL); + test_SetTrigger_GetTrigger(); + CoUninitialize(); +}