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