ReactOS  0.4.14-dev-552-g2fad488
task_scheduler.c
Go to the documentation of this file.
1 /*
2  * Test suite for TaskScheduler interface
3  *
4  * Copyright (C) 2008 Google (Roy Shea)
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #define COBJMACROS
22 
23 #include "corerror.h"
24 
25 #include "initguid.h"
26 #include "mstask.h"
27 #include "wine/test.h"
28 
30 
31 static const WCHAR does_not_existW[] = {'\\','\\','d','o','e','s','_','n','o','t','_','e','x','i','s','t',0};
32 
33 static void test_NewWorkItem(void)
34 {
35  HRESULT hres;
36  ITask *task;
37  const WCHAR task_name[] = {'T', 'e', 's', 't', 'i', 'n', 'g', 0};
38  GUID GUID_BAD;
39 
40  /* Initialize a GUID that will not be a recognized CLSID or a IID */
41  CoCreateGuid(&GUID_BAD);
42 
43  /* Create TaskScheduler */
44  hres = CoCreateInstance(&CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER,
45  &IID_ITaskScheduler, (void **) &test_task_scheduler);
46  ok(hres == S_OK, "CTaskScheduler CoCreateInstance failed: %08x\n", hres);
47  if (hres != S_OK)
48  {
49  skip("Failed to create task scheduler. Skipping tests.\n");
50  return;
51  }
52 
53  /* Test basic task creation */
54  hres = ITaskScheduler_NewWorkItem(test_task_scheduler, task_name,
55  &CLSID_CTask, &IID_ITask, (IUnknown**)&task);
56  ok(hres == S_OK, "NewNetworkItem failed: %08x\n", hres);
57  if (hres == S_OK)
58  ITask_Release(task);
59 
60  /* Task creation attempt using invalid work item class ID */
61  hres = ITaskScheduler_NewWorkItem(test_task_scheduler, task_name,
62  &GUID_BAD, &IID_ITask, (IUnknown**)&task);
64  "Expected CLASS_E_CLASSNOTAVAILABLE: %08x\n", hres);
65 
66  /* Task creation attempt using invalid interface ID */
67  hres = ITaskScheduler_NewWorkItem(test_task_scheduler, task_name,
68  &CLSID_CTask, &GUID_BAD, (IUnknown**)&task);
69  ok(hres == E_NOINTERFACE, "Expected E_NOINTERFACE: %08x\n", hres);
70 
71  /* Task creation attempt using invalid work item class and interface ID */
72  hres = ITaskScheduler_NewWorkItem(test_task_scheduler, task_name,
73  &GUID_BAD, &GUID_BAD, (IUnknown**)&task);
75  "Expected CLASS_E_CLASSNOTAVAILABLE: %08x\n", hres);
76 
77  ITaskScheduler_Release(test_task_scheduler);
78  return;
79 }
80 
81 static void test_Activate(void)
82 {
83  HRESULT hres;
84  ITask *task = NULL;
85  const WCHAR not_task_name[] =
86  {'N', 'o', 'S', 'u', 'c', 'h', 'T', 'a', 's', 'k', 0};
87 
88  /* Create TaskScheduler */
89  hres = CoCreateInstance(&CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER,
90  &IID_ITaskScheduler, (void **) &test_task_scheduler);
91  ok(hres == S_OK, "CTaskScheduler CoCreateInstance failed: %08x\n", hres);
92  if (hres != S_OK)
93  {
94  skip("Failed to create task scheduler. Skipping tests.\n");
95  return;
96  }
97 
98  /* Attempt to activate a nonexistent task */
99  hres = ITaskScheduler_Activate(test_task_scheduler, not_task_name,
100  &IID_ITask, (IUnknown**)&task);
101  ok(hres == COR_E_FILENOTFOUND, "Expected COR_E_FILENOTFOUND: %08x\n", hres);
102 
103  ITaskScheduler_Release(test_task_scheduler);
104  return;
105 }
106 
107 static void test_GetTargetComputer(void)
108 {
109  HRESULT hres;
110  WCHAR *oldname;
111 
112  /* Create TaskScheduler */
113  hres = CoCreateInstance(&CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER,
114  &IID_ITaskScheduler, (void **) &test_task_scheduler);
115  ok(hres == S_OK, "CTaskScheduler CoCreateInstance failed: %08x\n", hres);
116  if (hres != S_OK)
117  {
118  skip("Failed to create task scheduler.\n");
119  return;
120  }
121 
122  if (0)
123  {
124  /* This crashes on w2k */
125  hres = ITaskScheduler_GetTargetComputer(test_task_scheduler, NULL);
126  ok(hres == E_INVALIDARG, "got 0x%x (expected E_INVALIDARG)\n", hres);
127  }
128 
129  hres = ITaskScheduler_GetTargetComputer(test_task_scheduler, &oldname);
130  ok((hres == S_OK) && oldname && oldname[0] == '\\' && oldname[1] == '\\' && oldname[2],
131  "got 0x%x and %s (expected S_OK and an unc name)\n", hres, wine_dbgstr_w(oldname));
132 
133  CoTaskMemFree(oldname);
134 
135  ITaskScheduler_Release(test_task_scheduler);
136  return;
137 }
138 
139 static void test_SetTargetComputer(void)
140 {
141  WCHAR buffer[MAX_COMPUTERNAME_LENGTH + 3]; /* extra space for two '\' and a zero */
142  DWORD len = MAX_COMPUTERNAME_LENGTH + 1; /* extra space for a zero */
143  WCHAR *oldname = NULL;
144  WCHAR *name = NULL;
145  HRESULT hres;
146 
147 
148  buffer[0] = '\\';
149  buffer[1] = '\\';
150  if (!GetComputerNameW(buffer + 2, &len))
151  return;
152 
153  /* Create TaskScheduler */
154  hres = CoCreateInstance(&CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER,
155  &IID_ITaskScheduler, (void **) &test_task_scheduler);
156  ok(hres == S_OK, "CTaskScheduler CoCreateInstance failed: %08x\n", hres);
157  if (hres != S_OK)
158  {
159  skip("Failed to create task scheduler. Skipping tests.\n");
160  return;
161  }
162 
163  hres = ITaskScheduler_GetTargetComputer(test_task_scheduler, &oldname);
164  ok(hres == S_OK, "got 0x%x and %s (expected S_OK)\n", hres, wine_dbgstr_w(oldname));
165 
166  /* NULL is an alias for the local computer */
167  hres = ITaskScheduler_SetTargetComputer(test_task_scheduler, NULL);
168  ok(hres == S_OK, "got 0x%x (expected S_OK)\n", hres);
169  hres = ITaskScheduler_GetTargetComputer(test_task_scheduler, &name);
170  ok((hres == S_OK && !lstrcmpiW(name, buffer)),
171  "got 0x%x with %s (expected S_OK and %s)\n",
174 
175  /* The name must be valid */
176  hres = ITaskScheduler_SetTargetComputer(test_task_scheduler, does_not_existW);
177  ok(hres == HRESULT_FROM_WIN32(ERROR_BAD_NETPATH), "got 0x%x (expected 0x80070035)\n", hres);
178  /* the name of the target computer is unchanged */
179  hres = ITaskScheduler_GetTargetComputer(test_task_scheduler, &name);
180  ok((hres == S_OK && !lstrcmpiW(name, buffer)),
181  "got 0x%x with %s (expected S_OK and %s)\n",
184 
185  /* the two backslashes are optional */
186  hres = ITaskScheduler_SetTargetComputer(test_task_scheduler, oldname + 2);
187  if (hres == E_ACCESSDENIED)
188  {
189  skip("SetTargetComputer failed with E_ACCESSDENIED (needs admin rights)\n");
190  goto done;
191  }
192  ok(hres == S_OK, "got 0x%x (expected S_OK)\n", hres);
193 
194  /* the case is ignored */
196  hres = ITaskScheduler_SetTargetComputer(test_task_scheduler, buffer);
197  ok(hres == S_OK, "got 0x%x (expected S_OK)\n", hres);
199  hres = ITaskScheduler_SetTargetComputer(test_task_scheduler, buffer);
200  ok(hres == S_OK, "got 0x%x (expected S_OK)\n", hres);
201 
202  /* cleanup */
203  hres = ITaskScheduler_SetTargetComputer(test_task_scheduler, oldname);
204  ok(hres == S_OK, "got 0x%x (expected S_OK)\n", hres);
205 
206 done:
207  CoTaskMemFree(oldname);
208  ITaskScheduler_Release(test_task_scheduler);
209  return;
210 }
211 
212 static void test_Enum(void)
213 {
214  ITaskScheduler *scheduler;
215  IEnumWorkItems *tasks;
216  HRESULT hr;
217 
218  hr = CoCreateInstance(&CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER,
219  &IID_ITaskScheduler, (void **)&scheduler);
220  ok(hr == S_OK, "got 0x%08x\n", hr);
221 
222 if (0) { /* crashes on win2k */
223  hr = ITaskScheduler_Enum(scheduler, NULL);
224  ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
225 }
226 
227  hr = ITaskScheduler_Enum(scheduler, &tasks);
228  ok(hr == S_OK, "got 0x%08x\n", hr);
229  IEnumWorkItems_Release(tasks);
230 
231  ITaskScheduler_Release(scheduler);
232 }
233 
234 START_TEST(task_scheduler)
235 {
238  test_Activate();
241  test_Enum();
242  CoUninitialize();
243 }
#define COR_E_FILENOTFOUND
Definition: corerror.h:42
#define E_ACCESSDENIED
Definition: winerror.h:2849
#define E_NOINTERFACE
Definition: winerror.h:2364
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:420
HRESULT hr
Definition: shlfolder.c:183
static void test_SetTargetComputer(void)
static void test_NewWorkItem(void)
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
LPWSTR WINAPI CharLowerW(_Inout_ LPWSTR)
GLuint buffer
Definition: glext.h:5915
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
Definition: compname.c:440
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:2663
#define ERROR_BAD_NETPATH
Definition: winerror.h:145
LPWSTR WINAPI CharUpperW(_Inout_ LPWSTR)
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
static void test_Activate(void)
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
static void test_GetTargetComputer(void)
HRESULT hres
Definition: protocol.c:465
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
static void test_Enum(void)
unsigned long DWORD
Definition: ntddk_ex.h:95
HRESULT WINAPI CoCreateGuid(GUID *pguid)
Definition: compobj.c:2206
static ITaskScheduler * test_task_scheduler
GLenum GLsizei len
Definition: glext.h:6722
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:240
#define S_OK
Definition: intsafe.h:59
static const WCHAR does_not_existW[]
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
#define ok(value,...)
Definition: atltest.h:57
START_TEST(task_scheduler)
#define skip(...)
Definition: atltest.h:64
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
Definition: name.c:38