diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-01-14 21:37:24 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-01-16 10:30:28 -0600 |
| commit | da1d1376953ef1c9afb32d5eee02b785e52e372e (patch) | |
| tree | 0df8550960259d7b13f5cd90f04d21b5576f16b7 /src/burn/test/BurnUnitTest/PlanTest.cpp | |
| parent | abe316b80fae80eba54b0b79e76b6362105fa098 (diff) | |
| download | wix-da1d1376953ef1c9afb32d5eee02b785e52e372e.tar.gz wix-da1d1376953ef1c9afb32d5eee02b785e52e372e.tar.bz2 wix-da1d1376953ef1c9afb32d5eee02b785e52e372e.zip | |
Remove orphan compatible MSI packages.
Reimplements #3190
Diffstat (limited to 'src/burn/test/BurnUnitTest/PlanTest.cpp')
| -rw-r--r-- | src/burn/test/BurnUnitTest/PlanTest.cpp | 133 |
1 files changed, 132 insertions, 1 deletions
diff --git a/src/burn/test/BurnUnitTest/PlanTest.cpp b/src/burn/test/BurnUnitTest/PlanTest.cpp index 7e704c23..fc2b8472 100644 --- a/src/burn/test/BurnUnitTest/PlanTest.cpp +++ b/src/burn/test/BurnUnitTest/PlanTest.cpp | |||
| @@ -288,6 +288,74 @@ namespace Bootstrapper | |||
| 288 | } | 288 | } |
| 289 | 289 | ||
| 290 | [Fact] | 290 | [Fact] |
| 291 | void OrphanCompatiblePackageTest() | ||
| 292 | { | ||
| 293 | HRESULT hr = S_OK; | ||
| 294 | BURN_ENGINE_STATE engineState = { }; | ||
| 295 | BURN_ENGINE_STATE* pEngineState = &engineState; | ||
| 296 | BURN_PLAN* pPlan = &engineState.plan; | ||
| 297 | |||
| 298 | InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState); | ||
| 299 | DetectPackagesAsAbsent(pEngineState); | ||
| 300 | DetectCompatibleMsiPackage(pEngineState->packages.rgPackages, L"{C24F3903-38E7-4D44-8037-D9856B3C5046}", L"2.0.0.0"); | ||
| 301 | |||
| 302 | hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); | ||
| 303 | NativeAssert::Succeeded(hr, "CorePlan failed"); | ||
| 304 | |||
| 305 | Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); | ||
| 306 | Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); | ||
| 307 | Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); | ||
| 308 | |||
| 309 | BOOL fRollback = FALSE; | ||
| 310 | DWORD dwIndex = 0; | ||
| 311 | Assert::Equal(dwIndex, pPlan->cCacheActions); | ||
| 312 | |||
| 313 | fRollback = TRUE; | ||
| 314 | dwIndex = 0; | ||
| 315 | Assert::Equal(dwIndex, pPlan->cRollbackCacheActions); | ||
| 316 | |||
| 317 | Assert::Equal(0ull, pPlan->qwEstimatedSize); | ||
| 318 | Assert::Equal(0ull, pPlan->qwCacheSizeTotal); | ||
| 319 | |||
| 320 | fRollback = FALSE; | ||
| 321 | dwIndex = 0; | ||
| 322 | DWORD dwExecuteCheckpointId = 1; | ||
| 323 | ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE); | ||
| 324 | ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER); | ||
| 325 | ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER); | ||
| 326 | ValidateUninstallMsiCompatiblePackage(pPlan, fRollback, dwIndex++, L"PackageA", 0); | ||
| 327 | ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); | ||
| 328 | ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); | ||
| 329 | ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++); | ||
| 330 | Assert::Equal(dwIndex, pPlan->cExecuteActions); | ||
| 331 | |||
| 332 | fRollback = TRUE; | ||
| 333 | dwIndex = 0; | ||
| 334 | dwExecuteCheckpointId = 1; | ||
| 335 | ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE); | ||
| 336 | ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); | ||
| 337 | ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); | ||
| 338 | ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++); | ||
| 339 | Assert::Equal(dwIndex, pPlan->cRollbackActions); | ||
| 340 | |||
| 341 | Assert::Equal(1ul, pPlan->cExecutePackagesTotal); | ||
| 342 | Assert::Equal(1ul, pPlan->cOverallProgressTicksTotal); | ||
| 343 | |||
| 344 | dwIndex = 0; | ||
| 345 | ValidateCleanAction(pPlan, dwIndex++, L"PackageA"); | ||
| 346 | ValidateCleanCompatibleAction(pPlan, dwIndex++, L"PackageA"); | ||
| 347 | Assert::Equal(dwIndex, pPlan->cCleanActions); | ||
| 348 | |||
| 349 | UINT uIndex = 0; | ||
| 350 | ValidatePlannedProvider(pPlan, uIndex++, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", NULL); | ||
| 351 | ValidatePlannedProvider(pPlan, uIndex++, L"{64633047-D172-4BBB-B202-64337D15C952}", NULL); | ||
| 352 | Assert::Equal(uIndex, pPlan->cPlannedProviders); | ||
| 353 | |||
| 354 | Assert::Equal(1ul, pEngineState->packages.cPackages); | ||
| 355 | ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[0], L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BURN_PACKAGE_REGISTRATION_STATE_ABSENT); | ||
| 356 | } | ||
| 357 | |||
| 358 | [Fact] | ||
| 291 | void RelatedBundleMissingFromCacheTest() | 359 | void RelatedBundleMissingFromCacheTest() |
| 292 | { | 360 | { |
| 293 | HRESULT hr = S_OK; | 361 | HRESULT hr = S_OK; |
| @@ -1026,6 +1094,36 @@ namespace Bootstrapper | |||
| 1026 | } | 1094 | } |
| 1027 | } | 1095 | } |
| 1028 | 1096 | ||
| 1097 | void DetectCompatibleMsiPackage(BURN_PACKAGE* pPackage, LPCWSTR wzProductCode, LPCWSTR wzVersion) | ||
| 1098 | { | ||
| 1099 | HRESULT hr = S_OK; | ||
| 1100 | Assert(BOOTSTRAPPER_PACKAGE_STATE_PRESENT > pPackage->currentState); | ||
| 1101 | Assert(0 < pPackage->cDependencyProviders); | ||
| 1102 | BURN_DEPENDENCY_PROVIDER* pProvider = pPackage->rgDependencyProviders; | ||
| 1103 | BURN_COMPATIBLE_PACKAGE* pCompatiblePackage = &pPackage->compatiblePackage; | ||
| 1104 | pCompatiblePackage->fDetected = TRUE; | ||
| 1105 | pCompatiblePackage->fPlannable = TRUE; | ||
| 1106 | pCompatiblePackage->type = BURN_PACKAGE_TYPE_MSI; | ||
| 1107 | |||
| 1108 | hr = StrAllocFormatted(&pCompatiblePackage->sczCacheId, L"%lsv%ls", wzProductCode, wzVersion); | ||
| 1109 | NativeAssert::Succeeded(hr, "Failed to format cache id"); | ||
| 1110 | |||
| 1111 | hr = StrAllocString(&pCompatiblePackage->Msi.sczVersion, wzVersion, 0); | ||
| 1112 | NativeAssert::Succeeded(hr, "Failed to copy MSI version"); | ||
| 1113 | |||
| 1114 | hr = VerParseVersion(wzVersion, 0, FALSE, &pCompatiblePackage->Msi.pVersion); | ||
| 1115 | NativeAssert::Succeeded(hr, "Failed to parse MSI version"); | ||
| 1116 | |||
| 1117 | hr = StrAllocString(&pCompatiblePackage->compatibleEntry.sczId, wzProductCode, 0); | ||
| 1118 | NativeAssert::Succeeded(hr, "Failed to copy product code"); | ||
| 1119 | |||
| 1120 | hr = StrAllocString(&pCompatiblePackage->compatibleEntry.sczVersion, wzVersion, 0); | ||
| 1121 | NativeAssert::Succeeded(hr, "Failed to copy version"); | ||
| 1122 | |||
| 1123 | hr = StrAllocString(&pCompatiblePackage->compatibleEntry.sczProviderKey, pProvider->sczKey, 0); | ||
| 1124 | NativeAssert::Succeeded(hr, "Failed to copy provider key"); | ||
| 1125 | } | ||
| 1126 | |||
| 1029 | void DetectPackageAsAbsent(BURN_PACKAGE* pPackage) | 1127 | void DetectPackageAsAbsent(BURN_PACKAGE* pPackage) |
| 1030 | { | 1128 | { |
| 1031 | pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT; | 1129 | pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT; |
| @@ -1262,9 +1360,26 @@ namespace Bootstrapper | |||
| 1262 | __in LPCWSTR wzPackageId | 1360 | __in LPCWSTR wzPackageId |
| 1263 | ) | 1361 | ) |
| 1264 | { | 1362 | { |
| 1363 | BURN_CLEAN_ACTION* pCleanAction = ValidateCleanActionExists(pPlan, dwIndex); | ||
| 1364 | Assert::Equal<DWORD>(BURN_CLEAN_ACTION_TYPE_PACKAGE, pCleanAction->type); | ||
| 1365 | Assert::NotEqual((DWORD_PTR)0, (DWORD_PTR)pCleanAction->pPackage); | ||
| 1366 | NativeAssert::StringEqual(wzPackageId, pCleanAction->pPackage->sczId); | ||
| 1367 | } | ||
| 1368 | |||
| 1369 | BURN_CLEAN_ACTION* ValidateCleanActionExists(BURN_PLAN* pPlan, DWORD dwIndex) | ||
| 1370 | { | ||
| 1265 | Assert::InRange(dwIndex + 1ul, 1ul, pPlan->cCleanActions); | 1371 | Assert::InRange(dwIndex + 1ul, 1ul, pPlan->cCleanActions); |
| 1372 | return pPlan->rgCleanActions + dwIndex; | ||
| 1373 | } | ||
| 1266 | 1374 | ||
| 1267 | BURN_CLEAN_ACTION* pCleanAction = pPlan->rgCleanActions + dwIndex; | 1375 | void ValidateCleanCompatibleAction( |
| 1376 | __in BURN_PLAN* pPlan, | ||
| 1377 | __in DWORD dwIndex, | ||
| 1378 | __in LPCWSTR wzPackageId | ||
| 1379 | ) | ||
| 1380 | { | ||
| 1381 | BURN_CLEAN_ACTION* pCleanAction = ValidateCleanActionExists(pPlan, dwIndex); | ||
| 1382 | Assert::Equal<DWORD>(BURN_CLEAN_ACTION_TYPE_COMPATIBLE_PACKAGE, pCleanAction->type); | ||
| 1268 | Assert::NotEqual((DWORD_PTR)0, (DWORD_PTR)pCleanAction->pPackage); | 1383 | Assert::NotEqual((DWORD_PTR)0, (DWORD_PTR)pCleanAction->pPackage); |
| 1269 | NativeAssert::StringEqual(wzPackageId, pCleanAction->pPackage->sczId); | 1384 | NativeAssert::StringEqual(wzPackageId, pCleanAction->pPackage->sczId); |
| 1270 | } | 1385 | } |
| @@ -1537,6 +1652,22 @@ namespace Bootstrapper | |||
| 1537 | NativeAssert::StringEqual(wzKey, pProvider->sczKey); | 1652 | NativeAssert::StringEqual(wzKey, pProvider->sczKey); |
| 1538 | NativeAssert::StringEqual(wzName, pProvider->sczName); | 1653 | NativeAssert::StringEqual(wzName, pProvider->sczName); |
| 1539 | } | 1654 | } |
| 1655 | |||
| 1656 | void ValidateUninstallMsiCompatiblePackage( | ||
| 1657 | __in BURN_PLAN* pPlan, | ||
| 1658 | __in BOOL fRollback, | ||
| 1659 | __in DWORD dwIndex, | ||
| 1660 | __in_z LPCWSTR wzPackageId, | ||
| 1661 | __in DWORD dwLoggingAttributes | ||
| 1662 | ) | ||
| 1663 | { | ||
| 1664 | BURN_EXECUTE_ACTION* pAction = ValidateExecuteActionExists(pPlan, fRollback, dwIndex); | ||
| 1665 | Assert::Equal<DWORD>(BURN_EXECUTE_ACTION_TYPE_UNINSTALL_MSI_COMPATIBLE_PACKAGE, pAction->type); | ||
| 1666 | NativeAssert::StringEqual(wzPackageId, pAction->uninstallMsiCompatiblePackage.pParentPackage->sczId); | ||
| 1667 | NativeAssert::NotNull(pAction->msiPackage.sczLogPath); | ||
| 1668 | Assert::Equal<DWORD>(dwLoggingAttributes, pAction->uninstallMsiCompatiblePackage.dwLoggingAttributes); | ||
| 1669 | Assert::Equal<BOOL>(FALSE, pAction->fDeleted); | ||
| 1670 | } | ||
| 1540 | }; | 1671 | }; |
| 1541 | } | 1672 | } |
| 1542 | } | 1673 | } |
