aboutsummaryrefslogtreecommitdiff
path: root/src/test/BurnUnitTest/PlanTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/BurnUnitTest/PlanTest.cpp')
-rw-r--r--src/test/BurnUnitTest/PlanTest.cpp303
1 files changed, 301 insertions, 2 deletions
diff --git a/src/test/BurnUnitTest/PlanTest.cpp b/src/test/BurnUnitTest/PlanTest.cpp
index 42c11968..820f88c2 100644
--- a/src/test/BurnUnitTest/PlanTest.cpp
+++ b/src/test/BurnUnitTest/PlanTest.cpp
@@ -11,6 +11,7 @@ static HRESULT WINAPI PlanTestBAProc(
11 11
12static LPCWSTR wzMsiTransactionManifestFileName = L"MsiTransaction_BundleAv1_manifest.xml"; 12static LPCWSTR wzMsiTransactionManifestFileName = L"MsiTransaction_BundleAv1_manifest.xml";
13static LPCWSTR wzSingleMsiManifestFileName = L"BasicFunctionality_BundleA_manifest.xml"; 13static LPCWSTR wzSingleMsiManifestFileName = L"BasicFunctionality_BundleA_manifest.xml";
14static LPCWSTR wzSlipstreamManifestFileName = L"Slipstream_BundleA_manifest.xml";
14 15
15namespace Microsoft 16namespace Microsoft
16{ 17{
@@ -650,6 +651,210 @@ namespace Bootstrapper
650 ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[0], L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_IGNORED, BURN_PACKAGE_REGISTRATION_STATE_IGNORED); 651 ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[0], L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_IGNORED, BURN_PACKAGE_REGISTRATION_STATE_IGNORED);
651 } 652 }
652 653
654 [Fact]
655 void SlipstreamInstallTest()
656 {
657 HRESULT hr = S_OK;
658 BURN_ENGINE_STATE engineState = { };
659 BURN_ENGINE_STATE* pEngineState = &engineState;
660 BURN_PLAN* pPlan = &engineState.plan;
661
662 InitializeEngineStateForCorePlan(wzSlipstreamManifestFileName, pEngineState);
663 DetectPermanentPackagesAsPresentAndCached(pEngineState);
664 PlanTestDetectPatchInitialize(pEngineState);
665
666 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL);
667 NativeAssert::Succeeded(hr, "CorePlan failed");
668
669 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
670 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
671 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
672
673 BOOL fRollback = FALSE;
674 DWORD dwIndex = 0;
675 DWORD dwPackageStart = 0;
676 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
677 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PatchA", 4, 1, 20480, FALSE);
678 ValidateCacheAcquirePayload(pPlan, fRollback, dwIndex++, L"PatchA", L"PatchA", FALSE);
679 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PatchA", L"PatchA", TRUE, FALSE, dwPackageStart);
680 ValidateCachePackageStop(pPlan, fRollback, dwIndex++, L"PatchA", FALSE);
681 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++, FALSE);
682 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 2);
683 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PackageA", 10, 1, 32768, FALSE);
684 ValidateCacheAcquirePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"PackageA", FALSE);
685 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"PackageA", TRUE, FALSE, dwPackageStart);
686 ValidateCachePackageStop(pPlan, fRollback, dwIndex++, L"PackageA", FALSE);
687 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++, FALSE);
688 Assert::Equal(dwIndex, pPlan->cCacheActions);
689
690 fRollback = TRUE;
691 dwIndex = 0;
692 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 2);
693 ValidateCacheRollbackPackage(pPlan, fRollback, dwIndex++, L"PackageA", FALSE);
694 Assert::Equal(dwIndex, pPlan->cRollbackCacheActions);
695
696 Assert::Equal(3055111ull, pPlan->qwEstimatedSize);
697 Assert::Equal(53248ull, pPlan->qwCacheSizeTotal);
698
699 fRollback = FALSE;
700 dwIndex = 0;
701 DWORD dwExecuteCheckpointId = 3;
702 BURN_EXECUTE_ACTION* pExecuteAction = NULL;
703 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
704 ValidateExecuteWaitSyncpoint(pPlan, fRollback, dwIndex++, pPlan->rgCacheActions[11].syncpoint.hEvent);
705 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
706 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
707 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
708 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
709 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
710 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
711 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
712 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
713 ValidateExecuteWaitSyncpoint(pPlan, fRollback, dwIndex++, pPlan->rgCacheActions[5].syncpoint.hEvent);
714 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
715 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
716 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_REGISTER);
717 pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_INSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, TRUE);
718 ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
719 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
720 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
721 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
722 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
723 Assert::Equal(dwIndex, pPlan->cExecuteActions);
724
725 fRollback = TRUE;
726 dwIndex = 0;
727 dwExecuteCheckpointId = 3;
728 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
729 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
730 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
731 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
732 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
733 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
734 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
735 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_UNREGISTER);
736 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
737 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
738 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PatchA");
739 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
740 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_UNREGISTER);
741 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
742 pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, TRUE);
743 ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
744 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_UNREGISTER);
745 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
746 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
747 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
748 Assert::Equal(dwIndex, pPlan->cRollbackActions);
749
750 Assert::Equal(2ul, pPlan->cExecutePackagesTotal);
751 Assert::Equal(4ul, pPlan->cOverallProgressTicksTotal);
752
753 dwIndex = 0;
754 Assert::Equal(dwIndex, pPlan->cCleanActions);
755
756 UINT uIndex = 0;
757 ValidatePlannedProvider(pPlan, uIndex++, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", NULL);
758 Assert::Equal(uIndex, pPlan->cPlannedProviders);
759
760 Assert::Equal(3ul, pEngineState->packages.cPackages);
761 ValidatePermanentPackageExpectedStates(&pEngineState->packages.rgPackages[0], L"NetFx48Web");
762 ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[1], L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, BURN_PACKAGE_REGISTRATION_STATE_PRESENT);
763 ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[2], L"PatchA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BURN_PACKAGE_REGISTRATION_STATE_PRESENT);
764 }
765
766 [Fact]
767 void SlipstreamUninstallTest()
768 {
769 HRESULT hr = S_OK;
770 BURN_ENGINE_STATE engineState = { };
771 BURN_ENGINE_STATE* pEngineState = &engineState;
772 BURN_PLAN* pPlan = &engineState.plan;
773
774 InitializeEngineStateForCorePlan(wzSlipstreamManifestFileName, pEngineState);
775 DetectPackagesAsPresentAndCached(pEngineState);
776
777 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL);
778 NativeAssert::Succeeded(hr, "CorePlan failed");
779
780 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
781 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
782 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
783
784 BOOL fRollback = FALSE;
785 DWORD dwIndex = 0;
786 Assert::Equal(dwIndex, pPlan->cCacheActions);
787
788 fRollback = TRUE;
789 dwIndex = 0;
790 Assert::Equal(dwIndex, pPlan->cRollbackCacheActions);
791
792 Assert::Equal(0ull, pPlan->qwEstimatedSize);
793 Assert::Equal(0ull, pPlan->qwCacheSizeTotal);
794
795 fRollback = FALSE;
796 dwIndex = 0;
797 DWORD dwExecuteCheckpointId = 1;
798 BURN_EXECUTE_ACTION* pExecuteAction = NULL;
799 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
800 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
801 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_UNREGISTER);
802 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
803 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_UNREGISTER);
804 pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, TRUE);
805 ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
806 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
807 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
808 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_UNREGISTER);
809 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
810 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
811 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
812 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
813 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
814 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
815 Assert::Equal(dwIndex, pPlan->cExecuteActions);
816
817 fRollback = TRUE;
818 dwIndex = 0;
819 dwExecuteCheckpointId = 1;
820 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
821 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
822 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
823 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_REGISTER);
824 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
825 pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_INSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, TRUE);
826 ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
827 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
828 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
829 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
830 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
831 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
832 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
833 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
834 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
835 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
836 Assert::Equal(dwIndex, pPlan->cRollbackActions);
837
838 Assert::Equal(2ul, pPlan->cExecutePackagesTotal);
839 Assert::Equal(2ul, pPlan->cOverallProgressTicksTotal);
840
841 dwIndex = 0;
842 ValidateCleanAction(pPlan, dwIndex++, L"PatchA");
843 ValidateCleanAction(pPlan, dwIndex++, L"PackageA");
844 Assert::Equal(dwIndex, pPlan->cCleanActions);
845
846 UINT uIndex = 0;
847 ValidatePlannedProvider(pPlan, uIndex++, L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", NULL);
848 ValidatePlannedProvider(pPlan, uIndex++, L"{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}", NULL);
849 ValidatePlannedProvider(pPlan, uIndex++, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", NULL);
850 Assert::Equal(uIndex, pPlan->cPlannedProviders);
851
852 Assert::Equal(3ul, pEngineState->packages.cPackages);
853 ValidatePermanentPackageExpectedStates(&pEngineState->packages.rgPackages[0], L"NetFx48Web");
854 ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[1], L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BURN_PACKAGE_REGISTRATION_STATE_ABSENT);
855 ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[2], L"PatchA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BURN_PACKAGE_REGISTRATION_STATE_ABSENT);
856 }
857
653 private: 858 private:
654 // This doesn't initialize everything, just enough for CorePlan to work. 859 // This doesn't initialize everything, just enough for CorePlan to work.
655 void InitializeEngineStateForCorePlan(LPCWSTR wzManifestFileName, BURN_ENGINE_STATE* pEngineState) 860 void InitializeEngineStateForCorePlan(LPCWSTR wzManifestFileName, BURN_ENGINE_STATE* pEngineState)
@@ -700,6 +905,30 @@ namespace Bootstrapper
700 pEngineState->fDetected = TRUE; 905 pEngineState->fDetected = TRUE;
701 } 906 }
702 907
908 void PlanTestDetectPatchInitialize(BURN_ENGINE_STATE* pEngineState)
909 {
910 HRESULT hr = MsiEngineDetectInitialize(&pEngineState->packages);
911 NativeAssert::Succeeded(hr, "MsiEngineDetectInitialize failed");
912
913 for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i)
914 {
915 BURN_PACKAGE* pPackage = pEngineState->packages.rgPackages + i;
916
917 if (BURN_PACKAGE_TYPE_MSP == pPackage->type)
918 {
919 for (DWORD j = 0; j < pPackage->Msp.cTargetProductCodes; ++j)
920 {
921 BURN_MSPTARGETPRODUCT* pTargetProduct = pPackage->Msp.rgTargetProducts + j;
922
923 if (BOOTSTRAPPER_PACKAGE_STATE_UNKNOWN == pTargetProduct->patchPackageState)
924 {
925 pTargetProduct->patchPackageState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT;
926 }
927 }
928 }
929 }
930 }
931
703 void DetectAttachedContainerAsAttached(BURN_ENGINE_STATE* pEngineState) 932 void DetectAttachedContainerAsAttached(BURN_ENGINE_STATE* pEngineState)
704 { 933 {
705 for (DWORD i = 0; i < pEngineState->containers.cContainers; ++i) 934 for (DWORD i = 0; i < pEngineState->containers.cContainers; ++i)
@@ -773,6 +1002,21 @@ namespace Bootstrapper
773 BURN_PACKAGE* pPackage = pEngineState->packages.rgPackages + i; 1002 BURN_PACKAGE* pPackage = pEngineState->packages.rgPackages + i;
774 DetectPackageAsPresentAndCached(pPackage); 1003 DetectPackageAsPresentAndCached(pPackage);
775 DetectPackageDependent(pPackage, pEngineState->registration.sczId); 1004 DetectPackageDependent(pPackage, pEngineState->registration.sczId);
1005
1006 if (BURN_PACKAGE_TYPE_MSI == pPackage->type)
1007 {
1008 for (DWORD j = 0; j < pPackage->Msi.cSlipstreamMspPackages; ++j)
1009 {
1010 pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED;
1011
1012 BURN_PACKAGE* pMspPackage = pPackage->Msi.rgSlipstreamMsps[j].pMspPackage;
1013 MspEngineAddDetectedTargetProduct(&pEngineState->packages, pMspPackage, j, pPackage->Msi.sczProductCode, pPackage->fPerMachine ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED);
1014
1015 BURN_MSPTARGETPRODUCT* pTargetProduct = pMspPackage->Msp.rgTargetProducts + (pMspPackage->Msp.cTargetProductCodes - 1);
1016 pTargetProduct->patchPackageState = BOOTSTRAPPER_PACKAGE_STATE_PRESENT;
1017 pTargetProduct->registrationState = BURN_PACKAGE_REGISTRATION_STATE_PRESENT;
1018 }
1019 }
776 } 1020 }
777 } 1021 }
778 1022
@@ -862,7 +1106,23 @@ namespace Bootstrapper
862 { 1106 {
863 BURN_CACHE_ACTION* pAction = ValidateCacheActionExists(pPlan, fRollback, dwIndex); 1107 BURN_CACHE_ACTION* pAction = ValidateCacheActionExists(pPlan, fRollback, dwIndex);
864 Assert::Equal<DWORD>(BURN_CACHE_ACTION_TYPE_ACQUIRE_CONTAINER, pAction->type); 1108 Assert::Equal<DWORD>(BURN_CACHE_ACTION_TYPE_ACQUIRE_CONTAINER, pAction->type);
865 NativeAssert::StringEqual(wzContainerId, pAction->extractContainer.pContainer->sczId); 1109 NativeAssert::StringEqual(wzContainerId, pAction->resolveContainer.pContainer->sczId);
1110 Assert::Equal<BOOL>(fSkipUntilRetried, pAction->fSkipUntilRetried);
1111 }
1112
1113 void ValidateCacheAcquirePayload(
1114 __in BURN_PLAN* pPlan,
1115 __in BOOL fRollback,
1116 __in DWORD dwIndex,
1117 __in LPCWSTR wzPackageId,
1118 __in LPCWSTR wzPayloadId,
1119 __in BOOL fSkipUntilRetried
1120 )
1121 {
1122 BURN_CACHE_ACTION* pAction = ValidateCacheActionExists(pPlan, fRollback, dwIndex);
1123 Assert::Equal<DWORD>(BURN_CACHE_ACTION_TYPE_ACQUIRE_PAYLOAD, pAction->type);
1124 NativeAssert::StringEqual(wzPackageId, pAction->resolvePayload.pPackage->sczId);
1125 NativeAssert::StringEqual(wzPayloadId, pAction->resolvePayload.pPayload->sczKey);
866 Assert::Equal<BOOL>(fSkipUntilRetried, pAction->fSkipUntilRetried); 1126 Assert::Equal<BOOL>(fSkipUntilRetried, pAction->fSkipUntilRetried);
867 } 1127 }
868 1128
@@ -1063,7 +1323,7 @@ namespace Bootstrapper
1063 __in BURN_PLAN* pPlan, 1323 __in BURN_PLAN* pPlan,
1064 __in BOOL fRollback, 1324 __in BOOL fRollback,
1065 __in DWORD dwIndex, 1325 __in DWORD dwIndex,
1066 __in LPCWSTR wzPackageId, 1326 __in_z LPCWSTR wzPackageId,
1067 __in BOOTSTRAPPER_ACTION_STATE action, 1327 __in BOOTSTRAPPER_ACTION_STATE action,
1068 __in BURN_MSI_PROPERTY actionMsiProperty, 1328 __in BURN_MSI_PROPERTY actionMsiProperty,
1069 __in DWORD uiLevel, 1329 __in DWORD uiLevel,
@@ -1083,6 +1343,45 @@ namespace Bootstrapper
1083 Assert::Equal<BOOL>(FALSE, pAction->fDeleted); 1343 Assert::Equal<BOOL>(FALSE, pAction->fDeleted);
1084 } 1344 }
1085 1345
1346 BURN_EXECUTE_ACTION* ValidateDeletedExecuteMspTarget(
1347 __in BURN_PLAN* pPlan,
1348 __in BOOL fRollback,
1349 __in DWORD dwIndex,
1350 __in_z LPCWSTR wzPackageId,
1351 __in BOOTSTRAPPER_ACTION_STATE action,
1352 __in_z LPCWSTR wzTargetProductCode,
1353 __in BOOL fPerMachineTarget,
1354 __in BURN_MSI_PROPERTY actionMsiProperty,
1355 __in DWORD uiLevel,
1356 __in BOOL fDisableExternalUiHandler,
1357 __in BOOL fDeleted
1358 )
1359 {
1360 BURN_EXECUTE_ACTION* pAction = ValidateExecuteActionExists(pPlan, fRollback, dwIndex);
1361 Assert::Equal<DWORD>(BURN_EXECUTE_ACTION_TYPE_MSP_TARGET, pAction->type);
1362 NativeAssert::StringEqual(wzPackageId, pAction->mspTarget.pPackage->sczId);
1363 Assert::Equal<DWORD>(action, pAction->mspTarget.action);
1364 NativeAssert::StringEqual(wzTargetProductCode, pAction->mspTarget.sczTargetProductCode);
1365 Assert::Equal<BOOL>(fPerMachineTarget, pAction->mspTarget.fPerMachineTarget);
1366 Assert::Equal<DWORD>(actionMsiProperty, pAction->mspTarget.actionMsiProperty);
1367 Assert::Equal<DWORD>(uiLevel, pAction->mspTarget.uiLevel);
1368 Assert::Equal<BOOL>(fDisableExternalUiHandler, pAction->mspTarget.fDisableExternalUiHandler);
1369 NativeAssert::NotNull(pAction->mspTarget.sczLogPath);
1370 Assert::Equal<BOOL>(fDeleted, pAction->fDeleted);
1371 return pAction;
1372 }
1373
1374 void ValidateExecuteMspTargetPatch(
1375 __in BURN_EXECUTE_ACTION* pAction,
1376 __in DWORD dwIndex,
1377 __in_z LPCWSTR wzPackageId
1378 )
1379 {
1380 Assert::InRange(dwIndex + 1ul, 1ul, pAction->mspTarget.cOrderedPatches);
1381 BURN_ORDERED_PATCHES* pOrderedPatch = pAction->mspTarget.rgOrderedPatches + dwIndex;
1382 NativeAssert::StringEqual(wzPackageId, pOrderedPatch->pPackage->sczId);
1383 }
1384
1086 void ValidateExecutePackageDependency( 1385 void ValidateExecutePackageDependency(
1087 __in BURN_PLAN* pPlan, 1386 __in BURN_PLAN* pPlan,
1088 __in BOOL fRollback, 1387 __in BOOL fRollback,