[PATCH 11/12] mstask/tests: Add some tests for ITask::Run().
Dmitry Timoshkov
dmitry at baikal.ru
Thu May 10 23:36:47 CDT 2018
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
dlls/mstask/tests/task.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 164 insertions(+)
diff --git a/dlls/mstask/tests/task.c b/dlls/mstask/tests/task.c
index 6837782f2a..2e8ee93630 100644
--- a/dlls/mstask/tests/task.c
+++ b/dlls/mstask/tests/task.c
@@ -591,6 +591,169 @@ static void test_task_state(void)
cleanup_task();
}
+static void save_job(ITask *task)
+{
+ HRESULT hr;
+ IPersistFile *pfile;
+
+ hr = ITask_QueryInterface(task, &IID_IPersistFile, (void **)&pfile);
+ ok(hr == S_OK, "QueryInterface error %#x\n", hr);
+
+ hr = IPersistFile_Save(pfile, NULL, FALSE);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ IPersistFile_Release(pfile);
+}
+
+static void test_Run(void)
+{
+ static const WCHAR wine_test_runW[] = { 'w','i','n','e','_','t','e','s','t','_','r','u','n',0 };
+ static const WCHAR cmdW[] = { 'c','m','d','.','e','x','e',0 };
+ ITaskScheduler *scheduler;
+ ITask *task;
+ ITaskTrigger *trigger;
+ WORD idx, i;
+ TASK_TRIGGER trigger_data;
+ SYSTEMTIME st;
+ HRESULT hr, status;
+
+ hr = CoCreateInstance(&CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER,
+ &IID_ITaskScheduler, (void **)&scheduler);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ /* cleanup after previous runs */
+ ITaskScheduler_Delete(scheduler, wine_test_runW);
+
+ hr = ITaskScheduler_NewWorkItem(scheduler, wine_test_runW, &CLSID_CTask,
+ &IID_ITask, (IUnknown **)&task);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ hr = ITask_Run(task);
+ ok(hr == SCHED_E_TASK_NOT_READY, "got %#x\n", hr);
+
+ hr = ITask_Terminate(task);
+ ok(hr == SCHED_E_TASK_NOT_RUNNING, "got %#x\n", hr);
+
+ hr = ITask_GetStatus(task, &status);
+ ok(hr == S_OK, "got %#x\n", hr);
+ ok(status == SCHED_S_TASK_NOT_SCHEDULED, "got %#x\n", status);
+
+ save_job(task);
+
+ hr = ITask_GetStatus(task, &status);
+ ok(hr == S_OK, "got %#x\n", hr);
+ ok(status == SCHED_S_TASK_NOT_SCHEDULED, "got %#x\n", status);
+
+ hr = ITask_CreateTrigger(task, &idx, &trigger);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ memset(&trigger_data, 0, sizeof(trigger_data));
+ trigger_data.cbTriggerSize = sizeof(trigger_data);
+ trigger_data.Reserved1 = 0;
+ GetLocalTime(&st);
+ trigger_data.wBeginYear = st.wYear;
+ trigger_data.wBeginMonth = st.wMonth;
+ trigger_data.wBeginDay = st.wDay;
+ trigger_data.wStartHour = st.wHour;
+ trigger_data.wStartMinute = st.wMinute;
+ trigger_data.TriggerType = TASK_TIME_TRIGGER_WEEKLY;
+ trigger_data.Type.Weekly.WeeksInterval = 1;
+ trigger_data.Type.Weekly.rgfDaysOfTheWeek = 0x7f; /* every day */
+ hr = ITaskTrigger_SetTrigger(trigger, &trigger_data);
+ ok(hr == S_OK, "got %#x\n", hr);
+ ITaskTrigger_Release(trigger);
+
+ hr = ITask_SetApplicationName(task, cmdW);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ hr = ITask_SetParameters(task, empty);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ hr = ITask_SetWorkingDirectory(task, empty);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ /* Save the task so that the Scheduler service would notice the changes */
+ save_job(task);
+
+ hr = ITask_GetStatus(task, &status);
+ ok(hr == S_OK, "got %#x\n", hr);
+ ok(status == SCHED_S_TASK_HAS_NOT_RUN, "got %#x\n", status);
+
+ hr = ITask_Run(task);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ /* According to MSDN the task status doesn't update dynamically */
+ hr = ITask_GetStatus(task, &status);
+ ok(hr == S_OK, "got %#x\n", hr);
+ ok(status == SCHED_S_TASK_HAS_NOT_RUN, "got %#x\n", status);
+
+ ITask_Release(task);
+
+ /* Running the process associated with the task to start up may
+ * take quite a bit a of time, and waiting for it during the test
+ * may be not the best idea.
+ *
+ * This is how it's supposed to look like in the application
+ * (the loop should be infinite):
+ */
+ for (i = 0; i < 3; i++)
+ {
+ hr = ITaskScheduler_Activate(scheduler, wine_test_runW, &IID_ITask, (IUnknown **)&task);
+ ok(hr == S_OK, "Activate error %#x\n", hr);
+
+ hr = ITask_GetStatus(task, &status);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ ITask_Release(task);
+
+ if (status == SCHED_S_TASK_RUNNING) break;
+
+ Sleep(100);
+ }
+
+ hr = ITaskScheduler_Activate(scheduler, wine_test_runW, &IID_ITask, (IUnknown **)&task);
+ ok(hr == S_OK, "Activate error %#x\n", hr);
+
+ hr = ITask_GetStatus(task, &status);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ if (status == SCHED_S_TASK_RUNNING)
+ {
+ hr = ITask_Terminate(task);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ ITask_Release(task);
+
+ /* Waiting for the process associated with the task to terminate
+ * may take quite a bit a of time, and waiting for it during the
+ * test is not practical.
+ *
+ * This is how it's supposed to look like in the application
+ * (the loop should be infinite):
+ */
+ for (i = 0; i < 3; i++)
+ {
+ hr = ITaskScheduler_Activate(scheduler, wine_test_runW, &IID_ITask, (IUnknown **)&task);
+ ok(hr == S_OK, "Activate error %#x\n", hr);
+
+ hr = ITask_GetStatus(task, &status);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ ITask_Release(task);
+
+ if (status != SCHED_S_TASK_RUNNING) break;
+
+ Sleep(100);
+ }
+ }
+ else
+ ITask_Release(task);
+
+ hr = ITaskScheduler_Delete(scheduler, wine_test_runW);
+ ok(hr == S_OK, "got %#x\n", hr);
+ ITaskScheduler_Release(scheduler);
+}
+
START_TEST(task)
{
CoInitialize(NULL);
@@ -601,5 +764,6 @@ START_TEST(task)
test_SetMaxRunTime_GetMaxRunTime();
test_SetAccountInformation_GetAccountInformation();
test_task_state();
+ test_Run();
CoUninitialize();
}
--
2.16.3
More information about the wine-devel
mailing list