2 * Copyright 2014 Dmitry Timoshkov
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include <wine/test.h>
33 static BOOL
is_process_elevated(void)
36 if (OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY
, &token
))
38 TOKEN_ELEVATION_TYPE type
;
42 ret
= GetTokenInformation( token
, TokenElevationType
, &type
, sizeof(type
), &size
);
44 return (ret
&& type
== TokenElevationTypeFull
);
49 static BOOL
check_win_version(int min_major
, int min_minor
)
51 HMODULE hntdll
= GetModuleHandleA("ntdll.dll");
52 NTSTATUS (WINAPI
*pRtlGetVersion
)(RTL_OSVERSIONINFOEXW
*);
53 RTL_OSVERSIONINFOEXW rtlver
;
55 rtlver
.dwOSVersionInfoSize
= sizeof(RTL_OSVERSIONINFOEXW
);
56 pRtlGetVersion
= (void *)GetProcAddress(hntdll
, "RtlGetVersion");
57 pRtlGetVersion(&rtlver
);
58 return rtlver
.dwMajorVersion
> min_major
||
59 (rtlver
.dwMajorVersion
== min_major
&&
60 rtlver
.dwMinorVersion
>= min_minor
);
62 #define is_win8_plus() check_win_version(6, 2)
64 static void test_Connect(void)
66 WCHAR comp_name
[MAX_COMPUTERNAME_LENGTH
+ 1];
71 VARIANT v_null
, v_comp
;
74 ITaskService
*service
;
76 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
79 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#lx\n", hr
);
83 hr
= ITaskService_get_Connected(service
, NULL
);
84 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
87 hr
= ITaskService_get_Connected(service
, &vbool
);
88 ok(hr
== S_OK
, "get_Connected error %#lx\n", hr
);
89 ok(vbool
== VARIANT_FALSE
, "expected VARIANT_FALSE, got %d\n", vbool
);
91 hr
= ITaskService_get_TargetServer(service
, NULL
);
92 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
94 hr
= ITaskService_get_TargetServer(service
, &bstr
);
95 ok(hr
== HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
), "expected ERROR_ONLY_IF_CONNECTED, got %#lx\n", hr
);
97 hr
= ITaskService_get_ConnectedUser(service
, NULL
);
98 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
100 hr
= ITaskService_get_ConnectedUser(service
, &bstr
);
101 ok(hr
== HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
), "expected ERROR_ONLY_IF_CONNECTED, got %#lx\n", hr
);
103 /* Win7 doesn't support UNC \\ prefix, but according to a user
104 * comment on MSDN Win8 supports both ways.
106 len
= ARRAY_SIZE(comp_name
);
107 GetComputerNameW(comp_name
, &len
);
109 V_VT(&v_null
) = VT_NULL
;
111 V_VT(&v_comp
) = VT_BSTR
;
112 V_BSTR(&v_comp
) = SysAllocString(comp_name
);
114 hr
= ITaskService_Connect(service
, v_comp
, v_null
, v_null
, v_null
);
115 ok(hr
== S_OK
|| (hr
== E_ACCESSDENIED
&& !is_process_elevated()),
116 "Connect error %#lx\n", hr
);
117 was_connected
= hr
== S_OK
;
118 SysFreeString(V_BSTR(&v_comp
));
120 V_BSTR(&v_comp
) = SysAllocString(L
"0.0.0.0");
121 hr
= ITaskService_Connect(service
, v_comp
, v_null
, v_null
, v_null
);
122 ok(hr
== HRESULT_FROM_WIN32(RPC_S_INVALID_NET_ADDR
) || hr
== HRESULT_FROM_WIN32(ERROR_BAD_NETPATH
) /* VM */,
123 "expected RPC_S_INVALID_NET_ADDR, got %#lx\n", hr
);
124 SysFreeString(V_BSTR(&v_comp
));
127 hr
= ITaskService_get_Connected(service
, &vbool
);
128 ok(hr
== S_OK
, "get_Connected error %#lx\n", hr
);
129 ok(vbool
== VARIANT_FALSE
|| (was_connected
&& vbool
== VARIANT_TRUE
),
130 "Connect shouldn't trash an existing connection, got %d (was connected %d)\n", vbool
, was_connected
);
132 V_BSTR(&v_comp
) = SysAllocString(L
"");
133 hr
= ITaskService_Connect(service
, v_comp
, v_null
, v_null
, v_null
);
134 ok(hr
== S_OK
, "Connect error %#lx\n", hr
);
135 SysFreeString(V_BSTR(&v_comp
));
137 V_BSTR(&v_comp
) = NULL
;
138 hr
= ITaskService_Connect(service
, v_comp
, v_null
, v_null
, v_null
);
139 ok(hr
== S_OK
, "Connect error %#lx\n", hr
);
141 hr
= ITaskService_Connect(service
, v_null
, v_null
, v_null
, v_null
);
142 ok(hr
== S_OK
, "Connect error %#lx\n", hr
);
145 hr
= ITaskService_get_Connected(service
, &vbool
);
146 ok(hr
== S_OK
, "get_Connected error %#lx\n", hr
);
147 ok(vbool
== VARIANT_TRUE
, "expected VARIANT_TRUE, got %d\n", vbool
);
149 hr
= ITaskService_get_TargetServer(service
, &bstr
);
150 ok(hr
== S_OK
, "get_TargetServer error %#lx\n", hr
);
151 ok(!lstrcmpW(comp_name
, bstr
), "compname %s != server name %s\n", wine_dbgstr_w(comp_name
), wine_dbgstr_w(bstr
));
154 len
= ARRAY_SIZE(user_name
);
155 GetUserNameW(user_name
, &len
);
157 hr
= ITaskService_get_ConnectedUser(service
, &bstr
);
158 ok(hr
== S_OK
, "get_ConnectedUser error %#lx\n", hr
);
159 ok(!lstrcmpW(user_name
, bstr
), "username %s != user name %s\n", wine_dbgstr_w(user_name
), wine_dbgstr_w(bstr
));
162 ITaskService_Release(service
);
165 static void test_GetFolder(void)
167 static WCHAR dot
[] = L
".";
168 static WCHAR empty
[] = L
"";
169 static WCHAR slash
[] = L
"/";
170 static WCHAR bslash
[] = L
"\\";
171 static WCHAR Wine
[] = L
"\\Wine";
172 static WCHAR Wine_Folder1
[] = L
"\\Wine\\Folder1";
173 static WCHAR Wine_Folder1_
[] = L
"\\Wine\\Folder1\\";
174 static WCHAR Wine_Folder1_Folder2
[] = L
"\\Wine\\Folder1\\Folder2";
175 static WCHAR Folder1_Folder2
[] = L
"\\Folder1\\Folder2";
179 ITaskService
*service
;
180 ITaskFolder
*folder
, *subfolder
, *subfolder2
;
182 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
185 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#lx\n", hr
);
189 hr
= ITaskService_GetFolder(service
, NULL
, &folder
);
190 ok(hr
== HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
), "expected ERROR_ONLY_IF_CONNECTED, got %#lx\n", hr
);
192 V_VT(&v_null
) = VT_NULL
;
194 hr
= ITaskService_Connect(service
, v_null
, v_null
, v_null
, v_null
);
195 ok(hr
== S_OK
, "Connect error %#lx\n", hr
);
197 hr
= ITaskService_GetFolder(service
, slash
, &folder
);
199 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#lx\n", hr
);
201 hr
= ITaskService_GetFolder(service
, dot
, &folder
);
203 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
) || hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) /* win7 */,
204 "expected ERROR_INVALID_NAME, got %#lx\n", hr
);
206 hr
= ITaskService_GetFolder(service
, bslash
, &folder
);
207 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
208 ITaskFolder_Release(folder
);
210 hr
= ITaskService_GetFolder(service
, NULL
, NULL
);
211 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
213 hr
= ITaskService_GetFolder(service
, empty
, &folder
);
214 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
215 ITaskFolder_Release(folder
);
217 hr
= ITaskService_GetFolder(service
, NULL
, &folder
);
218 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
220 hr
= ITaskFolder_get_Name(folder
, NULL
);
221 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
223 hr
= ITaskFolder_get_Name(folder
, &bstr
);
224 ok (hr
== S_OK
, "get_Name error %#lx\n", hr
);
225 ok(!lstrcmpW(bstr
, bslash
), "expected '\\', got %s\n", wine_dbgstr_w(bstr
));
228 hr
= ITaskFolder_get_Path(folder
, NULL
);
229 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
231 hr
= ITaskFolder_get_Path(folder
, &bstr
);
232 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
233 ok(!lstrcmpW(bstr
, bslash
), "expected '\\', got %s\n", wine_dbgstr_w(bstr
));
236 hr
= ITaskFolder_CreateFolder(folder
, NULL
, v_null
, &subfolder
);
237 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#lx\n", hr
);
239 /* Just in case something was left from previous runs */
240 ITaskFolder_DeleteFolder(folder
, Wine_Folder1_Folder2
, 0);
241 ITaskFolder_DeleteFolder(folder
, Wine_Folder1
, 0);
242 ITaskFolder_DeleteFolder(folder
, Wine
, 0);
244 hr
= ITaskFolder_CreateFolder(folder
, slash
, v_null
, &subfolder
);
246 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#lx\n", hr
);
248 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
, &subfolder
);
249 ok(hr
== HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
) || hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) /* win7 */,
250 "expected ERROR_PATH_NOT_FOUND, got %#lx\n", hr
);
252 hr
= ITaskFolder_CreateFolder(folder
, bslash
, v_null
, &subfolder
);
254 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#lx\n", hr
);
256 if (!is_process_elevated() && !is_win8_plus())
258 win_skip("Skipping CreateFolder tests because deleting folders requires elevated privileges on Windows 7\n");
262 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_Folder2
, v_null
, &subfolder
);
263 ok(hr
== S_OK
, "CreateFolder error %#lx\n", hr
);
264 ITaskFolder_Release(subfolder
);
266 hr
= ITaskFolder_CreateFolder(folder
, Wine
, v_null
, NULL
);
267 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr
);
269 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_
, v_null
, &subfolder
);
270 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#lx\n", hr
);
272 hr
= ITaskFolder_CreateFolder(folder
, Wine
, v_null
, &subfolder
);
273 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr
);
274 hr
= ITaskFolder_CreateFolder(folder
, Wine
+1, v_null
, &subfolder
);
275 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr
);
276 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1
, v_null
, &subfolder
);
277 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr
);
278 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1
+1, v_null
, &subfolder
);
279 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr
);
280 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_Folder2
, v_null
, &subfolder
);
281 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr
);
282 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_Folder2
+1, v_null
, &subfolder
);
283 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr
);
285 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
, NULL
);
286 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
288 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
, &subfolder
);
289 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
291 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
292 ok (hr
== S_OK
, "get_Name error %#lx\n", hr
);
293 ok(!lstrcmpW(bstr
, L
"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
295 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
296 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
297 ok(!lstrcmpW(bstr
, Wine_Folder1_Folder2
), "expected \\Wine\\Folder1\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
299 ITaskFolder_Release(subfolder
);
301 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
+1, &subfolder
);
302 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
303 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
304 ok (hr
== S_OK
, "get_Name error %#lx\n", hr
);
305 ok(!lstrcmpW(bstr
, L
"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
307 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
308 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
309 ok(!lstrcmpW(bstr
, Wine_Folder1_Folder2
+1), "expected Wine\\Folder1\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
311 ITaskFolder_Release(subfolder
);
313 hr
= ITaskService_GetFolder(service
, Wine_Folder1
, &subfolder
);
314 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
315 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
316 ok (hr
== S_OK
, "get_Name error %#lx\n", hr
);
317 ok(!lstrcmpW(bstr
, L
"Folder1"), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
319 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
320 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
321 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
323 ITaskFolder_Release(subfolder
);
325 hr
= ITaskService_GetFolder(service
, Wine
, &subfolder
);
326 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
327 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
328 ok (hr
== S_OK
, "get_Name error %#lx\n", hr
);
329 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
331 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
332 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
333 ok(!lstrcmpW(bstr
, Wine
), "expected \\Wine, got %s\n", wine_dbgstr_w(bstr
));
335 ITaskFolder_Release(subfolder
);
337 hr
= ITaskService_GetFolder(service
, Wine
+1, &subfolder
);
338 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
339 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
340 ok (hr
== S_OK
, "get_Name error %#lx\n", hr
);
341 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
343 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
344 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
345 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
348 hr
= ITaskFolder_GetFolder(subfolder
, bslash
, &subfolder2
);
349 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#lx\n", hr
);
351 hr
= ITaskFolder_GetFolder(subfolder
, NULL
, &subfolder2
);
352 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#lx\n", hr
);
354 hr
= ITaskFolder_GetFolder(subfolder
, empty
, &subfolder2
);
355 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
356 hr
= ITaskFolder_get_Name(subfolder2
, &bstr
);
357 ok (hr
== S_OK
, "get_Name error %#lx\n", hr
);
358 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
360 hr
= ITaskFolder_get_Path(subfolder2
, &bstr
);
361 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
362 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
364 ITaskFolder_Release(subfolder2
);
366 hr
= ITaskFolder_GetFolder(subfolder
, Folder1_Folder2
, &subfolder2
);
367 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
368 hr
= ITaskFolder_get_Name(subfolder2
, &bstr
);
369 ok (hr
== S_OK
, "get_Name error %#lx\n", hr
);
370 ok(!lstrcmpW(bstr
, L
"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
372 hr
= ITaskFolder_get_Path(subfolder2
, &bstr
);
373 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
374 ok(!lstrcmpW(bstr
, Wine_Folder1_Folder2
+1), "expected Wine\\Folder1\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
376 ITaskFolder_Release(subfolder2
);
378 hr
= ITaskFolder_GetFolder(subfolder
, Folder1_Folder2
+1, &subfolder2
);
379 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
381 hr
= ITaskFolder_get_Name(subfolder2
, &bstr
);
382 ok (hr
== S_OK
, "get_Name error %#lx\n", hr
);
383 ok(!lstrcmpW(bstr
, L
"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
385 hr
= ITaskFolder_get_Path(subfolder2
, &bstr
);
386 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
387 ok(!lstrcmpW(bstr
, Wine_Folder1_Folder2
+1), "expected Wine\\Folder1\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
389 ITaskFolder_Release(subfolder2
);
391 ITaskFolder_Release(subfolder
);
393 hr
= ITaskFolder_DeleteFolder(folder
, Wine
, 0);
394 ok(hr
== HRESULT_FROM_WIN32(ERROR_DIR_NOT_EMPTY
), "expected ERROR_DIR_NOT_EMPTY, got %#lx\n", hr
);
396 hr
= ITaskFolder_DeleteFolder(folder
, Wine_Folder1_Folder2
, 0);
397 ok(hr
== S_OK
, "DeleteFolder error %#lx\n", hr
);
398 hr
= ITaskFolder_DeleteFolder(folder
, Wine_Folder1
+1, 0);
399 ok(hr
== S_OK
, "DeleteFolder error %#lx\n", hr
);
400 hr
= ITaskFolder_DeleteFolder(folder
, Wine
+1, 0);
401 ok(hr
== S_OK
, "DeleteFolder error %#lx\n", hr
);
403 hr
= ITaskFolder_DeleteFolder(folder
, Wine
, 0);
404 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) || hr
== S_OK
/* win7 */, "expected ERROR_FILE_NOT_FOUND, got %#lx\n", hr
);
406 hr
= ITaskFolder_DeleteFolder(folder
, NULL
, 0);
407 ok(hr
== E_ACCESSDENIED
|| hr
== E_INVALIDARG
/* Vista */, "expected E_ACCESSDENIED, got %#lx\n", hr
);
409 hr
= ITaskFolder_DeleteFolder(folder
, empty
, 0);
410 ok(hr
== E_ACCESSDENIED
|| hr
== E_INVALIDARG
/* Vista */, "expected E_ACCESSDENIED, got %#lx\n", hr
);
412 hr
= ITaskFolder_DeleteFolder(folder
, slash
, 0);
414 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#lx\n", hr
);
417 ITaskFolder_Release(folder
);
418 ITaskService_Release(service
);
421 static void set_var(int vt
, VARIANT
*var
, LONG val
)
429 V_UI1(var
) = (BYTE
)val
;
434 V_UI2(var
) = (USHORT
)val
;
458 static void test_FolderCollection(void)
460 static WCHAR Wine
[] = L
"\\Wine";
461 static WCHAR Wine_Folder1
[] = L
"\\Wine\\Folder1";
462 static WCHAR Wine_Folder2
[] = L
"\\Wine\\Folder2";
463 static WCHAR Wine_Folder3
[] = L
"\\Wine\\Folder3";
466 VARIANT v_null
, var
[3];
467 ITaskService
*service
;
468 ITaskFolder
*root
, *folder
, *subfolder
;
469 ITaskFolderCollection
*folders
;
471 IEnumVARIANT
*enumvar
;
475 static const int vt
[] = { VT_I1
, VT_I2
, VT_I4
, VT_I8
, VT_UI1
, VT_UI2
, VT_UI4
, VT_UI8
, VT_INT
, VT_UINT
};
477 if (!is_process_elevated() && !is_win8_plus())
479 win_skip("Skipping ITaskFolderCollection tests because deleting folders requires elevated privileges on Windows 7\n");
483 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
486 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#lx\n", hr
);
490 V_VT(&v_null
) = VT_NULL
;
492 hr
= ITaskService_Connect(service
, v_null
, v_null
, v_null
, v_null
);
493 ok(hr
== S_OK
, "Connect error %#lx\n", hr
);
495 hr
= ITaskService_GetFolder(service
, NULL
, &root
);
496 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
498 /* Just in case something was left from previous runs */
499 ITaskFolder_DeleteFolder(root
, Wine_Folder1
, 0);
500 ITaskFolder_DeleteFolder(root
, Wine_Folder2
, 0);
501 ITaskFolder_DeleteFolder(root
, Wine_Folder3
, 0);
502 ITaskFolder_DeleteFolder(root
, Wine
, 0);
504 hr
= ITaskFolder_CreateFolder(root
, Wine_Folder1
, v_null
, &subfolder
);
505 ok(hr
== S_OK
, "CreateFolder error %#lx\n", hr
);
506 ITaskFolder_Release(subfolder
);
508 hr
= ITaskFolder_CreateFolder(root
, Wine_Folder2
, v_null
, &subfolder
);
509 ok(hr
== S_OK
, "CreateFolder error %#lx\n", hr
);
510 ITaskFolder_Release(subfolder
);
512 hr
= ITaskFolder_GetFolder(root
, Wine
, &folder
);
513 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
515 hr
= ITaskFolder_GetFolders(folder
, 0, NULL
);
516 ok (hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
518 hr
= ITaskFolder_GetFolders(folder
, 0, &folders
);
519 ok(hr
== S_OK
, "GetFolders error %#lx\n", hr
);
521 ITaskFolder_Release(folder
);
523 hr
= ITaskFolderCollection_get_Count(folders
, NULL
);
524 ok (hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
527 hr
= ITaskFolderCollection_get_Count(folders
, (LONG
*)&count
);
528 ok(hr
== S_OK
, "get_Count error %#lx\n", hr
);
529 ok(count
== 2, "expected 2, got %ld\n", count
);
531 hr
= ITaskFolder_CreateFolder(root
, Wine_Folder3
, v_null
, &subfolder
);
532 ok(hr
== S_OK
, "CreateFolder error %#lx\n", hr
);
533 ITaskFolder_Release(subfolder
);
536 hr
= ITaskFolderCollection_get_Count(folders
, (LONG
*)&count
);
537 ok(hr
== S_OK
, "get_Count error %#lx\n", hr
);
538 ok(count
== 2, "expected 2, got %ld\n", count
);
540 set_var(VT_INT
, &idx
, 0);
541 hr
= ITaskFolderCollection_get_Item(folders
, idx
, NULL
);
542 ok (hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
544 for (i
= 0; i
< ARRAY_SIZE(vt
); i
++)
546 set_var(vt
[i
], &idx
, 1);
547 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
548 ok(hr
== S_OK
, "get_Item(vt = %d) error %#lx\n", vt
[i
], hr
);
549 ITaskFolder_Release(subfolder
);
552 for (i
= 0; i
<= count
; i
++)
556 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
559 ok (hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#lx\n", hr
);
562 ok(hr
== S_OK
, "get_Item error %#lx\n", hr
);
564 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
565 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
566 is_first
= !lstrcmpW(bstr
, Wine_Folder1
);
568 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
570 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
573 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
574 ok(hr
== S_OK
, "get_Name error %#lx\n", hr
);
576 ok(!lstrcmpW(bstr
, L
"Folder1"), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
578 ok(!lstrcmpW(bstr
, L
"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
580 ITaskFolder_Release(subfolder
);
582 V_VT(&idx
) = VT_BSTR
;
584 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
585 ok(hr
== S_OK
, "get_Item error %#lx\n", hr
);
588 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
589 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
591 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
593 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
596 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
597 ok(hr
== S_OK
, "get_Name error %#lx\n", hr
);
599 ok(!lstrcmpW(bstr
, L
"Folder1"), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
601 ok(!lstrcmpW(bstr
, L
"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
604 ITaskFolder_Release(subfolder
);
609 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
610 ok (hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#lx\n", hr
);
612 hr
= ITaskFolderCollection_QueryInterface(folders
, &IID_IEnumVARIANT
, (void **)&enumvar
);
613 ok(hr
== E_NOINTERFACE
, "expected E_NOINTERFACE, got %#lx\n", hr
);
614 hr
= ITaskFolderCollection_QueryInterface(folders
, &IID_IEnumUnknown
, (void **)&enumvar
);
615 ok(hr
== E_NOINTERFACE
, "expected E_NOINTERFACE, got %#lx\n", hr
);
617 hr
= ITaskFolderCollection_get__NewEnum(folders
, NULL
);
618 ok (hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
620 hr
= ITaskFolderCollection_get__NewEnum(folders
, &unknown
);
621 ok(hr
== S_OK
, "get__NewEnum error %#lx\n", hr
);
622 hr
= IUnknown_QueryInterface(unknown
, &IID_IEnumUnknown
, (void **)&enumvar
);
623 ok(hr
== E_NOINTERFACE
, "expected E_NOINTERFACE, got %#lx\n", hr
);
624 hr
= IUnknown_QueryInterface(unknown
, &IID_IEnumVARIANT
, (void **)&enumvar
);
625 ok(hr
== S_OK
, "QueryInterface error %#lx\n", hr
);
626 IEnumVARIANT_Release(enumvar
);
628 hr
= IUnknown_QueryInterface(unknown
, &IID_IUnknown
, (void **)&enumvar
);
629 ok(hr
== S_OK
, "QueryInterface error %#lx\n", hr
);
630 IUnknown_Release(unknown
);
632 hr
= IEnumVARIANT_Skip(enumvar
, 0);
633 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
634 hr
= IEnumVARIANT_Skip(enumvar
, 2);
635 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
636 hr
= IEnumVARIANT_Skip(enumvar
, 1);
637 ok(hr
== S_FALSE
, "expected S_FALSE, got %#lx\n", hr
);
639 hr
= IEnumVARIANT_Reset(enumvar
);
640 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
643 hr
= IEnumVARIANT_Next(enumvar
, 1, NULL
, &count
);
644 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
646 memset(var
, 0, sizeof(var
));
648 hr
= IEnumVARIANT_Next(enumvar
, 1, var
, &count
);
649 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
650 ok(count
== 1, "expected 1, got %ld\n", count
);
651 hr
= ITaskFolder_get_Path((ITaskFolder
*)V_DISPATCH(&var
[0]), &bstr
);
652 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
653 is_first
= !lstrcmpW(bstr
, Wine_Folder1
);
655 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
657 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
659 hr
= ITaskFolder_get_Name((ITaskFolder
*)V_DISPATCH(&var
[0]), &bstr
);
660 ok(hr
== S_OK
, "get_Name error %#lx\n", hr
);
662 ok(!lstrcmpW(bstr
, L
"Folder1"), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
664 ok(!lstrcmpW(bstr
, L
"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
666 IDispatch_Release(V_DISPATCH(&var
[0]));
668 memset(var
, 0, sizeof(var
));
670 hr
= IEnumVARIANT_Next(enumvar
, 1, var
, &count
);
671 ok(hr
== S_FALSE
, "expected S_FALSE, got %#lx\n", hr
);
672 ok(count
== 0, "expected 0, got %ld\n", count
);
675 hr
= IEnumVARIANT_Next(enumvar
, 1, NULL
, &count
);
676 ok(hr
== S_FALSE
, "expected S_FALSE, got %#lx\n", hr
);
677 ok(count
== 0, "expected 0, got %ld\n", count
);
679 hr
= IEnumVARIANT_Reset(enumvar
);
680 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
682 memset(var
, 0, sizeof(var
));
684 hr
= IEnumVARIANT_Next(enumvar
, 3, var
, &count
);
685 ok(hr
== S_FALSE
, "expected S_FALSE, got %#lx\n", hr
);
686 ok(count
== 2, "expected 2, got %ld\n", count
);
687 ok(V_VT(&var
[0]) == VT_DISPATCH
, "expected VT_DISPATCH, got %d\n", V_VT(&var
[0]));
688 ok(V_VT(&var
[1]) == VT_DISPATCH
, "expected VT_DISPATCH, got %d\n", V_VT(&var
[1]));
689 IEnumVARIANT_Release(enumvar
);
691 for (i
= 0; i
< count
; i
++)
693 hr
= IDispatch_QueryInterface(V_DISPATCH(&var
[i
]), &IID_ITaskFolder
, (void **)&subfolder
);
694 ok(hr
== S_OK
, "QueryInterface error %#lx\n", hr
);
696 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
697 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
698 is_first
= !lstrcmpW(bstr
, Wine_Folder1
);
700 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
702 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
705 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
706 ok(hr
== S_OK
, "get_Name error %#lx\n", hr
);
708 ok(!lstrcmpW(bstr
, L
"Folder1"), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
710 ok(!lstrcmpW(bstr
, L
"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
713 ITaskFolder_Release(subfolder
);
716 IDispatch_Release(V_DISPATCH(&var
[0]));
717 IDispatch_Release(V_DISPATCH(&var
[1]));
719 ITaskFolderCollection_Release(folders
);
721 hr
= ITaskFolder_DeleteFolder(root
, Wine_Folder1
, 0);
722 ok(hr
== S_OK
, "DeleteFolder error %#lx\n", hr
);
723 hr
= ITaskFolder_DeleteFolder(root
, Wine_Folder2
, 0);
724 ok(hr
== S_OK
, "DeleteFolder error %#lx\n", hr
);
725 hr
= ITaskFolder_DeleteFolder(root
, Wine_Folder3
, 0);
726 ok(hr
== S_OK
, "DeleteFolder error %#lx\n", hr
);
727 hr
= ITaskFolder_DeleteFolder(root
, Wine
, 0);
728 ok(hr
== S_OK
, "DeleteFolder error %#lx\n", hr
);
730 ITaskFolder_Release(root
);
731 ITaskService_Release(service
);
734 static void test_GetTask(void)
736 static WCHAR Wine
[] = L
"\\Wine";
737 static WCHAR Wine_Task1
[] = L
"\\Wine\\Task1";
738 static WCHAR Wine_Task2
[] = L
"\\Wine\\Task2";
739 static WCHAR Task1
[] = L
"Task1";
740 static WCHAR Task2
[] = L
"Task2";
741 static WCHAR xml1
[] =
742 L
"<?xml version=\"1.0\"?>\n"
743 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
744 " <RegistrationInfo>\n"
745 " <Description>\"Task1\"</Description>\n"
746 " </RegistrationInfo>\n"
748 " <Enabled>false</Enabled>\n"
749 " <Hidden>false</Hidden>\n"
753 " <Command>\"task1.exe\"</Command>\n"
757 static WCHAR xml2
[] =
758 L
"<?xml version=\"1.0\"?>\n"
759 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
760 " <RegistrationInfo>\n"
761 " <Description>\"Task2\"</Description>\n"
762 " </RegistrationInfo>\n"
764 " <Enabled>true</Enabled>\n"
765 " <Hidden>true</Hidden>\n"
769 " <Command>\"task2.exe\"</Command>\n"
776 } create_new_task
[] =
779 { TASK_CREATE
, S_OK
},
780 { TASK_UPDATE
, __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) },
781 { TASK_CREATE
| TASK_UPDATE
, S_OK
}
786 } open_existing_task
[] =
788 { 0, __HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
) },
789 { TASK_CREATE
, __HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
) },
790 { TASK_UPDATE
, S_OK
},
791 { TASK_CREATE
| TASK_UPDATE
, S_OK
}
798 ITaskService
*service
;
799 ITaskFolder
*root
, *folder
;
800 IRegisteredTask
*task1
, *task2
;
805 if (!is_process_elevated() && !is_win8_plus())
807 win_skip("Skipping task creation tests because deleting anything requires elevated privileges on Windows 7\n");
811 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
814 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#lx\n", hr
);
818 V_VT(&v_null
) = VT_NULL
;
820 hr
= ITaskService_Connect(service
, v_null
, v_null
, v_null
, v_null
);
821 ok(hr
== S_OK
, "Connect error %#lx\n", hr
);
823 hr
= ITaskService_GetFolder(service
, NULL
, &root
);
824 ok(hr
== S_OK
, "GetFolder error %#lx\n", hr
);
826 /* Just in case something was left from previous runs */
827 ITaskFolder_DeleteTask(root
, Wine_Task1
, 0);
828 ITaskFolder_DeleteTask(root
, Wine_Task2
, 0);
829 ITaskFolder_DeleteFolder(root
, Wine
, 0);
831 hr
= ITaskFolder_GetTask(root
, Wine_Task1
, &task1
);
832 ok(hr
== HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
) || hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) /* win7 */,
833 "expected ERROR_PATH_NOT_FOUND, got %#lx\n", hr
);
835 hr
= ITaskFolder_RegisterTask(root
, Wine
, xml1
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
836 ok(hr
== S_OK
, "RegisterTask error %#lx\n", hr
);
838 /* Without elevated privileges this fails on Windows 7 */
839 hr
= ITaskFolder_DeleteTask(root
, Wine
, 0);
840 ok(hr
== S_OK
, "DeleteTask error %#lx\n", hr
);
842 hr
= ITaskFolder_CreateFolder(root
, Wine
, v_null
, &folder
);
843 ok(hr
== S_OK
, "CreateFolder error %#lx\n", hr
);
845 hr
= ITaskFolder_RegisterTask(root
, Wine
, xml1
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
847 ok(hr
== HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED
) || broken(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
)) /* Vista */, "expected ERROR_ACCESS_DENIED, got %#lx\n", hr
);
849 /* Delete the folder and recreate it to prevent a crash on w1064v1507 */
850 hr
= ITaskFolder_DeleteFolder(root
, Wine
, 0);
852 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) || broken(hr
== S_OK
) /* w1064v1507 */,
853 "expected ERROR_FILE_NOT_FOUND, got %#lx\n", hr
);
854 ITaskFolder_Release(folder
);
856 hr
= ITaskFolder_CreateFolder(root
, Wine
, v_null
, &folder
);
857 ok(hr
== S_OK
, "CreateFolder error %#lx\n", hr
);
859 hr
= ITaskFolder_GetTask(root
, Wine
, &task1
);
860 ok(hr
== HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
) || hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) /* win7 */,
861 "expected ERROR_PATH_NOT_FOUND, got %#lx\n", hr
);
863 for (i
= 0; i
< ARRAY_SIZE(create_new_task
); i
++)
865 winetest_push_context("%d", i
);
866 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xml1
, create_new_task
[i
].flags
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
867 ok(hr
== create_new_task
[i
].hr
, "expected %#lx, got %#lx\n", create_new_task
[i
].hr
, hr
);
870 hr
= ITaskFolder_DeleteTask(root
, Wine_Task1
, 0);
871 ok(hr
== S_OK
, "DeleteTask error %#lx\n", hr
);
872 IRegisteredTask_Release(task1
);
874 winetest_pop_context();
877 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, NULL
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
878 ok(hr
== HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER
), "expected RPC_X_NULL_REF_POINTER, got %#lx\n", hr
);
880 hr
= ITaskFolder_RegisterTask(root
, Wine
, xml1
, TASK_VALIDATE_ONLY
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
881 ok(hr
== S_OK
, "RegisterTask error %#lx\n", hr
);
883 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xml1
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
884 ok(hr
== S_OK
, "RegisterTask error %#lx\n", hr
);
886 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xml1
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
887 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr
);
889 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xml1
, 0, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
890 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr
);
892 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xml1
, TASK_CREATE_OR_UPDATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
893 ok(hr
== S_OK
, "RegisterTask error %#lx\n", hr
);
895 for (i
= 0; i
< ARRAY_SIZE(open_existing_task
); i
++)
897 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xml1
, open_existing_task
[i
].flags
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task2
);
898 ok(hr
== open_existing_task
[i
].hr
, "%d: expected %#lx, got %#lx\n", i
, open_existing_task
[i
].hr
, hr
);
900 IRegisteredTask_Release(task2
);
903 hr
= IRegisteredTask_get_Name(task1
, NULL
);
904 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
906 hr
= IRegisteredTask_get_Name(task1
, &bstr
);
907 ok(hr
== S_OK
, "get_Name error %#lx\n", hr
);
908 ok(!lstrcmpW(bstr
, Task1
), "expected Task1, got %s\n", wine_dbgstr_w(bstr
));
910 hr
= IRegisteredTask_get_Path(task1
, &bstr
);
911 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
912 ok(!lstrcmpW(bstr
, Wine_Task1
), "expected \\Wine\\Task1, got %s\n", wine_dbgstr_w(bstr
));
914 hr
= IRegisteredTask_get_State(task1
, &state
);
915 ok(hr
== S_OK
, "get_State error %#lx\n", hr
);
916 ok(state
== TASK_STATE_DISABLED
, "expected TASK_STATE_DISABLED, got %d\n", state
);
917 hr
= IRegisteredTask_get_Enabled(task1
, &vbool
);
918 ok(hr
== S_OK
, "get_Enabled error %#lx\n", hr
);
919 ok(vbool
== VARIANT_FALSE
, "expected VARIANT_FALSE, got %d\n", vbool
);
921 hr
= IRegisteredTask_get_LastRunTime(task1
, &date
);
922 ok(hr
== SCHED_S_TASK_HAS_NOT_RUN
, "got %#lx\n", hr
);
924 IRegisteredTask_Release(task1
);
926 hr
= ITaskFolder_RegisterTask(folder
, Task1
, xml1
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task2
);
927 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr
);
929 hr
= ITaskFolder_RegisterTask(folder
, Task2
, xml2
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task2
);
930 ok(hr
== S_OK
, "RegisterTask error %#lx\n", hr
);
932 hr
= IRegisteredTask_get_Name(task2
, &bstr
);
933 ok(hr
== S_OK
, "get_Name error %#lx\n", hr
);
934 ok(!lstrcmpW(bstr
, Task2
), "expected Task2, got %s\n", wine_dbgstr_w(bstr
));
936 hr
= IRegisteredTask_get_Path(task2
, &bstr
);
937 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
938 ok(!lstrcmpW(bstr
, Wine_Task2
), "expected \\Wine\\Task2, got %s\n", wine_dbgstr_w(bstr
));
940 hr
= IRegisteredTask_get_State(task2
, &state
);
941 ok(hr
== S_OK
, "get_State error %#lx\n", hr
);
942 ok(state
== TASK_STATE_READY
, "expected TASK_STATE_READY, got %d\n", state
);
943 hr
= IRegisteredTask_get_Enabled(task2
, &vbool
);
944 ok(hr
== S_OK
, "get_Enabled error %#lx\n", hr
);
945 ok(vbool
== VARIANT_TRUE
, "expected VARIANT_TRUE, got %d\n", vbool
);
947 hr
= IRegisteredTask_get_LastRunTime(task2
, &date
);
948 ok(hr
== SCHED_S_TASK_HAS_NOT_RUN
, "got %#lx\n", hr
);
950 IRegisteredTask_Release(task2
);
952 hr
= ITaskFolder_GetTask(root
, NULL
, &task1
);
953 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#lx\n", hr
);
955 hr
= ITaskFolder_GetTask(root
, Wine_Task1
, NULL
);
956 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
958 hr
= ITaskFolder_GetTask(root
, Wine_Task1
, &task1
);
959 ok(hr
== S_OK
, "GetTask error %#lx\n", hr
);
961 hr
= IRegisteredTask_get_Name(task1
, &bstr
);
962 ok(hr
== S_OK
, "get_Name error %#lx\n", hr
);
963 ok(!lstrcmpW(bstr
, Task1
), "expected Task1, got %s\n", wine_dbgstr_w(bstr
));
965 hr
= IRegisteredTask_get_Path(task1
, &bstr
);
966 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
967 ok(!lstrcmpW(bstr
, Wine_Task1
), "expected \\Wine\\Task1, got %s\n", wine_dbgstr_w(bstr
));
969 hr
= IRegisteredTask_get_State(task1
, &state
);
970 ok(hr
== S_OK
, "get_State error %#lx\n", hr
);
971 ok(state
== TASK_STATE_DISABLED
, "expected TASK_STATE_DISABLED, got %d\n", state
);
972 hr
= IRegisteredTask_get_Enabled(task1
, &vbool
);
973 ok(hr
== S_OK
, "get_Enabled error %#lx\n", hr
);
974 ok(vbool
== VARIANT_FALSE
, "expected VARIANT_FALSE, got %d\n", vbool
);
976 hr
= IRegisteredTask_get_LastRunTime(task1
, &date
);
977 ok(hr
== SCHED_S_TASK_HAS_NOT_RUN
, "got %#lx\n", hr
);
979 hr
= IRegisteredTask_put_Enabled(task1
, VARIANT_TRUE
);
980 ok(hr
== S_OK
, "put_Enabled error %#lx\n", hr
);
981 hr
= IRegisteredTask_get_State(task1
, &state
);
982 ok(hr
== S_OK
, "get_State error %#lx\n", hr
);
984 ok(state
== TASK_STATE_READY
, "expected TASK_STATE_READY, got %d\n", state
);
985 hr
= IRegisteredTask_get_Enabled(task1
, &vbool
);
986 ok(hr
== S_OK
, "get_Enabled error %#lx\n", hr
);
988 ok(vbool
== VARIANT_TRUE
, "expected VARIANT_TRUE, got %d\n", vbool
);
990 hr
= IRegisteredTask_get_LastRunTime(task1
, &date
);
991 ok(hr
== SCHED_S_TASK_HAS_NOT_RUN
, "got %#lx\n", hr
);
993 IRegisteredTask_Release(task1
);
995 hr
= ITaskFolder_GetTask(folder
, Task2
, &task2
);
996 ok(hr
== S_OK
, "GetTask error %#lx\n", hr
);
998 hr
= IRegisteredTask_get_Name(task2
, &bstr
);
999 ok(hr
== S_OK
, "get_Name error %#lx\n", hr
);
1000 ok(!lstrcmpW(bstr
, Task2
), "expected Task2, got %s\n", wine_dbgstr_w(bstr
));
1001 SysFreeString(bstr
);
1002 hr
= IRegisteredTask_get_Path(task2
, &bstr
);
1003 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
1004 ok(!lstrcmpW(bstr
, Wine_Task2
), "expected \\Wine\\Task2, got %s\n", wine_dbgstr_w(bstr
));
1005 SysFreeString(bstr
);
1006 hr
= IRegisteredTask_get_State(task2
, &state
);
1007 ok(hr
== S_OK
, "get_State error %#lx\n", hr
);
1008 ok(state
== TASK_STATE_READY
, "expected TASK_STATE_READY, got %d\n", state
);
1009 hr
= IRegisteredTask_get_Enabled(task2
, &vbool
);
1010 ok(hr
== S_OK
, "get_Enabled error %#lx\n", hr
);
1011 ok(vbool
== VARIANT_TRUE
, "expected VARIANT_TRUE, got %d\n", vbool
);
1013 hr
= IRegisteredTask_get_LastRunTime(task2
, &date
);
1014 ok(hr
== SCHED_S_TASK_HAS_NOT_RUN
, "got %#lx\n", hr
);
1016 hr
= IRegisteredTask_get_State(task2
, NULL
);
1017 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
1018 hr
= IRegisteredTask_get_Enabled(task2
, NULL
);
1019 ok(hr
== E_POINTER
, "expected E_POINTER, got %#lx\n", hr
);
1021 IRegisteredTask_Release(task2
);
1023 hr
= ITaskFolder_DeleteTask(folder
, NULL
, 0);
1025 ok(hr
== HRESULT_FROM_WIN32(ERROR_DIR_NOT_EMPTY
), "expected ERROR_DIR_NOT_EMPTY, got %#lx\n", hr
);
1027 hr
= ITaskFolder_DeleteTask(root
, Wine_Task1
, 0);
1028 ok(hr
== S_OK
, "DeleteTask error %#lx\n", hr
);
1029 hr
= ITaskFolder_DeleteTask(folder
, Task2
, 0);
1030 ok(hr
== S_OK
, "DeleteTask error %#lx\n", hr
);
1032 hr
= ITaskFolder_DeleteTask(folder
, Task2
, 0);
1033 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) || hr
== S_OK
/* win7 */, "expected ERROR_FILE_NOT_FOUND, got %#lx\n", hr
);
1035 hr
= ITaskFolder_RegisterTask(root
, NULL
, xml2
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
1036 if(hr
== E_ACCESSDENIED
)
1038 skip("Access denied\n");
1041 ok(hr
== S_OK
, "RegisterTask error %#lx\n", hr
);
1043 hr
= IRegisteredTask_get_Name(task1
, &bstr
);
1044 ok(hr
== S_OK
, "get_Name error %#lx\n", hr
);
1045 hr
= IIDFromString(bstr
, &iid
);
1046 ok(hr
== S_OK
, "IIDFromString error %#lx\n", hr
);
1048 IRegisteredTask_Release(task1
);
1050 hr
= ITaskFolder_DeleteTask(root
, bstr
, 0);
1051 ok(hr
== S_OK
, "DeleteTask error %#lx\n", hr
);
1052 SysFreeString(bstr
);
1054 hr
= ITaskFolder_RegisterTask(folder
, NULL
, xml2
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
1055 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#lx\n", hr
);
1058 ITaskFolder_Release(folder
);
1060 hr
= ITaskFolder_DeleteFolder(root
, Wine
, 0);
1061 ok(hr
== S_OK
, "DeleteFolder error %#lx\n", hr
);
1063 ITaskFolder_Release(root
);
1064 ITaskService_Release(service
);
1069 WCHAR restart_interval
[20];
1070 WCHAR execution_time_limit
[20];
1071 WCHAR delete_expired_task_after
[20];
1074 TASK_INSTANCES_POLICY policy
;
1075 TASK_COMPATIBILITY compatibility
;
1076 VARIANT_BOOL allow_on_demand_start
;
1077 VARIANT_BOOL stop_if_going_on_batteries
;
1078 VARIANT_BOOL disallow_start_if_on_batteries
;
1079 VARIANT_BOOL allow_hard_terminate
;
1080 VARIANT_BOOL start_when_available
;
1081 VARIANT_BOOL run_only_if_network_available
;
1082 VARIANT_BOOL enabled
;
1083 VARIANT_BOOL hidden
;
1084 VARIANT_BOOL run_only_if_idle
;
1085 VARIANT_BOOL wake_to_run
;
1088 /* test the version 1 compatibility settings */
1089 static void test_settings_v1(ITaskDefinition
*taskdef
, struct settings
*test
, struct settings
*def
)
1096 TASK_INSTANCES_POLICY policy
;
1097 TASK_COMPATIBILITY compat
;
1099 hr
= ITaskDefinition_get_Settings(taskdef
, &set
);
1100 ok(hr
== S_OK
, "get_Settings error %#lx\n", hr
);
1102 hr
= ITaskSettings_get_AllowDemandStart(set
, &vbool
);
1103 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1104 ok(vbool
== def
->allow_on_demand_start
, "expected %d, got %d\n", def
->allow_on_demand_start
, vbool
);
1106 hr
= ITaskSettings_get_RestartInterval(set
, &bstr
);
1107 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1108 if (!def
->restart_interval
[0])
1109 ok(bstr
== NULL
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1112 ok(!lstrcmpW(bstr
, def
->restart_interval
), "expected %s, got %s\n", wine_dbgstr_w(def
->restart_interval
), wine_dbgstr_w(bstr
));
1113 SysFreeString(bstr
);
1116 hr
= ITaskSettings_get_RestartCount(set
, &vint
);
1117 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1118 ok(vint
== def
->restart_count
, "expected %d, got %d\n", def
->restart_count
, vint
);
1120 hr
= ITaskSettings_get_MultipleInstances(set
, &policy
);
1121 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1122 ok(policy
== def
->policy
, "expected %d, got %d\n", def
->policy
, policy
);
1124 hr
= ITaskSettings_get_StopIfGoingOnBatteries(set
, &vbool
);
1125 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1126 ok(vbool
== test
->stop_if_going_on_batteries
, "expected %d, got %d\n", test
->stop_if_going_on_batteries
, vbool
);
1128 hr
= ITaskSettings_get_DisallowStartIfOnBatteries(set
, &vbool
);
1129 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1130 ok(vbool
== test
->disallow_start_if_on_batteries
, "expected %d, got %d\n", test
->disallow_start_if_on_batteries
, vbool
);
1132 hr
= ITaskSettings_get_AllowHardTerminate(set
, &vbool
);
1133 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1134 ok(vbool
== def
->allow_hard_terminate
, "expected %d, got %d\n", def
->allow_hard_terminate
, vbool
);
1136 hr
= ITaskSettings_get_StartWhenAvailable(set
, &vbool
);
1137 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1138 ok(vbool
== def
->start_when_available
, "expected %d, got %d\n", def
->start_when_available
, vbool
);
1140 hr
= ITaskSettings_get_RunOnlyIfNetworkAvailable(set
, &vbool
);
1141 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1142 ok(vbool
== def
->run_only_if_network_available
, "expected %d, got %d\n", def
->run_only_if_network_available
, vbool
);
1144 hr
= ITaskSettings_get_ExecutionTimeLimit(set
, &bstr
);
1145 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1146 if (!test
->execution_time_limit
[0])
1147 ok(bstr
== NULL
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1150 ok(!lstrcmpW(bstr
, test
->execution_time_limit
), "expected %s, got %s\n", wine_dbgstr_w(test
->execution_time_limit
), wine_dbgstr_w(bstr
));
1151 SysFreeString(bstr
);
1154 hr
= ITaskSettings_get_Enabled(set
, &vbool
);
1155 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1156 ok(vbool
== test
->enabled
, "expected %d, got %d\n", test
->enabled
, vbool
);
1158 hr
= ITaskSettings_get_DeleteExpiredTaskAfter(set
, &bstr
);
1159 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1160 if (!test
->delete_expired_task_after
[0])
1161 ok(bstr
== NULL
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1164 ok(!lstrcmpW(bstr
, test
->delete_expired_task_after
), "expected %s, got %s\n", wine_dbgstr_w(test
->delete_expired_task_after
), wine_dbgstr_w(bstr
));
1165 SysFreeString(bstr
);
1168 hr
= ITaskSettings_get_Priority(set
, &vint
);
1169 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1170 ok(vint
== test
->priority
, "expected %d, got %d\n", test
->priority
, vint
);
1172 hr
= ITaskSettings_get_Compatibility(set
, &compat
);
1173 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1174 ok(compat
== test
->compatibility
, "expected %d, got %d\n", test
->compatibility
, compat
);
1176 hr
= ITaskSettings_get_Hidden(set
, &vbool
);
1177 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1178 ok(vbool
== test
->hidden
, "expected %d, got %d\n", test
->hidden
, vbool
);
1180 hr
= ITaskSettings_get_RunOnlyIfIdle(set
, &vbool
);
1181 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1182 ok(vbool
== test
->run_only_if_idle
, "expected %d, got %d\n", test
->run_only_if_idle
, vbool
);
1184 hr
= ITaskSettings_get_WakeToRun(set
, &vbool
);
1185 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1186 ok(vbool
== test
->wake_to_run
, "expected %d, got %d\n", test
->wake_to_run
, vbool
);
1188 /* FIXME: test IIdleSettings and INetworkSettings */
1190 ITaskSettings_Release(set
);
1193 static void change_settings(ITaskDefinition
*taskdef
, struct settings
*test
)
1197 ITriggerCollection
*triggers
;
1198 IPrincipal
*principal
;
1199 IActionCollection
*actions
;
1201 hr
= ITaskDefinition_get_Settings(taskdef
, &set
);
1202 ok(hr
== S_OK
, "get_Settings error %#lx\n", hr
);
1204 if (!test
->restart_interval
[0])
1205 hr
= ITaskSettings_put_RestartInterval(set
, NULL
);
1207 hr
= ITaskSettings_put_RestartInterval(set
, test
->restart_interval
);
1208 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1210 hr
= ITaskSettings_put_RestartCount(set
, test
->restart_count
);
1211 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1213 hr
= ITaskSettings_put_MultipleInstances(set
, test
->policy
);
1214 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1216 hr
= ITaskSettings_put_StopIfGoingOnBatteries(set
, test
->stop_if_going_on_batteries
);
1217 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1219 hr
= ITaskSettings_put_DisallowStartIfOnBatteries(set
, test
->disallow_start_if_on_batteries
);
1220 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1222 hr
= ITaskSettings_put_AllowHardTerminate(set
, test
->allow_hard_terminate
);
1223 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1225 hr
= ITaskSettings_put_StartWhenAvailable(set
, test
->start_when_available
);
1226 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1228 hr
= ITaskSettings_put_RunOnlyIfNetworkAvailable(set
, test
->run_only_if_network_available
);
1229 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1231 if (!test
->execution_time_limit
[0])
1232 hr
= ITaskSettings_put_ExecutionTimeLimit(set
, NULL
);
1234 hr
= ITaskSettings_put_ExecutionTimeLimit(set
, test
->execution_time_limit
);
1235 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1237 hr
= ITaskSettings_put_Enabled(set
, test
->enabled
);
1238 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1240 if (!test
->delete_expired_task_after
[0])
1241 hr
= ITaskSettings_put_DeleteExpiredTaskAfter(set
, NULL
);
1243 hr
= ITaskSettings_put_DeleteExpiredTaskAfter(set
, test
->delete_expired_task_after
);
1244 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1246 hr
= ITaskSettings_put_Priority(set
, test
->priority
);
1247 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1249 hr
= ITaskSettings_put_Compatibility(set
, test
->compatibility
);
1250 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1252 hr
= ITaskSettings_put_Hidden(set
, test
->hidden
);
1253 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1255 hr
= ITaskSettings_put_RunOnlyIfIdle(set
, test
->run_only_if_idle
);
1256 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1258 hr
= ITaskSettings_put_WakeToRun(set
, test
->wake_to_run
);
1259 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1261 hr
= ITaskSettings_put_AllowDemandStart(set
, test
->allow_on_demand_start
);
1262 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1265 hr
= ITaskDefinition_get_Triggers(taskdef
, &triggers
);
1266 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1267 ok(triggers
!= NULL
, "triggers not set\n");
1269 hr
= ITaskDefinition_put_Triggers(taskdef
, triggers
);
1270 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1271 if (triggers
) ITriggerCollection_Release(triggers
);
1274 hr
= ITaskDefinition_get_Principal(taskdef
, &principal
);
1275 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1276 ok(principal
!= NULL
, "principal not set\n");
1278 hr
= ITaskDefinition_put_Principal(taskdef
, principal
);
1279 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1280 if (principal
) IPrincipal_Release(principal
);
1283 hr
= ITaskDefinition_get_Actions(taskdef
, &actions
);
1284 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1285 ok(actions
!= NULL
, "actions not set\n");
1287 hr
= ITaskDefinition_put_Actions(taskdef
, actions
);
1288 ok(hr
== S_OK
, "expected S_OK, got %#lx\n", hr
);
1289 if (actions
) IActionCollection_Release(actions
);
1291 /* FIXME: set IIdleSettings and INetworkSettings */
1293 ITaskSettings_Release(set
);
1296 static void test_daily_trigger(ITrigger
*trigger
)
1305 {L
"2004-01-01T00:00:00", S_OK
},
1306 {L
"2004-01-01T00:00:00Z", S_OK
},
1307 {L
"2004-01-01T00:00:00+01:00", S_OK
},
1308 {L
"2004.01.01T00.00.00", S_OK
},
1309 {L
"9999-99-99T99:99:99", S_OK
},
1312 IDailyTrigger
*daily_trigger
;
1313 BSTR start_boundary
;
1314 VARIANT_BOOL enabled
;
1319 hr
= ITrigger_QueryInterface(trigger
, &IID_IDailyTrigger
, (void**)&daily_trigger
);
1320 ok(hr
== S_OK
, "Could not get IDailyTrigger iface: %08lx\n", hr
);
1323 hr
= IDailyTrigger_get_DaysInterval(daily_trigger
, &interval
);
1324 ok(hr
== S_OK
, "get_DaysInterval failed: %08lx\n", hr
);
1325 ok(interval
== 1, "interval = %d\n", interval
);
1327 hr
= IDailyTrigger_put_DaysInterval(daily_trigger
, -2);
1328 ok(hr
== E_INVALIDARG
, "put_DaysInterval failed: %08lx\n", hr
);
1329 hr
= IDailyTrigger_put_DaysInterval(daily_trigger
, 0);
1330 ok(hr
== E_INVALIDARG
, "put_DaysInterval failed: %08lx\n", hr
);
1333 hr
= IDailyTrigger_get_DaysInterval(daily_trigger
, &interval
);
1334 ok(hr
== S_OK
, "get_DaysInterval failed: %08lx\n", hr
);
1335 ok(interval
== 1, "interval = %d\n", interval
);
1337 hr
= IDailyTrigger_put_DaysInterval(daily_trigger
, 2);
1338 ok(hr
== S_OK
, "put_DaysInterval failed: %08lx\n", hr
);
1341 hr
= IDailyTrigger_get_DaysInterval(daily_trigger
, &interval
);
1342 ok(hr
== S_OK
, "get_DaysInterval failed: %08lx\n", hr
);
1343 ok(interval
== 2, "interval = %d\n", interval
);
1345 hr
= IDailyTrigger_get_StartBoundary(daily_trigger
, NULL
);
1346 ok(hr
== E_POINTER
, "get_StartBoundary failed: %08lx\n", hr
);
1348 start_boundary
= (BSTR
)0xdeadbeef;
1349 hr
= IDailyTrigger_get_StartBoundary(daily_trigger
, &start_boundary
);
1350 ok(hr
== S_OK
, "get_StartBoundary failed: %08lx\n", hr
);
1351 ok(start_boundary
== NULL
, "start_boundary not set\n");
1353 for (i
= 0; i
< ARRAY_SIZE(start_test
); i
++)
1355 winetest_push_context("%lu", i
);
1356 start_boundary
= SysAllocString(start_test
[i
].str
);
1357 hr
= IDailyTrigger_put_StartBoundary(daily_trigger
, start_boundary
);
1358 ok(hr
== start_test
[i
].hr
, "got %08lx expected %08lx\n", hr
, start_test
[i
].hr
);
1359 SysFreeString(start_boundary
);
1362 start_boundary
= NULL
;
1363 hr
= IDailyTrigger_get_StartBoundary(daily_trigger
, &start_boundary
);
1364 ok(hr
== S_OK
, "got %08lx\n", hr
);
1365 ok(start_boundary
!= NULL
, "start_boundary not set\n");
1366 ok(!lstrcmpW(start_boundary
, start_test
[i
].str
), "got %s\n", wine_dbgstr_w(start_boundary
));
1367 SysFreeString(start_boundary
);
1369 winetest_pop_context();
1372 hr
= IDailyTrigger_put_StartBoundary(daily_trigger
, NULL
);
1373 ok(hr
== S_OK
, "put_StartBoundary failed: %08lx\n", hr
);
1375 hr
= IDailyTrigger_get_Enabled(daily_trigger
, NULL
);
1376 ok(hr
== E_POINTER
, "get_Enabled failed: %08lx\n", hr
);
1378 enabled
= VARIANT_FALSE
;
1379 hr
= IDailyTrigger_get_Enabled(daily_trigger
, &enabled
);
1380 ok(hr
== S_OK
, "get_Enabled failed: %08lx\n", hr
);
1381 ok(enabled
== VARIANT_TRUE
, "got %d\n", enabled
);
1383 hr
= IDailyTrigger_put_Enabled(daily_trigger
, VARIANT_FALSE
);
1384 ok(hr
== S_OK
, "put_Enabled failed: %08lx\n", hr
);
1386 enabled
= VARIANT_TRUE
;
1387 hr
= IDailyTrigger_get_Enabled(daily_trigger
, &enabled
);
1388 ok(hr
== S_OK
, "get_Enabled failed: %08lx\n", hr
);
1389 ok(enabled
== VARIANT_FALSE
, "got %d\n", enabled
);
1391 IDailyTrigger_Release(daily_trigger
);
1394 static void test_registration_trigger(ITrigger
*trigger
)
1396 IRegistrationTrigger
*reg_trigger
;
1397 VARIANT_BOOL enabled
;
1400 hr
= ITrigger_QueryInterface(trigger
, &IID_IRegistrationTrigger
, (void**)®_trigger
);
1401 ok(hr
== S_OK
, "Could not get IRegistrationTrigger iface: %08lx\n", hr
);
1403 enabled
= VARIANT_FALSE
;
1404 hr
= IRegistrationTrigger_get_Enabled(reg_trigger
, &enabled
);
1405 ok(hr
== S_OK
, "get_Enabled failed: %08lx\n", hr
);
1406 ok(enabled
== VARIANT_TRUE
, "got %d\n", enabled
);
1408 hr
= IRegistrationTrigger_put_Enabled(reg_trigger
, VARIANT_FALSE
);
1409 ok(hr
== S_OK
, "put_Enabled failed: %08lx\n", hr
);
1411 enabled
= VARIANT_TRUE
;
1412 hr
= IRegistrationTrigger_get_Enabled(reg_trigger
, &enabled
);
1413 ok(hr
== S_OK
, "get_Enabled failed: %08lx\n", hr
);
1414 ok(enabled
== VARIANT_FALSE
, "got %d\n", enabled
);
1416 IRegistrationTrigger_Release(reg_trigger
);
1419 static void create_action(ITaskDefinition
*taskdef
)
1421 static WCHAR task1_exe
[] = L
"task1.exe";
1422 static WCHAR workdir
[] = L
"workdir";
1423 static WCHAR args
[] = L
"arguments";
1424 static WCHAR comment
[] = L
"comment";
1426 IActionCollection
*actions
;
1428 IExecAction
*exec_action
;
1429 TASK_ACTION_TYPE type
;
1432 hr
= ITaskDefinition_get_Actions(taskdef
, NULL
);
1433 ok(hr
== E_POINTER
, "got %#lx\n", hr
);
1435 hr
= ITaskDefinition_get_Actions(taskdef
, &actions
);
1436 ok(hr
== S_OK
, "get_Actions error %#lx\n", hr
);
1438 hr
= IActionCollection_Create(actions
, TASK_ACTION_EXEC
, &action
);
1439 ok(hr
== S_OK
, "Create action error %#lx\n", hr
);
1441 hr
= IAction_QueryInterface(action
, &IID_IExecAction
, (void **)&exec_action
);
1442 ok(hr
== S_OK
, "QueryInterface error %#lx\n", hr
);
1445 hr
= IExecAction_get_Type(exec_action
, &type
);
1446 ok(hr
== S_OK
, "get_Type error %#lx\n", hr
);
1447 ok(type
== TASK_ACTION_EXEC
, "got %u\n", type
);
1449 hr
= IExecAction_get_Path(exec_action
, NULL
);
1450 ok(hr
== E_POINTER
, "got %#lx\n", hr
);
1452 path
= (BSTR
)0xdeadbeef;
1453 hr
= IExecAction_get_Path(exec_action
, &path
);
1454 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
1455 ok(path
== NULL
, "path not set\n");
1457 hr
= IExecAction_put_Path(exec_action
, NULL
);
1458 ok(hr
== S_OK
, "put_Path error %#lx\n", hr
);
1460 hr
= IExecAction_put_Path(exec_action
, task1_exe
);
1461 ok(hr
== S_OK
, "put_Path error %#lx\n", hr
);
1464 hr
= IExecAction_get_Path(exec_action
, &path
);
1465 ok(hr
== S_OK
, "get_Path error %#lx\n", hr
);
1466 ok(path
!= NULL
, "path not set\n");
1467 ok(!lstrcmpW(path
, task1_exe
), "got %s\n", wine_dbgstr_w(path
));
1468 SysFreeString(path
);
1470 hr
= IExecAction_get_WorkingDirectory(exec_action
, NULL
);
1471 ok(hr
== E_POINTER
, "got %#lx\n", hr
);
1473 path
= (BSTR
)0xdeadbeef;
1474 hr
= IExecAction_get_WorkingDirectory(exec_action
, &path
);
1475 ok(hr
== S_OK
, "get_WorkingDirectory error %#lx\n", hr
);
1476 ok(path
== NULL
, "workdir not set\n");
1478 hr
= IExecAction_put_WorkingDirectory(exec_action
, NULL
);
1479 ok(hr
== S_OK
, "put_WorkingDirectory error %#lx\n", hr
);
1481 hr
= IExecAction_put_WorkingDirectory(exec_action
, workdir
);
1482 ok(hr
== S_OK
, "put_WorkingDirectory error %#lx\n", hr
);
1485 hr
= IExecAction_get_WorkingDirectory(exec_action
, &path
);
1486 ok(hr
== S_OK
, "get_WorkingDirectory error %#lx\n", hr
);
1487 ok(path
!= NULL
, "workdir not set\n");
1488 ok(!lstrcmpW(path
, workdir
), "got %s\n", wine_dbgstr_w(path
));
1489 SysFreeString(path
);
1491 hr
= IExecAction_get_Arguments(exec_action
, NULL
);
1492 ok(hr
== E_POINTER
, "got %#lx\n", hr
);
1494 path
= (BSTR
)0xdeadbeef;
1495 hr
= IExecAction_get_Arguments(exec_action
, &path
);
1496 ok(hr
== S_OK
, "get_Arguments error %#lx\n", hr
);
1497 ok(path
== NULL
, "args not set\n");
1499 hr
= IExecAction_put_Arguments(exec_action
, NULL
);
1500 ok(hr
== S_OK
, "put_Arguments error %#lx\n", hr
);
1502 hr
= IExecAction_put_Arguments(exec_action
, args
);
1503 ok(hr
== S_OK
, "put_Arguments error %#lx\n", hr
);
1506 hr
= IExecAction_get_Arguments(exec_action
, &path
);
1507 ok(hr
== S_OK
, "get_Arguments error %#lx\n", hr
);
1508 ok(path
!= NULL
, "args not set\n");
1509 ok(!lstrcmpW(path
, args
), "got %s\n", wine_dbgstr_w(path
));
1510 SysFreeString(path
);
1513 str
= (BSTR
)0xdeadbeef;
1514 hr
= IExecAction_get_Id(exec_action
, &str
);
1515 ok(hr
== S_OK
, "get_Id error %#lx\n", hr
);
1516 ok(str
== NULL
, "id should be NULL\n");
1518 hr
= IExecAction_put_Id(exec_action
, NULL
);
1519 ok(hr
== S_OK
, "put_Id error %#lx\n", hr
);
1521 hr
= IExecAction_put_Id(exec_action
, comment
);
1522 ok(hr
== S_OK
, "put_Id error %#lx\n", hr
);
1525 hr
= IExecAction_get_Id(exec_action
, &str
);
1526 ok(hr
== S_OK
, "get_Id error %#lx\n", hr
);
1527 ok(str
!= NULL
, "should not be NULL\n");
1528 ok(!lstrcmpW(str
, comment
), "got %s\n", wine_dbgstr_w(str
));
1531 IExecAction_Release(exec_action
);
1532 IAction_Release(action
);
1533 IActionCollection_Release(actions
);
1536 static void test_TaskDefinition(void)
1538 static WCHAR xml0
[] = L
"";
1539 static WCHAR xml1
[] =
1540 L
"<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1541 " <RegistrationInfo>\n"
1542 " <Description>\"Task1\"</Description>\n"
1543 " <Author>author</Author>\n"
1544 " <Version>1.0</Version>\n"
1545 " <Date>2018-04-02T11:22:33</Date>\n"
1546 " <Documentation>doc</Documentation>\n"
1548 " <Source>source</Source>\n"
1549 " </RegistrationInfo>\n"
1551 " <Enabled>false</Enabled>\n"
1552 " <Hidden>false</Hidden>\n"
1556 " <Command>\"task1.exe\"</Command>\n"
1560 static WCHAR xml2
[] =
1562 " <RegistrationInfo>\n"
1563 " <Description>\"Task1\"</Description>\n"
1564 " </RegistrationInfo>\n"
1566 " <Enabled>false</Enabled>\n"
1567 " <Hidden>false</Hidden>\n"
1571 " <Command>\"task1.exe\"</Command>\n"
1575 static WCHAR xml3
[] =
1577 " <RegistrationInfo>\n"
1578 " <Description>\"Task1\"</Description>\n"
1579 " </RegistrationInfo>\n"
1581 " <Enabled>false</Enabled>\n"
1582 " <Hidden>false</Hidden>\n"
1586 " <Command>\"task1.exe\"</Command>\n"
1590 static WCHAR xml4
[] =
1591 L
"<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1592 " <RegistrationInfo/>\n"
1596 " <Command>\"task1.exe\"</Command>\n"
1600 static WCHAR xml5
[] =
1601 L
"<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1602 " <RegistrationInfo/>\n"
1606 static WCHAR xml6
[] =
1607 L
"<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1608 " <RegistrationInfo/>\n"
1611 " <Command>\"task1.exe\"</Command>\n"
1616 static WCHAR xml7
[] =
1617 L
"<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1618 " <RegistrationInfo/>\n"
1620 " <Enabled>FALSE</Enabled>\n"
1624 " <Command>\"task1.exe\"</Command>\n"
1628 static struct settings def_settings
= { L
"", L
"PT72H", L
"",
1629 0, 7, TASK_INSTANCES_IGNORE_NEW
, TASK_COMPATIBILITY_V2
, VARIANT_TRUE
, VARIANT_TRUE
,
1630 VARIANT_TRUE
, VARIANT_TRUE
, VARIANT_FALSE
, VARIANT_FALSE
, VARIANT_TRUE
, VARIANT_FALSE
,
1631 VARIANT_FALSE
, VARIANT_FALSE
};
1632 static struct settings new_settings
= { L
"P1Y", L
"PT10M", L
"",
1633 100, 1, TASK_INSTANCES_STOP_EXISTING
, TASK_COMPATIBILITY_V1
, VARIANT_FALSE
, VARIANT_FALSE
,
1634 VARIANT_FALSE
, VARIANT_FALSE
, VARIANT_TRUE
, VARIANT_TRUE
, VARIANT_FALSE
, VARIANT_TRUE
,
1635 VARIANT_TRUE
, VARIANT_TRUE
};
1636 ITriggerCollection
*trigger_col
, *trigger_col2
;
1638 ITaskService
*service
;
1639 ITaskDefinition
*taskdef
;
1640 IRegistrationInfo
*reginfo
;
1645 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
1648 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#lx\n", hr
);
1652 hr
= ITaskService_NewTask(service
, 0, &taskdef
);
1653 ok(hr
== S_OK
, "NewTask error %#lx\n", hr
);
1655 test_settings_v1(taskdef
, &def_settings
, &def_settings
);
1656 change_settings(taskdef
, &new_settings
);
1658 /* Action is mandatory for v1 compatibility */
1659 create_action(taskdef
);
1661 hr
= ITaskDefinition_get_XmlText(taskdef
, &xml
);
1662 ok(hr
== S_OK
, "get_XmlText error %#lx\n", hr
);
1664 ITaskDefinition_Release(taskdef
);
1666 hr
= ITaskService_NewTask(service
, 0, &taskdef
);
1667 ok(hr
== S_OK
, "NewTask error %#lx\n", hr
);
1669 hr
= ITaskDefinition_put_XmlText(taskdef
, xml
);
1670 ok(hr
== S_OK
, "put_XmlText error %#lx\n", hr
);
1673 /* FIXME: uncomment once changing settings is implemented
1674 test_settings_v1(taskdef, &new_settings, &def_settings);
1677 hr
= ITaskDefinition_put_XmlText(taskdef
, NULL
);
1678 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#lx\n", hr
);
1680 hr
= ITaskDefinition_put_XmlText(taskdef
, xml1
);
1681 ok(hr
== S_OK
, "put_XmlText error %#lx\n", hr
);
1683 hr
= ITaskDefinition_put_XmlText(taskdef
, xml2
);
1684 ok(hr
== SCHED_E_NAMESPACE
, "expected SCHED_E_NAMESPACE, got %#lx\n", hr
);
1686 hr
= ITaskDefinition_put_XmlText(taskdef
, xml3
);
1688 ok(hr
== SCHED_E_UNEXPECTEDNODE
, "expected SCHED_E_UNEXPECTEDNODE, got %#lx\n", hr
);
1690 hr
= ITaskDefinition_put_XmlText(taskdef
, xml4
);
1691 ok(hr
== S_OK
, "put_XmlText error %#lx\n", hr
);
1693 hr
= ITaskDefinition_put_XmlText(taskdef
, xml5
);
1695 ok(hr
== SCHED_E_MISSINGNODE
, "expected SCHED_E_MISSINGNODE, got %#lx\n", hr
);
1697 hr
= ITaskDefinition_put_XmlText(taskdef
, xml6
);
1698 ok(hr
== SCHED_E_MALFORMEDXML
, "expected SCHED_E_MALFORMEDXML, got %#lx\n", hr
);
1700 hr
= ITaskDefinition_put_XmlText(taskdef
, xml7
);
1701 ok(hr
== SCHED_E_INVALIDVALUE
, "expected SCHED_E_INVALIDVALUE, got %#lx\n", hr
);
1703 hr
= ITaskDefinition_put_XmlText(taskdef
, xml0
);
1704 ok(hr
== SCHED_E_MALFORMEDXML
, "expected SCHED_E_MALFORMEDXML, got %#lx\n", hr
);
1706 /* test registration info */
1707 hr
= ITaskDefinition_put_XmlText(taskdef
, xml1
);
1708 ok(hr
== S_OK
, "put_XmlText error %#lx\n", hr
);
1709 hr
= ITaskDefinition_get_RegistrationInfo(taskdef
, ®info
);
1710 ok(hr
== S_OK
, "get_RegistrationInfo error %#lx\n", hr
);
1712 hr
= IRegistrationInfo_get_Description(reginfo
, &bstr
);
1713 ok(hr
== S_OK
, "get_Description error %#lx\n", hr
);
1714 ok(!lstrcmpW(bstr
, L
"\"Task1\""), "expected \"Task1\", got %s\n", wine_dbgstr_w(bstr
));
1715 SysFreeString(bstr
);
1716 hr
= IRegistrationInfo_put_Description(reginfo
, NULL
);
1717 ok(hr
== S_OK
, "put_Description error %#lx\n", hr
);
1718 bstr
= (BSTR
)0xdeadbeef;
1719 hr
= IRegistrationInfo_get_Description(reginfo
, &bstr
);
1720 ok(hr
== S_OK
, "get_Description error %#lx\n", hr
);
1721 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1723 hr
= IRegistrationInfo_get_Author(reginfo
, &bstr
);
1724 ok(hr
== S_OK
, "get_Author error %#lx\n", hr
);
1725 ok(!lstrcmpW(bstr
, L
"author"), "expected author, got %s\n", wine_dbgstr_w(bstr
));
1726 SysFreeString(bstr
);
1727 hr
= IRegistrationInfo_put_Author(reginfo
, NULL
);
1728 ok(hr
== S_OK
, "put_Author error %#lx\n", hr
);
1729 bstr
= (BSTR
)0xdeadbeef;
1730 hr
= IRegistrationInfo_get_Author(reginfo
, &bstr
);
1731 ok(hr
== S_OK
, "get_Author error %#lx\n", hr
);
1732 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1734 hr
= IRegistrationInfo_get_Version(reginfo
, &bstr
);
1735 ok(hr
== S_OK
, "get_Version error %#lx\n", hr
);
1736 ok(!lstrcmpW(bstr
, L
"1.0"), "expected 1.0, got %s\n", wine_dbgstr_w(bstr
));
1737 SysFreeString(bstr
);
1738 hr
= IRegistrationInfo_put_Version(reginfo
, NULL
);
1739 ok(hr
== S_OK
, "put_Version error %#lx\n", hr
);
1740 bstr
= (BSTR
)0xdeadbeef;
1741 hr
= IRegistrationInfo_get_Version(reginfo
, &bstr
);
1742 ok(hr
== S_OK
, "get_Version error %#lx\n", hr
);
1743 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1745 hr
= IRegistrationInfo_get_Date(reginfo
, &bstr
);
1746 ok(hr
== S_OK
, "get_Date error %#lx\n", hr
);
1747 ok(!lstrcmpW(bstr
, L
"2018-04-02T11:22:33"), "expected 2018-04-02T11:22:33, got %s\n", wine_dbgstr_w(bstr
));
1748 SysFreeString(bstr
);
1749 hr
= IRegistrationInfo_put_Date(reginfo
, NULL
);
1750 ok(hr
== S_OK
, "put_Date error %#lx\n", hr
);
1751 bstr
= (BSTR
)0xdeadbeef;
1752 hr
= IRegistrationInfo_get_Date(reginfo
, &bstr
);
1753 ok(hr
== S_OK
, "get_Date error %#lx\n", hr
);
1754 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1756 hr
= IRegistrationInfo_get_Documentation(reginfo
, &bstr
);
1757 ok(hr
== S_OK
, "get_Documentation error %#lx\n", hr
);
1758 ok(!lstrcmpW(bstr
, L
"doc"), "expected doc, got %s\n", wine_dbgstr_w(bstr
));
1759 SysFreeString(bstr
);
1760 hr
= IRegistrationInfo_put_Documentation(reginfo
, NULL
);
1761 ok(hr
== S_OK
, "put_Documentation error %#lx\n", hr
);
1762 bstr
= (BSTR
)0xdeadbeef;
1763 hr
= IRegistrationInfo_get_Documentation(reginfo
, &bstr
);
1764 ok(hr
== S_OK
, "get_Documentation error %#lx\n", hr
);
1765 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1767 hr
= IRegistrationInfo_get_URI(reginfo
, &bstr
);
1768 ok(hr
== S_OK
, "get_URI error %#lx\n", hr
);
1769 ok(!lstrcmpW(bstr
, L
"uri"), "expected uri, got %s\n", wine_dbgstr_w(bstr
));
1770 SysFreeString(bstr
);
1771 hr
= IRegistrationInfo_put_URI(reginfo
, NULL
);
1772 ok(hr
== S_OK
, "put_URI error %#lx\n", hr
);
1773 bstr
= (BSTR
)0xdeadbeef;
1774 hr
= IRegistrationInfo_get_URI(reginfo
, &bstr
);
1775 ok(hr
== S_OK
, "get_URI error %#lx\n", hr
);
1776 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1778 hr
= IRegistrationInfo_get_Source(reginfo
, &bstr
);
1779 ok(hr
== S_OK
, "get_Source error %#lx\n", hr
);
1780 ok(!lstrcmpW(bstr
, L
"source"), "expected source, got %s\n", wine_dbgstr_w(bstr
));
1781 SysFreeString(bstr
);
1782 hr
= IRegistrationInfo_put_Source(reginfo
, NULL
);
1783 ok(hr
== S_OK
, "put_Source error %#lx\n", hr
);
1784 bstr
= (BSTR
)0xdeadbeef;
1785 hr
= IRegistrationInfo_get_Source(reginfo
, &bstr
);
1786 ok(hr
== S_OK
, "get_Source error %#lx\n", hr
);
1787 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1789 V_VT(&var
) = VT_BSTR
;
1790 V_BSTR(&var
) = NULL
;
1791 hr
= IRegistrationInfo_get_SecurityDescriptor(reginfo
, &var
);
1793 ok(hr
== S_OK
, "get_SecurityDescriptor error %#lx\n", hr
);
1795 ok(V_VT(&var
) == VT_EMPTY
, "expected VT_EMPTY, got %u\n", V_VT(&var
));
1797 IRegistrationInfo_Release(reginfo
);
1799 hr
= ITaskDefinition_put_XmlText(taskdef
, xml4
);
1800 ok(hr
== S_OK
, "put_XmlText error %#lx\n", hr
);
1801 hr
= ITaskDefinition_get_RegistrationInfo(taskdef
, ®info
);
1802 ok(hr
== S_OK
, "get_RegistrationInfo error %#lx\n", hr
);
1804 hr
= IRegistrationInfo_get_Description(reginfo
, &bstr
);
1805 ok(hr
== S_OK
, "get_Description error %#lx\n", hr
);
1806 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1808 hr
= ITaskDefinition_get_Triggers(taskdef
, &trigger_col
);
1809 ok(hr
== S_OK
, "get_Triggers failed: %08lx\n", hr
);
1810 ok(trigger_col
!= NULL
, "Triggers = NULL\n");
1812 hr
= ITriggerCollection_Create(trigger_col
, TASK_TRIGGER_DAILY
, &trigger
);
1813 ok(hr
== S_OK
, "Create failed: %08lx\n", hr
);
1814 ok(trigger
!= NULL
, "trigger = NULL\n");
1815 test_daily_trigger(trigger
);
1816 ITrigger_Release(trigger
);
1818 hr
= ITriggerCollection_Create(trigger_col
, TASK_TRIGGER_REGISTRATION
, &trigger
);
1819 ok(hr
== S_OK
, "Create failed: %08lx\n", hr
);
1820 ok(trigger
!= NULL
, "trigger = NULL\n");
1821 test_registration_trigger(trigger
);
1822 ITrigger_Release(trigger
);
1823 ITriggerCollection_Release(trigger_col
);
1825 hr
= ITaskDefinition_get_Triggers(taskdef
, &trigger_col2
);
1826 ok(hr
== S_OK
, "get_Triggers failed: %08lx\n", hr
);
1827 ok(trigger_col
== trigger_col2
, "Mismatched triggers\n");
1828 ITriggerCollection_Release(trigger_col2
);
1830 IRegistrationInfo_Release(reginfo
);
1831 ITaskDefinition_Release(taskdef
);
1832 ITaskService_Release(service
);
1835 START_TEST(scheduler
)
1837 OleInitialize(NULL
);
1841 test_FolderCollection();
1843 test_TaskDefinition();