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 >= 528040" InstallArguments="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" UninstallArguments="" RepairArguments="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" 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 >= 528040" InstallArguments="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" UninstallArguments="" RepairArguments="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" 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>