diff options
Diffstat (limited to 'src/burn/test')
-rw-r--r-- | src/burn/test/BurnUnitTest/PlanTest.cpp | 183 |
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 | |||
13 | static LPCWSTR wzSingleMsiManifestFileName = L"BasicFunctionality_BundleA_manifest.xml"; | 13 | static LPCWSTR wzSingleMsiManifestFileName = L"BasicFunctionality_BundleA_manifest.xml"; |
14 | static LPCWSTR wzSlipstreamManifestFileName = L"Slipstream_BundleA_manifest.xml"; | 14 | static LPCWSTR wzSlipstreamManifestFileName = L"Slipstream_BundleA_manifest.xml"; |
15 | 15 | ||
16 | static BOOL vfUsePackageRequestState = FALSE; | ||
17 | static BOOTSTRAPPER_REQUEST_STATE vPackageRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE; | ||
18 | static BOOL vfUseRelatedBundleRequestState = FALSE; | ||
19 | static BOOTSTRAPPER_REQUEST_STATE vRelatedBundleRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE; | ||
20 | |||
16 | namespace Microsoft | 21 | namespace Microsoft |
17 | { | 22 | { |
18 | namespace Tools | 23 | namespace 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 | ||
1678 | static HRESULT WINAPI PlanTestBAProc( | 1839 | static 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 | } |