aboutsummaryrefslogtreecommitdiff
path: root/src/burn/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/test')
-rw-r--r--src/burn/test/BurnUnitTest/PlanTest.cpp183
1 files changed, 181 insertions, 2 deletions
diff --git a/src/burn/test/BurnUnitTest/PlanTest.cpp b/src/burn/test/BurnUnitTest/PlanTest.cpp
index 281c32e0..9d86b7cc 100644
--- a/src/burn/test/BurnUnitTest/PlanTest.cpp
+++ b/src/burn/test/BurnUnitTest/PlanTest.cpp
@@ -13,6 +13,11 @@ static LPCWSTR wzMsiTransactionManifestFileName = L"MsiTransaction_BundleAv1_man
13static LPCWSTR wzSingleMsiManifestFileName = L"BasicFunctionality_BundleA_manifest.xml"; 13static LPCWSTR wzSingleMsiManifestFileName = L"BasicFunctionality_BundleA_manifest.xml";
14static LPCWSTR wzSlipstreamManifestFileName = L"Slipstream_BundleA_manifest.xml"; 14static LPCWSTR wzSlipstreamManifestFileName = L"Slipstream_BundleA_manifest.xml";
15 15
16static BOOL vfUsePackageRequestState = FALSE;
17static BOOTSTRAPPER_REQUEST_STATE vPackageRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE;
18static BOOL vfUseRelatedBundleRequestState = FALSE;
19static BOOTSTRAPPER_REQUEST_STATE vRelatedBundleRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE;
20
16namespace Microsoft 21namespace Microsoft
17{ 22{
18namespace Tools 23namespace Tools
@@ -514,6 +519,158 @@ namespace Bootstrapper
514 } 519 }
515 520
516 [Fact] 521 [Fact]
522 void SingleMsiForceAbsentTest()
523 {
524 HRESULT hr = S_OK;
525 BURN_ENGINE_STATE engineState = { };
526 BURN_ENGINE_STATE* pEngineState = &engineState;
527 BURN_PLAN* pPlan = &engineState.plan;
528
529 InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState);
530 DetectAttachedContainerAsAttached(pEngineState);
531 DetectPackagesAsAbsent(pEngineState);
532 DetectUpgradeBundle(pEngineState, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", L"0.9.0.0");
533
534 vfUsePackageRequestState = TRUE;
535 vPackageRequestState = BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT;
536 vfUseRelatedBundleRequestState = TRUE;
537 vRelatedBundleRequestState = BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT;
538
539 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL);
540 NativeAssert::Succeeded(hr, "CorePlan failed");
541
542 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
543 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
544 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
545
546 BOOL fRollback = FALSE;
547 DWORD dwIndex = 0;
548 Assert::Equal(dwIndex, pPlan->cCacheActions);
549
550 fRollback = TRUE;
551 dwIndex = 0;
552 Assert::Equal(dwIndex, pPlan->cRollbackCacheActions);
553
554 Assert::Equal(0ull, pPlan->qwEstimatedSize);
555 Assert::Equal(0ull, pPlan->qwCacheSizeTotal);
556
557 fRollback = FALSE;
558 dwIndex = 0;
559 DWORD dwExecuteCheckpointId = 1;
560 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
561 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER);
562 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
563 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
564 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
565 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
566 ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
567 ValidateExecuteRelatedBundle(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, NULL);
568 Assert::Equal(dwIndex, pPlan->cExecuteActions);
569
570 fRollback = TRUE;
571 dwIndex = 0;
572 dwExecuteCheckpointId = 1;
573 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
574 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
575 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
576 ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
577 ValidateExecuteRelatedBundle(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_INSTALL, NULL);
578 Assert::Equal(dwIndex, pPlan->cRollbackActions);
579
580 Assert::Equal(2ul, pPlan->cExecutePackagesTotal);
581 Assert::Equal(2ul, pPlan->cOverallProgressTicksTotal);
582
583 dwIndex = 0;
584 ValidateCleanAction(pPlan, dwIndex++, L"PackageA");
585 Assert::Equal(dwIndex, pPlan->cCleanActions);
586
587 UINT uIndex = 0;
588 ValidatePlannedProvider(pPlan, uIndex++, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", NULL);
589 ValidatePlannedProvider(pPlan, uIndex++, L"{64633047-D172-4BBB-B202-64337D15C952}", NULL);
590 Assert::Equal(uIndex, pPlan->cPlannedProviders);
591
592 Assert::Equal(1ul, pEngineState->packages.cPackages);
593 ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[0], L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BURN_PACKAGE_REGISTRATION_STATE_ABSENT);
594 }
595
596 [Fact]
597 void SingleMsiForcePresentTest()
598 {
599 HRESULT hr = S_OK;
600 BURN_ENGINE_STATE engineState = { };
601 BURN_ENGINE_STATE* pEngineState = &engineState;
602 BURN_PLAN* pPlan = &engineState.plan;
603
604 InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState);
605 DetectPackagesAsPresentAndCached(pEngineState);
606 DetectUpgradeBundle(pEngineState, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", L"0.9.0.0");
607
608 vfUsePackageRequestState = TRUE;
609 vPackageRequestState = BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT;
610 vfUseRelatedBundleRequestState = TRUE;
611 vRelatedBundleRequestState = BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT;
612
613 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_MODIFY);
614 NativeAssert::Succeeded(hr, "CorePlan failed");
615
616 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_MODIFY, pPlan->action);
617 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
618 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
619
620 BOOL fRollback = FALSE;
621 DWORD dwIndex = 0;
622 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
623 ValidateCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
624 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
625 Assert::Equal(dwIndex, pPlan->cCacheActions);
626
627 fRollback = TRUE;
628 dwIndex = 0;
629 Assert::Equal(dwIndex, pPlan->cRollbackCacheActions);
630
631 Assert::Equal(35694ull, pPlan->qwEstimatedSize);
632 Assert::Equal(175674ull, pPlan->qwCacheSizeTotal);
633
634 fRollback = FALSE;
635 dwIndex = 0;
636 DWORD dwExecuteCheckpointId = 2;
637 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
638 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
639 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
640 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
641 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
642 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
643 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
644 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
645 ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
646 ValidateExecuteRelatedBundle(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_INSTALL, NULL);
647 Assert::Equal(dwIndex, pPlan->cExecuteActions);
648
649 fRollback = TRUE;
650 dwIndex = 0;
651 dwExecuteCheckpointId = 2;
652 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
653 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
654 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
655 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
656 ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
657 Assert::Equal(dwIndex, pPlan->cRollbackActions);
658
659 Assert::Equal(2ul, pPlan->cExecutePackagesTotal);
660 Assert::Equal(3ul, pPlan->cOverallProgressTicksTotal);
661
662 dwIndex = 0;
663 Assert::Equal(dwIndex, pPlan->cCleanActions);
664
665 UINT uIndex = 0;
666 ValidatePlannedProvider(pPlan, uIndex++, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", NULL);
667 Assert::Equal(uIndex, pPlan->cPlannedProviders);
668
669 Assert::Equal(1ul, pEngineState->packages.cPackages);
670 ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[0], L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, BURN_PACKAGE_REGISTRATION_STATE_PRESENT);
671 }
672
673 [Fact]
517 void SingleMsiInstallTest() 674 void SingleMsiInstallTest()
518 { 675 {
519 HRESULT hr = S_OK; 676 HRESULT hr = S_OK;
@@ -1015,6 +1172,9 @@ namespace Bootstrapper
1015 HRESULT hr = S_OK; 1172 HRESULT hr = S_OK;
1016 LPWSTR sczFilePath = NULL; 1173 LPWSTR sczFilePath = NULL;
1017 1174
1175 vfUsePackageRequestState = FALSE;
1176 vfUseRelatedBundleRequestState = FALSE;
1177
1018 ::InitializeCriticalSection(&pEngineState->userExperience.csEngineActive); 1178 ::InitializeCriticalSection(&pEngineState->userExperience.csEngineActive);
1019 1179
1020 hr = CacheInitialize(&pEngineState->cache, &pEngineState->internalCommand); 1180 hr = CacheInitialize(&pEngineState->cache, &pEngineState->internalCommand);
@@ -1046,6 +1206,7 @@ namespace Bootstrapper
1046 hr = CacheInitializeSources(&pEngineState->cache, &pEngineState->registration, &pEngineState->variables, &pEngineState->internalCommand); 1206 hr = CacheInitializeSources(&pEngineState->cache, &pEngineState->registration, &pEngineState->variables, &pEngineState->internalCommand);
1047 NativeAssert::Succeeded(hr, "Failed to initialize cache sources."); 1207 NativeAssert::Succeeded(hr, "Failed to initialize cache sources.");
1048 1208
1209 pEngineState->userExperience.hUXModule = reinterpret_cast<HMODULE>(1);
1049 pEngineState->userExperience.pfnBAProc = PlanTestBAProc; 1210 pEngineState->userExperience.pfnBAProc = PlanTestBAProc;
1050 } 1211 }
1051 1212
@@ -1676,11 +1837,29 @@ namespace Bootstrapper
1676} 1837}
1677 1838
1678static HRESULT WINAPI PlanTestBAProc( 1839static HRESULT WINAPI PlanTestBAProc(
1679 __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/, 1840 __in BOOTSTRAPPER_APPLICATION_MESSAGE message,
1680 __in const LPVOID /*pvArgs*/, 1841 __in const LPVOID /*pvArgs*/,
1681 __inout LPVOID /*pvResults*/, 1842 __inout LPVOID pvResults,
1682 __in_opt LPVOID /*pvContext*/ 1843 __in_opt LPVOID /*pvContext*/
1683 ) 1844 )
1684{ 1845{
1846 switch (message)
1847 {
1848 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGEBEGIN:
1849 if (vfUsePackageRequestState)
1850 {
1851 BA_ONPLANPACKAGEBEGIN_RESULTS* pResults = reinterpret_cast<BA_ONPLANPACKAGEBEGIN_RESULTS*>(pvResults);
1852 pResults->requestedState = vPackageRequestState;
1853 }
1854 break;
1855 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANRELATEDBUNDLE:
1856 if (vfUseRelatedBundleRequestState)
1857 {
1858 BA_ONPLANRELATEDBUNDLE_RESULTS* pResults = reinterpret_cast<BA_ONPLANRELATEDBUNDLE_RESULTS*>(pvResults);
1859 pResults->requestedState = vRelatedBundleRequestState;
1860 }
1861 break;
1862 }
1863
1685 return S_OK; 1864 return S_OK;
1686} 1865}