xref: /reactos/modules/rostests/winetests/qmgr/qmgr.c (revision d5399189)
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 }
215