/* * 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 #include #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(); }