Release 1.6-rc2.
[wine/testsucceed.git] / dlls / qmgr / tests / enum_jobs.c
blobe388087c8b98759d65618aa1771779b6ac127767
1 /*
2 * Unit test suite for Enum Background Copy Jobs Interface
4 * Copyright 2007 Google (Roy Shea, Dan Hipschman)
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.
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.
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
21 #include <stdio.h>
23 #define COBJMACROS
25 #include "wine/test.h"
26 #include "bits.h"
28 /* Globals used by many tests */
29 static const WCHAR test_displayNameA[] = {'T','e','s','t','A', 0};
30 static const WCHAR test_displayNameB[] = {'T','e','s','t','B', 0};
31 static IBackgroundCopyManager *test_manager;
32 static IBackgroundCopyJob *test_jobA;
33 static IBackgroundCopyJob *test_jobB;
34 static ULONG test_jobCountB;
35 static IEnumBackgroundCopyJobs *test_enumJobsA;
36 static IEnumBackgroundCopyJobs *test_enumJobsB;
37 static GUID test_jobIdA;
38 static GUID test_jobIdB;
40 /* Generic test setup */
41 static BOOL setup(void)
43 HRESULT hres;
45 test_manager = NULL;
46 test_jobA = NULL;
47 test_jobB = NULL;
48 memset(&test_jobIdA, 0, sizeof test_jobIdA);
49 memset(&test_jobIdB, 0, sizeof test_jobIdB);
51 hres = CoCreateInstance(&CLSID_BackgroundCopyManager, NULL,
52 CLSCTX_LOCAL_SERVER, &IID_IBackgroundCopyManager,
53 (void **) &test_manager);
54 if(hres != S_OK)
55 return FALSE;
57 hres = IBackgroundCopyManager_CreateJob(test_manager, test_displayNameA,
58 BG_JOB_TYPE_DOWNLOAD, &test_jobIdA,
59 &test_jobA);
60 if(hres != S_OK)
61 return FALSE;
63 hres = IBackgroundCopyManager_EnumJobs(test_manager, 0, &test_enumJobsA);
64 if(hres != S_OK)
65 return FALSE;
67 hres = IBackgroundCopyManager_CreateJob(test_manager, test_displayNameB,
68 BG_JOB_TYPE_DOWNLOAD, &test_jobIdB,
69 &test_jobB);
70 if(hres != S_OK)
71 return FALSE;
73 hres = IBackgroundCopyManager_EnumJobs(test_manager, 0, &test_enumJobsB);
74 if(hres != S_OK)
75 return FALSE;
77 hres = IEnumBackgroundCopyJobs_GetCount(test_enumJobsB, &test_jobCountB);
78 if (hres != S_OK)
79 return FALSE;
81 return TRUE;
84 /* Generic test cleanup */
85 static void teardown(void)
87 if (test_enumJobsB)
88 IEnumBackgroundCopyJobs_Release(test_enumJobsB);
89 test_enumJobsB = NULL;
90 if (test_jobB)
91 IBackgroundCopyJob_Release(test_jobB);
92 test_jobB = NULL;
93 if (test_enumJobsA)
94 IEnumBackgroundCopyJobs_Release(test_enumJobsA);
95 test_enumJobsA = NULL;
96 if (test_jobA)
97 IBackgroundCopyJob_Release(test_jobA);
98 test_jobA = NULL;
99 if (test_manager)
100 IBackgroundCopyManager_Release(test_manager);
101 test_manager = NULL;
104 /* We can't assume the job count will start at any fixed number since esp
105 when testing on Windows there may be other jobs created by other
106 processes. Even this approach of creating two jobs and checking the
107 difference in counts could fail if a job was created in between, but
108 it's probably not worth worrying about in sane test environments. */
109 static void test_GetCount(void)
111 HRESULT hres;
112 ULONG jobCountA, jobCountB;
114 hres = IEnumBackgroundCopyJobs_GetCount(test_enumJobsA, &jobCountA);
115 ok(hres == S_OK, "GetCount failed: %08x\n", hres);
116 if(hres != S_OK)
118 skip("Couldn't get job count\n");
119 return;
122 hres = IEnumBackgroundCopyJobs_GetCount(test_enumJobsB, &jobCountB);
123 ok(hres == S_OK, "GetCount failed: %08x\n", hres);
124 if(hres != S_OK)
126 skip("Couldn't get job count\n");
127 return;
130 ok(jobCountB == jobCountA + 1, "Got incorrect count\n");
133 /* Test Next with a NULL pceltFetched*/
134 static void test_Next_walkListNull(void)
136 HRESULT hres;
137 IBackgroundCopyJob *job;
138 ULONG i;
140 /* Fetch the available jobs */
141 for (i = 0; i < test_jobCountB; i++)
143 hres = IEnumBackgroundCopyJobs_Next(test_enumJobsB, 1, &job, NULL);
144 ok(hres == S_OK, "Next failed: %08x\n", hres);
145 if(hres != S_OK)
147 skip("Unable to get job from Next\n");
148 return;
150 IBackgroundCopyJob_Release(job);
153 /* Attempt to fetch one more than the number of available jobs */
154 hres = IEnumBackgroundCopyJobs_Next(test_enumJobsB, 1, &job, NULL);
155 ok(hres == S_FALSE, "Next off end of available jobs failed: %08x\n", hres);
158 /* Test Next */
159 static void test_Next_walkList_1(void)
161 HRESULT hres;
162 IBackgroundCopyJob *job;
163 ULONG fetched;
164 ULONG i;
166 /* Fetch the available jobs */
167 for (i = 0; i < test_jobCountB; i++)
169 fetched = 0;
170 hres = IEnumBackgroundCopyJobs_Next(test_enumJobsB, 1, &job, &fetched);
171 ok(hres == S_OK, "Next failed: %08x\n", hres);
172 if(hres != S_OK)
174 skip("Unable to get job from Next\n");
175 return;
177 ok(fetched == 1, "Next returned the incorrect number of jobs: %08x\n", hres);
178 IBackgroundCopyJob_Release(job);
181 /* Attempt to fetch one more than the number of available jobs */
182 fetched = 0;
183 hres = IEnumBackgroundCopyJobs_Next(test_enumJobsB, 1, &job, &fetched);
184 ok(hres == S_FALSE, "Next off end of available jobs failed: %08x\n", hres);
185 ok(fetched == 0, "Next returned the incorrect number of jobs: %08x\n", hres);
188 /* Test Next by requesting multiple files at a time */
189 static void test_Next_walkList_2(void)
191 HRESULT hres;
192 IBackgroundCopyJob **jobs;
193 ULONG fetched;
194 ULONG i;
196 jobs = HeapAlloc(GetProcessHeap(), 0, test_jobCountB * sizeof *jobs);
197 if (!jobs)
199 skip("Couldn't allocate memory\n");
200 return;
203 for (i = 0; i < test_jobCountB; i++)
204 jobs[i] = NULL;
206 fetched = 0;
207 hres = IEnumBackgroundCopyJobs_Next(test_enumJobsB, test_jobCountB, jobs, &fetched);
208 ok(hres == S_OK, "Next failed: %08x\n", hres);
209 if(hres != S_OK)
211 skip("Unable to get file from test_enumJobs\n");
212 HeapFree(GetProcessHeap(), 0, jobs);
213 return;
215 ok(fetched == test_jobCountB, "Next returned the incorrect number of jobs: %08x\n", hres);
217 for (i = 0; i < test_jobCountB; i++)
219 ok(jobs[i] != NULL, "Next returned NULL\n");
220 if (jobs[i])
221 IBackgroundCopyJob_Release(jobs[i]);
224 HeapFree(GetProcessHeap(), 0, jobs);
227 /* Test Next Error conditions */
228 static void test_Next_errors(void)
230 HRESULT hres;
231 IBackgroundCopyJob *jobs[2];
233 /* E_INVALIDARG: pceltFetched can ONLY be NULL if celt is 1 */
234 hres = IEnumBackgroundCopyJobs_Next(test_enumJobsB, 2, jobs, NULL);
235 ok(hres != S_OK, "Invalid call to Next succeeded: %08x\n", hres);
238 /* Test skipping through the jobs in a list */
239 static void test_Skip_walkList(void)
241 HRESULT hres;
242 ULONG i;
244 for (i = 0; i < test_jobCountB; i++)
246 hres = IEnumBackgroundCopyJobs_Skip(test_enumJobsB, 1);
247 ok(hres == S_OK, "Skip failed: %08x\n", hres);
248 if(hres != S_OK)
250 skip("Unable to properly Skip jobs\n");
251 return;
255 hres = IEnumBackgroundCopyJobs_Skip(test_enumJobsB, 1);
256 ok(hres == S_FALSE, "Skip expected end of list: %08x\n", hres);
259 /* Test skipping off the end of the list */
260 static void test_Skip_offEnd(void)
262 HRESULT hres;
264 hres = IEnumBackgroundCopyJobs_Skip(test_enumJobsB, test_jobCountB + 1);
265 ok(hres == S_FALSE, "Skip expected end of list: %08x\n", hres);
268 /* Test reset */
269 static void test_Reset(void)
271 HRESULT hres;
273 hres = IEnumBackgroundCopyJobs_Skip(test_enumJobsB, test_jobCountB);
274 ok(hres == S_OK, "Skip failed: %08x\n", hres);
275 if (hres != S_OK)
277 skip("Skip failed\n");
278 return;
281 hres = IEnumBackgroundCopyJobs_Reset(test_enumJobsB);
282 ok(hres == S_OK, "Reset failed: %08x\n", hres);
283 if(hres != S_OK)
285 skip("Unable to Reset enumerator\n");
286 return;
289 hres = IEnumBackgroundCopyJobs_Skip(test_enumJobsB, test_jobCountB);
290 ok(hres == S_OK, "Reset failed: %08x\n", hres);
293 typedef void (*test_t)(void);
295 START_TEST(enum_jobs)
297 static const test_t tests[] = {
298 test_GetCount,
299 test_Next_walkListNull,
300 test_Next_walkList_1,
301 test_Next_walkList_2,
302 test_Next_errors,
303 test_Skip_walkList,
304 test_Skip_offEnd,
305 test_Reset,
308 const test_t *test;
310 CoInitialize(NULL);
311 for (test = tests; *test; ++test)
313 /* Keep state separate between tests */
314 if (!setup())
316 teardown();
317 skip("Unable to setup test\n");
318 break;
320 (*test)();
321 teardown();
323 CoUninitialize();