diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-04-22 16:56:21 -0500 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-04-23 15:40:21 -0500 |
| commit | a981e29d7a3df566754356c3fe1eb938a5cac4c1 (patch) | |
| tree | 9d2b2abac872ae3c4917003812951e68b72e7163 /src | |
| parent | 72e20f682c0d64102e86439ba5527dd0d71932ae (diff) | |
| download | wix-a981e29d7a3df566754356c3fe1eb938a5cac4c1.tar.gz wix-a981e29d7a3df566754356c3fe1eb938a5cac4c1.tar.bz2 wix-a981e29d7a3df566754356c3fe1eb938a5cac4c1.zip | |
Make the estimated size in ARP a little more accurate.
Fixes 4039
Diffstat (limited to 'src')
| -rw-r--r-- | src/burn/engine/apply.cpp | 43 | ||||
| -rw-r--r-- | src/burn/engine/elevation.cpp | 10 | ||||
| -rw-r--r-- | src/burn/engine/elevation.h | 1 | ||||
| -rw-r--r-- | src/burn/engine/plan.cpp | 26 | ||||
| -rw-r--r-- | src/burn/engine/plan.h | 2 | ||||
| -rw-r--r-- | src/burn/engine/registration.cpp | 61 | ||||
| -rw-r--r-- | src/burn/engine/registration.h | 1 | ||||
| -rw-r--r-- | src/burn/test/BurnUnitTest/PlanTest.cpp | 25 | ||||
| -rw-r--r-- | src/burn/test/BurnUnitTest/RegistrationTest.cpp | 42 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/regutil.cpp | 5 | ||||
| -rw-r--r-- | src/test/burn/TestBA/TestBA.cs | 17 | ||||
| -rw-r--r-- | src/test/burn/WixTestTools/BundleVerifier.cs | 4 | ||||
| -rw-r--r-- | src/test/burn/WixToolsetTest.BurnE2E/BasicFunctionalityTests.cs | 3 | ||||
| -rw-r--r-- | src/test/burn/WixToolsetTest.BurnE2E/CacheTests.cs | 8 | ||||
| -rw-r--r-- | src/test/burn/WixToolsetTest.BurnE2E/MsiTransactionTests.cs | 8 | ||||
| -rw-r--r-- | src/test/burn/WixToolsetTest.BurnE2E/RegistrationTests.cs | 29 | ||||
| -rw-r--r-- | src/test/burn/WixToolsetTest.BurnE2E/TestBAController.cs | 5 |
17 files changed, 177 insertions, 113 deletions
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp index 9ee7b58c..69106f65 100644 --- a/src/burn/engine/apply.cpp +++ b/src/burn/engine/apply.cpp | |||
| @@ -79,7 +79,8 @@ static HRESULT WINAPI AuthenticationRequired( | |||
| 79 | static void CalculateKeepRegistration( | 79 | static void CalculateKeepRegistration( |
| 80 | __in BURN_ENGINE_STATE* pEngineState, | 80 | __in BURN_ENGINE_STATE* pEngineState, |
| 81 | __in BOOL fLog, | 81 | __in BOOL fLog, |
| 82 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType | 82 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType, |
| 83 | __inout DWORD64* pqwEstimatedSize | ||
| 83 | ); | 84 | ); |
| 84 | static HRESULT ExecuteDependentRegistrationActions( | 85 | static HRESULT ExecuteDependentRegistrationActions( |
| 85 | __in HANDLE hPipe, | 86 | __in HANDLE hPipe, |
| @@ -422,8 +423,9 @@ extern "C" HRESULT ApplyRegister( | |||
| 422 | HRESULT hr = S_OK; | 423 | HRESULT hr = S_OK; |
| 423 | LPWSTR sczEngineWorkingPath = NULL; | 424 | LPWSTR sczEngineWorkingPath = NULL; |
| 424 | BOOTSTRAPPER_REGISTRATION_TYPE registrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; | 425 | BOOTSTRAPPER_REGISTRATION_TYPE registrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; |
| 426 | DWORD64 qwEstimatedSize = 0; | ||
| 425 | 427 | ||
| 426 | CalculateKeepRegistration(pEngineState, FALSE, ®istrationType); | 428 | CalculateKeepRegistration(pEngineState, FALSE, ®istrationType, &qwEstimatedSize); |
| 427 | 429 | ||
| 428 | hr = UserExperienceOnRegisterBegin(&pEngineState->userExperience, ®istrationType); | 430 | hr = UserExperienceOnRegisterBegin(&pEngineState->userExperience, ®istrationType); |
| 429 | ExitOnRootFailure(hr, "BA aborted register begin."); | 431 | ExitOnRootFailure(hr, "BA aborted register begin."); |
| @@ -451,12 +453,12 @@ extern "C" HRESULT ApplyRegister( | |||
| 451 | // begin new session | 453 | // begin new session |
| 452 | if (pEngineState->registration.fPerMachine) | 454 | if (pEngineState->registration.fPerMachine) |
| 453 | { | 455 | { |
| 454 | hr = ElevationSessionBegin(pEngineState->companionConnection.hPipe, sczEngineWorkingPath, pEngineState->registration.sczResumeCommandLine, pEngineState->registration.fDisableResume, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, pEngineState->registration.fDetectedForeignProviderKeyBundleId, pEngineState->plan.qwEstimatedSize, registrationType); | 456 | hr = ElevationSessionBegin(pEngineState->companionConnection.hPipe, sczEngineWorkingPath, pEngineState->registration.sczResumeCommandLine, pEngineState->registration.fDisableResume, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, pEngineState->registration.fDetectedForeignProviderKeyBundleId, qwEstimatedSize, registrationType); |
| 455 | ExitOnFailure(hr, "Failed to begin registration session in per-machine process."); | 457 | ExitOnFailure(hr, "Failed to begin registration session in per-machine process."); |
| 456 | } | 458 | } |
| 457 | else | 459 | else |
| 458 | { | 460 | { |
| 459 | hr = RegistrationSessionBegin(sczEngineWorkingPath, &pEngineState->registration, &pEngineState->cache, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, pEngineState->plan.qwEstimatedSize, registrationType); | 461 | hr = RegistrationSessionBegin(sczEngineWorkingPath, &pEngineState->registration, &pEngineState->cache, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, qwEstimatedSize, registrationType); |
| 460 | ExitOnFailure(hr, "Failed to begin registration session."); | 462 | ExitOnFailure(hr, "Failed to begin registration session."); |
| 461 | } | 463 | } |
| 462 | } | 464 | } |
| @@ -491,6 +493,7 @@ extern "C" HRESULT ApplyUnregister( | |||
| 491 | BURN_RESUME_MODE resumeMode = BURN_RESUME_MODE_NONE; | 493 | BURN_RESUME_MODE resumeMode = BURN_RESUME_MODE_NONE; |
| 492 | BOOTSTRAPPER_REGISTRATION_TYPE defaultRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE; | 494 | BOOTSTRAPPER_REGISTRATION_TYPE defaultRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE; |
| 493 | BOOTSTRAPPER_REGISTRATION_TYPE registrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE; | 495 | BOOTSTRAPPER_REGISTRATION_TYPE registrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE; |
| 496 | DWORD64 qwEstimatedSize = 0; | ||
| 494 | 497 | ||
| 495 | // Calculate special cases for the resume mode. If a restart has been initiated, that trumps all other | 498 | // Calculate special cases for the resume mode. If a restart has been initiated, that trumps all other |
| 496 | // modes. If the user chose to suspend the install then we'll use that as the resume mode. | 499 | // modes. If the user chose to suspend the install then we'll use that as the resume mode. |
| @@ -513,7 +516,7 @@ extern "C" HRESULT ApplyUnregister( | |||
| 513 | defaultRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; | 516 | defaultRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; |
| 514 | } | 517 | } |
| 515 | 518 | ||
| 516 | CalculateKeepRegistration(pEngineState, TRUE, &defaultRegistrationType); | 519 | CalculateKeepRegistration(pEngineState, TRUE, &defaultRegistrationType, &qwEstimatedSize); |
| 517 | 520 | ||
| 518 | registrationType = defaultRegistrationType; | 521 | registrationType = defaultRegistrationType; |
| 519 | 522 | ||
| @@ -547,12 +550,12 @@ extern "C" HRESULT ApplyUnregister( | |||
| 547 | 550 | ||
| 548 | if (pEngineState->registration.fPerMachine) | 551 | if (pEngineState->registration.fPerMachine) |
| 549 | { | 552 | { |
| 550 | hr = ElevationSessionEnd(pEngineState->companionConnection.hPipe, resumeMode, restart, pEngineState->registration.fDetectedForeignProviderKeyBundleId, registrationType); | 553 | hr = ElevationSessionEnd(pEngineState->companionConnection.hPipe, resumeMode, restart, pEngineState->registration.fDetectedForeignProviderKeyBundleId, qwEstimatedSize, registrationType); |
| 551 | ExitOnFailure(hr, "Failed to end session in per-machine process."); | 554 | ExitOnFailure(hr, "Failed to end session in per-machine process."); |
| 552 | } | 555 | } |
| 553 | else | 556 | else |
| 554 | { | 557 | { |
| 555 | hr = RegistrationSessionEnd(&pEngineState->registration, &pEngineState->cache, &pEngineState->variables, &pEngineState->packages, resumeMode, restart, registrationType); | 558 | hr = RegistrationSessionEnd(&pEngineState->registration, &pEngineState->cache, &pEngineState->variables, &pEngineState->packages, resumeMode, restart, qwEstimatedSize, registrationType); |
| 556 | ExitOnFailure(hr, "Failed to end session in per-user process."); | 559 | ExitOnFailure(hr, "Failed to end session in per-user process."); |
| 557 | } | 560 | } |
| 558 | 561 | ||
| @@ -880,9 +883,12 @@ extern "C" void ApplyClean( | |||
| 880 | static void CalculateKeepRegistration( | 883 | static void CalculateKeepRegistration( |
| 881 | __in BURN_ENGINE_STATE* pEngineState, | 884 | __in BURN_ENGINE_STATE* pEngineState, |
| 882 | __in BOOL fLog, | 885 | __in BOOL fLog, |
| 883 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType | 886 | __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType, |
| 887 | __inout DWORD64* pqwEstimatedSize | ||
| 884 | ) | 888 | ) |
| 885 | { | 889 | { |
| 890 | DWORD64 qwEstimatedSize = pEngineState->section.qwBundleSize; | ||
| 891 | |||
| 886 | if (fLog) | 892 | if (fLog) |
| 887 | { | 893 | { |
| 888 | LogId(REPORT_STANDARD, MSG_POST_APPLY_CALCULATE_REGISTRATION); | 894 | LogId(REPORT_STANDARD, MSG_POST_APPLY_CALCULATE_REGISTRATION); |
| @@ -911,16 +917,29 @@ static void CalculateKeepRegistration( | |||
| 911 | { | 917 | { |
| 912 | *pRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL; | 918 | *pRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL; |
| 913 | 919 | ||
| 914 | if (!fLog) | 920 | if (BURN_PACKAGE_TYPE_MSP == pPackage->type) |
| 915 | { | 921 | { |
| 916 | break; | 922 | qwEstimatedSize += pPackage->qwSize; |
| 917 | } | 923 | } |
| 924 | |||
| 925 | qwEstimatedSize += pPackage->qwInstallSize; | ||
| 918 | } | 926 | } |
| 919 | else if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->cacheRegistrationState && BOOTSTRAPPER_REGISTRATION_TYPE_NONE == *pRegistrationType) | 927 | |
| 928 | if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->cacheRegistrationState) | ||
| 920 | { | 929 | { |
| 921 | *pRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; | 930 | if (BOOTSTRAPPER_REGISTRATION_TYPE_NONE == *pRegistrationType) |
| 931 | { | ||
| 932 | *pRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; | ||
| 933 | } | ||
| 934 | |||
| 935 | qwEstimatedSize += pPackage->qwSize; | ||
| 922 | } | 936 | } |
| 923 | } | 937 | } |
| 938 | |||
| 939 | if (pqwEstimatedSize) | ||
| 940 | { | ||
| 941 | *pqwEstimatedSize = qwEstimatedSize; | ||
| 942 | } | ||
| 924 | } | 943 | } |
| 925 | 944 | ||
| 926 | static HRESULT ExecuteDependentRegistrationActions( | 945 | static HRESULT ExecuteDependentRegistrationActions( |
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp index 56a62955..3305cf62 100644 --- a/src/burn/engine/elevation.cpp +++ b/src/burn/engine/elevation.cpp | |||
| @@ -636,6 +636,7 @@ extern "C" HRESULT ElevationSessionEnd( | |||
| 636 | __in BURN_RESUME_MODE resumeMode, | 636 | __in BURN_RESUME_MODE resumeMode, |
| 637 | __in BOOTSTRAPPER_APPLY_RESTART restart, | 637 | __in BOOTSTRAPPER_APPLY_RESTART restart, |
| 638 | __in BOOL fDetectedForeignProviderKeyBundleId, | 638 | __in BOOL fDetectedForeignProviderKeyBundleId, |
| 639 | __in DWORD64 qwEstimatedSize, | ||
| 639 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | 640 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType |
| 640 | ) | 641 | ) |
| 641 | { | 642 | { |
| @@ -654,6 +655,9 @@ extern "C" HRESULT ElevationSessionEnd( | |||
| 654 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)fDetectedForeignProviderKeyBundleId); | 655 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)fDetectedForeignProviderKeyBundleId); |
| 655 | ExitOnFailure(hr, "Failed to write dependency registration action to message buffer."); | 656 | ExitOnFailure(hr, "Failed to write dependency registration action to message buffer."); |
| 656 | 657 | ||
| 658 | hr = BuffWriteNumber64(&pbData, &cbData, qwEstimatedSize); | ||
| 659 | ExitOnFailure(hr, "Failed to write estimated size to message buffer."); | ||
| 660 | |||
| 657 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)registrationType); | 661 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)registrationType); |
| 658 | ExitOnFailure(hr, "Failed to write registration type to message buffer."); | 662 | ExitOnFailure(hr, "Failed to write registration type to message buffer."); |
| 659 | 663 | ||
| @@ -2580,6 +2584,7 @@ static HRESULT OnSessionEnd( | |||
| 2580 | SIZE_T iData = 0; | 2584 | SIZE_T iData = 0; |
| 2581 | DWORD dwResumeMode = 0; | 2585 | DWORD dwResumeMode = 0; |
| 2582 | DWORD dwRestart = 0; | 2586 | DWORD dwRestart = 0; |
| 2587 | DWORD64 qwEstimatedSize = 0; | ||
| 2583 | DWORD dwRegistrationType = 0; | 2588 | DWORD dwRegistrationType = 0; |
| 2584 | 2589 | ||
| 2585 | // Deserialize message data. | 2590 | // Deserialize message data. |
| @@ -2592,11 +2597,14 @@ static HRESULT OnSessionEnd( | |||
| 2592 | hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&pRegistration->fDetectedForeignProviderKeyBundleId); | 2597 | hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&pRegistration->fDetectedForeignProviderKeyBundleId); |
| 2593 | ExitOnFailure(hr, "Failed to read dependency registration action."); | 2598 | ExitOnFailure(hr, "Failed to read dependency registration action."); |
| 2594 | 2599 | ||
| 2600 | hr = BuffReadNumber64(pbData, cbData, &iData, &qwEstimatedSize); | ||
| 2601 | ExitOnFailure(hr, "Failed to read estimated size."); | ||
| 2602 | |||
| 2595 | hr = BuffReadNumber(pbData, cbData, &iData, &dwRegistrationType); | 2603 | hr = BuffReadNumber(pbData, cbData, &iData, &dwRegistrationType); |
| 2596 | ExitOnFailure(hr, "Failed to read dependency registration action."); | 2604 | ExitOnFailure(hr, "Failed to read dependency registration action."); |
| 2597 | 2605 | ||
| 2598 | // suspend session in per-machine process | 2606 | // suspend session in per-machine process |
| 2599 | hr = RegistrationSessionEnd(pRegistration, pCache, pVariables, pPackages, (BURN_RESUME_MODE)dwResumeMode, (BOOTSTRAPPER_APPLY_RESTART)dwRestart, (BOOTSTRAPPER_REGISTRATION_TYPE)dwRegistrationType); | 2607 | hr = RegistrationSessionEnd(pRegistration, pCache, pVariables, pPackages, (BURN_RESUME_MODE)dwResumeMode, (BOOTSTRAPPER_APPLY_RESTART)dwRestart, qwEstimatedSize, (BOOTSTRAPPER_REGISTRATION_TYPE)dwRegistrationType); |
| 2600 | ExitOnFailure(hr, "Failed to suspend registration session."); | 2608 | ExitOnFailure(hr, "Failed to suspend registration session."); |
| 2601 | 2609 | ||
| 2602 | LExit: | 2610 | LExit: |
diff --git a/src/burn/engine/elevation.h b/src/burn/engine/elevation.h index 3484057e..a74b6027 100644 --- a/src/burn/engine/elevation.h +++ b/src/burn/engine/elevation.h | |||
| @@ -44,6 +44,7 @@ HRESULT ElevationSessionEnd( | |||
| 44 | __in BURN_RESUME_MODE resumeMode, | 44 | __in BURN_RESUME_MODE resumeMode, |
| 45 | __in BOOTSTRAPPER_APPLY_RESTART restart, | 45 | __in BOOTSTRAPPER_APPLY_RESTART restart, |
| 46 | __in BOOL fDetectedForeignProviderKeyBundleId, | 46 | __in BOOL fDetectedForeignProviderKeyBundleId, |
| 47 | __in DWORD64 qwEstimatedSize, | ||
| 47 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | 48 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType |
| 48 | ); | 49 | ); |
| 49 | HRESULT ElevationSaveState( | 50 | HRESULT ElevationSaveState( |
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp index 47da22c0..68c1d2ba 100644 --- a/src/burn/engine/plan.cpp +++ b/src/burn/engine/plan.cpp | |||
| @@ -1178,31 +1178,6 @@ extern "C" HRESULT PlanExecutePackage( | |||
| 1178 | pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE; | 1178 | pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE; |
| 1179 | } | 1179 | } |
| 1180 | 1180 | ||
| 1181 | // Add the cache and install size to estimated size if it will be on the machine at the end of the install | ||
| 1182 | if (BOOTSTRAPPER_REQUEST_STATE_PRESENT == pPackage->requested || | ||
| 1183 | fRequestedCache || | ||
| 1184 | (BOOTSTRAPPER_PACKAGE_STATE_PRESENT == pPackage->currentState && BOOTSTRAPPER_REQUEST_STATE_ABSENT < pPackage->requested) | ||
| 1185 | ) | ||
| 1186 | { | ||
| 1187 | // If the package will remain in the cache, add the package size to the estimated size | ||
| 1188 | if (BOOTSTRAPPER_CACHE_TYPE_REMOVE < pPackage->cacheType) | ||
| 1189 | { | ||
| 1190 | pPlan->qwEstimatedSize += pPackage->qwSize; | ||
| 1191 | } | ||
| 1192 | |||
| 1193 | // If the package will end up installed on the machine, add the install size to the estimated size. | ||
| 1194 | if (BOOTSTRAPPER_REQUEST_STATE_CACHE < pPackage->requested) | ||
| 1195 | { | ||
| 1196 | // MSP packages get cached automatically by windows installer with any embedded cabs, so include that in the size as well | ||
| 1197 | if (BURN_PACKAGE_TYPE_MSP == pPackage->type) | ||
| 1198 | { | ||
| 1199 | pPlan->qwEstimatedSize += pPackage->qwSize; | ||
| 1200 | } | ||
| 1201 | |||
| 1202 | pPlan->qwEstimatedSize += pPackage->qwInstallSize; | ||
| 1203 | } | ||
| 1204 | } | ||
| 1205 | |||
| 1206 | // Add execute actions. | 1181 | // Add execute actions. |
| 1207 | switch (pPackage->type) | 1182 | switch (pPackage->type) |
| 1208 | { | 1183 | { |
| @@ -3079,7 +3054,6 @@ extern "C" void PlanDump( | |||
| 3079 | LogStringLine(PlanDumpLevel, " disallow-removal: %hs", LoggingTrueFalseToString(pPlan->fDisallowRemoval)); | 3054 | LogStringLine(PlanDumpLevel, " disallow-removal: %hs", LoggingTrueFalseToString(pPlan->fDisallowRemoval)); |
| 3080 | LogStringLine(PlanDumpLevel, " downgrade: %hs", LoggingTrueFalseToString(pPlan->fDowngrade)); | 3055 | LogStringLine(PlanDumpLevel, " downgrade: %hs", LoggingTrueFalseToString(pPlan->fDowngrade)); |
| 3081 | LogStringLine(PlanDumpLevel, " registration options: %hs", LoggingRegistrationOptionsToString(pPlan->dwRegistrationOperations)); | 3056 | LogStringLine(PlanDumpLevel, " registration options: %hs", LoggingRegistrationOptionsToString(pPlan->dwRegistrationOperations)); |
| 3082 | LogStringLine(PlanDumpLevel, " estimated size: %llu", pPlan->qwEstimatedSize); | ||
| 3083 | if (pPlan->sczLayoutDirectory) | 3057 | if (pPlan->sczLayoutDirectory) |
| 3084 | { | 3058 | { |
| 3085 | LogStringLine(PlanDumpLevel, " layout directory: %ls", pPlan->sczLayoutDirectory); | 3059 | LogStringLine(PlanDumpLevel, " layout directory: %ls", pPlan->sczLayoutDirectory); |
diff --git a/src/burn/engine/plan.h b/src/burn/engine/plan.h index fbb7a5a1..2b04e097 100644 --- a/src/burn/engine/plan.h +++ b/src/burn/engine/plan.h | |||
| @@ -267,8 +267,6 @@ typedef struct _BURN_PLAN | |||
| 267 | 267 | ||
| 268 | DWORD64 qwCacheSizeTotal; | 268 | DWORD64 qwCacheSizeTotal; |
| 269 | 269 | ||
| 270 | DWORD64 qwEstimatedSize; | ||
| 271 | |||
| 272 | DWORD cExecutePackagesTotal; | 270 | DWORD cExecutePackagesTotal; |
| 273 | DWORD cOverallProgressTicksTotal; | 271 | DWORD cOverallProgressTicksTotal; |
| 274 | 272 | ||
diff --git a/src/burn/engine/registration.cpp b/src/burn/engine/registration.cpp index 0ffbc89e..9953be83 100644 --- a/src/burn/engine/registration.cpp +++ b/src/burn/engine/registration.cpp | |||
| @@ -102,6 +102,10 @@ static HRESULT UpdateBundleNameRegistration( | |||
| 102 | __in HKEY hkRegistration, | 102 | __in HKEY hkRegistration, |
| 103 | __in BOOL fInProgressRegistration | 103 | __in BOOL fInProgressRegistration |
| 104 | ); | 104 | ); |
| 105 | static HRESULT UpdateEstimatedSize( | ||
| 106 | __in HKEY hkRegistration, | ||
| 107 | __in DWORD64 qwEstimatedSize | ||
| 108 | ); | ||
| 105 | static BOOL IsWuRebootPending(); | 109 | static BOOL IsWuRebootPending(); |
| 106 | static BOOL IsRegistryRebootPending(); | 110 | static BOOL IsRegistryRebootPending(); |
| 107 | 111 | ||
| @@ -600,8 +604,8 @@ extern "C" HRESULT RegistrationSessionBegin( | |||
| 600 | ) | 604 | ) |
| 601 | { | 605 | { |
| 602 | HRESULT hr = S_OK; | 606 | HRESULT hr = S_OK; |
| 603 | DWORD dwSize = 0; | ||
| 604 | HKEY hkRegistration = NULL; | 607 | HKEY hkRegistration = NULL; |
| 608 | BOOL fCreated = FALSE; | ||
| 605 | LPWSTR sczPublisher = NULL; | 609 | LPWSTR sczPublisher = NULL; |
| 606 | 610 | ||
| 607 | AssertSz(BOOTSTRAPPER_REGISTRATION_TYPE_NONE != registrationType, "Registration type can't be NONE"); | 611 | AssertSz(BOOTSTRAPPER_REGISTRATION_TYPE_NONE != registrationType, "Registration type can't be NONE"); |
| @@ -620,7 +624,7 @@ extern "C" HRESULT RegistrationSessionBegin( | |||
| 620 | } | 624 | } |
| 621 | 625 | ||
| 622 | // create registration key | 626 | // create registration key |
| 623 | hr = RegCreate(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_WRITE, &hkRegistration); | 627 | hr = RegCreateEx(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_WRITE, REG_KEY_DEFAULT, FALSE, NULL, &hkRegistration, &fCreated); |
| 624 | ExitOnFailure(hr, "Failed to create registration key."); | 628 | ExitOnFailure(hr, "Failed to create registration key."); |
| 625 | 629 | ||
| 626 | // Write any ARP values and software tags. | 630 | // Write any ARP values and software tags. |
| @@ -797,22 +801,12 @@ extern "C" HRESULT RegistrationSessionBegin( | |||
| 797 | ExitOnFailure(hr, "Failed to write update registration."); | 801 | ExitOnFailure(hr, "Failed to write update registration."); |
| 798 | } | 802 | } |
| 799 | 803 | ||
| 800 | // Update estimated size. | 804 | // Only set estimated size here for the first time. |
| 801 | qwEstimatedSize /= 1024; // Convert bytes to KB | 805 | // It will always get updated at the end of the session. |
| 802 | if (0 < qwEstimatedSize) | 806 | if (fCreated) |
| 803 | { | 807 | { |
| 804 | if (DWORD_MAX < qwEstimatedSize) | 808 | hr = UpdateEstimatedSize(hkRegistration, qwEstimatedSize); |
| 805 | { | 809 | ExitOnFailure(hr, "Failed to update estimated size."); |
| 806 | // ARP doesn't support QWORDs here | ||
| 807 | dwSize = DWORD_MAX; | ||
| 808 | } | ||
| 809 | else | ||
| 810 | { | ||
| 811 | dwSize = static_cast<DWORD>(qwEstimatedSize); | ||
| 812 | } | ||
| 813 | |||
| 814 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_ESTIMATED_SIZE, dwSize); | ||
| 815 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_ESTIMATED_SIZE); | ||
| 816 | } | 810 | } |
| 817 | 811 | ||
| 818 | // Register the bundle dependency key. | 812 | // Register the bundle dependency key. |
| @@ -879,6 +873,7 @@ extern "C" HRESULT RegistrationSessionEnd( | |||
| 879 | __in BURN_PACKAGES* pPackages, | 873 | __in BURN_PACKAGES* pPackages, |
| 880 | __in BURN_RESUME_MODE resumeMode, | 874 | __in BURN_RESUME_MODE resumeMode, |
| 881 | __in BOOTSTRAPPER_APPLY_RESTART restart, | 875 | __in BOOTSTRAPPER_APPLY_RESTART restart, |
| 876 | __in DWORD64 qwEstimatedSize, | ||
| 882 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | 877 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType |
| 883 | ) | 878 | ) |
| 884 | { | 879 | { |
| @@ -921,6 +916,9 @@ extern "C" HRESULT RegistrationSessionEnd( | |||
| 921 | // update display name | 916 | // update display name |
| 922 | hr = UpdateBundleNameRegistration(pRegistration, pVariables, hkRegistration, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS == registrationType); | 917 | hr = UpdateBundleNameRegistration(pRegistration, pVariables, hkRegistration, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS == registrationType); |
| 923 | ExitOnFailure(hr, "Failed to update name and publisher."); | 918 | ExitOnFailure(hr, "Failed to update name and publisher."); |
| 919 | |||
| 920 | hr = UpdateEstimatedSize(hkRegistration, qwEstimatedSize); | ||
| 921 | ExitOnFailure(hr, "Failed to update estimated size."); | ||
| 924 | } | 922 | } |
| 925 | 923 | ||
| 926 | // Update resume mode. | 924 | // Update resume mode. |
| @@ -1604,6 +1602,35 @@ LExit: | |||
| 1604 | return hr; | 1602 | return hr; |
| 1605 | } | 1603 | } |
| 1606 | 1604 | ||
| 1605 | static HRESULT UpdateEstimatedSize( | ||
| 1606 | __in HKEY hkRegistration, | ||
| 1607 | __in DWORD64 qwEstimatedSize | ||
| 1608 | ) | ||
| 1609 | { | ||
| 1610 | HRESULT hr = S_OK; | ||
| 1611 | DWORD dwSize = 0; | ||
| 1612 | |||
| 1613 | qwEstimatedSize /= 1024; // Convert bytes to KB | ||
| 1614 | if (0 < qwEstimatedSize) | ||
| 1615 | { | ||
| 1616 | if (DWORD_MAX < qwEstimatedSize) | ||
| 1617 | { | ||
| 1618 | // ARP doesn't support QWORDs here | ||
| 1619 | dwSize = DWORD_MAX; | ||
| 1620 | } | ||
| 1621 | else | ||
| 1622 | { | ||
| 1623 | dwSize = static_cast<DWORD>(qwEstimatedSize); | ||
| 1624 | } | ||
| 1625 | |||
| 1626 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_ESTIMATED_SIZE, dwSize); | ||
| 1627 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_ESTIMATED_SIZE); | ||
| 1628 | } | ||
| 1629 | |||
| 1630 | LExit: | ||
| 1631 | return hr; | ||
| 1632 | } | ||
| 1633 | |||
| 1607 | static BOOL IsWuRebootPending() | 1634 | static BOOL IsWuRebootPending() |
| 1608 | { | 1635 | { |
| 1609 | HRESULT hr = S_OK; | 1636 | HRESULT hr = S_OK; |
diff --git a/src/burn/engine/registration.h b/src/burn/engine/registration.h index c07be962..cb5349a3 100644 --- a/src/burn/engine/registration.h +++ b/src/burn/engine/registration.h | |||
| @@ -213,6 +213,7 @@ HRESULT RegistrationSessionEnd( | |||
| 213 | __in BURN_PACKAGES* pPackages, | 213 | __in BURN_PACKAGES* pPackages, |
| 214 | __in BURN_RESUME_MODE resumeMode, | 214 | __in BURN_RESUME_MODE resumeMode, |
| 215 | __in BOOTSTRAPPER_APPLY_RESTART restart, | 215 | __in BOOTSTRAPPER_APPLY_RESTART restart, |
| 216 | __in DWORD64 qwEstimatedSize, | ||
| 216 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | 217 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType |
| 217 | ); | 218 | ); |
| 218 | HRESULT RegistrationSaveState( | 219 | HRESULT RegistrationSaveState( |
diff --git a/src/burn/test/BurnUnitTest/PlanTest.cpp b/src/burn/test/BurnUnitTest/PlanTest.cpp index f69606a0..be078c5c 100644 --- a/src/burn/test/BurnUnitTest/PlanTest.cpp +++ b/src/burn/test/BurnUnitTest/PlanTest.cpp | |||
| @@ -106,7 +106,6 @@ namespace Bootstrapper | |||
| 106 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 14); | 106 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 14); |
| 107 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 107 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 108 | 108 | ||
| 109 | Assert::Equal(107082ull, pPlan->qwEstimatedSize); | ||
| 110 | Assert::Equal(522548ull, pPlan->qwCacheSizeTotal); | 109 | Assert::Equal(522548ull, pPlan->qwCacheSizeTotal); |
| 111 | 110 | ||
| 112 | fRollback = FALSE; | 111 | fRollback = FALSE; |
| @@ -252,7 +251,6 @@ namespace Bootstrapper | |||
| 252 | dwIndex = 0; | 251 | dwIndex = 0; |
| 253 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 252 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 254 | 253 | ||
| 255 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 256 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | 254 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); |
| 257 | 255 | ||
| 258 | fRollback = FALSE; | 256 | fRollback = FALSE; |
| @@ -392,7 +390,6 @@ namespace Bootstrapper | |||
| 392 | dwIndex = 0; | 390 | dwIndex = 0; |
| 393 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 391 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 394 | 392 | ||
| 395 | Assert::Equal(18575450ull, pPlan->qwEstimatedSize); | ||
| 396 | Assert::Equal(78462280ull, pPlan->qwCacheSizeTotal); | 393 | Assert::Equal(78462280ull, pPlan->qwCacheSizeTotal); |
| 397 | 394 | ||
| 398 | fRollback = FALSE; | 395 | fRollback = FALSE; |
| @@ -503,7 +500,6 @@ namespace Bootstrapper | |||
| 503 | dwIndex = 0; | 500 | dwIndex = 0; |
| 504 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 501 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 505 | 502 | ||
| 506 | Assert::Equal(18575450ull, pPlan->qwEstimatedSize); | ||
| 507 | Assert::Equal(52254105ull, pPlan->qwCacheSizeTotal); | 503 | Assert::Equal(52254105ull, pPlan->qwCacheSizeTotal); |
| 508 | 504 | ||
| 509 | fRollback = FALSE; | 505 | fRollback = FALSE; |
| @@ -595,7 +591,6 @@ namespace Bootstrapper | |||
| 595 | dwIndex = 0; | 591 | dwIndex = 0; |
| 596 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 592 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 597 | 593 | ||
| 598 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 599 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | 594 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); |
| 600 | 595 | ||
| 601 | fRollback = FALSE; | 596 | fRollback = FALSE; |
| @@ -703,7 +698,6 @@ namespace Bootstrapper | |||
| 703 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); | 698 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); |
| 704 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 699 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 705 | 700 | ||
| 706 | Assert::Equal(35694ull, pPlan->qwEstimatedSize); | ||
| 707 | Assert::Equal(168715ull, pPlan->qwCacheSizeTotal); | 701 | Assert::Equal(168715ull, pPlan->qwCacheSizeTotal); |
| 708 | 702 | ||
| 709 | fRollback = FALSE; | 703 | fRollback = FALSE; |
| @@ -823,7 +817,6 @@ namespace Bootstrapper | |||
| 823 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); | 817 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); |
| 824 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 818 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 825 | 819 | ||
| 826 | Assert::Equal(35694ull, pPlan->qwEstimatedSize); | ||
| 827 | Assert::Equal(168715ull, pPlan->qwCacheSizeTotal); | 820 | Assert::Equal(168715ull, pPlan->qwCacheSizeTotal); |
| 828 | 821 | ||
| 829 | fRollback = FALSE; | 822 | fRollback = FALSE; |
| @@ -924,7 +917,6 @@ namespace Bootstrapper | |||
| 924 | dwIndex = 0; | 917 | dwIndex = 0; |
| 925 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 918 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 926 | 919 | ||
| 927 | Assert::Equal(1463267ull, pPlan->qwEstimatedSize); | ||
| 928 | Assert::Equal(119695ull, pPlan->qwCacheSizeTotal); | 920 | Assert::Equal(119695ull, pPlan->qwCacheSizeTotal); |
| 929 | 921 | ||
| 930 | fRollback = FALSE; | 922 | fRollback = FALSE; |
| @@ -1021,7 +1013,6 @@ namespace Bootstrapper | |||
| 1021 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); | 1013 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); |
| 1022 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1014 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 1023 | 1015 | ||
| 1024 | Assert::Equal(33743ull, pPlan->qwEstimatedSize); | ||
| 1025 | Assert::Equal(168715ull, pPlan->qwCacheSizeTotal); | 1016 | Assert::Equal(168715ull, pPlan->qwCacheSizeTotal); |
| 1026 | 1017 | ||
| 1027 | fRollback = FALSE; | 1018 | fRollback = FALSE; |
| @@ -1104,7 +1095,6 @@ namespace Bootstrapper | |||
| 1104 | dwIndex = 0; | 1095 | dwIndex = 0; |
| 1105 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1096 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 1106 | 1097 | ||
| 1107 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 1108 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | 1098 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); |
| 1109 | 1099 | ||
| 1110 | fRollback = FALSE; | 1100 | fRollback = FALSE; |
| @@ -1180,7 +1170,6 @@ namespace Bootstrapper | |||
| 1180 | dwIndex = 0; | 1170 | dwIndex = 0; |
| 1181 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1171 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 1182 | 1172 | ||
| 1183 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 1184 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | 1173 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); |
| 1185 | 1174 | ||
| 1186 | fRollback = FALSE; | 1175 | fRollback = FALSE; |
| @@ -1273,7 +1262,6 @@ namespace Bootstrapper | |||
| 1273 | dwIndex = 0; | 1262 | dwIndex = 0; |
| 1274 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1263 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 1275 | 1264 | ||
| 1276 | Assert::Equal(35694ull, pPlan->qwEstimatedSize); | ||
| 1277 | Assert::Equal(175674ull, pPlan->qwCacheSizeTotal); | 1265 | Assert::Equal(175674ull, pPlan->qwCacheSizeTotal); |
| 1278 | 1266 | ||
| 1279 | fRollback = FALSE; | 1267 | fRollback = FALSE; |
| @@ -1371,7 +1359,6 @@ namespace Bootstrapper | |||
| 1371 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); | 1359 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); |
| 1372 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1360 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 1373 | 1361 | ||
| 1374 | Assert::Equal(35694ull, pPlan->qwEstimatedSize); | ||
| 1375 | Assert::Equal(168715ull, pPlan->qwCacheSizeTotal); | 1362 | Assert::Equal(168715ull, pPlan->qwCacheSizeTotal); |
| 1376 | 1363 | ||
| 1377 | fRollback = FALSE; | 1364 | fRollback = FALSE; |
| @@ -1473,7 +1460,6 @@ namespace Bootstrapper | |||
| 1473 | dwIndex = 0; | 1460 | dwIndex = 0; |
| 1474 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1461 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 1475 | 1462 | ||
| 1476 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 1477 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | 1463 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); |
| 1478 | 1464 | ||
| 1479 | fRollback = FALSE; | 1465 | fRollback = FALSE; |
| @@ -1553,7 +1539,6 @@ namespace Bootstrapper | |||
| 1553 | dwIndex = 0; | 1539 | dwIndex = 0; |
| 1554 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1540 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 1555 | 1541 | ||
| 1556 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 1557 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | 1542 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); |
| 1558 | 1543 | ||
| 1559 | fRollback = FALSE; | 1544 | fRollback = FALSE; |
| @@ -1649,7 +1634,6 @@ namespace Bootstrapper | |||
| 1649 | dwIndex = 0; | 1634 | dwIndex = 0; |
| 1650 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1635 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 1651 | 1636 | ||
| 1652 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 1653 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | 1637 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); |
| 1654 | 1638 | ||
| 1655 | fRollback = FALSE; | 1639 | fRollback = FALSE; |
| @@ -1720,7 +1704,6 @@ namespace Bootstrapper | |||
| 1720 | dwIndex = 0; | 1704 | dwIndex = 0; |
| 1721 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1705 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 1722 | 1706 | ||
| 1723 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 1724 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | 1707 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); |
| 1725 | 1708 | ||
| 1726 | fRollback = FALSE; | 1709 | fRollback = FALSE; |
| @@ -1805,7 +1788,6 @@ namespace Bootstrapper | |||
| 1805 | dwIndex = 0; | 1788 | dwIndex = 0; |
| 1806 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1789 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 1807 | 1790 | ||
| 1808 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 1809 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | 1791 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); |
| 1810 | 1792 | ||
| 1811 | fRollback = FALSE; | 1793 | fRollback = FALSE; |
| @@ -1906,7 +1888,6 @@ namespace Bootstrapper | |||
| 1906 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); | 1888 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); |
| 1907 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1889 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 1908 | 1890 | ||
| 1909 | Assert::Equal(56ull, pPlan->qwEstimatedSize); | ||
| 1910 | Assert::Equal(140ull, pPlan->qwCacheSizeTotal); | 1891 | Assert::Equal(140ull, pPlan->qwCacheSizeTotal); |
| 1911 | 1892 | ||
| 1912 | fRollback = FALSE; | 1893 | fRollback = FALSE; |
| @@ -2005,7 +1986,6 @@ namespace Bootstrapper | |||
| 2005 | dwIndex = 0; | 1986 | dwIndex = 0; |
| 2006 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 1987 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 2007 | 1988 | ||
| 2008 | Assert::Equal(3055111ull, pPlan->qwEstimatedSize); | ||
| 2009 | Assert::Equal(6130592ull, pPlan->qwCacheSizeTotal); | 1989 | Assert::Equal(6130592ull, pPlan->qwCacheSizeTotal); |
| 2010 | 1990 | ||
| 2011 | fRollback = FALSE; | 1991 | fRollback = FALSE; |
| @@ -2128,7 +2108,6 @@ namespace Bootstrapper | |||
| 2128 | dwIndex = 0; | 2108 | dwIndex = 0; |
| 2129 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 2109 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 2130 | 2110 | ||
| 2131 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 2132 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | 2111 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); |
| 2133 | 2112 | ||
| 2134 | fRollback = FALSE; | 2113 | fRollback = FALSE; |
| @@ -2245,7 +2224,6 @@ namespace Bootstrapper | |||
| 2245 | dwIndex = 0; | 2224 | dwIndex = 0; |
| 2246 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 2225 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 2247 | 2226 | ||
| 2248 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 2249 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | 2227 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); |
| 2250 | 2228 | ||
| 2251 | fRollback = FALSE; | 2229 | fRollback = FALSE; |
| @@ -2351,7 +2329,6 @@ namespace Bootstrapper | |||
| 2351 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 4); | 2329 | ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 4); |
| 2352 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | 2330 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); |
| 2353 | 2331 | ||
| 2354 | Assert::Equal(2993671ull, pPlan->qwEstimatedSize); | ||
| 2355 | Assert::Equal(6048672ull, pPlan->qwCacheSizeTotal); | 2332 | Assert::Equal(6048672ull, pPlan->qwCacheSizeTotal); |
| 2356 | 2333 | ||
| 2357 | fRollback = FALSE; | 2334 | fRollback = FALSE; |
| @@ -2451,6 +2428,8 @@ namespace Bootstrapper | |||
| 2451 | ReleaseStr(sczFilePath); | 2428 | ReleaseStr(sczFilePath); |
| 2452 | } | 2429 | } |
| 2453 | 2430 | ||
| 2431 | pEngineState->section.qwBundleSize = 1234; | ||
| 2432 | |||
| 2454 | hr = CoreInitializeConstants(pEngineState); | 2433 | hr = CoreInitializeConstants(pEngineState); |
| 2455 | NativeAssert::Succeeded(hr, "Failed to initialize core constants"); | 2434 | NativeAssert::Succeeded(hr, "Failed to initialize core constants"); |
| 2456 | 2435 | ||
diff --git a/src/burn/test/BurnUnitTest/RegistrationTest.cpp b/src/burn/test/BurnUnitTest/RegistrationTest.cpp index f01d92a4..0075e937 100644 --- a/src/burn/test/BurnUnitTest/RegistrationTest.cpp +++ b/src/burn/test/BurnUnitTest/RegistrationTest.cpp | |||
| @@ -60,6 +60,7 @@ namespace Bootstrapper | |||
| 60 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); | 60 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); |
| 61 | String^ cacheExePath = Path::Combine(cacheDirectory, gcnew String(L"setup.exe")); | 61 | String^ cacheExePath = Path::Combine(cacheDirectory, gcnew String(L"setup.exe")); |
| 62 | DWORD dwRegistrationOptions = BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE; | 62 | DWORD dwRegistrationOptions = BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE; |
| 63 | DWORD64 qwEstimatedSize = 1024; | ||
| 63 | 64 | ||
| 64 | try | 65 | try |
| 65 | { | 66 | { |
| @@ -103,7 +104,7 @@ namespace Bootstrapper | |||
| 103 | TestThrowOnFailure(hr, L"Failed to get current process path."); | 104 | TestThrowOnFailure(hr, L"Failed to get current process path."); |
| 104 | 105 | ||
| 105 | // write registration | 106 | // write registration |
| 106 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); | 107 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
| 107 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 108 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
| 108 | 109 | ||
| 109 | // verify that registration was created | 110 | // verify that registration was created |
| @@ -114,7 +115,7 @@ namespace Bootstrapper | |||
| 114 | this->ValidateRunOnceKeyEntry(cacheExePath); | 115 | this->ValidateRunOnceKeyEntry(cacheExePath); |
| 115 | 116 | ||
| 116 | // end session | 117 | // end session |
| 117 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); | 118 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); |
| 118 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 119 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
| 119 | 120 | ||
| 120 | // verify that registration was removed | 121 | // verify that registration was removed |
| @@ -158,6 +159,7 @@ namespace Bootstrapper | |||
| 158 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); | 159 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); |
| 159 | String^ cacheExePath = Path::Combine(cacheDirectory, gcnew String(L"setup.exe")); | 160 | String^ cacheExePath = Path::Combine(cacheDirectory, gcnew String(L"setup.exe")); |
| 160 | DWORD dwRegistrationOptions = 0; | 161 | DWORD dwRegistrationOptions = 0; |
| 162 | DWORD64 qwEstimatedSize = 1024; | ||
| 161 | try | 163 | try |
| 162 | { | 164 | { |
| 163 | this->testRegistry->SetUp(); | 165 | this->testRegistry->SetUp(); |
| @@ -204,7 +206,7 @@ namespace Bootstrapper | |||
| 204 | // | 206 | // |
| 205 | 207 | ||
| 206 | // write registration | 208 | // write registration |
| 207 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); | 209 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
| 208 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 210 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
| 209 | 211 | ||
| 210 | // verify that registration was created | 212 | // verify that registration was created |
| @@ -213,7 +215,7 @@ namespace Bootstrapper | |||
| 213 | this->ValidateRunOnceKeyEntry(cacheExePath); | 215 | this->ValidateRunOnceKeyEntry(cacheExePath); |
| 214 | 216 | ||
| 215 | // complete registration | 217 | // complete registration |
| 216 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_NONE, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); | 218 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_NONE, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
| 217 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 219 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
| 218 | 220 | ||
| 219 | // verify that registration was updated | 221 | // verify that registration was updated |
| @@ -226,7 +228,7 @@ namespace Bootstrapper | |||
| 226 | // | 228 | // |
| 227 | 229 | ||
| 228 | // write registration | 230 | // write registration |
| 229 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); | 231 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
| 230 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 232 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
| 231 | 233 | ||
| 232 | // verify that registration was updated | 234 | // verify that registration was updated |
| @@ -235,7 +237,7 @@ namespace Bootstrapper | |||
| 235 | this->ValidateRunOnceKeyEntry(cacheExePath); | 237 | this->ValidateRunOnceKeyEntry(cacheExePath); |
| 236 | 238 | ||
| 237 | // delete registration | 239 | // delete registration |
| 238 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); | 240 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); |
| 239 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 241 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
| 240 | 242 | ||
| 241 | // verify that registration was removed | 243 | // verify that registration was removed |
| @@ -278,6 +280,7 @@ namespace Bootstrapper | |||
| 278 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); | 280 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); |
| 279 | String^ cacheExePath = Path::Combine(cacheDirectory, gcnew String(L"setup.exe")); | 281 | String^ cacheExePath = Path::Combine(cacheDirectory, gcnew String(L"setup.exe")); |
| 280 | DWORD dwRegistrationOptions = 0; | 282 | DWORD dwRegistrationOptions = 0; |
| 283 | DWORD64 qwEstimatedSize = 1024; | ||
| 281 | try | 284 | try |
| 282 | { | 285 | { |
| 283 | this->testRegistry->SetUp(); | 286 | this->testRegistry->SetUp(); |
| @@ -327,7 +330,7 @@ namespace Bootstrapper | |||
| 327 | // | 330 | // |
| 328 | 331 | ||
| 329 | // write registration | 332 | // write registration |
| 330 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); | 333 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
| 331 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 334 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
| 332 | 335 | ||
| 333 | // verify that registration was created | 336 | // verify that registration was created |
| @@ -335,7 +338,7 @@ namespace Bootstrapper | |||
| 335 | this->ValidateRunOnceKeyEntry(cacheExePath); | 338 | this->ValidateRunOnceKeyEntry(cacheExePath); |
| 336 | 339 | ||
| 337 | // complete registration | 340 | // complete registration |
| 338 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_REQUIRED, BOOTSTRAPPER_REGISTRATION_TYPE_FULL); | 341 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_REQUIRED, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_FULL); |
| 339 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 342 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
| 340 | 343 | ||
| 341 | // verify that registration variables were updated | 344 | // verify that registration variables were updated |
| @@ -355,7 +358,7 @@ namespace Bootstrapper | |||
| 355 | // | 358 | // |
| 356 | 359 | ||
| 357 | // delete registration | 360 | // delete registration |
| 358 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); | 361 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); |
| 359 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 362 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
| 360 | 363 | ||
| 361 | // verify that registration was removed | 364 | // verify that registration was removed |
| @@ -398,6 +401,7 @@ namespace Bootstrapper | |||
| 398 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); | 401 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); |
| 399 | String^ cacheExePath = Path::Combine(cacheDirectory, gcnew String(L"setup.exe")); | 402 | String^ cacheExePath = Path::Combine(cacheDirectory, gcnew String(L"setup.exe")); |
| 400 | DWORD dwRegistrationOptions = 0; | 403 | DWORD dwRegistrationOptions = 0; |
| 404 | DWORD64 qwEstimatedSize = 1024; | ||
| 401 | try | 405 | try |
| 402 | { | 406 | { |
| 403 | this->testRegistry->SetUp(); | 407 | this->testRegistry->SetUp(); |
| @@ -446,7 +450,7 @@ namespace Bootstrapper | |||
| 446 | // | 450 | // |
| 447 | 451 | ||
| 448 | // write registration | 452 | // write registration |
| 449 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); | 453 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
| 450 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 454 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
| 451 | 455 | ||
| 452 | // verify that registration was created | 456 | // verify that registration was created |
| @@ -454,7 +458,7 @@ namespace Bootstrapper | |||
| 454 | this->ValidateRunOnceKeyEntry(cacheExePath); | 458 | this->ValidateRunOnceKeyEntry(cacheExePath); |
| 455 | 459 | ||
| 456 | // finish registration | 460 | // finish registration |
| 457 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_NONE, BOOTSTRAPPER_REGISTRATION_TYPE_FULL); | 461 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_ARP, BOOTSTRAPPER_APPLY_RESTART_NONE, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_FULL); |
| 458 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 462 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
| 459 | 463 | ||
| 460 | // verify that registration was updated | 464 | // verify that registration was updated |
| @@ -479,7 +483,7 @@ namespace Bootstrapper | |||
| 479 | // | 483 | // |
| 480 | 484 | ||
| 481 | // write registration | 485 | // write registration |
| 482 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); | 486 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
| 483 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 487 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
| 484 | 488 | ||
| 485 | // verify that registration was updated | 489 | // verify that registration was updated |
| @@ -487,7 +491,7 @@ namespace Bootstrapper | |||
| 487 | this->ValidateRunOnceKeyEntry(cacheExePath); | 491 | this->ValidateRunOnceKeyEntry(cacheExePath); |
| 488 | 492 | ||
| 489 | // delete registration | 493 | // delete registration |
| 490 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); | 494 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); |
| 491 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 495 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
| 492 | 496 | ||
| 493 | // verify that registration was removed | 497 | // verify that registration was removed |
| @@ -533,6 +537,7 @@ namespace Bootstrapper | |||
| 533 | BYTE* pbBuffer = NULL; | 537 | BYTE* pbBuffer = NULL; |
| 534 | SIZE_T cbBuffer = 0; | 538 | SIZE_T cbBuffer = 0; |
| 535 | DWORD dwRegistrationOptions = 0; | 539 | DWORD dwRegistrationOptions = 0; |
| 540 | DWORD64 qwEstimatedSize = 1024; | ||
| 536 | 541 | ||
| 537 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); | 542 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); |
| 538 | try | 543 | try |
| @@ -586,7 +591,7 @@ namespace Bootstrapper | |||
| 586 | TestThrowOnFailure(hr, L"Failed to get current process path."); | 591 | TestThrowOnFailure(hr, L"Failed to get current process path."); |
| 587 | 592 | ||
| 588 | // begin session | 593 | // begin session |
| 589 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); | 594 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
| 590 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 595 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
| 591 | 596 | ||
| 592 | VariableSetNumericHelper(&variables, L"MyBurnVariable1", 42); | 597 | VariableSetNumericHelper(&variables, L"MyBurnVariable1", 42); |
| @@ -629,7 +634,7 @@ namespace Bootstrapper | |||
| 629 | NativeAssert::StringEqual(L"42", sczValue); | 634 | NativeAssert::StringEqual(L"42", sczValue); |
| 630 | 635 | ||
| 631 | // end session | 636 | // end session |
| 632 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); | 637 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); |
| 633 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 638 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
| 634 | } | 639 | } |
| 635 | finally | 640 | finally |
| @@ -673,6 +678,7 @@ namespace Bootstrapper | |||
| 673 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); | 678 | String^ cacheDirectory = Path::Combine(Path::Combine(Environment::GetFolderPath(Environment::SpecialFolder::LocalApplicationData), gcnew String(L"Package Cache")), gcnew String(TEST_BUNDLE_ID)); |
| 674 | String^ cacheExePath = Path::Combine(cacheDirectory, gcnew String(L"setup.exe")); | 679 | String^ cacheExePath = Path::Combine(cacheDirectory, gcnew String(L"setup.exe")); |
| 675 | DWORD dwRegistrationOptions = 0; | 680 | DWORD dwRegistrationOptions = 0; |
| 681 | DWORD64 qwEstimatedSize = 1024; | ||
| 676 | try | 682 | try |
| 677 | { | 683 | { |
| 678 | this->testRegistry->SetUp(); | 684 | this->testRegistry->SetUp(); |
| @@ -728,7 +734,7 @@ namespace Bootstrapper | |||
| 728 | Assert::Equal((int)BOOTSTRAPPER_RESUME_TYPE_NONE, (int)resumeType); | 734 | Assert::Equal((int)BOOTSTRAPPER_RESUME_TYPE_NONE, (int)resumeType); |
| 729 | 735 | ||
| 730 | // begin session | 736 | // begin session |
| 731 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, 0, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); | 737 | hr = RegistrationSessionBegin(sczCurrentProcess, ®istration, &cache, &variables, dwRegistrationOptions, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
| 732 | TestThrowOnFailure(hr, L"Failed to register bundle."); | 738 | TestThrowOnFailure(hr, L"Failed to register bundle."); |
| 733 | 739 | ||
| 734 | VariableSetNumericHelper(&variables, L"MyBurnVariable1", 42); | 740 | VariableSetNumericHelper(&variables, L"MyBurnVariable1", 42); |
| @@ -767,7 +773,7 @@ namespace Bootstrapper | |||
| 767 | Assert::Equal((int)BOOTSTRAPPER_RESUME_TYPE_INTERRUPTED, (int)resumeType); | 773 | Assert::Equal((int)BOOTSTRAPPER_RESUME_TYPE_INTERRUPTED, (int)resumeType); |
| 768 | 774 | ||
| 769 | // suspend session | 775 | // suspend session |
| 770 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_SUSPEND, BOOTSTRAPPER_APPLY_RESTART_NONE, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); | 776 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_SUSPEND, BOOTSTRAPPER_APPLY_RESTART_NONE, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS); |
| 771 | TestThrowOnFailure(hr, L"Failed to suspend session."); | 777 | TestThrowOnFailure(hr, L"Failed to suspend session."); |
| 772 | 778 | ||
| 773 | // verify that run key was removed | 779 | // verify that run key was removed |
| @@ -794,7 +800,7 @@ namespace Bootstrapper | |||
| 794 | this->ValidateRunOnceKeyEntry(cacheExePath); | 800 | this->ValidateRunOnceKeyEntry(cacheExePath); |
| 795 | 801 | ||
| 796 | // end session | 802 | // end session |
| 797 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); | 803 | hr = RegistrationSessionEnd(®istration, &cache, &variables, &packages, BURN_RESUME_MODE_NONE, BOOTSTRAPPER_APPLY_RESTART_NONE, qwEstimatedSize, BOOTSTRAPPER_REGISTRATION_TYPE_NONE); |
| 798 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); | 804 | TestThrowOnFailure(hr, L"Failed to unregister bundle."); |
| 799 | 805 | ||
| 800 | // read resume type after session | 806 | // read resume type after session |
diff --git a/src/libs/dutil/WixToolset.DUtil/regutil.cpp b/src/libs/dutil/WixToolset.DUtil/regutil.cpp index 219a6c11..78507ade 100644 --- a/src/libs/dutil/WixToolset.DUtil/regutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/regutil.cpp | |||
| @@ -107,10 +107,9 @@ DAPI_(HRESULT) RegCreate( | |||
| 107 | ) | 107 | ) |
| 108 | { | 108 | { |
| 109 | HRESULT hr = S_OK; | 109 | HRESULT hr = S_OK; |
| 110 | DWORD er = ERROR_SUCCESS; | ||
| 111 | 110 | ||
| 112 | er = vpfnRegCreateKeyExW(hkRoot, wzSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, dwAccess, NULL, phk, NULL); | 111 | hr = RegCreateEx(hkRoot, wzSubKey, dwAccess, REG_KEY_DEFAULT, FALSE, NULL, phk, NULL); |
| 113 | RegExitOnWin32Error(er, hr, "Failed to create registry key."); | 112 | RegExitOnFailure(hr, "Failed to create registry key."); |
| 114 | 113 | ||
| 115 | LExit: | 114 | LExit: |
| 116 | return hr; | 115 | return hr; |
diff --git a/src/test/burn/TestBA/TestBA.cs b/src/test/burn/TestBA/TestBA.cs index fdbcc6d4..b4d74341 100644 --- a/src/test/burn/TestBA/TestBA.cs +++ b/src/test/burn/TestBA/TestBA.cs | |||
| @@ -27,6 +27,7 @@ namespace WixToolset.Test.BA | |||
| 27 | 27 | ||
| 28 | private string updateBundlePath; | 28 | private string updateBundlePath; |
| 29 | 29 | ||
| 30 | private bool forceKeepRegistration; | ||
| 30 | private bool immediatelyQuit; | 31 | private bool immediatelyQuit; |
| 31 | private bool quitAfterDetect; | 32 | private bool quitAfterDetect; |
| 32 | private bool explicitlyElevateAndPlanFromOnElevateBegin; | 33 | private bool explicitlyElevateAndPlanFromOnElevateBegin; |
| @@ -131,6 +132,12 @@ namespace WixToolset.Test.BA | |||
| 131 | this.explicitlyElevateAndPlanFromOnElevateBegin = false; | 132 | this.explicitlyElevateAndPlanFromOnElevateBegin = false; |
| 132 | } | 133 | } |
| 133 | 134 | ||
| 135 | string forceKeepRegistration = this.ReadPackageAction(null, "ForceKeepRegistration"); | ||
| 136 | if (String.IsNullOrEmpty(forceKeepRegistration) || !Boolean.TryParse(forceKeepRegistration, out this.forceKeepRegistration)) | ||
| 137 | { | ||
| 138 | this.forceKeepRegistration = false; | ||
| 139 | } | ||
| 140 | |||
| 134 | string quitAfterDetect = this.ReadPackageAction(null, "QuitAfterDetect"); | 141 | string quitAfterDetect = this.ReadPackageAction(null, "QuitAfterDetect"); |
| 135 | if (String.IsNullOrEmpty(quitAfterDetect) || !Boolean.TryParse(quitAfterDetect, out this.quitAfterDetect)) | 142 | if (String.IsNullOrEmpty(quitAfterDetect) || !Boolean.TryParse(quitAfterDetect, out this.quitAfterDetect)) |
| 136 | { | 143 | { |
| @@ -533,6 +540,16 @@ namespace WixToolset.Test.BA | |||
| 533 | this.ShutdownUiThread(); | 540 | this.ShutdownUiThread(); |
| 534 | } | 541 | } |
| 535 | 542 | ||
| 543 | protected override void OnUnregisterBegin(UnregisterBeginEventArgs args) | ||
| 544 | { | ||
| 545 | if (this.forceKeepRegistration && args.RegistrationType == RegistrationType.None) | ||
| 546 | { | ||
| 547 | args.RegistrationType = RegistrationType.InProgress; | ||
| 548 | } | ||
| 549 | |||
| 550 | this.Log("OnUnregisterBegin, default: {0}, requested: {1}", args.RecommendedRegistrationType, args.RegistrationType); | ||
| 551 | } | ||
| 552 | |||
| 536 | private void TestVariables() | 553 | private void TestVariables() |
| 537 | { | 554 | { |
| 538 | // First make sure we can check and get standard variables of each type. | 555 | // First make sure we can check and get standard variables of each type. |
diff --git a/src/test/burn/WixTestTools/BundleVerifier.cs b/src/test/burn/WixTestTools/BundleVerifier.cs index 56044c5f..594b19aa 100644 --- a/src/test/burn/WixTestTools/BundleVerifier.cs +++ b/src/test/burn/WixTestTools/BundleVerifier.cs | |||
| @@ -87,7 +87,7 @@ namespace WixTestTools | |||
| 87 | } | 87 | } |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | public string VerifyRegisteredAndInPackageCache(int? expectedSystemComponent = null) | 90 | public BundleRegistration VerifyRegisteredAndInPackageCache(int? expectedSystemComponent = null) |
| 91 | { | 91 | { |
| 92 | Assert.True(this.TryGetRegistration(out var registration)); | 92 | Assert.True(this.TryGetRegistration(out var registration)); |
| 93 | 93 | ||
| @@ -99,7 +99,7 @@ namespace WixTestTools | |||
| 99 | var expectedCachePath = this.GetExpectedCachedBundlePath(); | 99 | var expectedCachePath = this.GetExpectedCachedBundlePath(); |
| 100 | WixAssert.StringEqual(expectedCachePath, registration.CachePath, true); | 100 | WixAssert.StringEqual(expectedCachePath, registration.CachePath, true); |
| 101 | 101 | ||
| 102 | return registration.CachePath; | 102 | return registration; |
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | public void VerifyUnregisteredAndRemovedFromPackageCache() | 105 | public void VerifyUnregisteredAndRemovedFromPackageCache() |
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/BasicFunctionalityTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/BasicFunctionalityTests.cs index 89c5be9b..efe4f05b 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/BasicFunctionalityTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/BasicFunctionalityTests.cs | |||
| @@ -82,7 +82,8 @@ namespace WixToolsetTest.BurnE2E | |||
| 82 | 82 | ||
| 83 | bundle.Install(); | 83 | bundle.Install(); |
| 84 | 84 | ||
| 85 | var cachedBundlePath = bundle.VerifyRegisteredAndInPackageCache(); | 85 | var registration = bundle.VerifyRegisteredAndInPackageCache(); |
| 86 | var cachedBundlePath = registration.CachePath; | ||
| 86 | 87 | ||
| 87 | // Source file should be installed | 88 | // Source file should be installed |
| 88 | Assert.True(File.Exists(packageSourceCodeInstalled), $"Should have found {packageName} payload installed at: {packageSourceCodeInstalled}"); | 89 | Assert.True(File.Exists(packageSourceCodeInstalled), $"Should have found {packageName} payload installed at: {packageSourceCodeInstalled}"); |
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/CacheTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/CacheTests.cs index 943939e3..4d5fb811 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/CacheTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/CacheTests.cs | |||
| @@ -162,14 +162,14 @@ namespace WixToolsetTest.BurnE2E | |||
| 162 | bundleA.Install(bundleACopiedPath); | 162 | bundleA.Install(bundleACopiedPath); |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | var bundlePackageCachePath = bundleA.VerifyRegisteredAndInPackageCache(); | 165 | var bundlePackageRegistration = bundleA.VerifyRegisteredAndInPackageCache(); |
| 166 | 166 | ||
| 167 | packageA.VerifyInstalled(true); | 167 | packageA.VerifyInstalled(true); |
| 168 | packageB.VerifyInstalled(false); | 168 | packageB.VerifyInstalled(false); |
| 169 | 169 | ||
| 170 | testBAController.SetPackageRequestedState("PackageB", RequestState.Present); | 170 | testBAController.SetPackageRequestedState("PackageB", RequestState.Present); |
| 171 | 171 | ||
| 172 | var modifyLogPath = bundleA.Modify(bundlePackageCachePath); | 172 | var modifyLogPath = bundleA.Modify(bundlePackageRegistration.CachePath); |
| 173 | bundleA.VerifyRegisteredAndInPackageCache(); | 173 | bundleA.VerifyRegisteredAndInPackageCache(); |
| 174 | 174 | ||
| 175 | packageA.VerifyInstalled(true); | 175 | packageA.VerifyInstalled(true); |
| @@ -204,14 +204,14 @@ namespace WixToolsetTest.BurnE2E | |||
| 204 | 204 | ||
| 205 | bundleB.Install(bundleBCopiedPath); | 205 | bundleB.Install(bundleBCopiedPath); |
| 206 | 206 | ||
| 207 | var bundlePackageCachePath = bundleB.VerifyRegisteredAndInPackageCache(); | 207 | var bundlePackageRegistration = bundleB.VerifyRegisteredAndInPackageCache(); |
| 208 | 208 | ||
| 209 | packageA.VerifyInstalled(true); | 209 | packageA.VerifyInstalled(true); |
| 210 | packageB.VerifyInstalled(false); | 210 | packageB.VerifyInstalled(false); |
| 211 | 211 | ||
| 212 | testBAController.SetPackageRequestedState("PackageB", RequestState.Present); | 212 | testBAController.SetPackageRequestedState("PackageB", RequestState.Present); |
| 213 | 213 | ||
| 214 | bundleB.Modify(bundlePackageCachePath); | 214 | bundleB.Modify(bundlePackageRegistration.CachePath); |
| 215 | bundleB.VerifyRegisteredAndInPackageCache(); | 215 | bundleB.VerifyRegisteredAndInPackageCache(); |
| 216 | 216 | ||
| 217 | packageA.VerifyInstalled(true); | 217 | packageA.VerifyInstalled(true); |
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/MsiTransactionTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/MsiTransactionTests.cs index 3d9748bb..cbfee806 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/MsiTransactionTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/MsiTransactionTests.cs | |||
| @@ -42,7 +42,7 @@ namespace WixToolsetTest.BurnE2E | |||
| 42 | 42 | ||
| 43 | bundleAv1.Install(); | 43 | bundleAv1.Install(); |
| 44 | 44 | ||
| 45 | var bundleAv1CachedPath = bundleAv1.VerifyRegisteredAndInPackageCache(); | 45 | var bundleAv1Registration = bundleAv1.VerifyRegisteredAndInPackageCache(); |
| 46 | 46 | ||
| 47 | // Source file should be installed | 47 | // Source file should be installed |
| 48 | Assert.True(File.Exists(packageASourceCodeInstalled), String.Concat("Should have found Package A payload installed at: ", packageASourceCodeInstalled)); | 48 | Assert.True(File.Exists(packageASourceCodeInstalled), String.Concat("Should have found Package A payload installed at: ", packageASourceCodeInstalled)); |
| @@ -51,7 +51,7 @@ namespace WixToolsetTest.BurnE2E | |||
| 51 | 51 | ||
| 52 | bundleAv2.Install(); | 52 | bundleAv2.Install(); |
| 53 | 53 | ||
| 54 | var bundleAv2CachedPath = bundleAv2.VerifyRegisteredAndInPackageCache(); | 54 | var bundleAv2Registration = bundleAv2.VerifyRegisteredAndInPackageCache(); |
| 55 | 55 | ||
| 56 | // Source file should be upgraded | 56 | // Source file should be upgraded |
| 57 | Assert.True(File.Exists(packageDSourceCodeInstalled), String.Concat("Should have found Package D payload installed at: ", packageDSourceCodeInstalled)); | 57 | Assert.True(File.Exists(packageDSourceCodeInstalled), String.Concat("Should have found Package D payload installed at: ", packageDSourceCodeInstalled)); |
| @@ -61,7 +61,7 @@ namespace WixToolsetTest.BurnE2E | |||
| 61 | Assert.False(File.Exists(packageBv1SourceCodeInstalled), String.Concat("Package Bv1 payload should have been removed by upgrade uninstall from: ", packageBv1SourceCodeInstalled)); | 61 | Assert.False(File.Exists(packageBv1SourceCodeInstalled), String.Concat("Package Bv1 payload should have been removed by upgrade uninstall from: ", packageBv1SourceCodeInstalled)); |
| 62 | Assert.False(File.Exists(packageASourceCodeInstalled), String.Concat("Package A payload should have been removed by upgrade uninstall from: ", packageASourceCodeInstalled)); | 62 | Assert.False(File.Exists(packageASourceCodeInstalled), String.Concat("Package A payload should have been removed by upgrade uninstall from: ", packageASourceCodeInstalled)); |
| 63 | 63 | ||
| 64 | bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache(bundleAv1CachedPath); | 64 | bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache(bundleAv1Registration.CachePath); |
| 65 | 65 | ||
| 66 | // Uninstall everything. | 66 | // Uninstall everything. |
| 67 | bundleAv2.Uninstall(); | 67 | bundleAv2.Uninstall(); |
| @@ -71,7 +71,7 @@ namespace WixToolsetTest.BurnE2E | |||
| 71 | Assert.False(File.Exists(packageBv2SourceCodeInstalled), String.Concat("Package Bv2 payload should have been removed by uninstall from: ", packageBv2SourceCodeInstalled)); | 71 | Assert.False(File.Exists(packageBv2SourceCodeInstalled), String.Concat("Package Bv2 payload should have been removed by uninstall from: ", packageBv2SourceCodeInstalled)); |
| 72 | Assert.False(File.Exists(packageCv2SourceCodeInstalled), String.Concat("Package Cv2 payload should have been removed by uninstall from: ", packageCv2SourceCodeInstalled)); | 72 | Assert.False(File.Exists(packageCv2SourceCodeInstalled), String.Concat("Package Cv2 payload should have been removed by uninstall from: ", packageCv2SourceCodeInstalled)); |
| 73 | 73 | ||
| 74 | bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache(bundleAv2CachedPath); | 74 | bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache(bundleAv2Registration.CachePath); |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | /// <summary> | 77 | /// <summary> |
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/RegistrationTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/RegistrationTests.cs index 51122c28..01ffa942 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/RegistrationTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/RegistrationTests.cs | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | namespace WixToolsetTest.BurnE2E | 3 | namespace WixToolsetTest.BurnE2E |
| 4 | { | 4 | { |
| 5 | using System; | 5 | using System; |
| 6 | using WixToolset.Mba.Core; | ||
| 6 | using Xunit; | 7 | using Xunit; |
| 7 | using Xunit.Abstractions; | 8 | using Xunit.Abstractions; |
| 8 | 9 | ||
| @@ -11,8 +12,35 @@ namespace WixToolsetTest.BurnE2E | |||
| 11 | public RegistrationTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { } | 12 | public RegistrationTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { } |
| 12 | 13 | ||
| 13 | [Fact] | 14 | [Fact] |
| 15 | public void AllowsBAToKeepRegistration() | ||
| 16 | { | ||
| 17 | this.CreatePackageInstaller("PackageA"); | ||
| 18 | var bundleA = this.CreateBundleInstaller("BundleA"); | ||
| 19 | var testBAController = this.CreateTestBAController(); | ||
| 20 | |||
| 21 | testBAController.SetPackageRequestedState("PackageA", RequestState.Absent); | ||
| 22 | testBAController.SetForceKeepRegistration(); | ||
| 23 | |||
| 24 | bundleA.Install(); | ||
| 25 | var initialRegistration = bundleA.VerifyRegisteredAndInPackageCache(); | ||
| 26 | |||
| 27 | Assert.NotNull(initialRegistration.EstimatedSize); | ||
| 28 | |||
| 29 | testBAController.SetForceKeepRegistration(null); | ||
| 30 | testBAController.ResetPackageStates("PackageA"); | ||
| 31 | |||
| 32 | bundleA.Install(); | ||
| 33 | var finalRegistration = bundleA.VerifyRegisteredAndInPackageCache(); | ||
| 34 | |||
| 35 | // Verifies https://github.com/wixtoolset/issues/issues/4039 | ||
| 36 | Assert.NotNull(finalRegistration.EstimatedSize); | ||
| 37 | Assert.InRange(finalRegistration.EstimatedSize.Value, initialRegistration.EstimatedSize.Value + 1, Int32.MaxValue); | ||
| 38 | } | ||
| 39 | |||
| 40 | [Fact] | ||
| 14 | public void AutomaticallyUncachesBundleWhenNotInstalled() | 41 | public void AutomaticallyUncachesBundleWhenNotInstalled() |
| 15 | { | 42 | { |
| 43 | this.CreatePackageInstaller("PackageA"); | ||
| 16 | var bundleA = this.CreateBundleInstaller("BundleA"); | 44 | var bundleA = this.CreateBundleInstaller("BundleA"); |
| 17 | var testBAController = this.CreateTestBAController(); | 45 | var testBAController = this.CreateTestBAController(); |
| 18 | 46 | ||
| @@ -40,6 +68,7 @@ namespace WixToolsetTest.BurnE2E | |||
| 40 | [Fact] | 68 | [Fact] |
| 41 | public void RegistersInARPIfPrecached() | 69 | public void RegistersInARPIfPrecached() |
| 42 | { | 70 | { |
| 71 | this.CreatePackageInstaller("PackageA"); | ||
| 43 | var bundleA = this.CreateBundleInstaller("BundleA"); | 72 | var bundleA = this.CreateBundleInstaller("BundleA"); |
| 44 | 73 | ||
| 45 | bundleA.ManuallyCache(); | 74 | bundleA.ManuallyCache(); |
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/TestBAController.cs b/src/test/burn/WixToolsetTest.BurnE2E/TestBAController.cs index fa553919..8e6611a2 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/TestBAController.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/TestBAController.cs | |||
| @@ -47,6 +47,11 @@ namespace WixToolsetTest.BurnE2E | |||
| 47 | this.SetBurnTestValue("ExplicitlyElevateAndPlanFromOnElevateBegin", value); | 47 | this.SetBurnTestValue("ExplicitlyElevateAndPlanFromOnElevateBegin", value); |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | public void SetForceKeepRegistration(string value = "true") | ||
| 51 | { | ||
| 52 | this.SetBurnTestValue("ForceKeepRegistration", value); | ||
| 53 | } | ||
| 54 | |||
| 50 | public void SetImmediatelyQuit(string value = "true") | 55 | public void SetImmediatelyQuit(string value = "true") |
| 51 | { | 56 | { |
| 52 | this.SetBurnTestValue("ImmediatelyQuit", value); | 57 | this.SetBurnTestValue("ImmediatelyQuit", value); |
