[QMGR_WINETEST] Sync with Wine Staging 3.3. CORE-14434
[reactos.git] / modules / rostests / winetests / qmgr / qmgr.c
1 /*
2 * Unit test suite for bits functions
3 *
4 * Copyright 2007 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 #include <stdio.h>
22
23 #define COBJMACROS
24
25 #include "wine/test.h"
26 #include "bits.h"
27
28 static WCHAR progname[MAX_PATH];
29
30 static HRESULT test_create_manager(void)
31 {
32 HRESULT hres;
33 IBackgroundCopyManager *manager = NULL;
34
35 /* Creating BITS instance */
36 hres = CoCreateInstance(&CLSID_BackgroundCopyManager, NULL, CLSCTX_LOCAL_SERVER,
37 &IID_IBackgroundCopyManager, (void **) &manager);
38
39 if(hres == HRESULT_FROM_WIN32(ERROR_SERVICE_DISABLED)) {
40 win_skip("Needed Service is disabled\n");
41 return hres;
42 }
43
44 if (hres == S_OK)
45 IBackgroundCopyManager_Release(manager);
46
47 return hres;
48 }
49
50 static void test_CreateJob(void)
51 {
52 /* Job information */
53 static const WCHAR copyNameW[] = {'T', 'e', 's', 't', 0};
54 IBackgroundCopyJob* job = NULL;
55 GUID tmpId;
56 HRESULT hres;
57 ULONG res;
58 IBackgroundCopyManager* manager = NULL;
59
60 /* Setup */
61 hres = CoCreateInstance(&CLSID_BackgroundCopyManager, NULL,
62 CLSCTX_LOCAL_SERVER, &IID_IBackgroundCopyManager,
63 (void **) &manager);
64 ok(hres == S_OK, "got 0x%08x\n", hres);
65
66 /* Create bits job */
67 hres = IBackgroundCopyManager_CreateJob(manager, copyNameW,
68 BG_JOB_TYPE_DOWNLOAD, &tmpId,
69 &job);
70 ok(hres == S_OK, "CreateJob failed: %08x\n", hres);
71
72 res = IBackgroundCopyJob_Release(job);
73 ok(res == 0, "Bad ref count on release: %u\n", res);
74 IBackgroundCopyManager_Release(manager);
75 }
76
77 static void test_EnumJobs(void)
78 {
79 /* Job Enumerator */
80 IEnumBackgroundCopyJobs* enumJobs;
81
82 static const WCHAR copyNameW[] = {'T', 'e', 's', 't', 0};
83 IBackgroundCopyManager *manager = NULL;
84 IBackgroundCopyJob *job = NULL;
85 HRESULT hres;
86 GUID tmpId;
87
88 /* Setup */
89 hres = CoCreateInstance(&CLSID_BackgroundCopyManager, NULL,
90 CLSCTX_LOCAL_SERVER, &IID_IBackgroundCopyManager,
91 (void **) &manager);
92 ok(hres == S_OK, "got 0x%08x\n", hres);
93
94 hres = IBackgroundCopyManager_CreateJob(manager, copyNameW,
95 BG_JOB_TYPE_DOWNLOAD, &tmpId,
96 &job);
97 ok(hres == S_OK, "got 0x%08x\n", hres);
98
99 hres = IBackgroundCopyManager_EnumJobs(manager, 0, &enumJobs);
100 ok(hres == S_OK, "EnumJobs failed: %08x\n", hres);
101 IEnumBackgroundCopyJobs_Release(enumJobs);
102
103 /* Tear down */
104 IBackgroundCopyJob_Release(job);
105 IBackgroundCopyManager_Release(manager);
106 }
107
108 static void run_child(WCHAR *secret)
109 {
110 static const WCHAR format[] = {'%','s',' ','q','m','g','r',' ','%','s', 0};
111 WCHAR cmdline[MAX_PATH];
112 PROCESS_INFORMATION info;
113 STARTUPINFOW startup;
114
115 memset(&startup, 0, sizeof startup);
116 startup.cb = sizeof startup;
117
118 wsprintfW(cmdline, format, progname, secret);
119 ok(CreateProcessW(NULL, cmdline, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n");
120 winetest_wait_child_process(info.hProcess);
121 ok(CloseHandle(info.hProcess), "CloseHandle\n");
122 ok(CloseHandle(info.hThread), "CloseHandle\n");
123 }
124
125 static void do_child(const char *secretA)
126 {
127 WCHAR secretW[MAX_PATH];
128 IBackgroundCopyManager *manager = NULL;
129 GUID id;
130 IBackgroundCopyJob *job;
131 HRESULT hres;
132 hres = CoCreateInstance(&CLSID_BackgroundCopyManager, NULL,
133 CLSCTX_LOCAL_SERVER, &IID_IBackgroundCopyManager,
134 (void **) &manager);
135 ok(hres == S_OK, "got 0x%08x\n", hres);
136
137 MultiByteToWideChar(CP_ACP, 0, secretA, -1, secretW, MAX_PATH);
138 hres = IBackgroundCopyManager_CreateJob(manager, secretW,
139 BG_JOB_TYPE_DOWNLOAD, &id, &job);
140 ok(hres == S_OK, "CreateJob in child process\n");
141 IBackgroundCopyJob_Release(job);
142 IBackgroundCopyManager_Release(manager);
143 }
144
145 static void test_globalness(void)
146 {
147 static const WCHAR format[] = {'t','e','s','t','_','%','u', 0};
148 WCHAR secretName[MAX_PATH];
149 IEnumBackgroundCopyJobs* enumJobs;
150 IBackgroundCopyManager *manager = NULL;
151 HRESULT hres;
152 hres = CoCreateInstance(&CLSID_BackgroundCopyManager, NULL,
153 CLSCTX_LOCAL_SERVER, &IID_IBackgroundCopyManager,
154 (void **) &manager);
155 ok(hres == S_OK, "got 0x%08x\n", hres);
156
157 wsprintfW(secretName, format, GetTickCount());
158 run_child(secretName);
159
160 hres = IBackgroundCopyManager_EnumJobs(manager, 0, &enumJobs);
161 ok(hres == S_OK, "EnumJobs failed: %08x\n", hres);
162 if(hres != S_OK)
163 skip("Unable to create job enumerator.\n");
164 else
165 {
166 ULONG i, n;
167 IBackgroundCopyJob *job;
168 BOOL found = FALSE;
169
170 hres = IEnumBackgroundCopyJobs_GetCount(enumJobs, &n);
171 ok(hres == S_OK, "GetCount failed: %08x\n", hres);
172 for (i = 0; i < n && !found; ++i)
173 {
174 LPWSTR name;
175 IEnumBackgroundCopyJobs_Next(enumJobs, 1, &job, NULL);
176 IBackgroundCopyJob_GetDisplayName(job, &name);
177 if (lstrcmpW(name, secretName) == 0)
178 found = TRUE;
179 CoTaskMemFree(name);
180 IBackgroundCopyJob_Release(job);
181 }
182
183 IEnumBackgroundCopyJobs_Release(enumJobs);
184 ok(found, "Adding a job in another process failed\n");
185 }
186
187 IBackgroundCopyManager_Release(manager);
188 }
189
190 START_TEST(qmgr)
191 {
192 char **argv;
193 int argc = winetest_get_mainargs(&argv);
194 MultiByteToWideChar(CP_ACP, 0, argv[0], -1, progname, MAX_PATH);
195
196 CoInitialize(NULL);
197
198 if (FAILED(test_create_manager()))
199 {
200 win_skip("Failed to create Manager instance, skipping tests\n");
201 CoUninitialize();
202 return;
203 }
204
205 if (argc == 3)
206 do_child(argv[2]);
207 else
208 {
209 test_CreateJob();
210 test_EnumJobs();
211 test_globalness();
212 }
213 CoUninitialize();
214 }