Module: wine Branch: master Commit: c559895ce901dc9edc69f851309d9d4687728ddd URL: http://source.winehq.org/git/wine.git/?a=commit;h=c559895ce901dc9edc69f85130...
Author: Paul Vriens paul.vriens.wine@gmail.com Date: Mon Sep 1 12:16:41 2008 +0200
msi/tests: Create a system restore point when needed.
---
dlls/msi/tests/install.c | 59 ++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 54 insertions(+), 5 deletions(-)
diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c index e335cfa..3ff3420 100644 --- a/dlls/msi/tests/install.c +++ b/dlls/msi/tests/install.c @@ -29,6 +29,7 @@ #include <msi.h> #include <fci.h> #include <objidl.h> +#include <srrestoreptapi.h>
#include "wine/test.h"
@@ -39,6 +40,10 @@ static UINT (WINAPI *pMsiSourceListEnumSourcesA) static UINT (WINAPI *pMsiSourceListGetInfoA) (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD);
+static HMODULE hsrclient = 0; +static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD); +static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA*, STATEMGRSTATUS*); + static const char *msifile = "msitest.msi"; static const char *msifile2 = "winetest2.msi"; static const char *mstfile = "winetest.mst"; @@ -1271,14 +1276,18 @@ static void init_functionpointers(void) { HMODULE hmsi = GetModuleHandleA("msi.dll");
-#define GET_PROC(func) \ - p ## func = (void*)GetProcAddress(hmsi, #func); \ +#define GET_PROC(mod, func) \ + p ## func = (void*)GetProcAddress(mod, #func); \ if(!p ## func) \ trace("GetProcAddress(%s) failed\n", #func);
- GET_PROC(MsiQueryComponentStateA); - GET_PROC(MsiSourceListEnumSourcesA); - GET_PROC(MsiSourceListGetInfoA); + GET_PROC(hmsi, MsiQueryComponentStateA); + GET_PROC(hmsi, MsiSourceListEnumSourcesA); + GET_PROC(hmsi, MsiSourceListGetInfoA); + + hsrclient = LoadLibraryA("srclient.dll"); + GET_PROC(hsrclient, SRRemoveRestorePoint); + GET_PROC(hsrclient, SRSetRestorePointA);
#undef GET_PROC } @@ -1618,6 +1627,27 @@ static void check_service_is_installed(void) CloseServiceHandle(scm); }
+static BOOL notify_system_change(DWORD event_type, STATEMGRSTATUS *status) +{ + RESTOREPOINTINFOA spec; + + spec.dwEventType = event_type; + spec.dwRestorePtType = APPLICATION_INSTALL; + spec.llSequenceNumber = status->llSequenceNumber; + lstrcpyA(spec.szDescription, "msitest restore point"); + + return pSRSetRestorePointA(&spec, status); +} + +static void remove_restore_point(DWORD seq_number) +{ + DWORD res; + + res = pSRRemoveRestorePoint(seq_number); + if (res != ERROR_SUCCESS) + trace("Failed to remove the restore point : %08x\n", res); +} + static void test_MsiInstallProduct(void) { UINT r; @@ -5402,6 +5432,8 @@ START_TEST(install) { DWORD len; char temp_path[MAX_PATH], prev_path[MAX_PATH]; + STATEMGRSTATUS status; + BOOL ret = FALSE;
init_functionpointers();
@@ -5417,6 +5449,15 @@ START_TEST(install)
get_program_files_dir(PROG_FILES_DIR, COMMON_FILES_DIR);
+ /* Create a restore point ourselves so we circumvent the multitude of restore points + * that would have been created by all the installation and removal tests. + */ + if (pSRSetRestorePointA) + { + memset(&status, 0, sizeof(status)); + ret = notify_system_change(BEGIN_NESTED_SYSTEM_CHANGE, &status); + } + test_MsiInstallProduct(); test_MsiSetComponentState(); test_packagecoltypes(); @@ -5453,5 +5494,13 @@ START_TEST(install) test_MsiConfigureProductEx(); test_missingcomponent();
+ if (pSRSetRestorePointA && ret) + { + ret = notify_system_change(END_NESTED_SYSTEM_CHANGE, &status); + if (ret) + remove_restore_point(status.llSequenceNumber); + } + FreeLibrary(hsrclient); + SetCurrentDirectoryA(prev_path); }