diff options
Diffstat (limited to 'src/burn/test/BurnUnitTest/PlanTest.cpp')
| -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 | } |
