@joebigelow / wix-1 / commits / 72b024f3

After rolling back in a non-vital rollback boundary, skip to its end.

Fixes #6309

Sean Hall committed Dec 12, 2021 at 21:52 UTC 72b024f33d9630432e8aad2bf8261051a0df1e41
6 files changed +147 -57
src/burn/engine/apply.cpp
+48 -25
@@ -191,7 +191,6 @@ static HRESULT DoExecuteAction(
191 __in BURN_ENGINE_STATE* pEngineState,
192 __in BURN_EXECUTE_ACTION* pExecuteAction,
193 __in BURN_EXECUTE_CONTEXT* pContext,
194 - __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary,
194 __inout BURN_EXECUTE_ACTION_CHECKPOINT** ppCheckpoint,
195 __out BOOL* pfSuspend,
196 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
@@ -657,8 +656,7 @@ extern "C" HRESULT ApplyExecute(
656 HRESULT hrRollback = S_OK;
657 BURN_EXECUTE_ACTION_CHECKPOINT* pCheckpoint = NULL;
658 BURN_EXECUTE_CONTEXT context = { };
660 - BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL;
661 - BOOL fSeekNextRollbackBoundary = FALSE;
659 + BOOL fSeekRollbackBoundaryEnd = FALSE;
660
661 context.pCache = pEngineState->plan.pCache;
662 context.pUX = &pEngineState->userExperience;
@@ -680,21 +678,41 @@ extern "C" HRESULT ApplyExecute(
678 continue;
679 }
680
683 - // If we are seeking the next rollback boundary, skip if this action wasn't it.
684 - if (fSeekNextRollbackBoundary)
681 + // If we are seeking the end of the rollback boundary, skip if this action wasn't it.
682 + if (fSeekRollbackBoundaryEnd)
683 {
686 - if (BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY == pExecuteAction->type)
684 + if (BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_END != pExecuteAction->type)
685 {
686 + LPCWSTR wzId = NULL;
687 + switch (pExecuteAction->type)
688 + {
689 + case BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE:
690 + wzId = pExecuteAction->exePackage.pPackage->sczId;
691 + break;
692 + case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE:
693 + wzId = pExecuteAction->msiPackage.pPackage->sczId;
694 + break;
695 + case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET:
696 + wzId = pExecuteAction->mspTarget.pPackage->sczId;
697 + break;
698 + case BURN_EXECUTE_ACTION_TYPE_MSU_PACKAGE:
699 + wzId = pExecuteAction->msuPackage.pPackage->sczId;
700 + break;
701 + }
702 +
703 + if (wzId)
704 + {
705 + LogId(REPORT_WARNING, MSG_APPLY_SKIPPING_NONVITAL_ROLLBACK_BOUNDARY_PACKAGE, wzId);
706 + }
707 +
708 continue;
709 }
690 - else
691 - {
692 - fSeekNextRollbackBoundary = FALSE;
693 - }
710 +
711 + fSeekRollbackBoundaryEnd = FALSE;
712 }
713
714 // Execute the action.
697 - hr = DoExecuteAction(pEngineState, pExecuteAction, &context, &pRollbackBoundary, &pCheckpoint, pfSuspend, pRestart);
715 + hr = DoExecuteAction(pEngineState, pExecuteAction, &context, &pCheckpoint, pfSuspend, pRestart);
716
717 if (*pfSuspend || BOOTSTRAPPER_APPLY_RESTART_INITIATED == *pRestart)
718 {
@@ -737,19 +755,24 @@ extern "C" HRESULT ApplyExecute(
755
756 hrRollback = DoRollbackActions(pEngineState, &context, pCheckpoint->dwId, pRestart);
757 IgnoreRollbackError(hrRollback, "Failed rollback actions");
740 - }
758
742 - // If the rollback boundary is vital, end execution here.
743 - if (pRollbackBoundary && pRollbackBoundary->fVital)
744 - {
745 - break;
759 + if (pCheckpoint->pActiveRollbackBoundary)
760 + {
761 + if (pCheckpoint->pActiveRollbackBoundary->fVital)
762 + {
763 + // If the rollback boundary is vital, end execution here.
764 + break;
765 + }
766 +
767 + // Move forward to the end of this rollback boundary.
768 + fSeekRollbackBoundaryEnd = TRUE;
769 +
770 + LogId(REPORT_WARNING, MSG_APPLY_SKIPPING_REST_OF_NONVITAL_ROLLBACK_BOUNDARY, pCheckpoint->pActiveRollbackBoundary->sczId);
771 + }
772 }
773
748 - // Ignore failure inside of a non-vital rollback boundary.
774 + // Ignore failure outside of a vital rollback boundary.
775 hr = S_OK;
750 -
751 - // Move forward to next rollback boundary.
752 - fSeekNextRollbackBoundary = TRUE;
776 }
777 }
778
@@ -2207,7 +2230,6 @@ static HRESULT DoExecuteAction(
2230 __in BURN_ENGINE_STATE* pEngineState,
2231 __in BURN_EXECUTE_ACTION* pExecuteAction,
2232 __in BURN_EXECUTE_CONTEXT* pContext,
2210 - __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary,
2233 __inout BURN_EXECUTE_ACTION_CHECKPOINT** ppCheckpoint,
2234 __out BOOL* pfSuspend,
2235 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
@@ -2226,7 +2248,7 @@ static HRESULT DoExecuteAction(
2248
2249 do
2250 {
2229 - fInsideMsiTransaction = *ppRollbackBoundary && (*ppRollbackBoundary)->fActiveTransaction;
2251 + fInsideMsiTransaction = *ppCheckpoint && (*ppCheckpoint)->pActiveRollbackBoundary && (*ppCheckpoint)->pActiveRollbackBoundary->fActiveTransaction;
2252
2253 switch (pExecuteAction->type)
2254 {
@@ -2296,8 +2318,9 @@ static HRESULT DoExecuteAction(
2318
2319 break;
2320
2299 - case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY:
2300 - *ppRollbackBoundary = pExecuteAction->rollbackBoundary.pRollbackBoundary;
2321 + case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_START: __fallthrough;
2322 + case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_END:
2323 + *ppCheckpoint = NULL;
2324 break;
2325
2326 case BURN_EXECUTE_ACTION_TYPE_BEGIN_MSI_TRANSACTION:
@@ -2406,7 +2429,7 @@ static HRESULT DoRollbackActions(
2429 IgnoreRollbackError(hr, "Failed to rollback dependency action.");
2430 break;
2431
2409 - case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY:
2432 + case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_START:
2433 ExitFunction1(hr = S_OK);
2434
2435 case BURN_EXECUTE_ACTION_TYPE_UNCACHE_PACKAGE:
src/burn/engine/engine.mc
+14
@@ -991,6 +991,20 @@ Language=English
991 Illegal state: Reboot requested within an MSI transaction, id: %1!ls!
992 .
993
994 +MessageId=388
995 +Severity=Warning
996 +SymbolicName=MSG_APPLY_SKIPPING_NONVITAL_ROLLBACK_BOUNDARY_PACKAGE
997 +Language=English
998 +Skipping package inside non-vital rollback boundary, id: %1!ls!
999 +.
1000 +
1001 +MessageId=389
1002 +Severity=Warning
1003 +SymbolicName=MSG_APPLY_SKIPPING_REST_OF_NONVITAL_ROLLBACK_BOUNDARY
1004 +Language=English
1005 +Skipping the rest of non-vital rollback boundary, id: %1!ls!
1006 +.
1007 +
1008 MessageId=399
1009 Severity=Success
1010 SymbolicName=MSG_APPLY_COMPLETE
src/burn/engine/plan.cpp
+20 -4
@@ -1724,14 +1724,14 @@ extern "C" HRESULT PlanRollbackBoundaryBegin(
1724 hr = PlanAppendExecuteAction(pPlan, &pExecuteAction);
1725 ExitOnFailure(hr, "Failed to append rollback boundary begin action.");
1726
1727 - pExecuteAction->type = BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY;
1727 + pExecuteAction->type = BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_START;
1728 pExecuteAction->rollbackBoundary.pRollbackBoundary = pRollbackBoundary;
1729
1730 // Add begin rollback boundary to rollback plan.
1731 hr = PlanAppendRollbackAction(pPlan, &pExecuteAction);
1732 ExitOnFailure(hr, "Failed to append rollback boundary begin action.");
1733
1734 - pExecuteAction->type = BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY;
1734 + pExecuteAction->type = BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_START;
1735 pExecuteAction->rollbackBoundary.pRollbackBoundary = pRollbackBoundary;
1736
1737 hr = UserExperienceOnPlanRollbackBoundary(pUX, pRollbackBoundary->sczId, &pRollbackBoundary->fTransaction);
@@ -1786,6 +1786,18 @@ extern "C" HRESULT PlanRollbackBoundaryComplete(
1786 // Add checkpoints.
1787 hr = PlanExecuteCheckpoint(pPlan);
1788
1789 + // Add complete rollback boundary to execute plan.
1790 + hr = PlanAppendExecuteAction(pPlan, &pExecuteAction);
1791 + ExitOnFailure(hr, "Failed to append rollback boundary complete action.");
1792 +
1793 + pExecuteAction->type = BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_END;
1794 +
1795 + // Add begin rollback boundary to rollback plan.
1796 + hr = PlanAppendRollbackAction(pPlan, &pExecuteAction);
1797 + ExitOnFailure(hr, "Failed to append rollback boundary complete action.");
1798 +
1799 + pExecuteAction->type = BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_END;
1800 +
1801 LExit:
1802 return hr;
1803 }
@@ -2616,8 +2628,12 @@ static void ExecuteActionLog(
2628 LogStringLine(PlanDumpLevel, "%ls action[%u]: MSU_PACKAGE package id: %ls, action: %hs, log path: %ls", wzBase, iAction, pAction->msuPackage.pPackage->sczId, LoggingActionStateToString(pAction->msuPackage.action), pAction->msuPackage.sczLogPath);
2629 break;
2630
2619 - case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY:
2620 - LogStringLine(PlanDumpLevel, "%ls action[%u]: ROLLBACK_BOUNDARY id: %ls, vital: %ls", wzBase, iAction, pAction->rollbackBoundary.pRollbackBoundary->sczId, pAction->rollbackBoundary.pRollbackBoundary->fVital ? L"yes" : L"no");
2631 + case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_START:
2632 + LogStringLine(PlanDumpLevel, "%ls action[%u]: ROLLBACK_BOUNDARY_START id: %ls, vital: %ls", wzBase, iAction, pAction->rollbackBoundary.pRollbackBoundary->sczId, pAction->rollbackBoundary.pRollbackBoundary->fVital ? L"yes" : L"no");
2633 + break;
2634 +
2635 + case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_END:
2636 + LogStringLine(PlanDumpLevel, "%ls action[%u]: ROLLBACK_BOUNDARY_END", wzBase, iAction);
2637 break;
2638
2639 case BURN_EXECUTE_ACTION_TYPE_WAIT_CACHE_PACKAGE:
src/burn/engine/plan.h
+2 -1
@@ -56,7 +56,8 @@ enum BURN_EXECUTE_ACTION_TYPE
56 BURN_EXECUTE_ACTION_TYPE_MSU_PACKAGE,
57 BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER,
58 BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY,
59 - BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY,
59 + BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_START,
60 + BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_END,
61 BURN_EXECUTE_ACTION_TYPE_BEGIN_MSI_TRANSACTION,
62 BURN_EXECUTE_ACTION_TYPE_COMMIT_MSI_TRANSACTION,
63 };
src/burn/test/BurnUnitTest/PlanTest.cpp
+62 -26
@@ -81,7 +81,7 @@ namespace Bootstrapper
81 fRollback = FALSE;
82 dwIndex = 0;
83 DWORD dwExecuteCheckpointId = 2;
84 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
84 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
85 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
86 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
87 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -92,7 +92,8 @@ namespace Bootstrapper
92 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
93 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
94 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
95 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ", TRUE, TRUE);
95 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
96 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ", TRUE, TRUE);
97 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
98 ValidateExecuteBeginMsiTransaction(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ");
99 dwExecuteCheckpointId += 1; // cache checkpoints
@@ -115,13 +116,14 @@ namespace Bootstrapper
116 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
117 ValidateExecuteCommitMsiTransaction(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ");
118 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
119 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
120 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, NULL);
121 Assert::Equal(dwIndex, pPlan->cExecuteActions);
122
123 fRollback = TRUE;
124 dwIndex = 0;
125 dwExecuteCheckpointId = 2;
124 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
126 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
127 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
128 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
129 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
@@ -132,7 +134,8 @@ namespace Bootstrapper
134 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
135 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
136 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
135 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ", TRUE, TRUE);
137 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
138 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ", TRUE, TRUE);
139 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
140 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageB");
141 dwExecuteCheckpointId += 1; // cache checkpoints
@@ -151,6 +154,7 @@ namespace Bootstrapper
154 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
155 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
156 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
157 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
158 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_INSTALL, NULL);
159 Assert::Equal(dwIndex, pPlan->cRollbackActions);
160
@@ -202,7 +206,7 @@ namespace Bootstrapper
206 fRollback = FALSE;
207 dwIndex = 0;
208 DWORD dwExecuteCheckpointId = 1;
205 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ", TRUE, TRUE);
209 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ", TRUE, TRUE);
210 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
211 ValidateExecuteBeginMsiTransaction(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ");
212 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -219,7 +223,8 @@ namespace Bootstrapper
223 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
224 ValidateExecuteCommitMsiTransaction(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ");
225 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
222 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
226 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
227 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
228 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
229 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
230 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -228,12 +233,13 @@ namespace Bootstrapper
233 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
234 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
235 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
236 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
237 Assert::Equal(dwIndex, pPlan->cExecuteActions);
238
239 fRollback = TRUE;
240 dwIndex = 0;
241 dwExecuteCheckpointId = 1;
236 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ", TRUE, TRUE);
242 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ", TRUE, TRUE);
243 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
244 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageC", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
245 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -246,7 +252,8 @@ namespace Bootstrapper
252 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
253 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
254 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
249 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
255 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
256 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
257 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
258 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
259 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
@@ -255,6 +262,7 @@ namespace Bootstrapper
262 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
263 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
264 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
265 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
266 Assert::Equal(dwIndex, pPlan->cRollbackActions);
267
268 Assert::Equal(3ul, pPlan->cExecutePackagesTotal);
@@ -319,7 +327,7 @@ namespace Bootstrapper
327 fRollback = FALSE;
328 dwIndex = 0;
329 DWORD dwExecuteCheckpointId = 2;
322 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
330 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
331 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
332 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
333 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -330,12 +338,13 @@ namespace Bootstrapper
338 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
339 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
340 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
341 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
342 Assert::Equal(dwIndex, pPlan->cExecuteActions);
343
344 fRollback = TRUE;
345 dwIndex = 0;
346 dwExecuteCheckpointId = 2;
338 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
347 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
348 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
349 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
350 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
@@ -346,6 +355,7 @@ namespace Bootstrapper
355 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
356 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
357 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
358 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
359 Assert::Equal(dwIndex, pPlan->cRollbackActions);
360
361 Assert::Equal(1ul, pPlan->cExecutePackagesTotal);
@@ -401,22 +411,24 @@ namespace Bootstrapper
411 fRollback = FALSE;
412 dwIndex = 0;
413 DWORD dwExecuteCheckpointId = 2;
404 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
414 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
415 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
416 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
417 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
418 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
419 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
420 Assert::Equal(dwIndex, pPlan->cExecuteActions);
421
422 fRollback = TRUE;
423 dwIndex = 0;
424 dwExecuteCheckpointId = 2;
414 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
425 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
426 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
427 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
428 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
429 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
430 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
431 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
432 Assert::Equal(dwIndex, pPlan->cRollbackActions);
433
434 Assert::Equal(0ul, pPlan->cExecutePackagesTotal);
@@ -472,7 +484,7 @@ namespace Bootstrapper
484 fRollback = FALSE;
485 dwIndex = 0;
486 DWORD dwExecuteCheckpointId = 2;
475 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
487 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
488 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
489 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
490 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -483,13 +495,14 @@ namespace Bootstrapper
495 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
496 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
497 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
498 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
499 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, NULL);
500 Assert::Equal(dwIndex, pPlan->cExecuteActions);
501
502 fRollback = TRUE;
503 dwIndex = 0;
504 dwExecuteCheckpointId = 2;
492 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
505 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
506 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
507 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
508 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
@@ -500,6 +513,7 @@ namespace Bootstrapper
513 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
514 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
515 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
516 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
517 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_INSTALL, NULL);
518 Assert::Equal(dwIndex, pPlan->cRollbackActions);
519
@@ -551,15 +565,17 @@ namespace Bootstrapper
565 fRollback = FALSE;
566 dwIndex = 0;
567 DWORD dwExecuteCheckpointId = 1;
554 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
568 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
569 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
570 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
571 Assert::Equal(dwIndex, pPlan->cExecuteActions);
572
573 fRollback = TRUE;
574 dwIndex = 0;
575 dwExecuteCheckpointId = 1;
561 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
576 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
577 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
578 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
579 Assert::Equal(dwIndex, pPlan->cRollbackActions);
580
581 Assert::Equal(0ul, pPlan->cExecutePackagesTotal);
@@ -609,7 +625,7 @@ namespace Bootstrapper
625 fRollback = FALSE;
626 dwIndex = 0;
627 DWORD dwExecuteCheckpointId = 1;
612 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
628 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
629 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
630 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER);
631 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -618,12 +634,13 @@ namespace Bootstrapper
634 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
635 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
636 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
637 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
638 Assert::Equal(dwIndex, pPlan->cExecuteActions);
639
640 fRollback = TRUE;
641 dwIndex = 0;
642 dwExecuteCheckpointId = 1;
626 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
643 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
644 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
645 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
646 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
@@ -632,6 +649,7 @@ namespace Bootstrapper
649 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
650 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
651 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
652 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
653 Assert::Equal(dwIndex, pPlan->cRollbackActions);
654
655 Assert::Equal(1ul, pPlan->cExecutePackagesTotal);
@@ -682,21 +700,23 @@ namespace Bootstrapper
700 fRollback = FALSE;
701 dwIndex = 0;
702 DWORD dwExecuteCheckpointId = 1;
685 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
703 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
704 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
705 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER);
706 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
707 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
708 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
709 Assert::Equal(dwIndex, pPlan->cExecuteActions);
710
711 fRollback = TRUE;
712 dwIndex = 0;
713 dwExecuteCheckpointId = 1;
695 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
714 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
715 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
716 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
717 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
718 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
719 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
720 Assert::Equal(dwIndex, pPlan->cRollbackActions);
721
722 Assert::Equal(0ul, pPlan->cExecutePackagesTotal);
@@ -756,7 +776,7 @@ namespace Bootstrapper
776 dwIndex = 0;
777 DWORD dwExecuteCheckpointId = 2;
778 BURN_EXECUTE_ACTION* pExecuteAction = NULL;
759 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
779 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
780 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
781 dwExecuteCheckpointId += 1; // cache checkpoints
782 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"NetFx48Web");
@@ -780,12 +800,13 @@ namespace Bootstrapper
800 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
801 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
802 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
803 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
804 Assert::Equal(dwIndex, pPlan->cExecuteActions);
805
806 fRollback = TRUE;
807 dwIndex = 0;
808 dwExecuteCheckpointId = 2;
788 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
809 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
810 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
811 dwExecuteCheckpointId += 1; // cache checkpoints
812 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -806,6 +827,7 @@ namespace Bootstrapper
827 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
828 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
829 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
830 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
831 Assert::Equal(dwIndex, pPlan->cRollbackActions);
832
833 Assert::Equal(2ul, pPlan->cExecutePackagesTotal);
@@ -857,7 +879,7 @@ namespace Bootstrapper
879 dwIndex = 0;
880 DWORD dwExecuteCheckpointId = 1;
881 BURN_EXECUTE_ACTION* pExecuteAction = NULL;
860 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
882 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
883 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
884 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_UNREGISTER);
885 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -873,12 +895,13 @@ namespace Bootstrapper
895 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
896 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
897 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
898 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
899 Assert::Equal(dwIndex, pPlan->cExecuteActions);
900
901 fRollback = TRUE;
902 dwIndex = 0;
903 dwExecuteCheckpointId = 1;
881 - ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
904 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
905 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
906 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
907 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_REGISTER);
@@ -894,6 +917,7 @@ namespace Bootstrapper
917 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
918 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
919 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
920 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
921 Assert::Equal(dwIndex, pPlan->cRollbackActions);
922
923 Assert::Equal(2ul, pPlan->cExecutePackagesTotal);
@@ -1402,7 +1426,7 @@ namespace Bootstrapper
1426 Assert::Equal<BOOL>(FALSE, pAction->fDeleted);
1427 }
1428
1405 - void ValidateExecuteRollbackBoundary(
1429 + void ValidateExecuteRollbackBoundaryStart(
1430 __in BURN_PLAN* pPlan,
1431 __in BOOL fRollback,
1432 __in DWORD dwIndex,
@@ -1412,13 +1436,25 @@ namespace Bootstrapper
1436 )
1437 {
1438 BURN_EXECUTE_ACTION* pAction = ValidateExecuteActionExists(pPlan, fRollback, dwIndex);
1415 - Assert::Equal<DWORD>(BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY, pAction->type);
1439 + Assert::Equal<DWORD>(BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_START, pAction->type);
1440 NativeAssert::StringEqual(wzId, pAction->rollbackBoundary.pRollbackBoundary->sczId);
1441 Assert::Equal<BOOL>(fVital, pAction->rollbackBoundary.pRollbackBoundary->fVital);
1442 Assert::Equal<BOOL>(fTransaction, pAction->rollbackBoundary.pRollbackBoundary->fTransaction);
1443 Assert::Equal<BOOL>(FALSE, pAction->fDeleted);
1444 }
1445
1446 + void ValidateExecuteRollbackBoundaryEnd(
1447 + __in BURN_PLAN* pPlan,
1448 + __in BOOL fRollback,
1449 + __in DWORD dwIndex
1450 + )
1451 + {
1452 + BURN_EXECUTE_ACTION* pAction = ValidateExecuteActionExists(pPlan, fRollback, dwIndex);
1453 + Assert::Equal<DWORD>(BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_END, pAction->type);
1454 + Assert::Equal<size_t>(NULL, (size_t)(pAction->rollbackBoundary.pRollbackBoundary));
1455 + Assert::Equal<BOOL>(FALSE, pAction->fDeleted);
1456 + }
1457 +
1458 void ValidateExecuteUncachePackage(
1459 __in BURN_PLAN* pPlan,
1460 __in BOOL fRollback,
src/test/burn/WixToolsetTest.BurnE2E/RollbackBoundaryTests.cs
+1 -1
@@ -22,7 +22,7 @@ namespace WixToolsetTest.BurnE2E
22 /// install package B
23 /// unregister since no non-permanent packages should be installed or cached.
24 /// </summary>
25 - [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6309")]
25 + [Fact]
26 public void NonVitalRollbackBoundarySkipsToNextRollbackBoundary()
27 {
28 var packageA = this.CreatePackageInstaller("PackageA");