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
30 #include <wine/test.h>
32 static void test_Connect(void)
34 static WCHAR empty
[] = { 0 };
35 static const WCHAR deadbeefW
[] = { '0','.','0','.','0','.','0',0 };
36 WCHAR comp_name
[MAX_COMPUTERNAME_LENGTH
+ 1];
40 VARIANT v_null
, v_comp
;
43 ITaskService
*service
;
45 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
48 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#x\n", hr
);
52 hr
= ITaskService_get_Connected(service
, NULL
);
53 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
56 hr
= ITaskService_get_Connected(service
, &vbool
);
57 ok(hr
== S_OK
, "get_Connected error %#x\n", hr
);
58 ok(vbool
== VARIANT_FALSE
, "expected VARIANT_FALSE, got %d\n", vbool
);
60 hr
= ITaskService_get_TargetServer(service
, NULL
);
61 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
63 hr
= ITaskService_get_TargetServer(service
, &bstr
);
64 ok(hr
== HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
), "expected ERROR_ONLY_IF_CONNECTED, got %#x\n", hr
);
66 /* Win7 doesn't support UNC \\ prefix, but according to a user
67 * comment on MSDN Win8 supports both ways.
69 len
= sizeof(comp_name
)/sizeof(comp_name
[0]);
70 GetComputerNameW(comp_name
, &len
);
72 V_VT(&v_null
) = VT_NULL
;
74 V_VT(&v_comp
) = VT_BSTR
;
75 V_BSTR(&v_comp
) = SysAllocString(comp_name
);
77 hr
= ITaskService_Connect(service
, v_comp
, v_null
, v_null
, v_null
);
78 ok(hr
== S_OK
|| hr
== E_ACCESSDENIED
/* not an administrator */, "Connect error %#x\n", hr
);
79 was_connected
= hr
== S_OK
;
80 SysFreeString(V_BSTR(&v_comp
));
82 V_BSTR(&v_comp
) = SysAllocString(deadbeefW
);
83 hr
= ITaskService_Connect(service
, v_comp
, v_null
, v_null
, v_null
);
84 ok(hr
== HRESULT_FROM_WIN32(RPC_S_INVALID_NET_ADDR
) || hr
== HRESULT_FROM_WIN32(ERROR_BAD_NETPATH
) /* VM */,
85 "expected RPC_S_INVALID_NET_ADDR, got %#x\n", hr
);
86 SysFreeString(V_BSTR(&v_comp
));
89 hr
= ITaskService_get_Connected(service
, &vbool
);
90 ok(hr
== S_OK
, "get_Connected error %#x\n", hr
);
91 ok(vbool
== VARIANT_FALSE
|| (was_connected
&& vbool
== VARIANT_TRUE
),
92 "Connect shouldn't trash an existing connection, got %d (was connected %d)\n", vbool
, was_connected
);
94 V_BSTR(&v_comp
) = SysAllocString(empty
);
95 hr
= ITaskService_Connect(service
, v_comp
, v_null
, v_null
, v_null
);
96 ok(hr
== S_OK
, "Connect error %#x\n", hr
);
97 SysFreeString(V_BSTR(&v_comp
));
99 V_BSTR(&v_comp
) = NULL
;
100 hr
= ITaskService_Connect(service
, v_comp
, v_null
, v_null
, v_null
);
101 ok(hr
== S_OK
, "Connect error %#x\n", hr
);
103 hr
= ITaskService_Connect(service
, v_null
, v_null
, v_null
, v_null
);
104 ok(hr
== S_OK
, "Connect error %#x\n", hr
);
107 hr
= ITaskService_get_Connected(service
, &vbool
);
108 ok(hr
== S_OK
, "get_Connected error %#x\n", hr
);
109 ok(vbool
== VARIANT_TRUE
, "expected VARIANT_TRUE, got %d\n", vbool
);
111 hr
= ITaskService_get_TargetServer(service
, &bstr
);
112 ok(hr
== S_OK
, "get_TargetServer error %#x\n", hr
);
113 ok(!lstrcmpW(comp_name
, bstr
), "compname %s != server name %s\n", wine_dbgstr_w(comp_name
), wine_dbgstr_w(bstr
));
116 ITaskService_Release(service
);
119 static void test_GetFolder(void)
121 static WCHAR dot
[] = { '.',0 };
122 static WCHAR empty
[] = { 0 };
123 static WCHAR slash
[] = { '/',0 };
124 static WCHAR bslash
[] = { '\\',0 };
125 static WCHAR Wine
[] = { '\\','W','i','n','e',0 };
126 static WCHAR Wine_Folder1
[] = { '\\','W','i','n','e','\\','F','o','l','d','e','r','1',0 };
127 static WCHAR Wine_Folder1_
[] = { '\\','W','i','n','e','\\','F','o','l','d','e','r','1','\\',0 };
128 static WCHAR Wine_Folder1_Folder2
[] = { '\\','W','i','n','e','\\','F','o','l','d','e','r','1','\\','F','o','l','d','e','r','2',0 };
129 static WCHAR Folder1_Folder2
[] = { '\\','F','o','l','d','e','r','1','\\','F','o','l','d','e','r','2',0 };
130 static const WCHAR Folder1
[] = { 'F','o','l','d','e','r','1',0 };
131 static const WCHAR Folder2
[] = { 'F','o','l','d','e','r','2',0 };
135 ITaskService
*service
;
136 ITaskFolder
*folder
, *subfolder
, *subfolder2
;
138 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
141 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#x\n", hr
);
145 hr
= ITaskService_GetFolder(service
, NULL
, &folder
);
146 ok(hr
== HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
), "expected ERROR_ONLY_IF_CONNECTED, got %#x\n", hr
);
148 V_VT(&v_null
) = VT_NULL
;
150 hr
= ITaskService_Connect(service
, v_null
, v_null
, v_null
, v_null
);
151 ok(hr
== S_OK
, "Connect error %#x\n", hr
);
153 hr
= ITaskService_GetFolder(service
, slash
, &folder
);
155 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#x\n", hr
);
157 hr
= ITaskService_GetFolder(service
, dot
, &folder
);
159 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
) || hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) /* win7 */,
160 "expected ERROR_INVALID_NAME, got %#x\n", hr
);
162 hr
= ITaskService_GetFolder(service
, bslash
, &folder
);
163 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
164 ITaskFolder_Release(folder
);
166 hr
= ITaskService_GetFolder(service
, NULL
, NULL
);
167 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
169 hr
= ITaskService_GetFolder(service
, empty
, &folder
);
170 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
171 ITaskFolder_Release(folder
);
173 hr
= ITaskService_GetFolder(service
, NULL
, &folder
);
174 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
176 hr
= ITaskFolder_get_Name(folder
, NULL
);
177 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
179 hr
= ITaskFolder_get_Name(folder
, &bstr
);
180 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
181 ok(!lstrcmpW(bstr
, bslash
), "expected '\\', got %s\n", wine_dbgstr_w(bstr
));
184 hr
= ITaskFolder_get_Path(folder
, NULL
);
185 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
187 hr
= ITaskFolder_get_Path(folder
, &bstr
);
188 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
189 ok(!lstrcmpW(bstr
, bslash
), "expected '\\', got %s\n", wine_dbgstr_w(bstr
));
192 hr
= ITaskFolder_CreateFolder(folder
, NULL
, v_null
, &subfolder
);
193 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
195 /* Just in case something was left from previous runs */
196 ITaskFolder_DeleteFolder(folder
, Wine_Folder1_Folder2
, 0);
197 ITaskFolder_DeleteFolder(folder
, Wine_Folder1
, 0);
198 ITaskFolder_DeleteFolder(folder
, Wine
, 0);
200 hr
= ITaskFolder_CreateFolder(folder
, slash
, v_null
, &subfolder
);
202 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#x\n", hr
);
204 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
, &subfolder
);
205 ok(hr
== HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
) || hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) /* win7 */,
206 "expected ERROR_PATH_NOT_FOUND, got %#x\n", hr
);
208 hr
= ITaskFolder_CreateFolder(folder
, bslash
, v_null
, &subfolder
);
210 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
212 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_Folder2
, v_null
, &subfolder
);
213 ok(hr
== S_OK
, "CreateFolder error %#x\n", hr
);
214 ITaskFolder_Release(subfolder
);
216 hr
= ITaskFolder_CreateFolder(folder
, Wine
, v_null
, NULL
);
217 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
219 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_
, v_null
, &subfolder
);
220 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#x\n", hr
);
222 hr
= ITaskFolder_CreateFolder(folder
, Wine
, v_null
, &subfolder
);
223 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
224 hr
= ITaskFolder_CreateFolder(folder
, Wine
+1, v_null
, &subfolder
);
225 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
226 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1
, v_null
, &subfolder
);
227 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
228 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1
+1, v_null
, &subfolder
);
229 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
230 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_Folder2
, v_null
, &subfolder
);
231 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
232 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_Folder2
+1, v_null
, &subfolder
);
233 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
235 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
, NULL
);
236 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
238 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
, &subfolder
);
239 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
241 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
242 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
243 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
245 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
246 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
247 ok(!lstrcmpW(bstr
, Wine_Folder1_Folder2
), "expected \\Wine\\Folder1\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
249 ITaskFolder_Release(subfolder
);
251 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
+1, &subfolder
);
252 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
253 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
254 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
255 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
257 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
258 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
259 ok(!lstrcmpW(bstr
, Wine_Folder1_Folder2
+1), "expected Wine\\Folder1\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
261 ITaskFolder_Release(subfolder
);
263 hr
= ITaskService_GetFolder(service
, Wine_Folder1
, &subfolder
);
264 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
265 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
266 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
267 ok(!lstrcmpW(bstr
, Folder1
), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
269 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
270 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
271 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
273 ITaskFolder_Release(subfolder
);
275 hr
= ITaskService_GetFolder(service
, Wine
, &subfolder
);
276 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
277 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
278 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
279 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
281 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
282 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
283 ok(!lstrcmpW(bstr
, Wine
), "expected \\Wine, got %s\n", wine_dbgstr_w(bstr
));
285 ITaskFolder_Release(subfolder
);
287 hr
= ITaskService_GetFolder(service
, Wine
+1, &subfolder
);
288 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
289 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
290 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
291 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
293 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
294 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
295 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
298 hr
= ITaskFolder_GetFolder(subfolder
, bslash
, &subfolder2
);
299 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#x\n", hr
);
301 hr
= ITaskFolder_GetFolder(subfolder
, NULL
, &subfolder2
);
302 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
304 hr
= ITaskFolder_GetFolder(subfolder
, empty
, &subfolder2
);
305 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
306 hr
= ITaskFolder_get_Name(subfolder2
, &bstr
);
307 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
308 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
310 hr
= ITaskFolder_get_Path(subfolder2
, &bstr
);
311 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
312 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
314 ITaskFolder_Release(subfolder2
);
316 hr
= ITaskFolder_GetFolder(subfolder
, Folder1_Folder2
, &subfolder2
);
317 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
318 hr
= ITaskFolder_get_Name(subfolder2
, &bstr
);
319 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
320 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
322 hr
= ITaskFolder_get_Path(subfolder2
, &bstr
);
323 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
324 ok(!lstrcmpW(bstr
, Wine_Folder1_Folder2
+1), "expected Wine\\Folder1\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
326 ITaskFolder_Release(subfolder2
);
328 hr
= ITaskFolder_GetFolder(subfolder
, Folder1_Folder2
+1, &subfolder2
);
329 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
331 hr
= ITaskFolder_get_Name(subfolder2
, &bstr
);
332 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
333 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
335 hr
= ITaskFolder_get_Path(subfolder2
, &bstr
);
336 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
337 ok(!lstrcmpW(bstr
, Wine_Folder1_Folder2
+1), "expected Wine\\Folder1\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
339 ITaskFolder_Release(subfolder2
);
341 ITaskFolder_Release(subfolder
);
343 hr
= ITaskFolder_DeleteFolder(folder
, Wine
, 0);
344 ok(hr
== HRESULT_FROM_WIN32(ERROR_DIR_NOT_EMPTY
), "expected ERROR_DIR_NOT_EMPTY, got %#x\n", hr
);
346 hr
= ITaskFolder_DeleteFolder(folder
, Wine_Folder1_Folder2
, 0);
347 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
348 hr
= ITaskFolder_DeleteFolder(folder
, Wine_Folder1
+1, 0);
349 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
350 hr
= ITaskFolder_DeleteFolder(folder
, Wine
+1, 0);
351 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
353 hr
= ITaskFolder_DeleteFolder(folder
, Wine
, 0);
354 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) || hr
== S_OK
/* win7 */, "expected ERROR_FILE_NOT_FOUND, got %#x\n", hr
);
356 hr
= ITaskFolder_DeleteFolder(folder
, NULL
, 0);
357 ok(hr
== E_ACCESSDENIED
|| hr
== E_INVALIDARG
/* Vista */, "expected E_ACCESSDENIED, got %#x\n", hr
);
359 hr
= ITaskFolder_DeleteFolder(folder
, empty
, 0);
360 ok(hr
== E_ACCESSDENIED
|| hr
== E_INVALIDARG
/* Vista */, "expected E_ACCESSDENIED, got %#x\n", hr
);
362 hr
= ITaskFolder_DeleteFolder(folder
, slash
, 0);
364 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#x\n", hr
);
366 ITaskFolder_Release(folder
);
367 ITaskService_Release(service
);
370 static void set_var(int vt
, VARIANT
*var
, LONG val
)
378 V_UI1(var
) = (BYTE
)val
;
383 V_UI2(var
) = (USHORT
)val
;
407 static void test_FolderCollection(void)
409 static WCHAR Wine
[] = { '\\','W','i','n','e',0 };
410 static WCHAR Wine_Folder1
[] = { '\\','W','i','n','e','\\','F','o','l','d','e','r','1',0 };
411 static WCHAR Wine_Folder2
[] = { '\\','W','i','n','e','\\','F','o','l','d','e','r','2',0 };
412 static WCHAR Wine_Folder3
[] = { '\\','W','i','n','e','\\','F','o','l','d','e','r','3',0 };
413 static const WCHAR Folder1
[] = { 'F','o','l','d','e','r','1',0 };
414 static const WCHAR Folder2
[] = { 'F','o','l','d','e','r','2',0 };
417 VARIANT v_null
, var
[3];
418 ITaskService
*service
;
419 ITaskFolder
*root
, *folder
, *subfolder
;
420 ITaskFolderCollection
*folders
;
422 IEnumVARIANT
*enumvar
;
426 static const int vt
[] = { VT_I1
, VT_I2
, VT_I4
, VT_I8
, VT_UI1
, VT_UI2
, VT_UI4
, VT_UI8
, VT_INT
, VT_UINT
};
428 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
431 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#x\n", hr
);
435 V_VT(&v_null
) = VT_NULL
;
437 hr
= ITaskService_Connect(service
, v_null
, v_null
, v_null
, v_null
);
438 ok(hr
== S_OK
, "Connect error %#x\n", hr
);
440 hr
= ITaskService_GetFolder(service
, NULL
, &root
);
441 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
443 /* Just in case something was left from previous runs */
444 ITaskFolder_DeleteFolder(root
, Wine_Folder1
, 0);
445 ITaskFolder_DeleteFolder(root
, Wine_Folder2
, 0);
446 ITaskFolder_DeleteFolder(root
, Wine_Folder3
, 0);
447 ITaskFolder_DeleteFolder(root
, Wine
, 0);
449 hr
= ITaskFolder_CreateFolder(root
, Wine_Folder1
, v_null
, &subfolder
);
450 ok(hr
== S_OK
, "CreateFolder error %#x\n", hr
);
451 ITaskFolder_Release(subfolder
);
453 hr
= ITaskFolder_CreateFolder(root
, Wine_Folder2
, v_null
, &subfolder
);
454 ok(hr
== S_OK
, "CreateFolder error %#x\n", hr
);
455 ITaskFolder_Release(subfolder
);
457 hr
= ITaskFolder_GetFolder(root
, Wine
, &folder
);
458 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
460 hr
= ITaskFolder_GetFolders(folder
, 0, NULL
);
461 ok (hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
463 hr
= ITaskFolder_GetFolders(folder
, 0, &folders
);
464 ok(hr
== S_OK
, "GetFolders error %#x\n", hr
);
466 ITaskFolder_Release(folder
);
468 hr
= ITaskFolderCollection_get_Count(folders
, NULL
);
469 ok (hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
472 hr
= ITaskFolderCollection_get_Count(folders
, (LONG
*)&count
);
473 ok(hr
== S_OK
, "get_Count error %#x\n", hr
);
474 ok(count
== 2, "expected 2, got %d\n", count
);
476 hr
= ITaskFolder_CreateFolder(root
, Wine_Folder3
, v_null
, &subfolder
);
477 ok(hr
== S_OK
, "CreateFolder error %#x\n", hr
);
478 ITaskFolder_Release(subfolder
);
481 hr
= ITaskFolderCollection_get_Count(folders
, (LONG
*)&count
);
482 ok(hr
== S_OK
, "get_Count error %#x\n", hr
);
483 ok(count
== 2, "expected 2, got %d\n", count
);
485 set_var(VT_INT
, &idx
, 0);
486 hr
= ITaskFolderCollection_get_Item(folders
, idx
, NULL
);
487 ok (hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
489 for (i
= 0; i
< sizeof(vt
)/sizeof(vt
[0]); i
++)
491 set_var(vt
[i
], &idx
, 1);
492 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
493 ok(hr
== S_OK
, "get_Item(vt = %d) error %#x\n", vt
[i
], hr
);
494 ITaskFolder_Release(subfolder
);
497 for (i
= 0; i
<= count
; i
++)
501 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
504 ok (hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
507 ok(hr
== S_OK
, "get_Item error %#x\n", hr
);
509 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
510 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
511 is_first
= !lstrcmpW(bstr
, Wine_Folder1
);
513 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
515 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
518 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
519 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
521 ok(!lstrcmpW(bstr
, Folder1
), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
523 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
525 ITaskFolder_Release(subfolder
);
527 V_VT(&idx
) = VT_BSTR
;
529 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
530 ok(hr
== S_OK
, "get_Item error %#x\n", hr
);
533 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
534 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
536 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
538 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
541 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
542 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
544 ok(!lstrcmpW(bstr
, Folder1
), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
546 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
548 ITaskFolder_Release(subfolder
);
553 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
554 ok (hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
556 hr
= ITaskFolderCollection_QueryInterface(folders
, &IID_IEnumVARIANT
, (void **)&enumvar
);
557 ok(hr
== E_NOINTERFACE
, "expected E_NOINTERFACE, got %#x\n", hr
);
558 hr
= ITaskFolderCollection_QueryInterface(folders
, &IID_IEnumUnknown
, (void **)&enumvar
);
559 ok(hr
== E_NOINTERFACE
, "expected E_NOINTERFACE, got %#x\n", hr
);
561 hr
= ITaskFolderCollection_get__NewEnum(folders
, NULL
);
562 ok (hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
564 hr
= ITaskFolderCollection_get__NewEnum(folders
, &unknown
);
565 ok(hr
== S_OK
, "get__NewEnum error %#x\n", hr
);
566 hr
= IUnknown_QueryInterface(unknown
, &IID_IEnumUnknown
, (void **)&enumvar
);
567 ok(hr
== E_NOINTERFACE
, "expected E_NOINTERFACE, got %#x\n", hr
);
568 hr
= IUnknown_QueryInterface(unknown
, &IID_IEnumVARIANT
, (void **)&enumvar
);
569 ok(hr
== S_OK
, "QueryInterface error %#x\n", hr
);
570 IEnumVARIANT_Release(enumvar
);
572 hr
= IUnknown_QueryInterface(unknown
, &IID_IUnknown
, (void **)&enumvar
);
573 ok(hr
== S_OK
, "QueryInterface error %#x\n", hr
);
575 hr
= IEnumVARIANT_Skip(enumvar
, 0);
576 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
577 hr
= IEnumVARIANT_Skip(enumvar
, 2);
578 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
579 hr
= IEnumVARIANT_Skip(enumvar
, 1);
580 ok(hr
== S_FALSE
, "expected S_FALSE, got %#x\n", hr
);
582 hr
= IEnumVARIANT_Reset(enumvar
);
583 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
586 hr
= IEnumVARIANT_Next(enumvar
, 1, NULL
, &count
);
587 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
589 memset(var
, 0, sizeof(var
));
591 hr
= IEnumVARIANT_Next(enumvar
, 1, var
, &count
);
592 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
593 ok(count
== 1, "expected 1, got %d\n", count
);
594 hr
= ITaskFolder_get_Path((ITaskFolder
*)V_DISPATCH(&var
[0]), &bstr
);
595 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
596 is_first
= !lstrcmpW(bstr
, Wine_Folder1
);
598 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
600 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
602 hr
= ITaskFolder_get_Name((ITaskFolder
*)V_DISPATCH(&var
[0]), &bstr
);
603 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
605 ok(!lstrcmpW(bstr
, Folder1
), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
607 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
608 IDispatch_Release(V_DISPATCH(&var
[0]));
610 memset(var
, 0, sizeof(var
));
612 hr
= IEnumVARIANT_Next(enumvar
, 1, var
, &count
);
613 ok(hr
== S_FALSE
, "expected S_FALSE, got %#x\n", hr
);
614 ok(count
== 0, "expected 0, got %d\n", count
);
617 hr
= IEnumVARIANT_Next(enumvar
, 1, NULL
, &count
);
618 ok(hr
== S_FALSE
, "expected S_FALSE, got %#x\n", hr
);
619 ok(count
== 0, "expected 0, got %d\n", count
);
621 hr
= IEnumVARIANT_Reset(enumvar
);
622 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
624 memset(var
, 0, sizeof(var
));
626 hr
= IEnumVARIANT_Next(enumvar
, 3, var
, &count
);
627 ok(hr
== S_FALSE
, "expected S_FALSE, got %#x\n", hr
);
628 ok(count
== 2, "expected 2, got %d\n", count
);
629 ok(V_VT(&var
[0]) == VT_DISPATCH
, "expected VT_DISPATCH, got %d\n", V_VT(&var
[0]));
630 ok(V_VT(&var
[1]) == VT_DISPATCH
, "expected VT_DISPATCH, got %d\n", V_VT(&var
[1]));
631 IEnumVARIANT_Release(enumvar
);
633 for (i
= 0; i
< count
; i
++)
635 hr
= IDispatch_QueryInterface(V_DISPATCH(&var
[i
]), &IID_ITaskFolder
, (void **)&subfolder
);
636 ok(hr
== S_OK
, "QueryInterface error %#x\n", hr
);
638 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
639 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
640 is_first
= !lstrcmpW(bstr
, Wine_Folder1
);
642 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
644 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
647 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
648 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
650 ok(!lstrcmpW(bstr
, Folder1
), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
652 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
654 ITaskFolder_Release(subfolder
);
657 IDispatch_Release(V_DISPATCH(&var
[0]));
658 IDispatch_Release(V_DISPATCH(&var
[1]));
660 ITaskFolderCollection_Release(folders
);
662 hr
= ITaskFolder_DeleteFolder(root
, Wine_Folder1
, 0);
663 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
664 hr
= ITaskFolder_DeleteFolder(root
, Wine_Folder2
, 0);
665 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
666 hr
= ITaskFolder_DeleteFolder(root
, Wine_Folder3
, 0);
667 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
668 hr
= ITaskFolder_DeleteFolder(root
, Wine
, 0);
669 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
671 ITaskFolder_Release(root
);
672 ITaskService_Release(service
);
675 static void test_GetTask(void)
677 static WCHAR Wine
[] = { '\\','W','i','n','e',0 };
678 static WCHAR Wine_Task1
[] = { '\\','W','i','n','e','\\','T','a','s','k','1',0 };
679 static WCHAR Wine_Task2
[] = { '\\','W','i','n','e','\\','T','a','s','k','2',0 };
680 static WCHAR Task1
[] = { 'T','a','s','k','1',0 };
681 static WCHAR Task2
[] = { 'T','a','s','k','2',0 };
682 static const char xml1
[] =
683 "<?xml version=\"1.0\"?>\n"
684 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
685 " <RegistrationInfo>\n"
686 " <Description>\"Task1\"</Description>\n"
687 " </RegistrationInfo>\n"
689 " <Enabled>false</Enabled>\n"
690 " <Hidden>false</Hidden>\n"
694 " <Command>\"task1.exe\"</Command>\n"
698 static const char xml2
[] =
699 "<?xml version=\"1.0\"?>\n"
700 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
701 " <RegistrationInfo>\n"
702 " <Description>\"Task2\"</Description>\n"
703 " </RegistrationInfo>\n"
705 " <Enabled>true</Enabled>\n"
706 " <Hidden>true</Hidden>\n"
710 " <Command>\"task2.exe\"</Command>\n"
717 } create_new_task
[] =
720 { TASK_CREATE
, S_OK
},
721 { TASK_UPDATE
, 0x80070002 /* HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) */ },
722 { TASK_CREATE
| TASK_UPDATE
, S_OK
}
727 } open_existing_task
[] =
729 { 0, 0x800700b7 /* HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) */ },
730 { TASK_CREATE
, 0x800700b7 /* HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) */ },
731 { TASK_UPDATE
, S_OK
},
732 { TASK_CREATE
| TASK_UPDATE
, S_OK
}
734 WCHAR xmlW
[sizeof(xml1
)];
740 ITaskService
*service
;
741 ITaskFolder
*root
, *folder
;
742 IRegisteredTask
*task1
, *task2
;
746 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
749 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#x\n", hr
);
753 V_VT(&v_null
) = VT_NULL
;
755 hr
= ITaskService_Connect(service
, v_null
, v_null
, v_null
, v_null
);
756 ok(hr
== S_OK
, "Connect error %#x\n", hr
);
758 hr
= ITaskService_GetFolder(service
, NULL
, &root
);
759 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
761 /* Just in case something was left from previous runs */
762 ITaskFolder_DeleteTask(root
, Wine_Task1
, 0);
763 ITaskFolder_DeleteTask(root
, Wine_Task2
, 0);
764 ITaskFolder_DeleteFolder(root
, Wine
, 0);
766 hr
= ITaskFolder_GetTask(root
, Wine_Task1
, &task1
);
767 ok(hr
== HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
) || hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) /* win7 */,
768 "expected ERROR_PATH_NOT_FOUND, got %#x\n", hr
);
770 hr
= ITaskFolder_CreateFolder(root
, Wine
, v_null
, &folder
);
771 ok(hr
== S_OK
, "CreateFolder error %#x\n", hr
);
773 hr
= ITaskFolder_GetTask(root
, Wine
, &task1
);
774 ok(hr
== HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
) || hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) /* win7 */,
775 "expected ERROR_PATH_NOT_FOUND, got %#x\n", hr
);
777 MultiByteToWideChar(CP_ACP
, 0, xml1
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
779 for (i
= 0; i
< sizeof(create_new_task
)/sizeof(create_new_task
[0]); i
++)
781 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, create_new_task
[i
].flags
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
782 ok(hr
== create_new_task
[i
].hr
, "%d: expected %#x, got %#x\n", i
, create_new_task
[i
].hr
, hr
);
785 hr
= ITaskFolder_DeleteTask(root
, Wine_Task1
, 0);
786 ok(hr
== S_OK
, "DeleteTask error %#x\n", hr
);
787 IRegisteredTask_Release(task1
);
791 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, NULL
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
792 ok(hr
== HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER
), "expected RPC_X_NULL_REF_POINTER, got %#x\n", hr
);
794 hr
= ITaskFolder_RegisterTask(root
, Wine
, xmlW
, TASK_VALIDATE_ONLY
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
795 ok(hr
== S_OK
, "RegisterTask error %#x\n", hr
);
797 hr
= ITaskFolder_RegisterTask(root
, Wine
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
799 ok(hr
== HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED
) || broken(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
)) /* Vista */, "expected ERROR_ACCESS_DENIED, got %#x\n", hr
);
801 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
802 ok(hr
== S_OK
, "RegisterTask error %#x\n", hr
);
804 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
805 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
807 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, 0, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
808 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
810 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, TASK_CREATE_OR_UPDATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
811 ok(hr
== S_OK
, "RegisterTask error %#x\n", hr
);
813 for (i
= 0; i
< sizeof(open_existing_task
)/sizeof(open_existing_task
[0]); i
++)
815 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, open_existing_task
[i
].flags
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task2
);
816 ok(hr
== open_existing_task
[i
].hr
, "%d: expected %#x, got %#x\n", i
, open_existing_task
[i
].hr
, hr
);
818 IRegisteredTask_Release(task2
);
821 hr
= IRegisteredTask_get_Name(task1
, NULL
);
822 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
824 hr
= IRegisteredTask_get_Name(task1
, &bstr
);
825 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
826 ok(!lstrcmpW(bstr
, Task1
), "expected Task1, got %s\n", wine_dbgstr_w(bstr
));
828 hr
= IRegisteredTask_get_Path(task1
, &bstr
);
829 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
830 ok(!lstrcmpW(bstr
, Wine_Task1
), "expected \\Wine\\Task1, got %s\n", wine_dbgstr_w(bstr
));
832 hr
= IRegisteredTask_get_State(task1
, &state
);
833 ok(hr
== S_OK
, "get_State error %#x\n", hr
);
834 ok(state
== TASK_STATE_DISABLED
, "expected TASK_STATE_DISABLED, got %d\n", state
);
835 hr
= IRegisteredTask_get_Enabled(task1
, &vbool
);
836 ok(hr
== S_OK
, "get_Enabled error %#x\n", hr
);
837 ok(vbool
== VARIANT_FALSE
, "expected VARIANT_FALSE, got %d\n", vbool
);
839 IRegisteredTask_Release(task1
);
841 hr
= ITaskFolder_RegisterTask(folder
, Task1
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task2
);
842 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
844 MultiByteToWideChar(CP_ACP
, 0, xml2
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
846 hr
= ITaskFolder_RegisterTask(folder
, Task2
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task2
);
847 ok(hr
== S_OK
, "RegisterTask error %#x\n", hr
);
849 hr
= IRegisteredTask_get_Name(task2
, &bstr
);
850 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
851 ok(!lstrcmpW(bstr
, Task2
), "expected Task2, got %s\n", wine_dbgstr_w(bstr
));
853 hr
= IRegisteredTask_get_Path(task2
, &bstr
);
854 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
855 ok(!lstrcmpW(bstr
, Wine_Task2
), "expected \\Wine\\Task2, got %s\n", wine_dbgstr_w(bstr
));
857 hr
= IRegisteredTask_get_State(task2
, &state
);
858 ok(hr
== S_OK
, "get_State error %#x\n", hr
);
860 ok(state
== TASK_STATE_READY
, "expected TASK_STATE_READY, got %d\n", state
);
861 hr
= IRegisteredTask_get_Enabled(task2
, &vbool
);
862 ok(hr
== S_OK
, "get_Enabled error %#x\n", hr
);
864 ok(vbool
== VARIANT_TRUE
, "expected VARIANT_TRUE, got %d\n", vbool
);
866 IRegisteredTask_Release(task2
);
868 hr
= ITaskFolder_GetTask(root
, NULL
, &task1
);
869 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
871 hr
= ITaskFolder_GetTask(root
, Wine_Task1
, NULL
);
872 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
874 hr
= ITaskFolder_GetTask(root
, Wine_Task1
, &task1
);
875 ok(hr
== S_OK
, "GetTask error %#x\n", hr
);
877 hr
= IRegisteredTask_get_Name(task1
, &bstr
);
878 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
879 ok(!lstrcmpW(bstr
, Task1
), "expected Task1, got %s\n", wine_dbgstr_w(bstr
));
881 hr
= IRegisteredTask_get_Path(task1
, &bstr
);
882 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
883 ok(!lstrcmpW(bstr
, Wine_Task1
), "expected \\Wine\\Task1, got %s\n", wine_dbgstr_w(bstr
));
885 hr
= IRegisteredTask_get_State(task1
, &state
);
886 ok(hr
== S_OK
, "get_State error %#x\n", hr
);
887 ok(state
== TASK_STATE_DISABLED
, "expected TASK_STATE_DISABLED, got %d\n", state
);
888 hr
= IRegisteredTask_get_Enabled(task1
, &vbool
);
889 ok(hr
== S_OK
, "get_Enabled error %#x\n", hr
);
890 ok(vbool
== VARIANT_FALSE
, "expected VARIANT_FALSE, got %d\n", vbool
);
892 hr
= IRegisteredTask_put_Enabled(task1
, VARIANT_TRUE
);
893 ok(hr
== S_OK
, "put_Enabled error %#x\n", hr
);
894 hr
= IRegisteredTask_get_State(task1
, &state
);
895 ok(hr
== S_OK
, "get_State error %#x\n", hr
);
897 ok(state
== TASK_STATE_READY
, "expected TASK_STATE_READY, got %d\n", state
);
898 hr
= IRegisteredTask_get_Enabled(task1
, &vbool
);
899 ok(hr
== S_OK
, "get_Enabled error %#x\n", hr
);
901 ok(vbool
== VARIANT_TRUE
, "expected VARIANT_TRUE, got %d\n", vbool
);
903 IRegisteredTask_Release(task1
);
905 hr
= ITaskFolder_GetTask(folder
, Task2
, &task2
);
906 ok(hr
== S_OK
, "GetTask error %#x\n", hr
);
908 hr
= IRegisteredTask_get_Name(task2
, &bstr
);
909 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
910 ok(!lstrcmpW(bstr
, Task2
), "expected Task2, got %s\n", wine_dbgstr_w(bstr
));
912 hr
= IRegisteredTask_get_Path(task2
, &bstr
);
913 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
914 ok(!lstrcmpW(bstr
, Wine_Task2
), "expected \\Wine\\Task2, got %s\n", wine_dbgstr_w(bstr
));
916 hr
= IRegisteredTask_get_State(task2
, &state
);
917 ok(hr
== S_OK
, "get_State error %#x\n", hr
);
919 ok(state
== TASK_STATE_READY
, "expected TASK_STATE_READY, got %d\n", state
);
920 hr
= IRegisteredTask_get_Enabled(task2
, &vbool
);
921 ok(hr
== S_OK
, "get_Enabled error %#x\n", hr
);
923 ok(vbool
== VARIANT_TRUE
, "expected VARIANT_TRUE, got %d\n", vbool
);
925 hr
= IRegisteredTask_get_State(task2
, NULL
);
926 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
927 hr
= IRegisteredTask_get_Enabled(task2
, NULL
);
928 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
930 IRegisteredTask_Release(task2
);
932 hr
= ITaskFolder_DeleteTask(folder
, NULL
, 0);
934 ok(hr
== HRESULT_FROM_WIN32(ERROR_DIR_NOT_EMPTY
), "expected ERROR_DIR_NOT_EMPTY, got %#x\n", hr
);
936 hr
= ITaskFolder_DeleteTask(root
, Wine_Task1
, 0);
937 ok(hr
== S_OK
, "DeleteTask error %#x\n", hr
);
938 hr
= ITaskFolder_DeleteTask(folder
, Task2
, 0);
939 ok(hr
== S_OK
, "DeleteTask error %#x\n", hr
);
941 hr
= ITaskFolder_DeleteTask(folder
, Task2
, 0);
942 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
) || hr
== S_OK
/* win7 */, "expected ERROR_FILE_NOT_FOUND, got %#x\n", hr
);
944 hr
= ITaskFolder_RegisterTask(root
, NULL
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
945 ok(hr
== S_OK
, "RegisterTask error %#x\n", hr
);
947 hr
= IRegisteredTask_get_Name(task1
, &bstr
);
948 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
949 hr
= IIDFromString(bstr
, &iid
);
950 ok(hr
== S_OK
, "IIDFromString error %#x\n", hr
);
952 IRegisteredTask_Release(task1
);
954 hr
= ITaskFolder_DeleteTask(root
, bstr
, 0);
955 ok(hr
== S_OK
, "DeleteTask error %#x\n", hr
);
958 hr
= ITaskFolder_RegisterTask(folder
, NULL
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
959 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
961 ITaskFolder_Release(folder
);
963 hr
= ITaskFolder_DeleteFolder(root
, Wine
, 0);
964 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
966 ITaskFolder_Release(root
);
967 ITaskService_Release(service
);
972 WCHAR restart_interval
[20];
973 WCHAR execution_time_limit
[20];
974 WCHAR delete_expired_task_after
[20];
977 TASK_INSTANCES_POLICY policy
;
978 TASK_COMPATIBILITY compatibility
;
979 VARIANT_BOOL allow_on_demand_start
;
980 VARIANT_BOOL stop_if_going_on_batteries
;
981 VARIANT_BOOL disallow_start_if_on_batteries
;
982 VARIANT_BOOL allow_hard_terminate
;
983 VARIANT_BOOL start_when_available
;
984 VARIANT_BOOL run_only_if_network_available
;
985 VARIANT_BOOL enabled
;
987 VARIANT_BOOL run_only_if_idle
;
988 VARIANT_BOOL wake_to_run
;
991 /* test the version 1 compatibility settings */
992 static void test_settings_v1(ITaskDefinition
*taskdef
, struct settings
*test
, struct settings
*def
)
999 TASK_INSTANCES_POLICY policy
;
1000 TASK_COMPATIBILITY compat
;
1002 hr
= ITaskDefinition_get_Settings(taskdef
, &set
);
1003 ok(hr
== S_OK
, "get_Settings error %#x\n", hr
);
1005 hr
= ITaskSettings_get_AllowDemandStart(set
, &vbool
);
1006 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1007 ok(vbool
== def
->allow_on_demand_start
, "expected %d, got %d\n", def
->allow_on_demand_start
, vbool
);
1009 hr
= ITaskSettings_get_RestartInterval(set
, &bstr
);
1010 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1011 if (!def
->restart_interval
[0])
1012 ok(bstr
== NULL
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1015 ok(!lstrcmpW(bstr
, def
->restart_interval
), "expected %s, got %s\n", wine_dbgstr_w(def
->restart_interval
), wine_dbgstr_w(bstr
));
1016 SysFreeString(bstr
);
1019 hr
= ITaskSettings_get_RestartCount(set
, &vint
);
1020 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1021 ok(vint
== def
->restart_count
, "expected %d, got %d\n", def
->restart_count
, vint
);
1023 hr
= ITaskSettings_get_MultipleInstances(set
, &policy
);
1024 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1025 ok(policy
== def
->policy
, "expected %d, got %d\n", def
->policy
, policy
);
1027 hr
= ITaskSettings_get_StopIfGoingOnBatteries(set
, &vbool
);
1028 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1029 ok(vbool
== test
->stop_if_going_on_batteries
, "expected %d, got %d\n", test
->stop_if_going_on_batteries
, vbool
);
1031 hr
= ITaskSettings_get_DisallowStartIfOnBatteries(set
, &vbool
);
1032 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1033 ok(vbool
== test
->disallow_start_if_on_batteries
, "expected %d, got %d\n", test
->disallow_start_if_on_batteries
, vbool
);
1035 hr
= ITaskSettings_get_AllowHardTerminate(set
, &vbool
);
1036 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1037 ok(vbool
== def
->allow_hard_terminate
, "expected %d, got %d\n", def
->allow_hard_terminate
, vbool
);
1039 hr
= ITaskSettings_get_StartWhenAvailable(set
, &vbool
);
1040 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1041 ok(vbool
== def
->start_when_available
, "expected %d, got %d\n", def
->start_when_available
, vbool
);
1043 hr
= ITaskSettings_get_RunOnlyIfNetworkAvailable(set
, &vbool
);
1044 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1045 ok(vbool
== def
->run_only_if_network_available
, "expected %d, got %d\n", def
->run_only_if_network_available
, vbool
);
1047 hr
= ITaskSettings_get_ExecutionTimeLimit(set
, &bstr
);
1048 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1049 if (!test
->execution_time_limit
[0])
1050 ok(bstr
== NULL
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1052 ok(!lstrcmpW(bstr
, test
->execution_time_limit
), "expected %s, got %s\n", wine_dbgstr_w(test
->execution_time_limit
), wine_dbgstr_w(bstr
));
1054 hr
= ITaskSettings_get_Enabled(set
, &vbool
);
1055 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1056 ok(vbool
== test
->enabled
, "expected %d, got %d\n", test
->enabled
, vbool
);
1058 hr
= ITaskSettings_get_DeleteExpiredTaskAfter(set
, &bstr
);
1059 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1060 if (!test
->delete_expired_task_after
[0])
1061 ok(bstr
== NULL
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1064 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
));
1065 SysFreeString(bstr
);
1068 hr
= ITaskSettings_get_Priority(set
, &vint
);
1069 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1070 ok(vint
== test
->priority
, "expected %d, got %d\n", test
->priority
, vint
);
1072 hr
= ITaskSettings_get_Compatibility(set
, &compat
);
1073 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1074 ok(compat
== test
->compatibility
, "expected %d, got %d\n", test
->compatibility
, compat
);
1076 hr
= ITaskSettings_get_Hidden(set
, &vbool
);
1077 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1078 ok(vbool
== test
->hidden
, "expected %d, got %d\n", test
->hidden
, vbool
);
1080 hr
= ITaskSettings_get_RunOnlyIfIdle(set
, &vbool
);
1081 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1082 ok(vbool
== test
->run_only_if_idle
, "expected %d, got %d\n", test
->run_only_if_idle
, vbool
);
1084 hr
= ITaskSettings_get_WakeToRun(set
, &vbool
);
1085 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1086 ok(vbool
== test
->wake_to_run
, "expected %d, got %d\n", test
->wake_to_run
, vbool
);
1088 /* FIXME: test IIdleSettings and INetworkSettings */
1090 ITaskSettings_Release(set
);
1093 static void change_settings(ITaskDefinition
*taskdef
, struct settings
*test
)
1098 hr
= ITaskDefinition_get_Settings(taskdef
, &set
);
1099 ok(hr
== S_OK
, "get_Settings error %#x\n", hr
);
1101 if (!test
->restart_interval
[0])
1102 hr
= ITaskSettings_put_RestartInterval(set
, NULL
);
1104 hr
= ITaskSettings_put_RestartInterval(set
, test
->restart_interval
);
1106 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1107 /* FIXME: Remove once implemented */
1110 ITaskSettings_Release(set
);
1114 hr
= ITaskSettings_put_RestartCount(set
, test
->restart_count
);
1115 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1117 hr
= ITaskSettings_put_MultipleInstances(set
, test
->policy
);
1118 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1120 hr
= ITaskSettings_put_StopIfGoingOnBatteries(set
, test
->stop_if_going_on_batteries
);
1121 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1123 hr
= ITaskSettings_put_DisallowStartIfOnBatteries(set
, test
->disallow_start_if_on_batteries
);
1124 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1126 hr
= ITaskSettings_put_AllowHardTerminate(set
, test
->allow_hard_terminate
);
1127 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1129 hr
= ITaskSettings_put_StartWhenAvailable(set
, test
->start_when_available
);
1130 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1132 hr
= ITaskSettings_put_RunOnlyIfNetworkAvailable(set
, test
->run_only_if_network_available
);
1133 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1135 if (!test
->execution_time_limit
[0])
1136 hr
= ITaskSettings_put_ExecutionTimeLimit(set
, NULL
);
1138 hr
= ITaskSettings_put_ExecutionTimeLimit(set
, test
->execution_time_limit
);
1139 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1141 hr
= ITaskSettings_put_Enabled(set
, test
->enabled
);
1142 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1144 if (!test
->delete_expired_task_after
[0])
1145 hr
= ITaskSettings_put_DeleteExpiredTaskAfter(set
, NULL
);
1147 hr
= ITaskSettings_put_DeleteExpiredTaskAfter(set
, test
->delete_expired_task_after
);
1148 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1150 hr
= ITaskSettings_put_Priority(set
, test
->priority
);
1151 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1153 hr
= ITaskSettings_put_Compatibility(set
, test
->compatibility
);
1154 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1156 hr
= ITaskSettings_put_Hidden(set
, test
->hidden
);
1157 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1159 hr
= ITaskSettings_put_RunOnlyIfIdle(set
, test
->run_only_if_idle
);
1160 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1162 hr
= ITaskSettings_put_WakeToRun(set
, test
->wake_to_run
);
1163 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1165 hr
= ITaskSettings_put_AllowDemandStart(set
, test
->allow_on_demand_start
);
1166 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1168 /* FIXME: set IIdleSettings and INetworkSettings */
1170 ITaskSettings_Release(set
);
1173 static void test_daily_trigger(ITrigger
*trigger
)
1175 IDailyTrigger
*daily_trigger
;
1179 hr
= ITrigger_QueryInterface(trigger
, &IID_IDailyTrigger
, (void**)&daily_trigger
);
1180 ok(hr
== S_OK
, "Could not get IDailyTrigger iface: %08x\n", hr
);
1183 hr
= IDailyTrigger_get_DaysInterval(daily_trigger
, &interval
);
1184 ok(hr
== S_OK
, "get_DaysInterval failed: %08x\n", hr
);
1185 ok(interval
== 1, "interval = %d\n", interval
);
1187 hr
= IDailyTrigger_put_DaysInterval(daily_trigger
, -2);
1188 ok(hr
== E_INVALIDARG
, "put_DaysInterval failed: %08x\n", hr
);
1189 hr
= IDailyTrigger_put_DaysInterval(daily_trigger
, 0);
1190 ok(hr
== E_INVALIDARG
, "put_DaysInterval failed: %08x\n", hr
);
1193 hr
= IDailyTrigger_get_DaysInterval(daily_trigger
, &interval
);
1194 ok(hr
== S_OK
, "get_DaysInterval failed: %08x\n", hr
);
1195 ok(interval
== 1, "interval = %d\n", interval
);
1197 hr
= IDailyTrigger_put_DaysInterval(daily_trigger
, 2);
1198 ok(hr
== S_OK
, "put_DaysInterval failed: %08x\n", hr
);
1201 hr
= IDailyTrigger_get_DaysInterval(daily_trigger
, &interval
);
1202 ok(hr
== S_OK
, "get_DaysInterval failed: %08x\n", hr
);
1203 ok(interval
== 2, "interval = %d\n", interval
);
1205 IDailyTrigger_Release(daily_trigger
);
1208 static void create_action(ITaskDefinition
*taskdef
)
1210 static WCHAR task1_exe
[] = { 't','a','s','k','1','.','e','x','e',0 };
1212 IActionCollection
*actions
;
1214 IExecAction
*exec_action
;
1216 hr
= ITaskDefinition_get_Actions(taskdef
, &actions
);
1218 ok(hr
== S_OK
, "get_Actions error %#x\n", hr
);
1219 /* FIXME: Remove once implemented */
1220 if (hr
!= S_OK
) return;
1222 hr
= IActionCollection_Create(actions
, TASK_ACTION_EXEC
, &action
);
1223 ok(hr
== S_OK
, "Create action error %#x\n", hr
);
1225 hr
= IAction_QueryInterface(action
, &IID_IExecAction
, (void **)&exec_action
);
1226 ok(hr
== S_OK
, "QueryInterface error %#x\n", hr
);
1228 hr
= IExecAction_put_Path(exec_action
, task1_exe
);
1229 ok(hr
== S_OK
, "put_Path error %#x\n", hr
);
1231 IExecAction_Release(exec_action
);
1232 IAction_Release(action
);
1233 IActionCollection_Release(actions
);
1236 static void test_TaskDefinition(void)
1238 static const char xml1
[] =
1239 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1240 " <RegistrationInfo>\n"
1241 " <Description>\"Task1\"</Description>\n"
1242 " </RegistrationInfo>\n"
1244 " <Enabled>false</Enabled>\n"
1245 " <Hidden>false</Hidden>\n"
1249 " <Command>\"task1.exe\"</Command>\n"
1253 static const char xml2
[] =
1255 " <RegistrationInfo>\n"
1256 " <Description>\"Task1\"</Description>\n"
1257 " </RegistrationInfo>\n"
1259 " <Enabled>false</Enabled>\n"
1260 " <Hidden>false</Hidden>\n"
1264 " <Command>\"task1.exe\"</Command>\n"
1268 static const char xml3
[] =
1270 " <RegistrationInfo>\n"
1271 " <Description>\"Task1\"</Description>\n"
1272 " </RegistrationInfo>\n"
1274 " <Enabled>false</Enabled>\n"
1275 " <Hidden>false</Hidden>\n"
1279 " <Command>\"task1.exe\"</Command>\n"
1283 static const char xml4
[] =
1284 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1285 " <RegistrationInfo/>\n"
1289 " <Command>\"task1.exe\"</Command>\n"
1293 static const char xml5
[] =
1294 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1295 " <RegistrationInfo/>\n"
1299 static const char xml6
[] =
1300 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1301 " <RegistrationInfo/>\n"
1304 " <Command>\"task1.exe\"</Command>\n"
1309 static const char xml7
[] =
1310 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1311 " <RegistrationInfo/>\n"
1313 " <Enabled>FALSE</Enabled>\n"
1317 " <Command>\"task1.exe\"</Command>\n"
1321 static WCHAR Task1
[] = { '"','T','a','s','k','1','"',0 };
1322 static struct settings def_settings
= { { 0 }, { 'P','T','7','2','H',0 }, { 0 },
1323 0, 7, TASK_INSTANCES_IGNORE_NEW
, TASK_COMPATIBILITY_V2
, VARIANT_TRUE
, VARIANT_TRUE
,
1324 VARIANT_TRUE
, VARIANT_TRUE
, VARIANT_FALSE
, VARIANT_FALSE
, VARIANT_TRUE
, VARIANT_FALSE
,
1325 VARIANT_FALSE
, VARIANT_FALSE
};
1326 static struct settings new_settings
= { { 'P','1','Y',0 }, { 'P','T','1','0','M',0 }, { 0 },
1327 100, 1, TASK_INSTANCES_STOP_EXISTING
, TASK_COMPATIBILITY_V1
, VARIANT_FALSE
, VARIANT_FALSE
,
1328 VARIANT_FALSE
, VARIANT_FALSE
, VARIANT_TRUE
, VARIANT_TRUE
, VARIANT_FALSE
, VARIANT_TRUE
,
1329 VARIANT_TRUE
, VARIANT_TRUE
};
1330 ITriggerCollection
*trigger_col
, *trigger_col2
;
1332 ITaskService
*service
;
1333 ITaskDefinition
*taskdef
;
1334 IRegistrationInfo
*reginfo
;
1338 WCHAR xmlW
[sizeof(xml1
)];
1340 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
1343 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#x\n", hr
);
1347 hr
= ITaskService_NewTask(service
, 0, &taskdef
);
1348 ok(hr
== S_OK
, "NewTask error %#x\n", hr
);
1350 test_settings_v1(taskdef
, &def_settings
, &def_settings
);
1351 change_settings(taskdef
, &new_settings
);
1353 /* Action is mandatory for v1 compatibility */
1354 create_action(taskdef
);
1356 hr
= ITaskDefinition_get_XmlText(taskdef
, &xml
);
1357 ok(hr
== S_OK
, "get_XmlText error %#x\n", hr
);
1359 ITaskDefinition_Release(taskdef
);
1361 hr
= ITaskService_NewTask(service
, 0, &taskdef
);
1362 ok(hr
== S_OK
, "NewTask error %#x\n", hr
);
1364 hr
= ITaskDefinition_put_XmlText(taskdef
, xml
);
1365 ok(hr
== S_OK
, "put_XmlText error %#x\n", hr
);
1368 /* FIXME: uncomment once changing settings is implemented
1369 test_settings_v1(taskdef, &new_settings, &def_settings);
1372 hr
= ITaskDefinition_put_XmlText(taskdef
, NULL
);
1373 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
1375 MultiByteToWideChar(CP_ACP
, 0, xml1
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1376 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1377 ok(hr
== S_OK
, "put_XmlText error %#x\n", hr
);
1379 MultiByteToWideChar(CP_ACP
, 0, xml2
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1380 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1381 ok(hr
== SCHED_E_NAMESPACE
, "expected SCHED_E_NAMESPACE, got %#x\n", hr
);
1383 MultiByteToWideChar(CP_ACP
, 0, xml3
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1384 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1386 ok(hr
== SCHED_E_UNEXPECTEDNODE
, "expected SCHED_E_UNEXPECTEDNODE, got %#x\n", hr
);
1388 MultiByteToWideChar(CP_ACP
, 0, xml4
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1389 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1390 ok(hr
== S_OK
, "put_XmlText error %#x\n", hr
);
1392 MultiByteToWideChar(CP_ACP
, 0, xml5
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1393 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1395 ok(hr
== SCHED_E_MISSINGNODE
, "expected SCHED_E_MISSINGNODE, got %#x\n", hr
);
1397 MultiByteToWideChar(CP_ACP
, 0, xml6
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1398 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1399 ok(hr
== SCHED_E_MALFORMEDXML
, "expected SCHED_E_MALFORMEDXML, got %#x\n", hr
);
1401 MultiByteToWideChar(CP_ACP
, 0, xml7
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1402 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1403 ok(hr
== SCHED_E_INVALIDVALUE
, "expected SCHED_E_INVALIDVALUE, got %#x\n", hr
);
1406 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1407 ok(hr
== SCHED_E_MALFORMEDXML
, "expected SCHED_E_MALFORMEDXML, got %#x\n", hr
);
1409 /* test registration info */
1410 MultiByteToWideChar(CP_ACP
, 0, xml1
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1411 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1412 ok(hr
== S_OK
, "put_XmlText error %#x\n", hr
);
1413 hr
= ITaskDefinition_get_RegistrationInfo(taskdef
, ®info
);
1414 ok(hr
== S_OK
, "get_RegistrationInfo error %#x\n", hr
);
1416 hr
= IRegistrationInfo_get_Description(reginfo
, &bstr
);
1417 ok(hr
== S_OK
, "get_Description error %#x\n", hr
);
1418 ok(!lstrcmpW(bstr
, Task1
), "expected Task1, got %s\n", wine_dbgstr_w(bstr
));
1419 SysFreeString(bstr
);
1420 hr
= IRegistrationInfo_get_Author(reginfo
, &bstr
);
1421 ok(hr
== S_OK
, "get_Author error %#x\n", hr
);
1422 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1423 hr
= IRegistrationInfo_get_Version(reginfo
, &bstr
);
1424 ok(hr
== S_OK
, "get_Version error %#x\n", hr
);
1425 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1426 hr
= IRegistrationInfo_get_Date(reginfo
, &bstr
);
1427 ok(hr
== S_OK
, "get_Date error %#x\n", hr
);
1428 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1429 hr
= IRegistrationInfo_get_Documentation(reginfo
, &bstr
);
1430 ok(hr
== S_OK
, "get_Documentation error %#x\n", hr
);
1431 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1432 hr
= IRegistrationInfo_get_URI(reginfo
, &bstr
);
1433 ok(hr
== S_OK
, "get_URI error %#x\n", hr
);
1434 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1435 hr
= IRegistrationInfo_get_Source(reginfo
, &bstr
);
1436 ok(hr
== S_OK
, "get_Source error %#x\n", hr
);
1437 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1438 V_VT(&var
) = VT_BSTR
;
1439 V_BSTR(&var
) = NULL
;
1440 hr
= IRegistrationInfo_get_SecurityDescriptor(reginfo
, &var
);
1442 ok(hr
== S_OK
, "get_SecurityDescriptor error %#x\n", hr
);
1444 ok(V_VT(&var
) == VT_EMPTY
, "expected VT_EMPTY, got %u\n", V_VT(&var
));
1446 IRegistrationInfo_Release(reginfo
);
1448 MultiByteToWideChar(CP_ACP
, 0, xml4
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1449 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1450 ok(hr
== S_OK
, "put_XmlText error %#x\n", hr
);
1451 hr
= ITaskDefinition_get_RegistrationInfo(taskdef
, ®info
);
1452 ok(hr
== S_OK
, "get_RegistrationInfo error %#x\n", hr
);
1454 hr
= IRegistrationInfo_get_Description(reginfo
, &bstr
);
1455 ok(hr
== S_OK
, "get_Description error %#x\n", hr
);
1457 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1459 hr
= ITaskDefinition_get_Triggers(taskdef
, &trigger_col
);
1460 ok(hr
== S_OK
, "get_Triggers failed: %08x\n", hr
);
1461 ok(trigger_col
!= NULL
, "Triggers = NULL\n");
1463 hr
= ITriggerCollection_Create(trigger_col
, TASK_TRIGGER_DAILY
, &trigger
);
1464 ok(hr
== S_OK
, "Create failed: %08x\n", hr
);
1465 ok(trigger
!= NULL
, "trigger = NULL\n");
1466 test_daily_trigger(trigger
);
1467 ITrigger_Release(trigger
);
1468 ITriggerCollection_Release(trigger_col
);
1470 hr
= ITaskDefinition_get_Triggers(taskdef
, &trigger_col2
);
1471 ok(hr
== S_OK
, "get_Triggers failed: %08x\n", hr
);
1472 ok(trigger_col
== trigger_col2
, "Mismatched triggers\n");
1473 ITriggerCollection_Release(trigger_col2
);
1475 IRegistrationInfo_Release(reginfo
);
1476 ITaskDefinition_Release(taskdef
);
1477 ITaskService_Release(service
);
1480 START_TEST(scheduler
)
1482 OleInitialize(NULL
);
1486 test_FolderCollection();
1488 test_TaskDefinition();