@joebigelow / wix / commits / 78125b7c

Log rest of plan and add testing of registration actions to PlanTest.

Sean Hall committed Mar 13, 2022 at 23:47 UTC 78125b7c4bd59468275d65b63860bdb68b1bc6f1
5 files changed +440 -3
src/burn/engine/logging.cpp
+19
@@ -740,6 +740,25 @@ extern "C" LPCSTR LoggingPlanRelationTypeToString(
740 }
741 }
742
743 +extern "C" LPCSTR LoggingRegistrationOptionsToString(
744 + __in DWORD dwRegistrationOptions
745 + )
746 +{
747 + switch (dwRegistrationOptions)
748 + {
749 + case BURN_REGISTRATION_ACTION_OPERATIONS_NONE:
750 + return "None";
751 + case BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE:
752 + return "CacheBundle";
753 + case BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_PROVIDER_KEY:
754 + return "WriteProviderKey";
755 + case BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE + BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_PROVIDER_KEY:
756 + return "CacheBundle, WriteProviderKey";
757 + default:
758 + return "Invalid";
759 + }
760 +}
761 +
762 extern "C" LPCSTR LoggingRelationTypeToString(
763 __in BOOTSTRAPPER_RELATION_TYPE type
764 )
src/burn/engine/logging.h
+4
@@ -158,6 +158,10 @@ LPCSTR LoggingPlanRelationTypeToString(
158 __in BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE type
159 );
160
161 +LPCSTR LoggingRegistrationOptionsToString(
162 + __in DWORD dwRegistrationOptions
163 + );
164 +
165 LPCSTR LoggingRelationTypeToString(
166 __in BOOTSTRAPPER_RELATION_TYPE type
167 );
src/burn/engine/plan.cpp
+46
@@ -2786,6 +2786,36 @@ static BOOL ForceCache(
2786 }
2787 }
2788
2789 +static void DependentRegistrationActionLog(
2790 + __in DWORD iAction,
2791 + __in BURN_DEPENDENT_REGISTRATION_ACTION* pAction,
2792 + __in BOOL fRollback
2793 + )
2794 +{
2795 + LPCWSTR wzBase = fRollback ? L" Rollback dependent registration" : L" Dependent registration";
2796 + LPCWSTR wzType = NULL;
2797 +
2798 + switch (pAction->type)
2799 + {
2800 + case BURN_DEPENDENT_REGISTRATION_ACTION_TYPE_REGISTER:
2801 + wzType = L"REGISTER";
2802 + break;
2803 +
2804 + case BURN_DEPENDENT_REGISTRATION_ACTION_TYPE_UNREGISTER:
2805 + wzType = L"UNREGISTER";
2806 + break;
2807 +
2808 + default:
2809 + AssertSz(FALSE, "Unknown cache action type.");
2810 + break;
2811 + }
2812 +
2813 + if (wzType)
2814 + {
2815 + LogStringLine(PlanDumpLevel, "%ls action[%u]: %ls bundle id: %ls, provider key: %ls", wzBase, iAction, wzType, pAction->sczBundleId, pAction->sczDependentProviderKey);
2816 + }
2817 +}
2818 +
2819 static void CacheActionLog(
2820 __in DWORD iAction,
2821 __in BURN_CACHE_ACTION* pAction,
@@ -2974,14 +3004,30 @@ extern "C" void PlanDump(
3004 LogStringLine(PlanDumpLevel, "--- Begin plan dump ---");
3005
3006 LogStringLine(PlanDumpLevel, "Plan action: %hs", LoggingBurnActionToString(pPlan->action));
3007 + LogStringLine(PlanDumpLevel, " bundle id: %ls", pPlan->wzBundleId);
3008 + LogStringLine(PlanDumpLevel, " bundle provider key: %ls", pPlan->wzBundleProviderKey);
3009 + LogStringLine(PlanDumpLevel, " use-forward-compatible: %hs", LoggingTrueFalseToString(pPlan->fEnabledForwardCompatibleBundle));
3010 LogStringLine(PlanDumpLevel, " per-machine: %hs", LoggingTrueFalseToString(pPlan->fPerMachine));
3011 + LogStringLine(PlanDumpLevel, " can affect machine state: %hs", LoggingTrueFalseToString(pPlan->fCanAffectMachineState));
3012 LogStringLine(PlanDumpLevel, " disable-rollback: %hs", LoggingTrueFalseToString(pPlan->fDisableRollback));
3013 + LogStringLine(PlanDumpLevel, " disallow-removal: %hs", LoggingTrueFalseToString(pPlan->fDisallowRemoval));
3014 + LogStringLine(PlanDumpLevel, " registration options: %hs", LoggingRegistrationOptionsToString(pPlan->dwRegistrationOperations));
3015 LogStringLine(PlanDumpLevel, " estimated size: %llu", pPlan->qwEstimatedSize);
3016 if (pPlan->sczLayoutDirectory)
3017 {
3018 LogStringLine(PlanDumpLevel, " layout directory: %ls", pPlan->sczLayoutDirectory);
3019 }
3020
3021 + for (DWORD i = 0; i < pPlan->cRegistrationActions; ++i)
3022 + {
3023 + DependentRegistrationActionLog(i, pPlan->rgRegistrationActions + i, FALSE);
3024 + }
3025 +
3026 + for (DWORD i = 0; i < pPlan->cRollbackRegistrationActions; ++i)
3027 + {
3028 + DependentRegistrationActionLog(i, pPlan->rgRollbackRegistrationActions + i, TRUE);
3029 + }
3030 +
3031 LogStringLine(PlanDumpLevel, "Plan cache size: %llu", pPlan->qwCacheSizeTotal);
3032 for (DWORD i = 0; i < pPlan->cCacheActions; ++i)
3033 {
src/burn/test/BurnUnitTest/PlanTest.cpp
+370 -2
@@ -60,11 +60,26 @@ namespace Bootstrapper
60 NativeAssert::Succeeded(hr, "CorePlan failed");
61
62 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
63 + NativeAssert::StringEqual(L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", pPlan->wzBundleId);
64 + NativeAssert::StringEqual(L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", pPlan->wzBundleProviderKey);
65 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
66 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
67 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
68 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
69 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
70
71 BOOL fRollback = FALSE;
72 DWORD dwIndex = 0;
73 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}");
74 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
75 +
76 + fRollback = TRUE;
77 + dwIndex = 0;
78 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}");
79 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
80 +
81 + fRollback = FALSE;
82 + dwIndex = 0;
83 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
84 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
85 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -204,11 +219,26 @@ namespace Bootstrapper
219 NativeAssert::Succeeded(hr, "CorePlan failed");
220
221 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
222 + NativeAssert::StringEqual(L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", pPlan->wzBundleId);
223 + NativeAssert::StringEqual(L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", pPlan->wzBundleProviderKey);
224 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
225 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
226 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
227 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
228 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
229
230 BOOL fRollback = FALSE;
231 DWORD dwIndex = 0;
232 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}");
233 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
234 +
235 + fRollback = TRUE;
236 + dwIndex = 0;
237 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}");
238 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
239 +
240 + fRollback = FALSE;
241 + dwIndex = 0;
242 Assert::Equal(dwIndex, pPlan->cCacheActions);
243
244 fRollback = TRUE;
@@ -321,11 +351,24 @@ namespace Bootstrapper
351 NativeAssert::Succeeded(hr, "CorePlan failed");
352
353 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
354 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
355 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
356 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
357 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
358 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
359 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
360 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
361
362 BOOL fRollback = FALSE;
363 DWORD dwIndex = 0;
364 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
365 +
366 + fRollback = TRUE;
367 + dwIndex = 0;
368 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
369 +
370 + fRollback = FALSE;
371 + dwIndex = 0;
372 Assert::Equal(dwIndex, pPlan->cCacheActions);
373
374 fRollback = TRUE;
@@ -407,11 +450,26 @@ namespace Bootstrapper
450 NativeAssert::Succeeded(hr, "CorePlan failed");
451
452 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
453 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
454 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
455 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
456 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
457 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
458 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
459 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
460
461 BOOL fRollback = FALSE;
462 DWORD dwIndex = 0;
463 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
464 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
465 +
466 + fRollback = TRUE;
467 + dwIndex = 0;
468 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
469 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
470 +
471 + fRollback = FALSE;
472 + dwIndex = 0;
473 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
474 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
475 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -510,11 +568,26 @@ namespace Bootstrapper
568 NativeAssert::Succeeded(hr, "CorePlan failed");
569
570 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
571 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
572 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
573 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
574 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
575 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
576 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
577 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
578
579 BOOL fRollback = FALSE;
580 DWORD dwIndex = 0;
581 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
582 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
583 +
584 + fRollback = TRUE;
585 + dwIndex = 0;
586 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
587 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
588 +
589 + fRollback = FALSE;
590 + dwIndex = 0;
591 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
592 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
593 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -597,11 +670,26 @@ namespace Bootstrapper
670 NativeAssert::Succeeded(hr, "CorePlan failed");
671
672 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_CACHE, pPlan->action);
673 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
674 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
675 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
676 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
677 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
678 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
679 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
680
681 BOOL fRollback = FALSE;
682 DWORD dwIndex = 0;
683 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
684 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
685 +
686 + fRollback = TRUE;
687 + dwIndex = 0;
688 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
689 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
690 +
691 + fRollback = FALSE;
692 + dwIndex = 0;
693 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
694 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
695 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -675,11 +763,24 @@ namespace Bootstrapper
763 NativeAssert::Succeeded(hr, "CorePlan failed");
764
765 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
766 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
767 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
768 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
769 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
770 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
771 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
772 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
773
774 BOOL fRollback = FALSE;
775 DWORD dwIndex = 0;
776 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
777 +
778 + fRollback = TRUE;
779 + dwIndex = 0;
780 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
781 +
782 + fRollback = FALSE;
783 + dwIndex = 0;
784 Assert::Equal(dwIndex, pPlan->cCacheActions);
785
786 fRollback = TRUE;
@@ -750,11 +851,24 @@ namespace Bootstrapper
851 NativeAssert::Succeeded(hr, "CorePlan failed");
852
853 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
854 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
855 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
856 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
857 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
858 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
859 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
860 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
861
862 BOOL fRollback = FALSE;
863 DWORD dwIndex = 0;
864 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
865 +
866 + fRollback = TRUE;
867 + dwIndex = 0;
868 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
869 +
870 + fRollback = FALSE;
871 + dwIndex = 0;
872 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
873 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
874 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -827,11 +941,26 @@ namespace Bootstrapper
941 NativeAssert::Succeeded(hr, "CorePlan failed");
942
943 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
944 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
945 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
946 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
947 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
948 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
949 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
950 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
951
952 BOOL fRollback = FALSE;
953 DWORD dwIndex = 0;
954 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
955 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
956 +
957 + fRollback = TRUE;
958 + dwIndex = 0;
959 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
960 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
961 +
962 + fRollback = FALSE;
963 + dwIndex = 0;
964 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
965 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
966 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -917,11 +1046,26 @@ namespace Bootstrapper
1046 NativeAssert::Succeeded(hr, "CorePlan failed");
1047
1048 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_MODIFY, pPlan->action);
1049 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
1050 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
1051 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
1052 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1053 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1054 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1055 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1056
1057 BOOL fRollback = FALSE;
1058 DWORD dwIndex = 0;
1059 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
1060 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
1061 +
1062 + fRollback = TRUE;
1063 + dwIndex = 0;
1064 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
1065 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
1066 +
1067 + fRollback = FALSE;
1068 + dwIndex = 0;
1069 Assert::Equal(dwIndex, pPlan->cCacheActions);
1070
1071 fRollback = TRUE;
@@ -980,11 +1124,26 @@ namespace Bootstrapper
1124 NativeAssert::Succeeded(hr, "CorePlan failed");
1125
1126 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
1127 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
1128 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
1129 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
1130 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1131 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1132 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1133 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1134
1135 BOOL fRollback = FALSE;
1136 DWORD dwIndex = 0;
1137 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
1138 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
1139 +
1140 + fRollback = TRUE;
1141 + dwIndex = 0;
1142 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
1143 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
1144 +
1145 + fRollback = FALSE;
1146 + dwIndex = 0;
1147 Assert::Equal(dwIndex, pPlan->cCacheActions);
1148
1149 fRollback = TRUE;
@@ -1043,6 +1202,76 @@ namespace Bootstrapper
1202 ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[0], L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BURN_PACKAGE_REGISTRATION_STATE_ABSENT);
1203 }
1204
1205 + [Fact]
1206 + void SingleMsiUninstallWithDependentTest()
1207 + {
1208 + HRESULT hr = S_OK;
1209 + BURN_ENGINE_STATE engineState = { };
1210 + BURN_ENGINE_STATE* pEngineState = &engineState;
1211 + BURN_PLAN* pPlan = &engineState.plan;
1212 +
1213 + InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState);
1214 + DetectPackagesAsPresentAndCached(pEngineState);
1215 + DetectBundleDependent(pEngineState, L"{29855EB1-724D-4285-A89C-5D37D8549DCD}");
1216 +
1217 + hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL);
1218 + NativeAssert::Succeeded(hr, "CorePlan failed");
1219 +
1220 + Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
1221 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
1222 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
1223 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
1224 + Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1225 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1226 + Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1227 + Assert::Equal<BOOL>(TRUE, pPlan->fDisallowRemoval);
1228 +
1229 + BOOL fRollback = FALSE;
1230 + DWORD dwIndex = 0;
1231 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
1232 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
1233 +
1234 + fRollback = TRUE;
1235 + dwIndex = 0;
1236 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
1237 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
1238 +
1239 + fRollback = FALSE;
1240 + dwIndex = 0;
1241 + Assert::Equal(dwIndex, pPlan->cCacheActions);
1242 +
1243 + fRollback = TRUE;
1244 + dwIndex = 0;
1245 + Assert::Equal(dwIndex, pPlan->cRollbackCacheActions);
1246 +
1247 + Assert::Equal(0ull, pPlan->qwEstimatedSize);
1248 + Assert::Equal(0ull, pPlan->qwCacheSizeTotal);
1249 +
1250 + fRollback = FALSE;
1251 + dwIndex = 0;
1252 + Assert::Equal(dwIndex, pPlan->cExecuteActions);
1253 +
1254 + fRollback = TRUE;
1255 + dwIndex = 0;
1256 + Assert::Equal(dwIndex, pPlan->cRollbackActions);
1257 +
1258 + Assert::Equal(0ul, pPlan->cExecutePackagesTotal);
1259 + Assert::Equal(0ul, pPlan->cOverallProgressTicksTotal);
1260 +
1261 + dwIndex = 0;
1262 + Assert::Equal(dwIndex, pPlan->cRestoreRelatedBundleActions);
1263 +
1264 + dwIndex = 0;
1265 + Assert::Equal(dwIndex, pPlan->cCleanActions);
1266 +
1267 + UINT uIndex = 0;
1268 + ValidatePlannedProvider(pPlan, uIndex++, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", NULL);
1269 + Assert::Equal(uIndex, pPlan->cPlannedProviders);
1270 +
1271 + Assert::Equal(1ul, pEngineState->packages.cPackages);
1272 + ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[0], L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN, BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN);
1273 + }
1274 +
1275 [Fact]
1276 void SingleMsiUninstallTestFromUpgradeBundleWithSameExactPackage()
1277 {
@@ -1058,11 +1287,26 @@ namespace Bootstrapper
1287 NativeAssert::Succeeded(hr, "CorePlan failed");
1288
1289 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
1290 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
1291 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
1292 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
1293 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1294 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1295 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1296 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1297
1298 BOOL fRollback = FALSE;
1299 DWORD dwIndex = 0;
1300 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
1301 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
1302 +
1303 + fRollback = TRUE;
1304 + dwIndex = 0;
1305 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
1306 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
1307 +
1308 + fRollback = FALSE;
1309 + dwIndex = 0;
1310 Assert::Equal(dwIndex, pPlan->cCacheActions);
1311
1312 fRollback = TRUE;
@@ -1126,11 +1370,26 @@ namespace Bootstrapper
1370 NativeAssert::Succeeded(hr, "CorePlan failed");
1371
1372 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL, pPlan->action);
1373 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleId);
1374 + NativeAssert::StringEqual(L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", pPlan->wzBundleProviderKey);
1375 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
1376 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1377 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1378 Assert::Equal<BOOL>(TRUE, pPlan->fDisableRollback);
1379 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1380
1381 BOOL fRollback = FALSE;
1382 DWORD dwIndex = 0;
1383 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
1384 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
1385 +
1386 + fRollback = TRUE;
1387 + dwIndex = 0;
1388 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}");
1389 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
1390 +
1391 + fRollback = FALSE;
1392 + dwIndex = 0;
1393 Assert::Equal(dwIndex, pPlan->cCacheActions);
1394
1395 fRollback = TRUE;
@@ -1205,11 +1464,26 @@ namespace Bootstrapper
1464 NativeAssert::Succeeded(hr, "CorePlan failed");
1465
1466 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
1467 + NativeAssert::StringEqual(L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", pPlan->wzBundleId);
1468 + NativeAssert::StringEqual(L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", pPlan->wzBundleProviderKey);
1469 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
1470 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1471 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1472 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1473 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1474
1475 BOOL fRollback = FALSE;
1476 DWORD dwIndex = 0;
1477 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}");
1478 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
1479 +
1480 + fRollback = TRUE;
1481 + dwIndex = 0;
1482 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}");
1483 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
1484 +
1485 + fRollback = FALSE;
1486 + dwIndex = 0;
1487 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
1488 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"NetFx48Web");
1489 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -1320,11 +1594,26 @@ namespace Bootstrapper
1594 NativeAssert::Succeeded(hr, "CorePlan failed");
1595
1596 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
1597 + NativeAssert::StringEqual(L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", pPlan->wzBundleId);
1598 + NativeAssert::StringEqual(L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", pPlan->wzBundleProviderKey);
1599 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
1600 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1601 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1602 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1603 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1604
1605 BOOL fRollback = FALSE;
1606 DWORD dwIndex = 0;
1607 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}");
1608 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
1609 +
1610 + fRollback = TRUE;
1611 + dwIndex = 0;
1612 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}");
1613 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
1614 +
1615 + fRollback = FALSE;
1616 + dwIndex = 0;
1617 Assert::Equal(dwIndex, pPlan->cCacheActions);
1618
1619 fRollback = TRUE;
@@ -1420,11 +1709,26 @@ namespace Bootstrapper
1709 NativeAssert::Succeeded(hr, "CorePlan failed");
1710
1711 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
1712 + NativeAssert::StringEqual(L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", pPlan->wzBundleId);
1713 + NativeAssert::StringEqual(L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", pPlan->wzBundleProviderKey);
1714 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
1715 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1716 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1717 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1718 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1719
1720 BOOL fRollback = FALSE;
1721 DWORD dwIndex = 0;
1722 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}");
1723 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
1724 +
1725 + fRollback = TRUE;
1726 + dwIndex = 0;
1727 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}");
1728 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
1729 +
1730 + fRollback = FALSE;
1731 + dwIndex = 0;
1732 Assert::Equal(dwIndex, pPlan->cCacheActions);
1733
1734 fRollback = TRUE;
@@ -1475,7 +1779,7 @@ namespace Bootstrapper
1779 Assert::Equal(dwIndex, pPlan->cCleanActions);
1780
1781 UINT uIndex = 0;
1478 - ValidatePlannedProvider(pPlan, uIndex++, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", NULL);
1782 + ValidatePlannedProvider(pPlan, uIndex++, L"{DC94A8E0-4BF4-4026-B80B-2755DAFC05D3}", NULL);
1783 ValidatePlannedProvider(pPlan, uIndex++, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", NULL);
1784 Assert::Equal(uIndex, pPlan->cPlannedProviders);
1785
@@ -1499,11 +1803,26 @@ namespace Bootstrapper
1803 NativeAssert::Succeeded(hr, "CorePlan failed");
1804
1805 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
1806 + NativeAssert::StringEqual(L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", pPlan->wzBundleId);
1807 + NativeAssert::StringEqual(L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", pPlan->wzBundleProviderKey);
1808 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
1809 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1810 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1811 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1812 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1813
1814 BOOL fRollback = FALSE;
1815 DWORD dwIndex = 0;
1816 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}");
1817 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
1818 +
1819 + fRollback = TRUE;
1820 + dwIndex = 0;
1821 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}");
1822 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
1823 +
1824 + fRollback = FALSE;
1825 + dwIndex = 0;
1826 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
1827 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"NetFx48Web");
1828 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -1576,7 +1895,7 @@ namespace Bootstrapper
1895 Assert::Equal(dwIndex, pPlan->cCleanActions);
1896
1897 UINT uIndex = 0;
1579 - ValidatePlannedProvider(pPlan, uIndex++, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", NULL);
1898 + ValidatePlannedProvider(pPlan, uIndex++, L"{DC94A8E0-4BF4-4026-B80B-2755DAFC05D3}", NULL);
1899 Assert::Equal(uIndex, pPlan->cPlannedProviders);
1900
1901 Assert::Equal(2ul, pEngineState->packages.cPackages);
@@ -1728,6 +2047,29 @@ namespace Bootstrapper
2047 }
2048 }
2049
2050 + void DetectBundleDependent(BURN_ENGINE_STATE* pEngineState, LPCWSTR wzId)
2051 + {
2052 + HRESULT hr = S_OK;
2053 + BURN_DEPENDENCIES* pDependencies = &pEngineState->dependencies;
2054 + BURN_REGISTRATION* pRegistration = &pEngineState->registration;
2055 +
2056 + hr = DepDependencyArrayAlloc(&pRegistration->rgDependents, &pRegistration->cDependents, wzId, NULL);
2057 + NativeAssert::Succeeded(hr, "Failed to add package dependent");
2058 +
2059 + if (pDependencies->fSelfDependent || pDependencies->fActiveParent)
2060 + {
2061 + if (pDependencies->fActiveParent && CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, NORM_IGNORECASE, pDependencies->wzActiveParent, -1, wzId, -1))
2062 + {
2063 + pRegistration->fParentRegisteredAsDependent = TRUE;
2064 + }
2065 +
2066 + if (pDependencies->fSelfDependent && CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, NORM_IGNORECASE, pDependencies->wzSelfDependent, -1, wzId, -1))
2067 + {
2068 + pRegistration->fSelfRegisteredAsDependent = TRUE;
2069 + }
2070 + }
2071 + }
2072 +
2073 void DetectPackageDependent(BURN_PACKAGE* pPackage, LPCWSTR wzId)
2074 {
2075 HRESULT hr = S_OK;
@@ -1761,6 +2103,11 @@ namespace Bootstrapper
2103
2104 pEngineState->registration.detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL;
2105
2106 + if (pEngineState->dependencies.wzSelfDependent)
2107 + {
2108 + DetectBundleDependent(pEngineState, pEngineState->dependencies.wzSelfDependent);
2109 + }
2110 +
2111 for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i)
2112 {
2113 BURN_PACKAGE* pPackage = pEngineState->packages.rgPackages + i;
@@ -1971,6 +2318,27 @@ namespace Bootstrapper
2318 NativeAssert::StringEqual(wzPackageId, pCleanAction->pPackage->sczId);
2319 }
2320
2321 + BURN_DEPENDENT_REGISTRATION_ACTION* ValidateDependentRegistrationActionExists(BURN_PLAN* pPlan, BOOL fRollback, DWORD dwIndex)
2322 + {
2323 + Assert::InRange(dwIndex + 1ul, 1ul, (fRollback ? pPlan->cRollbackRegistrationActions : pPlan->cRegistrationActions));
2324 + return (fRollback ? pPlan->rgRollbackRegistrationActions : pPlan->rgRegistrationActions) + dwIndex;
2325 + }
2326 +
2327 + void ValidateDependentRegistrationAction(
2328 + __in BURN_PLAN* pPlan,
2329 + __in BOOL fRollback,
2330 + __in DWORD dwIndex,
2331 + __in BOOL fRegister,
2332 + __in LPCWSTR wzBundleId,
2333 + __in LPCWSTR wzProviderKey
2334 + )
2335 + {
2336 + BURN_DEPENDENT_REGISTRATION_ACTION* pAction = ValidateDependentRegistrationActionExists(pPlan, fRollback, dwIndex);
2337 + Assert::Equal<DWORD>(fRegister ? BURN_DEPENDENT_REGISTRATION_ACTION_TYPE_REGISTER : BURN_DEPENDENT_REGISTRATION_ACTION_TYPE_UNREGISTER, pAction->type);
2338 + NativeAssert::StringEqual(wzBundleId, pAction->sczBundleId);
2339 + NativeAssert::StringEqual(wzProviderKey, pAction->sczDependentProviderKey);
2340 + }
2341 +
2342 BURN_EXECUTE_ACTION* ValidateExecuteActionExists(BURN_PLAN* pPlan, BOOL fRollback, DWORD dwIndex)
2343 {
2344 Assert::InRange(dwIndex + 1ul, 1ul, (fRollback ? pPlan->cRollbackActions : pPlan->cExecuteActions));
src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml
+1 -1
@@ -1 +1 @@
1 -<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="~SlipstreamTests_BundleA" Extension=".log" /><RelatedBundle Id="{62C28DAF-A13E-4F55-ACA1-FB843630789C}" Action="Upgrade" /><Variable Id="TestGroupName" Value="SlipstreamTests" Type="string" Hidden="no" Persisted="no" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Type="value" VariableType="string" /><UX><Payload Id="WixManagedBootstrapperApplicationHost" FilePath="mbahost.dll" FileSize="140288" Hash="4569C53566B1025E243E0C29A96C608BD4019979" Packaging="embedded" SourcePath="u30" /><Payload Id="payO60IVK4ATGzPpMz3rwVbUWl6DyU" FilePath="WixToolset.Mba.Host.config" FileSize="783" Hash="B5BDD5E7179A94C2C817069913CA8C099DF811B9" Packaging="embedded" SourcePath="u0" /><Payload Id="payxj4zDAKL2NVlz4ohp0GvwFHepyI" FilePath="TestBA.dll" FileSize="25088" Hash="DB12DB6565CDBC4E9705204830E421ACEB710129" Packaging="embedded" SourcePath="u1" /><Payload Id="pay1hOSAUC8_D633cD2TXpIXCL30OU" FilePath="mbanative.dll" FileSize="118272" Hash="3A7A20D97B0546A23A025EE5774BE237C14D2957" Packaging="embedded" SourcePath="u2" /><Payload Id="payujy6Izl_BlUNfHt2eI.ADfjYAv4" FilePath="WixToolset.Mba.Core.dll" FileSize="114688" Hash="56BA3EA94BEBF8EB562C914495E1594E74F05DBE" Packaging="embedded" SourcePath="u3" /><Payload Id="payR4EbR4OTDZpPEycWaSSM_gZRBWM" FilePath="mbapreq.thm" FileSize="3599" Hash="8D9797C1E1A50AECB8B85FFCEA6A2A2EF611BD7F" Packaging="embedded" SourcePath="u4" /><Payload Id="paylVCy2Ecl8pHPdJTCQZryUG4T9us" FilePath="mbapreq.png" FileSize="797" Hash="75AE41181581FD6376CA9CA88147011E48BF9A30" Packaging="embedded" SourcePath="u5" /><Payload Id="payTaG4B_lob1aLcKFaOqSSG3MPMpU" FilePath="mbapreq.wxl" FileSize="2237" Hash="068B3C5E27AECE7987EABAA2802C9EB07B39EAF8" Packaging="embedded" SourcePath="u6" /><Payload Id="payZwIGuiezVTitZOoZKxyh2DdRSGs" FilePath="1028\mbapreq.wxl" FileSize="1998" Hash="A989D9B892F497215D81F903591ECB6CD50CFFFC" Packaging="embedded" SourcePath="u7" /><Payload Id="pay.herBWX.LlOh8jLsx24aWdunV_0" FilePath="1029\mbapreq.wxl" FileSize="2428" Hash="E6B8E4B1AA89430EB6A5A1E997CA3D1D2F968285" Packaging="embedded" SourcePath="u8" /><Payload Id="pay8DkMszYsoxxdgX14huLDMYXylQg" FilePath="1030\mbapreq.wxl" FileSize="2256" Hash="612CD2FD0CF3800639385C0BF4D805B24507D356" Packaging="embedded" SourcePath="u9" /><Payload Id="payPaHpoTeOdkW.TK99IDwktNLhTAg" FilePath="1031\mbapreq.wxl" FileSize="2409" Hash="E59A8F11D95AC17FC70BD718706EE36BFA50EF02" Packaging="embedded" SourcePath="u10" /><Payload Id="pay45AtAzterLTMzZgdxxtuYvaiXwU" FilePath="1032\mbapreq.wxl" FileSize="3368" Hash="154E0A658BA7EE59889224A231423634A9725547" Packaging="embedded" SourcePath="u11" /><Payload Id="payA2VEKIqhePyNIEmr14eyH3JoVLc" FilePath="1035\mbapreq.wxl" FileSize="2205" Hash="6AAE55269E42F99A5D88ADD18C433384DEB9E956" Packaging="embedded" SourcePath="u12" /><Payload Id="payvre23ObscjzhcaFIifUAkXMdPa8" FilePath="1036\mbapreq.wxl" FileSize="2276" Hash="7DC74874357F50AE8C4871D8F4DC06B337CF6352" Packaging="embedded" SourcePath="u13" /><Payload Id="paytxUV3vuBbG2c.a9c.d_sZX2x6wA" FilePath="1038\mbapreq.wxl" FileSize="2362" Hash="B60C34DE38E6E48BA0841E8A962C17179FC1B69A" Packaging="embedded" SourcePath="u14" /><Payload Id="payYvMWRK9xelo5.sQn7jRkJIaBp9A" FilePath="1040\mbapreq.wxl" FileSize="2273" Hash="902D231AD6306087F215DEABB7F2AB2F8072C401" Packaging="embedded" SourcePath="u15" /><Payload Id="pay68KKSApyQimbA25t6kSbqhdeH10" FilePath="1041\mbapreq.wxl" FileSize="2518" Hash="4095A1AFCF18C01F7DA51A1A389C2FBBB1A82A12" Packaging="embedded" SourcePath="u16" /><Payload Id="paypiqxaHpYZqx.9eDVjQrj1igLbRY" FilePath="1042\mbapreq.wxl" FileSize="2209" Hash="99CE8B42300EF656E6BD44F01766DC638CB0496F" Packaging="embedded" SourcePath="u17" /><Payload Id="payTO0YwZzxKpbqdrBVUcVRTu3BFe8" FilePath="1043\mbapreq.wxl" FileSize="2282" Hash="87117EE32E0004E25DDCEB1A7D417F3A02856A50" Packaging="embedded" SourcePath="u18" /><Payload Id="payIXg2ldBJukRzhqWolJVOEbTmF34" FilePath="1044\mbapreq.wxl" FileSize="2141" Hash="5AED841C6A870C3A8BAF8A10D00F887A781D0CF0" Packaging="embedded" SourcePath="u19" /><Payload Id="payOHIZbSkIvrpwKkkXI173tv3u3B4" FilePath="1045\mbapreq.wxl" FileSize="2338" Hash="07E37CBC59298F24A5C8C3B8FEB7A45DADF8CD07" Packaging="embedded" SourcePath="u20" /><Payload Id="payQRQ_UZl_R2UtV0xDXB2yeH2bg3E" FilePath="1046\mbapreq.wxl" FileSize="2118" Hash="AEC0CE51E8E335E9B86F1AC7E39CCD172B896582" Packaging="embedded" SourcePath="u21" /><Payload Id="payhrejLLBfc1i27iN._QPhQ4K337I" FilePath="1049\mbapreq.wxl" FileSize="2851" Hash="9628BADB173B171ED85D902634D9AA5D91FE9721" Packaging="embedded" SourcePath="u22" /><Payload Id="payqEzaDNzxB68vGp29jgDcCos6dvg" FilePath="1051\mbapreq.wxl" FileSize="2304" Hash="B584E8C0D7F9B7A1BB70BC00E42BFD35BED5D81D" Packaging="embedded" SourcePath="u23" /><Payload Id="paydz8Vk8xSTyYohgGXTSIxWGXL5.Q" FilePath="1053\mbapreq.wxl" FileSize="2102" Hash="67E93F555DBFEF8508E79F7CA8CE76B881308760" Packaging="embedded" SourcePath="u24" /><Payload Id="pay0HRUZTlbC3taSOffJBsEj92Br8Y" FilePath="1055\mbapreq.wxl" FileSize="2273" Hash="AEB8C90D66942A5CD73EA52A6F2ADD4F7D518A0D" Packaging="embedded" SourcePath="u25" /><Payload Id="payIvUOkc_EMH7laMFehefNolV8hZo" FilePath="1060\mbapreq.wxl" FileSize="2170" Hash="B1D4B71907B8BD82DD8B047404AF10FDBBE5CBA0" Packaging="embedded" SourcePath="u26" /><Payload Id="payLFhOb.rHuk4sW5CYAPMShG0NjGI" FilePath="2052\mbapreq.wxl" FileSize="1953" Hash="C8FB8982EC71C48D6EA021ADD9AAA7BCB0656281" Packaging="embedded" SourcePath="u27" /><Payload Id="payqIKCmERK7Nhxx_nNXvRxdKqKDbI" FilePath="2070\mbapreq.wxl" FileSize="2182" Hash="825F27A543907ED27E815EC67DFD48AF7BF5831E" Packaging="embedded" SourcePath="u28" /><Payload Id="payqeWUzIVaEqjuRXN0z8ECC3Y4tCc" FilePath="3082\mbapreq.wxl" FileSize="2369" Hash="39C07C31077AAFDC0DD208273AA41654CAD80FDD" Packaging="embedded" SourcePath="u29" /><Payload Id="paylfeHEjJSSTnNzY9QMZM2Ye3Ipy4" FilePath="mbapreq.dll" FileSize="245760" Hash="6499FA21D178131DDE13A4EF44ABEC32E91D65D4" Packaging="embedded" SourcePath="u31" /><Payload Id="payDPxs6uy8nbky.R7zhir2RRAfc.c" FilePath="WixToolset.Mba.Host.dll" FileSize="11264" Hash="9E6452891E401EB211DD41550A09FDF98EC0992F" Packaging="embedded" SourcePath="u32" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" FileSize="14292" Hash="CDF09A0723F4F33C13670BBAFCFFA7E660E15DFC" Packaging="embedded" SourcePath="u33" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" FileSize="252" Hash="86688B13D3364ADB90BBA552F544D4D546AFD63D" Packaging="embedded" SourcePath="u34" /></UX><Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1479400" Hash="5A84A8E612E270E27D0061D58DB6B470153BE1F9" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /><Payload Id="PackageA" FilePath="PackageAv1.msi" FileSize="32768" Hash="2369B16B7219B3C834DFBC5D2AF8B2EF8803D43D" Packaging="external" SourcePath="PackageAv1.msi" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{22D1DDBA-284D-40A7-BD14-95EA07906F21}" ExecutableName="BundleA.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{22D1DDBA-284D-40A7-BD14-95EA07906F21}"><Arp Register="yes" DisplayName="~SlipstreamTests - BundleA" DisplayVersion="1.0.0.0" /></Registration><Chain><ExePackage Id="NetFx48Web" Cache="keep" CacheId="5A84A8E612E270E27D0061D58DB6B470153BE1F9" InstallSize="1479400" Size="1479400" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" RepairArguments="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" Repairable="yes" Uninstallable="no" Protocol="netfx4"><PayloadRef Id="NetFx48Web" /></ExePackage><MsiPackage Id="PackageA" Cache="keep" CacheId="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}v1.0.0.0" InstallSize="2103" Size="32768" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Language="1033" Version="1.0.0.0" UpgradeCode="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}"><MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /><MsiProperty Id="MSIFASTINSTALL" Value="7" /><Provides Key="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Version="1.0.0.0" DisplayName="~SlipstreamTests - PackageA" /><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="no"><Language Id="1033" /></RelatedPackage><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="no"><Language Id="1033" /></RelatedPackage><PayloadRef Id="PackageA" /></MsiPackage></Chain><PatchTargetCode TargetCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Product="yes" /><CommandLine Variables="upperCase" /></BurnManifest>
1 +<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="~SlipstreamTests_BundleA" Extension=".log" /><RelatedBundle Id="{62C28DAF-A13E-4F55-ACA1-FB843630789C}" Action="Upgrade" /><Variable Id="TestGroupName" Value="SlipstreamTests" Type="string" Hidden="no" Persisted="no" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Type="value" VariableType="string" /><UX><Payload Id="WixManagedBootstrapperApplicationHost" FilePath="mbahost.dll" FileSize="140288" Hash="4569C53566B1025E243E0C29A96C608BD4019979" Packaging="embedded" SourcePath="u30" /><Payload Id="payO60IVK4ATGzPpMz3rwVbUWl6DyU" FilePath="WixToolset.Mba.Host.config" FileSize="783" Hash="B5BDD5E7179A94C2C817069913CA8C099DF811B9" Packaging="embedded" SourcePath="u0" /><Payload Id="payxj4zDAKL2NVlz4ohp0GvwFHepyI" FilePath="TestBA.dll" FileSize="25088" Hash="DB12DB6565CDBC4E9705204830E421ACEB710129" Packaging="embedded" SourcePath="u1" /><Payload Id="pay1hOSAUC8_D633cD2TXpIXCL30OU" FilePath="mbanative.dll" FileSize="118272" Hash="3A7A20D97B0546A23A025EE5774BE237C14D2957" Packaging="embedded" SourcePath="u2" /><Payload Id="payujy6Izl_BlUNfHt2eI.ADfjYAv4" FilePath="WixToolset.Mba.Core.dll" FileSize="114688" Hash="56BA3EA94BEBF8EB562C914495E1594E74F05DBE" Packaging="embedded" SourcePath="u3" /><Payload Id="payR4EbR4OTDZpPEycWaSSM_gZRBWM" FilePath="mbapreq.thm" FileSize="3599" Hash="8D9797C1E1A50AECB8B85FFCEA6A2A2EF611BD7F" Packaging="embedded" SourcePath="u4" /><Payload Id="paylVCy2Ecl8pHPdJTCQZryUG4T9us" FilePath="mbapreq.png" FileSize="797" Hash="75AE41181581FD6376CA9CA88147011E48BF9A30" Packaging="embedded" SourcePath="u5" /><Payload Id="payTaG4B_lob1aLcKFaOqSSG3MPMpU" FilePath="mbapreq.wxl" FileSize="2237" Hash="068B3C5E27AECE7987EABAA2802C9EB07B39EAF8" Packaging="embedded" SourcePath="u6" /><Payload Id="payZwIGuiezVTitZOoZKxyh2DdRSGs" FilePath="1028\mbapreq.wxl" FileSize="1998" Hash="A989D9B892F497215D81F903591ECB6CD50CFFFC" Packaging="embedded" SourcePath="u7" /><Payload Id="pay.herBWX.LlOh8jLsx24aWdunV_0" FilePath="1029\mbapreq.wxl" FileSize="2428" Hash="E6B8E4B1AA89430EB6A5A1E997CA3D1D2F968285" Packaging="embedded" SourcePath="u8" /><Payload Id="pay8DkMszYsoxxdgX14huLDMYXylQg" FilePath="1030\mbapreq.wxl" FileSize="2256" Hash="612CD2FD0CF3800639385C0BF4D805B24507D356" Packaging="embedded" SourcePath="u9" /><Payload Id="payPaHpoTeOdkW.TK99IDwktNLhTAg" FilePath="1031\mbapreq.wxl" FileSize="2409" Hash="E59A8F11D95AC17FC70BD718706EE36BFA50EF02" Packaging="embedded" SourcePath="u10" /><Payload Id="pay45AtAzterLTMzZgdxxtuYvaiXwU" FilePath="1032\mbapreq.wxl" FileSize="3368" Hash="154E0A658BA7EE59889224A231423634A9725547" Packaging="embedded" SourcePath="u11" /><Payload Id="payA2VEKIqhePyNIEmr14eyH3JoVLc" FilePath="1035\mbapreq.wxl" FileSize="2205" Hash="6AAE55269E42F99A5D88ADD18C433384DEB9E956" Packaging="embedded" SourcePath="u12" /><Payload Id="payvre23ObscjzhcaFIifUAkXMdPa8" FilePath="1036\mbapreq.wxl" FileSize="2276" Hash="7DC74874357F50AE8C4871D8F4DC06B337CF6352" Packaging="embedded" SourcePath="u13" /><Payload Id="paytxUV3vuBbG2c.a9c.d_sZX2x6wA" FilePath="1038\mbapreq.wxl" FileSize="2362" Hash="B60C34DE38E6E48BA0841E8A962C17179FC1B69A" Packaging="embedded" SourcePath="u14" /><Payload Id="payYvMWRK9xelo5.sQn7jRkJIaBp9A" FilePath="1040\mbapreq.wxl" FileSize="2273" Hash="902D231AD6306087F215DEABB7F2AB2F8072C401" Packaging="embedded" SourcePath="u15" /><Payload Id="pay68KKSApyQimbA25t6kSbqhdeH10" FilePath="1041\mbapreq.wxl" FileSize="2518" Hash="4095A1AFCF18C01F7DA51A1A389C2FBBB1A82A12" Packaging="embedded" SourcePath="u16" /><Payload Id="paypiqxaHpYZqx.9eDVjQrj1igLbRY" FilePath="1042\mbapreq.wxl" FileSize="2209" Hash="99CE8B42300EF656E6BD44F01766DC638CB0496F" Packaging="embedded" SourcePath="u17" /><Payload Id="payTO0YwZzxKpbqdrBVUcVRTu3BFe8" FilePath="1043\mbapreq.wxl" FileSize="2282" Hash="87117EE32E0004E25DDCEB1A7D417F3A02856A50" Packaging="embedded" SourcePath="u18" /><Payload Id="payIXg2ldBJukRzhqWolJVOEbTmF34" FilePath="1044\mbapreq.wxl" FileSize="2141" Hash="5AED841C6A870C3A8BAF8A10D00F887A781D0CF0" Packaging="embedded" SourcePath="u19" /><Payload Id="payOHIZbSkIvrpwKkkXI173tv3u3B4" FilePath="1045\mbapreq.wxl" FileSize="2338" Hash="07E37CBC59298F24A5C8C3B8FEB7A45DADF8CD07" Packaging="embedded" SourcePath="u20" /><Payload Id="payQRQ_UZl_R2UtV0xDXB2yeH2bg3E" FilePath="1046\mbapreq.wxl" FileSize="2118" Hash="AEC0CE51E8E335E9B86F1AC7E39CCD172B896582" Packaging="embedded" SourcePath="u21" /><Payload Id="payhrejLLBfc1i27iN._QPhQ4K337I" FilePath="1049\mbapreq.wxl" FileSize="2851" Hash="9628BADB173B171ED85D902634D9AA5D91FE9721" Packaging="embedded" SourcePath="u22" /><Payload Id="payqEzaDNzxB68vGp29jgDcCos6dvg" FilePath="1051\mbapreq.wxl" FileSize="2304" Hash="B584E8C0D7F9B7A1BB70BC00E42BFD35BED5D81D" Packaging="embedded" SourcePath="u23" /><Payload Id="paydz8Vk8xSTyYohgGXTSIxWGXL5.Q" FilePath="1053\mbapreq.wxl" FileSize="2102" Hash="67E93F555DBFEF8508E79F7CA8CE76B881308760" Packaging="embedded" SourcePath="u24" /><Payload Id="pay0HRUZTlbC3taSOffJBsEj92Br8Y" FilePath="1055\mbapreq.wxl" FileSize="2273" Hash="AEB8C90D66942A5CD73EA52A6F2ADD4F7D518A0D" Packaging="embedded" SourcePath="u25" /><Payload Id="payIvUOkc_EMH7laMFehefNolV8hZo" FilePath="1060\mbapreq.wxl" FileSize="2170" Hash="B1D4B71907B8BD82DD8B047404AF10FDBBE5CBA0" Packaging="embedded" SourcePath="u26" /><Payload Id="payLFhOb.rHuk4sW5CYAPMShG0NjGI" FilePath="2052\mbapreq.wxl" FileSize="1953" Hash="C8FB8982EC71C48D6EA021ADD9AAA7BCB0656281" Packaging="embedded" SourcePath="u27" /><Payload Id="payqIKCmERK7Nhxx_nNXvRxdKqKDbI" FilePath="2070\mbapreq.wxl" FileSize="2182" Hash="825F27A543907ED27E815EC67DFD48AF7BF5831E" Packaging="embedded" SourcePath="u28" /><Payload Id="payqeWUzIVaEqjuRXN0z8ECC3Y4tCc" FilePath="3082\mbapreq.wxl" FileSize="2369" Hash="39C07C31077AAFDC0DD208273AA41654CAD80FDD" Packaging="embedded" SourcePath="u29" /><Payload Id="paylfeHEjJSSTnNzY9QMZM2Ye3Ipy4" FilePath="mbapreq.dll" FileSize="245760" Hash="6499FA21D178131DDE13A4EF44ABEC32E91D65D4" Packaging="embedded" SourcePath="u31" /><Payload Id="payDPxs6uy8nbky.R7zhir2RRAfc.c" FilePath="WixToolset.Mba.Host.dll" FileSize="11264" Hash="9E6452891E401EB211DD41550A09FDF98EC0992F" Packaging="embedded" SourcePath="u32" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" FileSize="14292" Hash="CDF09A0723F4F33C13670BBAFCFFA7E660E15DFC" Packaging="embedded" SourcePath="u33" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" FileSize="252" Hash="86688B13D3364ADB90BBA552F544D4D546AFD63D" Packaging="embedded" SourcePath="u34" /></UX><Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1479400" Hash="5A84A8E612E270E27D0061D58DB6B470153BE1F9" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /><Payload Id="PackageA" FilePath="PackageAv1.msi" FileSize="32768" Hash="2369B16B7219B3C834DFBC5D2AF8B2EF8803D43D" Packaging="external" SourcePath="PackageAv1.msi" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{22D1DDBA-284D-40A7-BD14-95EA07906F21}" ExecutableName="BundleA.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{DC94A8E0-4BF4-4026-B80B-2755DAFC05D3}"><Arp Register="yes" DisplayName="~SlipstreamTests - BundleA" DisplayVersion="1.0.0.0" /></Registration><Chain><ExePackage Id="NetFx48Web" Cache="keep" CacheId="5A84A8E612E270E27D0061D58DB6B470153BE1F9" InstallSize="1479400" Size="1479400" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" RepairArguments="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" Repairable="yes" Uninstallable="no" Protocol="netfx4"><PayloadRef Id="NetFx48Web" /></ExePackage><MsiPackage Id="PackageA" Cache="keep" CacheId="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}v1.0.0.0" InstallSize="2103" Size="32768" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Language="1033" Version="1.0.0.0" UpgradeCode="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}"><MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /><MsiProperty Id="MSIFASTINSTALL" Value="7" /><Provides Key="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Version="1.0.0.0" DisplayName="~SlipstreamTests - PackageA" /><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="no"><Language Id="1033" /></RelatedPackage><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="no"><Language Id="1033" /></RelatedPackage><PayloadRef Id="PackageA" /></MsiPackage></Chain><PatchTargetCode TargetCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Product="yes" /><CommandLine Variables="upperCase" /></BurnManifest>