Module: wine Branch: master Commit: ef7d16c8168a511a35e0547a2b364198026e507d URL: http://source.winehq.org/git/wine.git/?a=commit;h=ef7d16c8168a511a35e0547a2b...
Author: James Hawkins truiken@gmail.com Date: Sun Nov 25 17:57:37 2007 -0600
msi: Add tests for MsiGetFileHash and clean up the existing tests.
---
dlls/msi/tests/msi.c | 130 ++++++++++++++++++++++++++++++++++---------------- 1 files changed, 89 insertions(+), 41 deletions(-)
diff --git a/dlls/msi/tests/msi.c b/dlls/msi/tests/msi.c index 446f497..40de221 100644 --- a/dlls/msi/tests/msi.c +++ b/dlls/msi/tests/msi.c @@ -28,17 +28,12 @@
#include "wine/test.h"
-typedef struct test_MSIFILEHASHINFO { - ULONG dwFileHashInfoSize; - ULONG dwData[4]; -} test_MSIFILEHASHINFO, *test_PMSIFILEHASHINFO; - static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
static INSTALLSTATE (WINAPI *pMsiGetComponentPathA) (LPCSTR, LPCSTR, LPSTR, DWORD*); static UINT (WINAPI *pMsiGetFileHashA) - (LPCSTR, DWORD, test_PMSIFILEHASHINFO); + (LPCSTR, DWORD, PMSIFILEHASHINFO); static UINT (WINAPI *pMsiOpenPackageExA) (LPCSTR, DWORD, MSIHANDLE*); static UINT (WINAPI *pMsiOpenPackageExW) @@ -229,58 +224,111 @@ static void test_getcomponentpath(void) ok( r == INSTALLSTATE_UNKNOWN, "wrong return value\n"); }
-static void test_filehash(void) +static void create_file(LPCSTR name, LPCSTR data, DWORD size) +{ + HANDLE file; + DWORD written; + + file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + ok(file != INVALID_HANDLE_VALUE, "Failure to open file %s\n", name); + WriteFile(file, data, strlen(data), &written, NULL); + + if (size) + { + SetFilePointer(file, size, NULL, FILE_BEGIN); + SetEndOfFile(file); + } + + CloseHandle(file); +} + +#define HASHSIZE sizeof(MSIFILEHASHINFO) + +static const struct +{ + LPCSTR data; + DWORD size; + MSIFILEHASHINFO hash; +} hash_data[] = +{ + { "abc", 0, + { HASHSIZE, + { 0x98500190, 0xb04fd23c, 0x7d3f96d6, 0x727fe128 }, + }, + }, + + { "C:\Program Files\msitest\caesar\n", 0, + { HASHSIZE, + { 0x2b566794, 0xfd42181b, 0x2514d6e4, 0x5768b4e2 }, + }, + }, + + { "C:\Program Files\msitest\caesar\n", 500, + { HASHSIZE, + { 0x58095058, 0x805efeff, 0x10f3483e, 0x0147d653 }, + }, + }, +}; + +static void test_MsiGetFileHash(void) { const char name[] = "msitest.bin"; - const char data[] = {'a','b','c'}; - HANDLE handle; UINT r; - test_MSIFILEHASHINFO hash; - DWORD count = 0; + MSIFILEHASHINFO hash; + DWORD i;
if (!pMsiGetFileHashA) + { + skip("MsiGetFileHash not implemented."); return; + }
- DeleteFile(name); + hash.dwFileHashInfoSize = sizeof(MSIFILEHASHINFO);
- memset(&hash, 0, sizeof hash); - r = pMsiGetFileHashA(name, 0, &hash); - ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r); + /* szFilePath is NULL */ + r = pMsiGetFileHashA(NULL, 0, &hash); + todo_wine + { + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + }
- r = pMsiGetFileHashA(name, 0, NULL); - ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r); + /* szFilePath is empty */ + r = pMsiGetFileHashA("", 0, &hash); + todo_wine + { + ok(r == ERROR_PATH_NOT_FOUND, "Expected ERROR_PATH_NOT_FOUND, got %d\n", r); + }
- memset(&hash, 0, sizeof hash); - hash.dwFileHashInfoSize = sizeof hash; + /* szFilePath is nonexistent */ r = pMsiGetFileHashA(name, 0, &hash); - ok( r == ERROR_FILE_NOT_FOUND, "wrong error %d\n", r); - - handle = CreateFile(name, GENERIC_READ|GENERIC_WRITE, 0, NULL, - CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL); - ok(handle != INVALID_HANDLE_VALUE, "failed to create file\n"); + ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", r);
- WriteFile(handle, data, sizeof data, &count, NULL); - CloseHandle(handle); + /* dwOptions is non-zero */ + r = pMsiGetFileHashA(name, 1, &hash); + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
- memset(&hash, 0, sizeof hash); + /* pHash.dwFileHashInfoSize is not correct */ + hash.dwFileHashInfoSize = 0; r = pMsiGetFileHashA(name, 0, &hash); - ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r); + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
- memset(&hash, 0, sizeof hash); - hash.dwFileHashInfoSize = sizeof hash; - r = pMsiGetFileHashA(name, 1, &hash); - ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r); + /* pHash is NULL */ + r = pMsiGetFileHashA(name, 0, NULL); + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
- r = pMsiGetFileHashA(name, 0, &hash); - ok( r == ERROR_SUCCESS, "wrong error %d\n", r); + for (i = 0; i < sizeof(hash_data) / sizeof(hash_data[0]); i++) + { + create_file(name, hash_data[i].data, hash_data[i].size);
- ok(hash.dwFileHashInfoSize == sizeof hash, "hash size changed\n"); - ok(hash.dwData[0] == 0x98500190 && - hash.dwData[1] == 0xb04fd23c && - hash.dwData[2] == 0x7d3f96d6 && - hash.dwData[3] == 0x727fe128, "hash of abc incorrect\n"); + memset(&hash, 0, sizeof(MSIFILEHASHINFO)); + hash.dwFileHashInfoSize = sizeof(MSIFILEHASHINFO);
- DeleteFile(name); + r = pMsiGetFileHashA(name, 0, &hash); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!memcmp(&hash, &hash_data[i].hash, HASHSIZE), "Hash incorrect\n"); + + DeleteFile(name); + } }
/* copied from dlls/msi/registry.c */ @@ -941,7 +989,7 @@ START_TEST(msi) test_usefeature(); test_null(); test_getcomponentpath(); - test_filehash(); + test_MsiGetFileHash(); test_MsiQueryProductState(); test_MsiQueryFeatureState(); test_MsiQueryComponentState();