aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-03-13 23:47:55 -0500
committerSean Hall <r.sean.hall@gmail.com>2022-03-14 14:53:29 -0500
commit78125b7c4bd59468275d65b63860bdb68b1bc6f1 (patch)
tree05c73a4e9ac79172afd42ba817c69d37571c3dc4
parent4cd1c4e06145434ca940ac828772dc47b9d9738e (diff)
downloadwix-78125b7c4bd59468275d65b63860bdb68b1bc6f1.tar.gz
wix-78125b7c4bd59468275d65b63860bdb68b1bc6f1.tar.bz2
wix-78125b7c4bd59468275d65b63860bdb68b1bc6f1.zip
Log rest of plan and add testing of registration actions to PlanTest.
-rw-r--r--src/burn/engine/logging.cpp19
-rw-r--r--src/burn/engine/logging.h4
-rw-r--r--src/burn/engine/plan.cpp46
-rw-r--r--src/burn/test/BurnUnitTest/PlanTest.cpp372
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml2
5 files changed, 440 insertions, 3 deletions
diff --git a/src/burn/engine/logging.cpp b/src/burn/engine/logging.cpp
index 2aa1bada..de332f84 100644
--- a/src/burn/engine/logging.cpp
+++ b/src/burn/engine/logging.cpp
@@ -740,6 +740,25 @@ extern "C" LPCSTR LoggingPlanRelationTypeToString(
740 } 740 }
741} 741}
742 742
743extern "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
743extern "C" LPCSTR LoggingRelationTypeToString( 762extern "C" LPCSTR LoggingRelationTypeToString(
744 __in BOOTSTRAPPER_RELATION_TYPE type 763 __in BOOTSTRAPPER_RELATION_TYPE type
745 ) 764 )
diff --git a/src/burn/engine/logging.h b/src/burn/engine/logging.h
index 15eb298a..857394b9 100644
--- a/src/burn/engine/logging.h
+++ b/src/burn/engine/logging.h
@@ -158,6 +158,10 @@ LPCSTR LoggingPlanRelationTypeToString(
158 __in BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE type 158 __in BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE type
159 ); 159 );
160 160
161LPCSTR LoggingRegistrationOptionsToString(
162 __in DWORD dwRegistrationOptions
163 );
164
161LPCSTR LoggingRelationTypeToString( 165LPCSTR LoggingRelationTypeToString(
162 __in BOOTSTRAPPER_RELATION_TYPE type 166 __in BOOTSTRAPPER_RELATION_TYPE type
163 ); 167 );
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp
index d3cc60f1..dcb919c7 100644
--- a/src/burn/engine/plan.cpp
+++ b/src/burn/engine/plan.cpp
@@ -2786,6 +2786,36 @@ static BOOL ForceCache(
2786 } 2786 }
2787} 2787}
2788 2788
2789static 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
2789static void CacheActionLog( 2819static void CacheActionLog(
2790 __in DWORD iAction, 2820 __in DWORD iAction,
2791 __in BURN_CACHE_ACTION* pAction, 2821 __in BURN_CACHE_ACTION* pAction,
@@ -2974,14 +3004,30 @@ extern "C" void PlanDump(
2974 LogStringLine(PlanDumpLevel, "--- Begin plan dump ---"); 3004 LogStringLine(PlanDumpLevel, "--- Begin plan dump ---");
2975 3005
2976 LogStringLine(PlanDumpLevel, "Plan action: %hs", LoggingBurnActionToString(pPlan->action)); 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));
2977 LogStringLine(PlanDumpLevel, " per-machine: %hs", LoggingTrueFalseToString(pPlan->fPerMachine)); 3010 LogStringLine(PlanDumpLevel, " per-machine: %hs", LoggingTrueFalseToString(pPlan->fPerMachine));
3011 LogStringLine(PlanDumpLevel, " can affect machine state: %hs", LoggingTrueFalseToString(pPlan->fCanAffectMachineState));
2978 LogStringLine(PlanDumpLevel, " disable-rollback: %hs", LoggingTrueFalseToString(pPlan->fDisableRollback)); 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));
2979 LogStringLine(PlanDumpLevel, " estimated size: %llu", pPlan->qwEstimatedSize); 3015 LogStringLine(PlanDumpLevel, " estimated size: %llu", pPlan->qwEstimatedSize);
2980 if (pPlan->sczLayoutDirectory) 3016 if (pPlan->sczLayoutDirectory)
2981 { 3017 {
2982 LogStringLine(PlanDumpLevel, " layout directory: %ls", pPlan->sczLayoutDirectory); 3018 LogStringLine(PlanDumpLevel, " layout directory: %ls", pPlan->sczLayoutDirectory);
2983 } 3019 }
2984 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
2985 LogStringLine(PlanDumpLevel, "Plan cache size: %llu", pPlan->qwCacheSizeTotal); 3031 LogStringLine(PlanDumpLevel, "Plan cache size: %llu", pPlan->qwCacheSizeTotal);
2986 for (DWORD i = 0; i < pPlan->cCacheActions; ++i) 3032 for (DWORD i = 0; i < pPlan->cCacheActions; ++i)
2987 { 3033 {
diff --git a/src/burn/test/BurnUnitTest/PlanTest.cpp b/src/burn/test/BurnUnitTest/PlanTest.cpp
index 7852f1c9..a3b58426 100644
--- a/src/burn/test/BurnUnitTest/PlanTest.cpp
+++ b/src/burn/test/BurnUnitTest/PlanTest.cpp
@@ -60,11 +60,26 @@ namespace Bootstrapper
60 NativeAssert::Succeeded(hr, "CorePlan failed"); 60 NativeAssert::Succeeded(hr, "CorePlan failed");
61 61
62 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 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);
63 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 66 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
67 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
64 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 68 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
69 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
65 70
66 BOOL fRollback = FALSE; 71 BOOL fRollback = FALSE;
67 DWORD dwIndex = 0; 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;
68 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); 83 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
69 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA"); 84 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
70 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++); 85 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -204,11 +219,26 @@ namespace Bootstrapper
204 NativeAssert::Succeeded(hr, "CorePlan failed"); 219 NativeAssert::Succeeded(hr, "CorePlan failed");
205 220
206 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 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);
207 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 225 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
226 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
208 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 227 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
228 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
209 229
210 BOOL fRollback = FALSE; 230 BOOL fRollback = FALSE;
211 DWORD dwIndex = 0; 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;
212 Assert::Equal(dwIndex, pPlan->cCacheActions); 242 Assert::Equal(dwIndex, pPlan->cCacheActions);
213 243
214 fRollback = TRUE; 244 fRollback = TRUE;
@@ -321,11 +351,24 @@ namespace Bootstrapper
321 NativeAssert::Succeeded(hr, "CorePlan failed"); 351 NativeAssert::Succeeded(hr, "CorePlan failed");
322 352
323 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 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);
324 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 357 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
358 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
325 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 359 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
360 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
326 361
327 BOOL fRollback = FALSE; 362 BOOL fRollback = FALSE;
328 DWORD dwIndex = 0; 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;
329 Assert::Equal(dwIndex, pPlan->cCacheActions); 372 Assert::Equal(dwIndex, pPlan->cCacheActions);
330 373
331 fRollback = TRUE; 374 fRollback = TRUE;
@@ -407,11 +450,26 @@ namespace Bootstrapper
407 NativeAssert::Succeeded(hr, "CorePlan failed"); 450 NativeAssert::Succeeded(hr, "CorePlan failed");
408 451
409 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 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);
410 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 456 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
457 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
411 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 458 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
459 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
412 460
413 BOOL fRollback = FALSE; 461 BOOL fRollback = FALSE;
414 DWORD dwIndex = 0; 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;
415 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); 473 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
416 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA"); 474 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
417 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++); 475 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -510,11 +568,26 @@ namespace Bootstrapper
510 NativeAssert::Succeeded(hr, "CorePlan failed"); 568 NativeAssert::Succeeded(hr, "CorePlan failed");
511 569
512 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 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);
513 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 574 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
575 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
514 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 576 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
577 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
515 578
516 BOOL fRollback = FALSE; 579 BOOL fRollback = FALSE;
517 DWORD dwIndex = 0; 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;
518 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); 591 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
519 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA"); 592 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
520 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++); 593 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -597,11 +670,26 @@ namespace Bootstrapper
597 NativeAssert::Succeeded(hr, "CorePlan failed"); 670 NativeAssert::Succeeded(hr, "CorePlan failed");
598 671
599 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_CACHE, pPlan->action); 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);
600 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 676 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
677 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
601 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 678 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
679 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
602 680
603 BOOL fRollback = FALSE; 681 BOOL fRollback = FALSE;
604 DWORD dwIndex = 0; 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;
605 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); 693 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
606 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA"); 694 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
607 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++); 695 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -675,11 +763,24 @@ namespace Bootstrapper
675 NativeAssert::Succeeded(hr, "CorePlan failed"); 763 NativeAssert::Succeeded(hr, "CorePlan failed");
676 764
677 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 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);
678 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 769 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
770 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
679 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 771 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
772 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
680 773
681 BOOL fRollback = FALSE; 774 BOOL fRollback = FALSE;
682 DWORD dwIndex = 0; 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;
683 Assert::Equal(dwIndex, pPlan->cCacheActions); 784 Assert::Equal(dwIndex, pPlan->cCacheActions);
684 785
685 fRollback = TRUE; 786 fRollback = TRUE;
@@ -750,11 +851,24 @@ namespace Bootstrapper
750 NativeAssert::Succeeded(hr, "CorePlan failed"); 851 NativeAssert::Succeeded(hr, "CorePlan failed");
751 852
752 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 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);
753 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 857 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
858 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
754 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 859 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
860 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
755 861
756 BOOL fRollback = FALSE; 862 BOOL fRollback = FALSE;
757 DWORD dwIndex = 0; 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;
758 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); 872 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
759 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA"); 873 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
760 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++); 874 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -827,11 +941,26 @@ namespace Bootstrapper
827 NativeAssert::Succeeded(hr, "CorePlan failed"); 941 NativeAssert::Succeeded(hr, "CorePlan failed");
828 942
829 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 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);
830 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 947 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
948 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
831 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 949 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
950 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
832 951
833 BOOL fRollback = FALSE; 952 BOOL fRollback = FALSE;
834 DWORD dwIndex = 0; 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;
835 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); 964 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
836 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA"); 965 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
837 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++); 966 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -917,11 +1046,26 @@ namespace Bootstrapper
917 NativeAssert::Succeeded(hr, "CorePlan failed"); 1046 NativeAssert::Succeeded(hr, "CorePlan failed");
918 1047
919 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_MODIFY, pPlan->action); 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);
920 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 1052 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1053 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
921 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 1054 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1055 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
922 1056
923 BOOL fRollback = FALSE; 1057 BOOL fRollback = FALSE;
924 DWORD dwIndex = 0; 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;
925 Assert::Equal(dwIndex, pPlan->cCacheActions); 1069 Assert::Equal(dwIndex, pPlan->cCacheActions);
926 1070
927 fRollback = TRUE; 1071 fRollback = TRUE;
@@ -980,11 +1124,26 @@ namespace Bootstrapper
980 NativeAssert::Succeeded(hr, "CorePlan failed"); 1124 NativeAssert::Succeeded(hr, "CorePlan failed");
981 1125
982 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 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);
983 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 1130 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1131 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
984 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 1132 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1133 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
985 1134
986 BOOL fRollback = FALSE; 1135 BOOL fRollback = FALSE;
987 DWORD dwIndex = 0; 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;
988 Assert::Equal(dwIndex, pPlan->cCacheActions); 1147 Assert::Equal(dwIndex, pPlan->cCacheActions);
989 1148
990 fRollback = TRUE; 1149 fRollback = TRUE;
@@ -1044,6 +1203,76 @@ namespace Bootstrapper
1044 } 1203 }
1045 1204
1046 [Fact] 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]
1047 void SingleMsiUninstallTestFromUpgradeBundleWithSameExactPackage() 1276 void SingleMsiUninstallTestFromUpgradeBundleWithSameExactPackage()
1048 { 1277 {
1049 HRESULT hr = S_OK; 1278 HRESULT hr = S_OK;
@@ -1058,11 +1287,26 @@ namespace Bootstrapper
1058 NativeAssert::Succeeded(hr, "CorePlan failed"); 1287 NativeAssert::Succeeded(hr, "CorePlan failed");
1059 1288
1060 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 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);
1061 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 1293 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1294 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1062 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 1295 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1296 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1063 1297
1064 BOOL fRollback = FALSE; 1298 BOOL fRollback = FALSE;
1065 DWORD dwIndex = 0; 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;
1066 Assert::Equal(dwIndex, pPlan->cCacheActions); 1310 Assert::Equal(dwIndex, pPlan->cCacheActions);
1067 1311
1068 fRollback = TRUE; 1312 fRollback = TRUE;
@@ -1126,11 +1370,26 @@ namespace Bootstrapper
1126 NativeAssert::Succeeded(hr, "CorePlan failed"); 1370 NativeAssert::Succeeded(hr, "CorePlan failed");
1127 1371
1128 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL, pPlan->action); 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);
1129 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 1376 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1377 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1130 Assert::Equal<BOOL>(TRUE, pPlan->fDisableRollback); 1378 Assert::Equal<BOOL>(TRUE, pPlan->fDisableRollback);
1379 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1131 1380
1132 BOOL fRollback = FALSE; 1381 BOOL fRollback = FALSE;
1133 DWORD dwIndex = 0; 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;
1134 Assert::Equal(dwIndex, pPlan->cCacheActions); 1393 Assert::Equal(dwIndex, pPlan->cCacheActions);
1135 1394
1136 fRollback = TRUE; 1395 fRollback = TRUE;
@@ -1205,11 +1464,26 @@ namespace Bootstrapper
1205 NativeAssert::Succeeded(hr, "CorePlan failed"); 1464 NativeAssert::Succeeded(hr, "CorePlan failed");
1206 1465
1207 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 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);
1208 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 1470 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1471 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1209 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 1472 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1473 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1210 1474
1211 BOOL fRollback = FALSE; 1475 BOOL fRollback = FALSE;
1212 DWORD dwIndex = 0; 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;
1213 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); 1487 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
1214 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"NetFx48Web"); 1488 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"NetFx48Web");
1215 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++); 1489 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -1320,11 +1594,26 @@ namespace Bootstrapper
1320 NativeAssert::Succeeded(hr, "CorePlan failed"); 1594 NativeAssert::Succeeded(hr, "CorePlan failed");
1321 1595
1322 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 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);
1323 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 1600 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1601 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1324 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 1602 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1603 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1325 1604
1326 BOOL fRollback = FALSE; 1605 BOOL fRollback = FALSE;
1327 DWORD dwIndex = 0; 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;
1328 Assert::Equal(dwIndex, pPlan->cCacheActions); 1617 Assert::Equal(dwIndex, pPlan->cCacheActions);
1329 1618
1330 fRollback = TRUE; 1619 fRollback = TRUE;
@@ -1420,11 +1709,26 @@ namespace Bootstrapper
1420 NativeAssert::Succeeded(hr, "CorePlan failed"); 1709 NativeAssert::Succeeded(hr, "CorePlan failed");
1421 1710
1422 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 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);
1423 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 1715 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1716 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1424 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 1717 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1718 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1425 1719
1426 BOOL fRollback = FALSE; 1720 BOOL fRollback = FALSE;
1427 DWORD dwIndex = 0; 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;
1428 Assert::Equal(dwIndex, pPlan->cCacheActions); 1732 Assert::Equal(dwIndex, pPlan->cCacheActions);
1429 1733
1430 fRollback = TRUE; 1734 fRollback = TRUE;
@@ -1475,7 +1779,7 @@ namespace Bootstrapper
1475 Assert::Equal(dwIndex, pPlan->cCleanActions); 1779 Assert::Equal(dwIndex, pPlan->cCleanActions);
1476 1780
1477 UINT uIndex = 0; 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);
1479 ValidatePlannedProvider(pPlan, uIndex++, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", NULL); 1783 ValidatePlannedProvider(pPlan, uIndex++, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", NULL);
1480 Assert::Equal(uIndex, pPlan->cPlannedProviders); 1784 Assert::Equal(uIndex, pPlan->cPlannedProviders);
1481 1785
@@ -1499,11 +1803,26 @@ namespace Bootstrapper
1499 NativeAssert::Succeeded(hr, "CorePlan failed"); 1803 NativeAssert::Succeeded(hr, "CorePlan failed");
1500 1804
1501 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 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);
1502 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 1809 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
1810 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
1503 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 1811 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
1812 Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
1504 1813
1505 BOOL fRollback = FALSE; 1814 BOOL fRollback = FALSE;
1506 DWORD dwIndex = 0; 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;
1507 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); 1826 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
1508 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"NetFx48Web"); 1827 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"NetFx48Web");
1509 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++); 1828 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
@@ -1576,7 +1895,7 @@ namespace Bootstrapper
1576 Assert::Equal(dwIndex, pPlan->cCleanActions); 1895 Assert::Equal(dwIndex, pPlan->cCleanActions);
1577 1896
1578 UINT uIndex = 0; 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);
1580 Assert::Equal(uIndex, pPlan->cPlannedProviders); 1899 Assert::Equal(uIndex, pPlan->cPlannedProviders);
1581 1900
1582 Assert::Equal(2ul, pEngineState->packages.cPackages); 1901 Assert::Equal(2ul, pEngineState->packages.cPackages);
@@ -1728,6 +2047,29 @@ namespace Bootstrapper
1728 } 2047 }
1729 } 2048 }
1730 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
1731 void DetectPackageDependent(BURN_PACKAGE* pPackage, LPCWSTR wzId) 2073 void DetectPackageDependent(BURN_PACKAGE* pPackage, LPCWSTR wzId)
1732 { 2074 {
1733 HRESULT hr = S_OK; 2075 HRESULT hr = S_OK;
@@ -1761,6 +2103,11 @@ namespace Bootstrapper
1761 2103
1762 pEngineState->registration.detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL; 2104 pEngineState->registration.detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL;
1763 2105
2106 if (pEngineState->dependencies.wzSelfDependent)
2107 {
2108 DetectBundleDependent(pEngineState, pEngineState->dependencies.wzSelfDependent);
2109 }
2110
1764 for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i) 2111 for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i)
1765 { 2112 {
1766 BURN_PACKAGE* pPackage = pEngineState->packages.rgPackages + i; 2113 BURN_PACKAGE* pPackage = pEngineState->packages.rgPackages + i;
@@ -1971,6 +2318,27 @@ namespace Bootstrapper
1971 NativeAssert::StringEqual(wzPackageId, pCleanAction->pPackage->sczId); 2318 NativeAssert::StringEqual(wzPackageId, pCleanAction->pPackage->sczId);
1972 } 2319 }
1973 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
1974 BURN_EXECUTE_ACTION* ValidateExecuteActionExists(BURN_PLAN* pPlan, BOOL fRollback, DWORD dwIndex) 2342 BURN_EXECUTE_ACTION* ValidateExecuteActionExists(BURN_PLAN* pPlan, BOOL fRollback, DWORD dwIndex)
1975 { 2343 {
1976 Assert::InRange(dwIndex + 1ul, 1ul, (fRollback ? pPlan->cRollbackActions : pPlan->cExecuteActions)); 2344 Assert::InRange(dwIndex + 1ul, 1ul, (fRollback ? pPlan->cRollbackActions : pPlan->cExecuteActions));
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml
index 463d2c7f..0b35860b 100644
--- a/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml
@@ -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> <?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>