| /* |
| * Unit test suite for Enum Background Copy Files Interface |
| * |
| * Copyright 2007, 2008 Google (Roy Shea, Dan Hipschman) |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #include <shlwapi.h> |
| #include <stdio.h> |
| |
| #define COBJMACROS |
| |
| #include "wine/test.h" |
| #include "initguid.h" |
| #include "bits.h" |
| |
| /* Globals used by many tests */ |
| #define NUM_FILES 2 /* At least two. */ |
| static const WCHAR test_remoteNameA[] = {'r','e','m','o','t','e','A', 0}; |
| static const WCHAR test_localNameA[] = {'l','o','c','a','l','A', 0}; |
| static const WCHAR test_remoteNameB[] = {'r','e','m','o','t','e','B', 0}; |
| static const WCHAR test_localNameB[] = {'l','o','c','a','l','B', 0}; |
| static const WCHAR test_displayName[] = {'T', 'e', 's', 't', 0}; |
| static const ULONG test_fileCount = NUM_FILES; |
| static IBackgroundCopyJob *test_job; |
| static IBackgroundCopyManager *test_manager; |
| static IEnumBackgroundCopyFiles *test_enumFiles; |
| |
| /* Helper function to add a file to a job. The helper function takes base |
| file name and creates properly formed path and URL strings for creation of |
| the file. */ |
| static HRESULT addFileHelper(IBackgroundCopyJob* job, |
| const WCHAR *localName, const WCHAR *remoteName) |
| { |
| DWORD urlSize; |
| WCHAR localFile[MAX_PATH]; |
| WCHAR remoteUrl[MAX_PATH]; |
| WCHAR remoteFile[MAX_PATH]; |
| |
| GetCurrentDirectoryW(MAX_PATH, localFile); |
| PathAppendW(localFile, localName); |
| GetCurrentDirectoryW(MAX_PATH, remoteFile); |
| PathAppendW(remoteFile, remoteName); |
| urlSize = MAX_PATH; |
| UrlCreateFromPathW(remoteFile, remoteUrl, &urlSize, 0); |
| UrlUnescapeW(remoteUrl, NULL, &urlSize, URL_UNESCAPE_INPLACE); |
| return IBackgroundCopyJob_AddFile(job, remoteUrl, localFile); |
| } |
| |
| static HRESULT test_create_manager(void) |
| { |
| HRESULT hres; |
| IBackgroundCopyManager *manager = NULL; |
| |
| /* Creating BITS instance */ |
| hres = CoCreateInstance(&CLSID_BackgroundCopyManager, NULL, CLSCTX_LOCAL_SERVER, |
| &IID_IBackgroundCopyManager, (void **) &manager); |
| |
| if(hres == HRESULT_FROM_WIN32(ERROR_SERVICE_DISABLED)) { |
| win_skip("Needed Service is disabled\n"); |
| return hres; |
| } |
| |
| if (hres == S_OK) |
| { |
| IBackgroundCopyJob *job; |
| GUID jobId; |
| |
| hres = IBackgroundCopyManager_CreateJob(manager, test_displayName, BG_JOB_TYPE_DOWNLOAD, &jobId, &job); |
| if (hres == S_OK) |
| { |
| hres = addFileHelper(job, test_localNameA, test_remoteNameA); |
| if (hres != S_OK) |
| win_skip("AddFile() with file:// protocol failed. Tests will be skipped.\n"); |
| IBackgroundCopyJob_Release(job); |
| } |
| IBackgroundCopyManager_Release(manager); |
| } |
| |
| return hres; |
| } |
| |
| /* Generic test setup */ |
| static BOOL setup(void) |
| { |
| HRESULT hres; |
| GUID test_jobId; |
| |
| hres = CoCreateInstance(&CLSID_BackgroundCopyManager, NULL, |
| CLSCTX_LOCAL_SERVER, &IID_IBackgroundCopyManager, |
| (void **) &test_manager); |
| if(hres != S_OK) |
| return FALSE; |
| |
| hres = IBackgroundCopyManager_CreateJob(test_manager, test_displayName, |
| BG_JOB_TYPE_DOWNLOAD, &test_jobId, |
| &test_job); |
| if(hres != S_OK) |
| { |
| IBackgroundCopyManager_Release(test_manager); |
| return FALSE; |
| } |
| |
| if (addFileHelper(test_job, test_localNameA, test_remoteNameA) != S_OK |
| || addFileHelper(test_job, test_localNameB, test_remoteNameB) != S_OK |
| || IBackgroundCopyJob_EnumFiles(test_job, &test_enumFiles) != S_OK) |
| { |
| IBackgroundCopyJob_Release(test_job); |
| IBackgroundCopyManager_Release(test_manager); |
| return FALSE; |
| } |
| |
| return TRUE; |
| } |
| |
| /* Generic test cleanup */ |
| static void teardown(void) |
| { |
| IEnumBackgroundCopyFiles_Release(test_enumFiles); |
| IBackgroundCopyJob_Release(test_job); |
| IBackgroundCopyManager_Release(test_manager); |
| } |
| |
| /* Test GetCount */ |
| static void test_GetCount(void) |
| { |
| HRESULT hres; |
| ULONG fileCount; |
| |
| hres = IEnumBackgroundCopyFiles_GetCount(test_enumFiles, &fileCount); |
| ok(hres == S_OK, "GetCount failed: %08x\n", hres); |
| ok(fileCount == test_fileCount, "Got incorrect count\n"); |
| } |
| |
| /* Test Next with a NULL pceltFetched*/ |
| static void test_Next_walkListNull(void) |
| { |
| HRESULT hres; |
| IBackgroundCopyFile *file; |
| ULONG i; |
| |
| /* Fetch the available files */ |
| for (i = 0; i < test_fileCount; i++) |
| { |
| hres = IEnumBackgroundCopyFiles_Next(test_enumFiles, 1, &file, NULL); |
| ok(hres == S_OK, "Next failed: %08x\n", hres); |
| IBackgroundCopyFile_Release(file); |
| } |
| |
| /* Attempt to fetch one more than the number of available files */ |
| hres = IEnumBackgroundCopyFiles_Next(test_enumFiles, 1, &file, NULL); |
| ok(hres == S_FALSE, "Next off end of available files failed: %08x\n", hres); |
| } |
| |
| /* Test Next by requesting one file at a time */ |
| static void test_Next_walkList_1(void) |
| { |
| HRESULT hres; |
| IBackgroundCopyFile *file; |
| ULONG fetched; |
| ULONG i; |
| |
| /* Fetch the available files */ |
| for (i = 0; i < test_fileCount; i++) |
| { |
| file = NULL; |
| fetched = 0; |
| hres = IEnumBackgroundCopyFiles_Next(test_enumFiles, 1, &file, &fetched); |
| ok(hres == S_OK, "Next failed: %08x\n", hres); |
| ok(fetched == 1, "Next returned the incorrect number of files: %08x\n", hres); |
| ok(file != NULL, "Next returned NULL\n"); |
| if (file) |
| IBackgroundCopyFile_Release(file); |
| } |
| |
| /* Attempt to fetch one more than the number of available files */ |
| fetched = 0; |
| hres = IEnumBackgroundCopyFiles_Next(test_enumFiles, 1, &file, &fetched); |
| ok(hres == S_FALSE, "Next off end of available files failed: %08x\n", hres); |
| ok(fetched == 0, "Next returned the incorrect number of files: %08x\n", hres); |
| } |
| |
| /* Test Next by requesting multiple files at a time */ |
| static void test_Next_walkList_2(void) |
| { |
| HRESULT hres; |
| IBackgroundCopyFile *files[NUM_FILES]; |
| ULONG fetched; |
| ULONG i; |
| |
| for (i = 0; i < test_fileCount; i++) |
| files[i] = NULL; |
| |
| fetched = 0; |
| hres = IEnumBackgroundCopyFiles_Next(test_enumFiles, test_fileCount, files, &fetched); |
| ok(hres == S_OK, "Next failed: %08x\n", hres); |
| ok(fetched == test_fileCount, "Next returned the incorrect number of files: %08x\n", hres); |
| |
| for (i = 0; i < test_fileCount; i++) |
| { |
| ok(files[i] != NULL, "Next returned NULL\n"); |
| if (files[i]) |
| IBackgroundCopyFile_Release(files[i]); |
| } |
| } |
| |
| /* Test Next Error conditions */ |
| static void test_Next_errors(void) |
| { |
| HRESULT hres; |
| IBackgroundCopyFile *files[NUM_FILES]; |
| |
| /* E_INVALIDARG: pceltFetched can ONLY be NULL if celt is 1 */ |
| hres = IEnumBackgroundCopyFiles_Next(test_enumFiles, 2, files, NULL); |
| ok(hres == E_INVALIDARG, "Invalid call to Next succeeded: %08x\n", hres); |
| } |
| |
| /* Test skipping through the files in a list */ |
| static void test_Skip_walkList(void) |
| { |
| HRESULT hres; |
| ULONG i; |
| |
| for (i = 0; i < test_fileCount; i++) |
| { |
| hres = IEnumBackgroundCopyFiles_Skip(test_enumFiles, 1); |
| ok(hres == S_OK, "Skip failed: %08x\n", hres); |
| } |
| |
| hres = IEnumBackgroundCopyFiles_Skip(test_enumFiles, 1); |
| ok(hres == S_FALSE, "Skip expected end of list: %08x\n", hres); |
| } |
| |
| /* Test skipping off the end of the list */ |
| static void test_Skip_offEnd(void) |
| { |
| HRESULT hres; |
| |
| hres = IEnumBackgroundCopyFiles_Skip(test_enumFiles, test_fileCount + 1); |
| ok(hres == S_FALSE, "Skip expected end of list: %08x\n", hres); |
| } |
| |
| /* Test resetting the file enumerator */ |
| static void test_Reset(void) |
| { |
| HRESULT hres; |
| |
| hres = IEnumBackgroundCopyFiles_Skip(test_enumFiles, test_fileCount); |
| ok(hres == S_OK, "Skip failed: %08x\n", hres); |
| hres = IEnumBackgroundCopyFiles_Reset(test_enumFiles); |
| ok(hres == S_OK, "Reset failed: %08x\n", hres); |
| hres = IEnumBackgroundCopyFiles_Skip(test_enumFiles, test_fileCount); |
| ok(hres == S_OK, "Reset failed: %08x\n", hres); |
| } |
| |
| typedef void (*test_t)(void); |
| |
| START_TEST(enum_files) |
| { |
| static const test_t tests[] = { |
| test_GetCount, |
| test_Next_walkListNull, |
| test_Next_walkList_1, |
| test_Next_walkList_2, |
| test_Next_errors, |
| test_Skip_walkList, |
| test_Skip_offEnd, |
| test_Reset, |
| 0 |
| }; |
| const test_t *test; |
| int i; |
| |
| CoInitialize(NULL); |
| |
| if (FAILED(test_create_manager())) |
| { |
| CoUninitialize(); |
| win_skip("Failed to create Manager instance, skipping tests\n"); |
| return; |
| } |
| |
| for (test = tests, i = 0; *test; ++test, ++i) |
| { |
| /* Keep state separate between tests. */ |
| if (!setup()) |
| { |
| ok(0, "tests:%d: Unable to setup test\n", i); |
| break; |
| } |
| (*test)(); |
| teardown(); |
| } |
| CoUninitialize(); |
| } |