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
), "expected ERROR_INVALID_NAME, got %#x\n", hr
);
161 hr
= ITaskService_GetFolder(service
, bslash
, &folder
);
162 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
163 ITaskFolder_Release(folder
);
165 hr
= ITaskService_GetFolder(service
, NULL
, NULL
);
166 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
168 hr
= ITaskService_GetFolder(service
, empty
, &folder
);
169 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
170 ITaskFolder_Release(folder
);
172 hr
= ITaskService_GetFolder(service
, NULL
, &folder
);
173 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
175 hr
= ITaskFolder_get_Name(folder
, NULL
);
176 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
178 hr
= ITaskFolder_get_Name(folder
, &bstr
);
179 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
180 ok(!lstrcmpW(bstr
, bslash
), "expected '\\', got %s\n", wine_dbgstr_w(bstr
));
183 hr
= ITaskFolder_get_Path(folder
, NULL
);
184 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
186 hr
= ITaskFolder_get_Path(folder
, &bstr
);
187 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
188 ok(!lstrcmpW(bstr
, bslash
), "expected '\\', got %s\n", wine_dbgstr_w(bstr
));
191 hr
= ITaskFolder_CreateFolder(folder
, NULL
, v_null
, &subfolder
);
192 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
194 /* Just in case something was left from previous runs */
195 ITaskFolder_DeleteFolder(folder
, Wine_Folder1_Folder2
, 0);
196 ITaskFolder_DeleteFolder(folder
, Wine_Folder1
, 0);
197 ITaskFolder_DeleteFolder(folder
, Wine
, 0);
199 hr
= ITaskFolder_CreateFolder(folder
, slash
, v_null
, &subfolder
);
201 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#x\n", hr
);
203 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
, &subfolder
);
204 ok(hr
== HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), "expected ERROR_PATH_NOT_FOUND, got %#x\n", hr
);
206 hr
= ITaskFolder_CreateFolder(folder
, bslash
, v_null
, &subfolder
);
208 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
210 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_Folder2
, v_null
, &subfolder
);
211 ok(hr
== S_OK
, "CreateFolder error %#x\n", hr
);
212 ITaskFolder_Release(subfolder
);
214 hr
= ITaskFolder_CreateFolder(folder
, Wine
, v_null
, NULL
);
215 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
217 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_
, v_null
, &subfolder
);
219 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
), "expected ERROR_INVALID_NAME, got %#x\n", hr
);
221 hr
= ITaskFolder_CreateFolder(folder
, Wine
, v_null
, &subfolder
);
222 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
223 hr
= ITaskFolder_CreateFolder(folder
, Wine
+1, v_null
, &subfolder
);
224 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
225 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1
, v_null
, &subfolder
);
226 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
227 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1
+1, v_null
, &subfolder
);
228 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
229 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_Folder2
, v_null
, &subfolder
);
230 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
231 hr
= ITaskFolder_CreateFolder(folder
, Wine_Folder1_Folder2
+1, v_null
, &subfolder
);
232 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
234 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
, NULL
);
235 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
237 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
, &subfolder
);
238 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
240 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
241 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
242 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
244 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
245 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
246 ok(!lstrcmpW(bstr
, Wine_Folder1_Folder2
), "expected \\Wine\\Folder1\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
248 ITaskFolder_Release(subfolder
);
250 hr
= ITaskService_GetFolder(service
, Wine_Folder1_Folder2
+1, &subfolder
);
251 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
252 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
253 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
254 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
256 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
257 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
258 ok(!lstrcmpW(bstr
, Wine_Folder1_Folder2
+1), "expected Wine\\Folder1\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
260 ITaskFolder_Release(subfolder
);
262 hr
= ITaskService_GetFolder(service
, Wine_Folder1
, &subfolder
);
263 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
264 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
265 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
266 ok(!lstrcmpW(bstr
, Folder1
), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
268 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
269 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
270 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
272 ITaskFolder_Release(subfolder
);
274 hr
= ITaskService_GetFolder(service
, Wine
, &subfolder
);
275 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
276 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
277 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
278 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
280 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
281 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
282 ok(!lstrcmpW(bstr
, Wine
), "expected \\Wine, got %s\n", wine_dbgstr_w(bstr
));
284 ITaskFolder_Release(subfolder
);
286 hr
= ITaskService_GetFolder(service
, Wine
+1, &subfolder
);
287 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
288 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
289 ok (hr
== S_OK
, "get_Name error %#x\n", hr
);
290 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
292 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
293 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
294 ok(!lstrcmpW(bstr
, Wine
+1), "expected Wine, got %s\n", wine_dbgstr_w(bstr
));
297 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 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
), "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
;
425 static const int vt
[] = { VT_I1
, VT_I2
, VT_I4
, VT_I8
, VT_UI1
, VT_UI2
, VT_UI4
, VT_UI8
, VT_INT
, VT_UINT
};
427 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
430 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#x\n", hr
);
434 V_VT(&v_null
) = VT_NULL
;
436 hr
= ITaskService_Connect(service
, v_null
, v_null
, v_null
, v_null
);
437 ok(hr
== S_OK
, "Connect error %#x\n", hr
);
439 hr
= ITaskService_GetFolder(service
, NULL
, &root
);
440 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
442 /* Just in case something was left from previous runs */
443 ITaskFolder_DeleteFolder(root
, Wine_Folder1
, 0);
444 ITaskFolder_DeleteFolder(root
, Wine_Folder2
, 0);
445 ITaskFolder_DeleteFolder(root
, Wine_Folder3
, 0);
446 ITaskFolder_DeleteFolder(root
, Wine
, 0);
448 hr
= ITaskFolder_CreateFolder(root
, Wine_Folder1
, v_null
, &subfolder
);
449 ok(hr
== S_OK
, "CreateFolder error %#x\n", hr
);
450 ITaskFolder_Release(subfolder
);
452 hr
= ITaskFolder_CreateFolder(root
, Wine_Folder2
, v_null
, &subfolder
);
453 ok(hr
== S_OK
, "CreateFolder error %#x\n", hr
);
454 ITaskFolder_Release(subfolder
);
456 hr
= ITaskFolder_GetFolder(root
, Wine
, &folder
);
457 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
459 hr
= ITaskFolder_GetFolders(folder
, 0, NULL
);
460 ok (hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
462 hr
= ITaskFolder_GetFolders(folder
, 0, &folders
);
463 ok(hr
== S_OK
, "GetFolders error %#x\n", hr
);
465 ITaskFolder_Release(folder
);
467 hr
= ITaskFolderCollection_get_Count(folders
, NULL
);
468 ok (hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
471 hr
= ITaskFolderCollection_get_Count(folders
, (LONG
*)&count
);
472 ok(hr
== S_OK
, "get_Count error %#x\n", hr
);
473 ok(count
== 2, "expected 2, got %d\n", count
);
475 hr
= ITaskFolder_CreateFolder(root
, Wine_Folder3
, v_null
, &subfolder
);
476 ok(hr
== S_OK
, "CreateFolder error %#x\n", hr
);
477 ITaskFolder_Release(subfolder
);
480 hr
= ITaskFolderCollection_get_Count(folders
, (LONG
*)&count
);
481 ok(hr
== S_OK
, "get_Count error %#x\n", hr
);
482 ok(count
== 2, "expected 2, got %d\n", count
);
484 set_var(VT_INT
, &idx
, 0);
485 hr
= ITaskFolderCollection_get_Item(folders
, idx
, NULL
);
486 ok (hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
488 for (i
= 0; i
< sizeof(vt
)/sizeof(vt
[0]); i
++)
490 set_var(vt
[i
], &idx
, 1);
491 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
492 ok(hr
== S_OK
, "get_Item(vt = %d) error %#x\n", vt
[i
], hr
);
493 ITaskFolder_Release(subfolder
);
496 for (i
= 0; i
<= count
; i
++)
500 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
503 ok (hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
506 ok(hr
== S_OK
, "get_Item error %#x\n", hr
);
508 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
509 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
511 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
513 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
516 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
517 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
519 ok(!lstrcmpW(bstr
, Folder1
), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
521 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
523 ITaskFolder_Release(subfolder
);
525 V_VT(&idx
) = VT_BSTR
;
527 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
528 ok(hr
== S_OK
, "get_Item error %#x\n", hr
);
531 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
532 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
534 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
536 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
539 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
540 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
542 ok(!lstrcmpW(bstr
, Folder1
), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
544 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
546 ITaskFolder_Release(subfolder
);
551 hr
= ITaskFolderCollection_get_Item(folders
, idx
, &subfolder
);
552 ok (hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
554 hr
= ITaskFolderCollection_QueryInterface(folders
, &IID_IEnumVARIANT
, (void **)&enumvar
);
555 ok(hr
== E_NOINTERFACE
, "expected E_NOINTERFACE, got %#x\n", hr
);
556 hr
= ITaskFolderCollection_QueryInterface(folders
, &IID_IEnumUnknown
, (void **)&enumvar
);
557 ok(hr
== E_NOINTERFACE
, "expected E_NOINTERFACE, got %#x\n", hr
);
559 hr
= ITaskFolderCollection_get__NewEnum(folders
, NULL
);
560 ok (hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
562 hr
= ITaskFolderCollection_get__NewEnum(folders
, &unknown
);
563 ok(hr
== S_OK
, "get__NewEnum error %#x\n", hr
);
564 hr
= IUnknown_QueryInterface(unknown
, &IID_IEnumUnknown
, (void **)&enumvar
);
565 ok(hr
== E_NOINTERFACE
, "expected E_NOINTERFACE, got %#x\n", hr
);
566 hr
= IUnknown_QueryInterface(unknown
, &IID_IEnumVARIANT
, (void **)&enumvar
);
567 ok(hr
== S_OK
, "QueryInterface error %#x\n", hr
);
568 IEnumVARIANT_Release(enumvar
);
570 hr
= IUnknown_QueryInterface(unknown
, &IID_IUnknown
, (void **)&enumvar
);
571 ok(hr
== S_OK
, "QueryInterface error %#x\n", hr
);
573 hr
= IEnumVARIANT_Skip(enumvar
, 0);
574 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
575 hr
= IEnumVARIANT_Skip(enumvar
, 2);
576 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
577 hr
= IEnumVARIANT_Skip(enumvar
, 1);
578 ok(hr
== S_FALSE
, "expected S_FALSE, got %#x\n", hr
);
580 hr
= IEnumVARIANT_Reset(enumvar
);
581 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
584 hr
= IEnumVARIANT_Next(enumvar
, 1, NULL
, &count
);
585 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
587 memset(var
, 0, sizeof(var
));
589 hr
= IEnumVARIANT_Next(enumvar
, 1, var
, &count
);
590 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
591 ok(count
== 1, "expected 1, got %d\n", count
);
592 hr
= ITaskFolder_get_Path((ITaskFolder
*)V_DISPATCH(&var
[0]), &bstr
);
593 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
594 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
596 hr
= ITaskFolder_get_Name((ITaskFolder
*)V_DISPATCH(&var
[0]), &bstr
);
597 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
598 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
599 IDispatch_Release(V_DISPATCH(&var
[0]));
601 memset(var
, 0, sizeof(var
));
603 hr
= IEnumVARIANT_Next(enumvar
, 1, var
, &count
);
604 ok(hr
== S_FALSE
, "expected S_FALSE, got %#x\n", hr
);
605 ok(count
== 0, "expected 0, got %d\n", count
);
608 hr
= IEnumVARIANT_Next(enumvar
, 1, NULL
, &count
);
609 ok(hr
== S_FALSE
, "expected S_FALSE, got %#x\n", hr
);
610 ok(count
== 0, "expected 0, got %d\n", count
);
612 hr
= IEnumVARIANT_Reset(enumvar
);
613 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
615 memset(var
, 0, sizeof(var
));
617 hr
= IEnumVARIANT_Next(enumvar
, 3, var
, &count
);
618 ok(hr
== S_FALSE
, "expected S_FALSE, got %#x\n", hr
);
619 ok(count
== 2, "expected 2, got %d\n", count
);
620 ok(V_VT(&var
[0]) == VT_DISPATCH
, "expected VT_DISPATCH, got %d\n", V_VT(&var
[0]));
621 ok(V_VT(&var
[1]) == VT_DISPATCH
, "expected VT_DISPATCH, got %d\n", V_VT(&var
[1]));
622 IEnumVARIANT_Release(enumvar
);
624 for (i
= 0; i
< count
; i
++)
626 hr
= IDispatch_QueryInterface(V_DISPATCH(&var
[i
]), &IID_ITaskFolder
, (void **)&subfolder
);
627 ok(hr
== S_OK
, "QueryInterface error %#x\n", hr
);
629 hr
= ITaskFolder_get_Path(subfolder
, &bstr
);
630 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
632 ok(!lstrcmpW(bstr
, Wine_Folder1
), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr
));
634 ok(!lstrcmpW(bstr
, Wine_Folder2
), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr
));
637 hr
= ITaskFolder_get_Name(subfolder
, &bstr
);
638 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
640 ok(!lstrcmpW(bstr
, Folder1
), "expected Folder1, got %s\n", wine_dbgstr_w(bstr
));
642 ok(!lstrcmpW(bstr
, Folder2
), "expected Folder2, got %s\n", wine_dbgstr_w(bstr
));
644 ITaskFolder_Release(subfolder
);
647 IDispatch_Release(V_DISPATCH(&var
[0]));
648 IDispatch_Release(V_DISPATCH(&var
[1]));
650 ITaskFolderCollection_Release(folders
);
652 hr
= ITaskFolder_DeleteFolder(root
, Wine_Folder1
, 0);
653 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
654 hr
= ITaskFolder_DeleteFolder(root
, Wine_Folder2
, 0);
655 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
656 hr
= ITaskFolder_DeleteFolder(root
, Wine_Folder3
, 0);
657 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
658 hr
= ITaskFolder_DeleteFolder(root
, Wine
, 0);
659 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
661 ITaskFolder_Release(root
);
662 ITaskService_Release(service
);
665 static void test_GetTask(void)
667 static WCHAR Wine
[] = { '\\','W','i','n','e',0 };
668 static WCHAR Wine_Task1
[] = { '\\','W','i','n','e','\\','T','a','s','k','1',0 };
669 static WCHAR Wine_Task2
[] = { '\\','W','i','n','e','\\','T','a','s','k','2',0 };
670 static WCHAR Task1
[] = { 'T','a','s','k','1',0 };
671 static WCHAR Task2
[] = { 'T','a','s','k','2',0 };
672 static const char xml1
[] =
673 "<?xml version=\"1.0\"?>\n"
674 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
675 " <RegistrationInfo>\n"
676 " <Description>\"Task1\"</Description>\n"
677 " </RegistrationInfo>\n"
679 " <Enabled>false</Enabled>\n"
680 " <Hidden>false</Hidden>\n"
684 " <Command>\"task1.exe\"</Command>\n"
688 static const char xml2
[] =
689 "<?xml version=\"1.0\"?>\n"
690 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
691 " <RegistrationInfo>\n"
692 " <Description>\"Task2\"</Description>\n"
693 " </RegistrationInfo>\n"
695 " <Enabled>true</Enabled>\n"
696 " <Hidden>true</Hidden>\n"
700 " <Command>\"task2.exe\"</Command>\n"
707 } create_new_task
[] =
710 { TASK_CREATE
, S_OK
},
711 { TASK_UPDATE
, 0x80070002 /* HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) */ },
712 { TASK_CREATE
| TASK_UPDATE
, S_OK
}
717 } open_existing_task
[] =
719 { 0, 0x800700b7 /* HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) */ },
720 { TASK_CREATE
, 0x800700b7 /* HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) */ },
721 { TASK_UPDATE
, S_OK
},
722 { TASK_CREATE
| TASK_UPDATE
, S_OK
}
724 WCHAR xmlW
[sizeof(xml1
)];
730 ITaskService
*service
;
731 ITaskFolder
*root
, *folder
;
732 IRegisteredTask
*task1
, *task2
;
736 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
739 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#x\n", hr
);
743 V_VT(&v_null
) = VT_NULL
;
745 hr
= ITaskService_Connect(service
, v_null
, v_null
, v_null
, v_null
);
746 ok(hr
== S_OK
, "Connect error %#x\n", hr
);
748 hr
= ITaskService_GetFolder(service
, NULL
, &root
);
749 ok(hr
== S_OK
, "GetFolder error %#x\n", hr
);
751 /* Just in case something was left from previous runs */
752 ITaskFolder_DeleteTask(root
, Wine_Task1
, 0);
753 ITaskFolder_DeleteTask(root
, Wine_Task2
, 0);
754 ITaskFolder_DeleteFolder(root
, Wine
, 0);
756 hr
= ITaskFolder_GetTask(root
, Wine_Task1
, &task1
);
757 ok(hr
== HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), "expected ERROR_PATH_NOT_FOUND, got %#x\n", hr
);
759 hr
= ITaskFolder_CreateFolder(root
, Wine
, v_null
, &folder
);
760 ok(hr
== S_OK
, "CreateFolder error %#x\n", hr
);
762 hr
= ITaskFolder_GetTask(root
, Wine
, &task1
);
763 ok(hr
== HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), "expected ERROR_PATH_NOT_FOUND, got %#x\n", hr
);
765 MultiByteToWideChar(CP_ACP
, 0, xml1
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
767 for (i
= 0; i
< sizeof(create_new_task
)/sizeof(create_new_task
[0]); i
++)
769 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, create_new_task
[i
].flags
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
770 ok(hr
== create_new_task
[i
].hr
, "%d: expected %#x, got %#x\n", i
, create_new_task
[i
].hr
, hr
);
773 hr
= ITaskFolder_DeleteTask(root
, Wine_Task1
, 0);
774 ok(hr
== S_OK
, "DeleteTask error %#x\n", hr
);
778 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, NULL
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
779 ok(hr
== HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER
), "expected RPC_X_NULL_REF_POINTER, got %#x\n", hr
);
781 hr
= ITaskFolder_RegisterTask(root
, Wine
, xmlW
, TASK_VALIDATE_ONLY
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
782 ok(hr
== S_OK
, "RegisterTask error %#x\n", hr
);
784 hr
= ITaskFolder_RegisterTask(root
, Wine
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
786 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
);
788 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
789 ok(hr
== S_OK
, "RegisterTask error %#x\n", hr
);
791 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
792 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
794 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, 0, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, NULL
);
795 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
797 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, TASK_CREATE_OR_UPDATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
798 ok(hr
== S_OK
, "RegisterTask error %#x\n", hr
);
800 for (i
= 0; i
< sizeof(open_existing_task
)/sizeof(open_existing_task
[0]); i
++)
802 hr
= ITaskFolder_RegisterTask(root
, Wine_Task1
, xmlW
, open_existing_task
[i
].flags
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
803 ok(hr
== open_existing_task
[i
].hr
, "%d: expected %#x, got %#x\n", i
, open_existing_task
[i
].hr
, hr
);
806 hr
= IRegisteredTask_get_Name(task1
, NULL
);
807 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
809 hr
= IRegisteredTask_get_Name(task1
, &bstr
);
810 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
811 ok(!lstrcmpW(bstr
, Task1
), "expected Task1, got %s\n", wine_dbgstr_w(bstr
));
813 hr
= IRegisteredTask_get_Path(task1
, &bstr
);
814 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
815 ok(!lstrcmpW(bstr
, Wine_Task1
), "expected \\Wine\\Task1, got %s\n", wine_dbgstr_w(bstr
));
817 hr
= IRegisteredTask_get_State(task1
, &state
);
818 ok(hr
== S_OK
, "get_State error %#x\n", hr
);
819 ok(state
== TASK_STATE_DISABLED
, "expected TASK_STATE_DISABLED, got %d\n", state
);
820 hr
= IRegisteredTask_get_Enabled(task1
, &vbool
);
821 ok(hr
== S_OK
, "get_Enabled error %#x\n", hr
);
822 ok(vbool
== VARIANT_FALSE
, "expected VARIANT_FALSE, got %d\n", vbool
);
824 IRegisteredTask_Release(task1
);
826 hr
= ITaskFolder_RegisterTask(folder
, Task1
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task2
);
827 ok(hr
== HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS
), "expected ERROR_ALREADY_EXISTS, got %#x\n", hr
);
829 MultiByteToWideChar(CP_ACP
, 0, xml2
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
831 hr
= ITaskFolder_RegisterTask(folder
, Task2
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task2
);
832 ok(hr
== S_OK
, "RegisterTask error %#x\n", hr
);
834 hr
= IRegisteredTask_get_Name(task2
, &bstr
);
835 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
836 ok(!lstrcmpW(bstr
, Task2
), "expected Task2, got %s\n", wine_dbgstr_w(bstr
));
838 hr
= IRegisteredTask_get_Path(task2
, &bstr
);
839 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
840 ok(!lstrcmpW(bstr
, Wine_Task2
), "expected \\Wine\\Task2, got %s\n", wine_dbgstr_w(bstr
));
842 hr
= IRegisteredTask_get_State(task2
, &state
);
843 ok(hr
== S_OK
, "get_State error %#x\n", hr
);
845 ok(state
== TASK_STATE_READY
, "expected TASK_STATE_READY, got %d\n", state
);
846 hr
= IRegisteredTask_get_Enabled(task2
, &vbool
);
847 ok(hr
== S_OK
, "get_Enabled error %#x\n", hr
);
849 ok(vbool
== VARIANT_TRUE
, "expected VARIANT_TRUE, got %d\n", vbool
);
851 IRegisteredTask_Release(task2
);
853 hr
= ITaskFolder_GetTask(root
, NULL
, &task1
);
854 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
856 hr
= ITaskFolder_GetTask(root
, Wine_Task1
, NULL
);
857 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
859 hr
= ITaskFolder_GetTask(root
, Wine_Task1
, &task1
);
860 ok(hr
== S_OK
, "GetTask error %#x\n", hr
);
862 hr
= IRegisteredTask_get_Name(task1
, &bstr
);
863 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
864 ok(!lstrcmpW(bstr
, Task1
), "expected Task1, got %s\n", wine_dbgstr_w(bstr
));
866 hr
= IRegisteredTask_get_Path(task1
, &bstr
);
867 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
868 ok(!lstrcmpW(bstr
, Wine_Task1
), "expected \\Wine\\Task1, got %s\n", wine_dbgstr_w(bstr
));
870 hr
= IRegisteredTask_get_State(task1
, &state
);
871 ok(hr
== S_OK
, "get_State error %#x\n", hr
);
872 ok(state
== TASK_STATE_DISABLED
, "expected TASK_STATE_DISABLED, got %d\n", state
);
873 hr
= IRegisteredTask_get_Enabled(task1
, &vbool
);
874 ok(hr
== S_OK
, "get_Enabled error %#x\n", hr
);
875 ok(vbool
== VARIANT_FALSE
, "expected VARIANT_FALSE, got %d\n", vbool
);
877 hr
= IRegisteredTask_put_Enabled(task1
, VARIANT_TRUE
);
879 ok(hr
== S_OK
, "put_Enabled error %#x\n", hr
);
880 hr
= IRegisteredTask_get_State(task1
, &state
);
881 ok(hr
== S_OK
, "get_State error %#x\n", hr
);
883 ok(state
== TASK_STATE_READY
, "expected TASK_STATE_READY, got %d\n", state
);
884 hr
= IRegisteredTask_get_Enabled(task1
, &vbool
);
885 ok(hr
== S_OK
, "get_Enabled error %#x\n", hr
);
887 ok(vbool
== VARIANT_TRUE
, "expected VARIANT_TRUE, got %d\n", vbool
);
889 IRegisteredTask_Release(task1
);
891 hr
= ITaskFolder_GetTask(folder
, Task2
, &task2
);
892 ok(hr
== S_OK
, "GetTask error %#x\n", hr
);
894 hr
= IRegisteredTask_get_Name(task2
, &bstr
);
895 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
896 ok(!lstrcmpW(bstr
, Task2
), "expected Task2, got %s\n", wine_dbgstr_w(bstr
));
898 hr
= IRegisteredTask_get_Path(task2
, &bstr
);
899 ok(hr
== S_OK
, "get_Path error %#x\n", hr
);
900 ok(!lstrcmpW(bstr
, Wine_Task2
), "expected \\Wine\\Task2, got %s\n", wine_dbgstr_w(bstr
));
902 hr
= IRegisteredTask_get_State(task2
, &state
);
903 ok(hr
== S_OK
, "get_State error %#x\n", hr
);
905 ok(state
== TASK_STATE_READY
, "expected TASK_STATE_READY, got %d\n", state
);
906 hr
= IRegisteredTask_get_Enabled(task2
, &vbool
);
907 ok(hr
== S_OK
, "get_Enabled error %#x\n", hr
);
909 ok(vbool
== VARIANT_TRUE
, "expected VARIANT_TRUE, got %d\n", vbool
);
911 hr
= IRegisteredTask_get_State(task2
, NULL
);
912 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
913 hr
= IRegisteredTask_get_Enabled(task2
, NULL
);
914 ok(hr
== E_POINTER
, "expected E_POINTER, got %#x\n", hr
);
916 IRegisteredTask_Release(task2
);
918 hr
= ITaskFolder_DeleteTask(folder
, NULL
, 0);
920 ok(hr
== HRESULT_FROM_WIN32(ERROR_DIR_NOT_EMPTY
), "expected ERROR_DIR_NOT_EMPTY, got %#x\n", hr
);
922 hr
= ITaskFolder_DeleteTask(root
, Wine_Task1
, 0);
923 ok(hr
== S_OK
, "DeleteTask error %#x\n", hr
);
924 hr
= ITaskFolder_DeleteTask(folder
, Task2
, 0);
925 ok(hr
== S_OK
, "DeleteTask error %#x\n", hr
);
927 hr
= ITaskFolder_DeleteTask(folder
, Task2
, 0);
928 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
), "expected ERROR_FILE_NOT_FOUND, got %#x\n", hr
);
930 hr
= ITaskFolder_RegisterTask(root
, NULL
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
931 ok(hr
== S_OK
, "RegisterTask error %#x\n", hr
);
933 hr
= IRegisteredTask_get_Name(task1
, &bstr
);
934 ok(hr
== S_OK
, "get_Name error %#x\n", hr
);
935 hr
= IIDFromString(bstr
, &iid
);
936 ok(hr
== S_OK
, "IIDFromString error %#x\n", hr
);
938 IRegisteredTask_Release(task1
);
940 hr
= ITaskFolder_DeleteTask(root
, bstr
, 0);
941 ok(hr
== S_OK
, "DeleteTask error %#x\n", hr
);
943 hr
= ITaskFolder_RegisterTask(folder
, NULL
, xmlW
, TASK_CREATE
, v_null
, v_null
, TASK_LOGON_NONE
, v_null
, &task1
);
944 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
946 ITaskFolder_Release(folder
);
948 hr
= ITaskFolder_DeleteFolder(root
, Wine
, 0);
949 ok(hr
== S_OK
, "DeleteFolder error %#x\n", hr
);
951 ITaskFolder_Release(root
);
952 ITaskService_Release(service
);
957 WCHAR restart_interval
[20];
958 WCHAR execution_time_limit
[20];
959 WCHAR delete_expired_task_after
[20];
962 TASK_INSTANCES_POLICY policy
;
963 TASK_COMPATIBILITY compatibility
;
964 VARIANT_BOOL allow_on_demand_start
;
965 VARIANT_BOOL stop_if_going_on_batteries
;
966 VARIANT_BOOL disallow_start_if_on_batteries
;
967 VARIANT_BOOL allow_hard_terminate
;
968 VARIANT_BOOL start_when_available
;
969 VARIANT_BOOL run_only_if_network_available
;
970 VARIANT_BOOL enabled
;
972 VARIANT_BOOL run_only_if_idle
;
973 VARIANT_BOOL wake_to_run
;
976 /* test the version 1 compatibility settings */
977 static void test_settings_v1(ITaskDefinition
*taskdef
, struct settings
*test
, struct settings
*def
)
984 TASK_INSTANCES_POLICY policy
;
985 TASK_COMPATIBILITY compat
;
987 hr
= ITaskDefinition_get_Settings(taskdef
, &set
);
988 ok(hr
== S_OK
, "get_Settings error %#x\n", hr
);
990 hr
= ITaskSettings_get_AllowDemandStart(set
, &vbool
);
991 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
992 ok(vbool
== def
->allow_on_demand_start
, "expected %d, got %d\n", def
->allow_on_demand_start
, vbool
);
994 hr
= ITaskSettings_get_RestartInterval(set
, &bstr
);
995 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
996 if (!def
->restart_interval
[0])
997 ok(bstr
== NULL
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
999 ok(!lstrcmpW(bstr
, def
->restart_interval
), "expected %s, got %s\n", wine_dbgstr_w(def
->restart_interval
), wine_dbgstr_w(bstr
));
1001 hr
= ITaskSettings_get_RestartCount(set
, &vint
);
1002 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1003 ok(vint
== def
->restart_count
, "expected %d, got %d\n", def
->restart_count
, vint
);
1005 hr
= ITaskSettings_get_MultipleInstances(set
, &policy
);
1006 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1007 ok(policy
== def
->policy
, "expected %d, got %d\n", def
->policy
, policy
);
1009 hr
= ITaskSettings_get_StopIfGoingOnBatteries(set
, &vbool
);
1010 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1011 ok(vbool
== test
->stop_if_going_on_batteries
, "expected %d, got %d\n", test
->stop_if_going_on_batteries
, vbool
);
1013 hr
= ITaskSettings_get_DisallowStartIfOnBatteries(set
, &vbool
);
1014 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1015 ok(vbool
== test
->disallow_start_if_on_batteries
, "expected %d, got %d\n", test
->disallow_start_if_on_batteries
, vbool
);
1017 hr
= ITaskSettings_get_AllowHardTerminate(set
, &vbool
);
1018 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1019 ok(vbool
== def
->allow_hard_terminate
, "expected %d, got %d\n", def
->allow_hard_terminate
, vbool
);
1021 hr
= ITaskSettings_get_StartWhenAvailable(set
, &vbool
);
1022 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1023 ok(vbool
== def
->start_when_available
, "expected %d, got %d\n", def
->start_when_available
, vbool
);
1025 hr
= ITaskSettings_get_RunOnlyIfNetworkAvailable(set
, &vbool
);
1026 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1027 ok(vbool
== def
->run_only_if_network_available
, "expected %d, got %d\n", def
->run_only_if_network_available
, vbool
);
1029 hr
= ITaskSettings_get_ExecutionTimeLimit(set
, &bstr
);
1030 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1031 if (!test
->execution_time_limit
[0])
1032 ok(bstr
== NULL
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1034 ok(!lstrcmpW(bstr
, test
->execution_time_limit
), "expected %s, got %s\n", wine_dbgstr_w(test
->execution_time_limit
), wine_dbgstr_w(bstr
));
1036 hr
= ITaskSettings_get_Enabled(set
, &vbool
);
1037 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1038 ok(vbool
== test
->enabled
, "expected %d, got %d\n", test
->enabled
, vbool
);
1040 hr
= ITaskSettings_get_DeleteExpiredTaskAfter(set
, &bstr
);
1041 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1042 if (!test
->delete_expired_task_after
[0])
1043 ok(bstr
== NULL
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1045 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
));
1047 hr
= ITaskSettings_get_Priority(set
, &vint
);
1048 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1049 ok(vint
== test
->priority
, "expected %d, got %d\n", test
->priority
, vint
);
1051 hr
= ITaskSettings_get_Compatibility(set
, &compat
);
1052 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1053 ok(compat
== test
->compatibility
, "expected %d, got %d\n", test
->compatibility
, compat
);
1055 hr
= ITaskSettings_get_Hidden(set
, &vbool
);
1056 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1057 ok(vbool
== test
->hidden
, "expected %d, got %d\n", test
->hidden
, vbool
);
1059 hr
= ITaskSettings_get_RunOnlyIfIdle(set
, &vbool
);
1060 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1061 ok(vbool
== test
->run_only_if_idle
, "expected %d, got %d\n", test
->run_only_if_idle
, vbool
);
1063 hr
= ITaskSettings_get_WakeToRun(set
, &vbool
);
1064 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1065 ok(vbool
== test
->wake_to_run
, "expected %d, got %d\n", test
->wake_to_run
, vbool
);
1067 /* FIXME: test IIdleSettings and INetworkSettings */
1069 ITaskSettings_Release(set
);
1072 static void change_settings(ITaskDefinition
*taskdef
, struct settings
*test
)
1077 hr
= ITaskDefinition_get_Settings(taskdef
, &set
);
1078 ok(hr
== S_OK
, "get_Settings error %#x\n", hr
);
1080 if (!test
->restart_interval
[0])
1081 hr
= ITaskSettings_put_RestartInterval(set
, NULL
);
1083 hr
= ITaskSettings_put_RestartInterval(set
, test
->restart_interval
);
1085 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1086 /* FIXME: Remove once implemented */
1087 if (hr
!= S_OK
) return;
1089 hr
= ITaskSettings_put_RestartCount(set
, test
->restart_count
);
1090 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1092 hr
= ITaskSettings_put_MultipleInstances(set
, test
->policy
);
1093 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1095 hr
= ITaskSettings_put_StopIfGoingOnBatteries(set
, test
->stop_if_going_on_batteries
);
1096 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1098 hr
= ITaskSettings_put_DisallowStartIfOnBatteries(set
, test
->disallow_start_if_on_batteries
);
1099 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1101 hr
= ITaskSettings_put_AllowHardTerminate(set
, test
->allow_hard_terminate
);
1102 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1104 hr
= ITaskSettings_put_StartWhenAvailable(set
, test
->start_when_available
);
1105 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1107 hr
= ITaskSettings_put_RunOnlyIfNetworkAvailable(set
, test
->run_only_if_network_available
);
1108 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1110 if (!test
->execution_time_limit
[0])
1111 hr
= ITaskSettings_put_ExecutionTimeLimit(set
, NULL
);
1113 hr
= ITaskSettings_put_ExecutionTimeLimit(set
, test
->execution_time_limit
);
1114 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1116 hr
= ITaskSettings_put_Enabled(set
, test
->enabled
);
1117 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1119 if (!test
->delete_expired_task_after
[0])
1120 hr
= ITaskSettings_put_DeleteExpiredTaskAfter(set
, NULL
);
1122 hr
= ITaskSettings_put_DeleteExpiredTaskAfter(set
, test
->delete_expired_task_after
);
1123 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1125 hr
= ITaskSettings_put_Priority(set
, test
->priority
);
1126 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1128 hr
= ITaskSettings_put_Compatibility(set
, test
->compatibility
);
1129 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1131 hr
= ITaskSettings_put_Hidden(set
, test
->hidden
);
1132 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1134 hr
= ITaskSettings_put_RunOnlyIfIdle(set
, test
->run_only_if_idle
);
1135 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1137 hr
= ITaskSettings_put_WakeToRun(set
, test
->wake_to_run
);
1138 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1140 hr
= ITaskSettings_put_AllowDemandStart(set
, test
->allow_on_demand_start
);
1141 ok(hr
== S_OK
, "expected S_OK, got %#x\n", hr
);
1143 /* FIXME: set IIdleSettings and INetworkSettings */
1145 ITaskSettings_Release(set
);
1148 static void create_action(ITaskDefinition
*taskdef
)
1150 static WCHAR task1_exe
[] = { 't','a','s','k','1','.','e','x','e',0 };
1152 IActionCollection
*actions
;
1154 IExecAction
*exec_action
;
1156 hr
= ITaskDefinition_get_Actions(taskdef
, &actions
);
1158 ok(hr
== S_OK
, "get_Actions error %#x\n", hr
);
1159 /* FIXME: Remove once implemented */
1160 if (hr
!= S_OK
) return;
1162 hr
= IActionCollection_Create(actions
, TASK_ACTION_EXEC
, &action
);
1163 ok(hr
== S_OK
, "Create action error %#x\n", hr
);
1165 hr
= IAction_QueryInterface(action
, &IID_IExecAction
, (void **)&exec_action
);
1166 ok(hr
== S_OK
, "QueryInterface error %#x\n", hr
);
1168 hr
= IExecAction_put_Path(exec_action
, task1_exe
);
1169 ok(hr
== S_OK
, "put_Path error %#x\n", hr
);
1171 IExecAction_Release(exec_action
);
1172 IAction_Release(action
);
1173 IActionCollection_Release(actions
);
1176 static void test_TaskDefinition(void)
1178 static const char xml1
[] =
1179 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1180 " <RegistrationInfo>\n"
1181 " <Description>\"Task1\"</Description>\n"
1182 " </RegistrationInfo>\n"
1184 " <Enabled>false</Enabled>\n"
1185 " <Hidden>false</Hidden>\n"
1189 " <Command>\"task1.exe\"</Command>\n"
1193 static const char xml2
[] =
1195 " <RegistrationInfo>\n"
1196 " <Description>\"Task1\"</Description>\n"
1197 " </RegistrationInfo>\n"
1199 " <Enabled>false</Enabled>\n"
1200 " <Hidden>false</Hidden>\n"
1204 " <Command>\"task1.exe\"</Command>\n"
1208 static const char xml3
[] =
1210 " <RegistrationInfo>\n"
1211 " <Description>\"Task1\"</Description>\n"
1212 " </RegistrationInfo>\n"
1214 " <Enabled>false</Enabled>\n"
1215 " <Hidden>false</Hidden>\n"
1219 " <Command>\"task1.exe\"</Command>\n"
1223 static const char xml4
[] =
1224 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1225 " <RegistrationInfo/>\n"
1229 " <Command>\"task1.exe\"</Command>\n"
1233 static const char xml5
[] =
1234 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1235 " <RegistrationInfo/>\n"
1239 static const char xml6
[] =
1240 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1241 " <RegistrationInfo/>\n"
1244 " <Command>\"task1.exe\"</Command>\n"
1249 static const char xml7
[] =
1250 "<Task xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
1251 " <RegistrationInfo/>\n"
1253 " <Enabled>FALSE</Enabled>\n"
1257 " <Command>\"task1.exe\"</Command>\n"
1261 static WCHAR Task1
[] = { '"','T','a','s','k','1','"',0 };
1262 static struct settings def_settings
= { { 0 }, { 'P','T','7','2','H',0 }, { 0 },
1263 0, 7, TASK_INSTANCES_IGNORE_NEW
, TASK_COMPATIBILITY_V2
, VARIANT_TRUE
, VARIANT_TRUE
,
1264 VARIANT_TRUE
, VARIANT_TRUE
, VARIANT_FALSE
, VARIANT_FALSE
, VARIANT_TRUE
, VARIANT_FALSE
,
1265 VARIANT_FALSE
, VARIANT_FALSE
};
1266 static struct settings new_settings
= { { 'P','1','Y',0 }, { 'P','T','1','0','M',0 }, { 0 },
1267 100, 1, TASK_INSTANCES_STOP_EXISTING
, TASK_COMPATIBILITY_V1
, VARIANT_FALSE
, VARIANT_FALSE
,
1268 VARIANT_FALSE
, VARIANT_FALSE
, VARIANT_TRUE
, VARIANT_TRUE
, VARIANT_FALSE
, VARIANT_TRUE
,
1269 VARIANT_TRUE
, VARIANT_TRUE
};
1271 ITaskService
*service
;
1272 ITaskDefinition
*taskdef
;
1273 IRegistrationInfo
*reginfo
;
1276 WCHAR xmlW
[sizeof(xml1
)];
1278 hr
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ITaskService
, (void **)&service
);
1281 win_skip("CoCreateInstance(CLSID_TaskScheduler) error %#x\n", hr
);
1285 hr
= ITaskService_NewTask(service
, 0, &taskdef
);
1286 ok(hr
== S_OK
, "NewTask error %#x\n", hr
);
1288 test_settings_v1(taskdef
, &def_settings
, &def_settings
);
1289 change_settings(taskdef
, &new_settings
);
1291 /* Action is mandatory for v1 compatibility */
1292 create_action(taskdef
);
1294 hr
= ITaskDefinition_get_XmlText(taskdef
, &xml
);
1295 ok(hr
== S_OK
, "get_XmlText error %#x\n", hr
);
1297 ITaskDefinition_Release(taskdef
);
1299 hr
= ITaskService_NewTask(service
, 0, &taskdef
);
1300 ok(hr
== S_OK
, "NewTask error %#x\n", hr
);
1302 hr
= ITaskDefinition_put_XmlText(taskdef
, xml
);
1303 ok(hr
== S_OK
, "put_XmlText error %#x\n", hr
);
1306 /* FIXME: uncomment once changing settings is implemented
1307 test_settings_v1(taskdef, &new_settings, &def_settings);
1310 hr
= ITaskDefinition_put_XmlText(taskdef
, NULL
);
1311 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
1313 MultiByteToWideChar(CP_ACP
, 0, xml1
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1314 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1315 ok(hr
== S_OK
, "put_XmlText error %#x\n", hr
);
1317 MultiByteToWideChar(CP_ACP
, 0, xml2
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1318 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1319 ok(hr
== SCHED_E_NAMESPACE
, "expected SCHED_E_NAMESPACE, got %#x\n", hr
);
1321 MultiByteToWideChar(CP_ACP
, 0, xml3
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1322 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1324 ok(hr
== SCHED_E_UNEXPECTEDNODE
, "expected SCHED_E_UNEXPECTEDNODE, got %#x\n", hr
);
1326 MultiByteToWideChar(CP_ACP
, 0, xml4
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1327 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1328 ok(hr
== S_OK
, "put_XmlText error %#x\n", hr
);
1330 MultiByteToWideChar(CP_ACP
, 0, xml5
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1331 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1333 ok(hr
== SCHED_E_MISSINGNODE
, "expected SCHED_E_MISSINGNODE, got %#x\n", hr
);
1335 MultiByteToWideChar(CP_ACP
, 0, xml6
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1336 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1337 ok(hr
== SCHED_E_MALFORMEDXML
, "expected SCHED_E_MALFORMEDXML, got %#x\n", hr
);
1339 MultiByteToWideChar(CP_ACP
, 0, xml7
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1340 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1341 ok(hr
== SCHED_E_INVALIDVALUE
, "expected SCHED_E_INVALIDVALUE, got %#x\n", hr
);
1344 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1345 ok(hr
== SCHED_E_MALFORMEDXML
, "expected SCHED_E_MALFORMEDXML, got %#x\n", hr
);
1347 /* test registration info */
1348 MultiByteToWideChar(CP_ACP
, 0, xml1
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1349 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1350 ok(hr
== S_OK
, "put_XmlText error %#x\n", hr
);
1351 hr
= ITaskDefinition_get_RegistrationInfo(taskdef
, ®info
);
1352 ok(hr
== S_OK
, "get_RegistrationInfo error %#x\n", hr
);
1354 hr
= IRegistrationInfo_get_Description(reginfo
, &bstr
);
1355 ok(hr
== S_OK
, "get_Description error %#x\n", hr
);
1356 ok(!lstrcmpW(bstr
, Task1
), "expected Task1, got %s\n", wine_dbgstr_w(bstr
));
1357 SysFreeString(bstr
);
1358 hr
= IRegistrationInfo_get_Author(reginfo
, &bstr
);
1359 ok(hr
== S_OK
, "get_Author error %#x\n", hr
);
1360 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1361 hr
= IRegistrationInfo_get_Version(reginfo
, &bstr
);
1362 ok(hr
== S_OK
, "get_Version error %#x\n", hr
);
1363 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1364 hr
= IRegistrationInfo_get_Date(reginfo
, &bstr
);
1365 ok(hr
== S_OK
, "get_Date error %#x\n", hr
);
1366 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1367 hr
= IRegistrationInfo_get_Documentation(reginfo
, &bstr
);
1368 ok(hr
== S_OK
, "get_Documentation error %#x\n", hr
);
1369 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1370 hr
= IRegistrationInfo_get_URI(reginfo
, &bstr
);
1371 ok(hr
== S_OK
, "get_URI error %#x\n", hr
);
1372 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1373 hr
= IRegistrationInfo_get_Source(reginfo
, &bstr
);
1374 ok(hr
== S_OK
, "get_Source error %#x\n", hr
);
1375 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1376 V_VT(&var
) = VT_BSTR
;
1377 V_BSTR(&var
) = NULL
;
1378 hr
= IRegistrationInfo_get_SecurityDescriptor(reginfo
, &var
);
1380 ok(hr
== S_OK
, "get_SecurityDescriptor error %#x\n", hr
);
1382 ok(V_VT(&var
) == VT_EMPTY
, "expected VT_EMPTY, got %u\n", V_VT(&var
));
1384 IRegistrationInfo_Release(reginfo
);
1386 MultiByteToWideChar(CP_ACP
, 0, xml4
, -1, xmlW
, sizeof(xmlW
)/sizeof(xmlW
[0]));
1387 hr
= ITaskDefinition_put_XmlText(taskdef
, xmlW
);
1388 ok(hr
== S_OK
, "put_XmlText error %#x\n", hr
);
1389 hr
= ITaskDefinition_get_RegistrationInfo(taskdef
, ®info
);
1390 ok(hr
== S_OK
, "get_RegistrationInfo error %#x\n", hr
);
1392 hr
= IRegistrationInfo_get_Description(reginfo
, &bstr
);
1393 ok(hr
== S_OK
, "get_Description error %#x\n", hr
);
1395 ok(!bstr
, "expected NULL, got %s\n", wine_dbgstr_w(bstr
));
1397 IRegistrationInfo_Release(reginfo
);
1398 ITaskDefinition_Release(taskdef
);
1399 ITaskService_Release(service
);
1402 START_TEST(scheduler
)
1404 OleInitialize(NULL
);
1408 test_FolderCollection();
1410 test_TaskDefinition();