aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-02-02 18:09:58 -0600
committerSean Hall <r.sean.hall@gmail.com>2021-02-04 22:16:10 -0600
commitfd8c2b0899bfbce07386af245c04eb21dc01cbdf (patch)
tree33d928124b0028729916189ddb9f239a9574c75d /src/test
parent39725a1a6d1c72a6748bd3c306af32bcae6dbf8f (diff)
downloadwix-fd8c2b0899bfbce07386af245c04eb21dc01cbdf.tar.gz
wix-fd8c2b0899bfbce07386af245c04eb21dc01cbdf.tar.bz2
wix-fd8c2b0899bfbce07386af245c04eb21dc01cbdf.zip
Update the logic for determining when the bundle should be registered.
The basic rule is that if a non-permanent package is present at the end of the chain, then the bundle should be registered. If no non-permanent packages are present at the end of the chain, then the bundle should not be registered. This required tracking what actually happened with each package during Apply. Include cache status in registration calculation. Include dependency ref-counting when determining whether the bundle should be registered.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/BurnUnitTest/BurnTestFixture.h2
-rw-r--r--src/test/BurnUnitTest/PlanTest.cpp260
2 files changed, 203 insertions, 59 deletions
diff --git a/src/test/BurnUnitTest/BurnTestFixture.h b/src/test/BurnUnitTest/BurnTestFixture.h
index 6b041641..103972ef 100644
--- a/src/test/BurnUnitTest/BurnTestFixture.h
+++ b/src/test/BurnUnitTest/BurnTestFixture.h
@@ -35,6 +35,8 @@ namespace Bootstrapper
35 35
36 LogInitialize(::GetModuleHandleW(NULL)); 36 LogInitialize(::GetModuleHandleW(NULL));
37 37
38 LogSetLevel(REPORT_DEBUG, FALSE);
39
38 hr = LogOpen(NULL, L"BurnUnitTest", NULL, L"txt", FALSE, FALSE, NULL); 40 hr = LogOpen(NULL, L"BurnUnitTest", NULL, L"txt", FALSE, FALSE, NULL);
39 TestThrowOnFailure(hr, L"Failed to open log."); 41 TestThrowOnFailure(hr, L"Failed to open log.");
40 } 42 }
diff --git a/src/test/BurnUnitTest/PlanTest.cpp b/src/test/BurnUnitTest/PlanTest.cpp
index a65bef4d..a50c64e1 100644
--- a/src/test/BurnUnitTest/PlanTest.cpp
+++ b/src/test/BurnUnitTest/PlanTest.cpp
@@ -50,13 +50,12 @@ namespace Bootstrapper
50 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 50 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
51 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 51 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
52 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 52 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
53 Assert::Equal<BOOL>(FALSE, pPlan->fKeepRegistrationDefault);
54 53
55 BOOL fRollback = FALSE; 54 BOOL fRollback = FALSE;
56 DWORD dwIndex = 0; 55 DWORD dwIndex = 0;
57 DWORD dwPackageStart = 0; 56 DWORD dwPackageStart = 0;
58 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); 57 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
59 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PackageA", 6, 2, 33743, FALSE); 58 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, 6, 2, 33743, FALSE);
60 ValidateCacheAcquireContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE); 59 ValidateCacheAcquireContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE);
61 ValidateCacheExtractContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE, dwPackageStart, 6); 60 ValidateCacheExtractContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE, dwPackageStart, 6);
62 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"PackageA", TRUE, FALSE, dwPackageStart); 61 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"PackageA", TRUE, FALSE, dwPackageStart);
@@ -64,7 +63,7 @@ namespace Bootstrapper
64 ValidateCachePackageStop(pPlan, fRollback, dwIndex++, L"PackageA", FALSE); 63 ValidateCachePackageStop(pPlan, fRollback, dwIndex++, L"PackageA", FALSE);
65 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++, FALSE); 64 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++, FALSE);
66 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 9); 65 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 9);
67 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PackageB", 14, 2, 33743, FALSE); 66 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PackageB", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, 14, 2, 33743, FALSE);
68 ValidateCacheAcquireContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", TRUE); 67 ValidateCacheAcquireContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", TRUE);
69 ValidateCacheExtractContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE, dwPackageStart, 2); 68 ValidateCacheExtractContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE, dwPackageStart, 2);
70 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageB", L"PackageB", TRUE, FALSE, dwPackageStart); 69 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageB", L"PackageB", TRUE, FALSE, dwPackageStart);
@@ -72,7 +71,7 @@ namespace Bootstrapper
72 ValidateCachePackageStop(pPlan, fRollback, dwIndex++, L"PackageB", FALSE); 71 ValidateCachePackageStop(pPlan, fRollback, dwIndex++, L"PackageB", FALSE);
73 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++, FALSE); 72 ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++, FALSE);
74 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 14); 73 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 14);
75 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PackageC", 22, 2, 33743, FALSE); 74 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PackageC", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, 22, 2, 33743, FALSE);
76 ValidateCacheAcquireContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", TRUE); 75 ValidateCacheAcquireContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", TRUE);
77 ValidateCacheExtractContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE, dwPackageStart, 2); 76 ValidateCacheExtractContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE, dwPackageStart, 2);
78 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageC", L"PackageC", TRUE, FALSE, dwPackageStart); 77 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageC", L"PackageC", TRUE, FALSE, dwPackageStart);
@@ -99,9 +98,8 @@ namespace Bootstrapper
99 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 98 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
100 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER); 99 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
101 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 100 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
102 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 101 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
103 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 102 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
104 ValidateExecuteRegistration(pPlan, fRollback, dwIndex++, TRUE);
105 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER); 103 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
106 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 104 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
107 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 105 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -113,7 +111,7 @@ namespace Bootstrapper
113 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 111 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
114 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 112 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
115 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", BURN_DEPENDENCY_ACTION_REGISTER); 113 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", BURN_DEPENDENCY_ACTION_REGISTER);
116 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageB", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 114 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageB", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
117 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 115 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
118 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageB", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER); 116 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageB", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
119 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 117 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -122,26 +120,25 @@ namespace Bootstrapper
122 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 120 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
123 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 121 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
124 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", BURN_DEPENDENCY_ACTION_REGISTER); 122 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", BURN_DEPENDENCY_ACTION_REGISTER);
125 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageC", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 123 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageC", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
126 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 124 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
127 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageC", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER); 125 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageC", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
128 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 126 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
129 ValidateExecuteCommitMsiTransaction(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ"); 127 ValidateExecuteCommitMsiTransaction(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ");
130 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 128 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
131 ValidateExecuteWaitSyncpoint(pPlan, fRollback, dwIndex++, pPlan->rgCacheActions[23].syncpoint.hEvent); 129 ValidateExecuteWaitSyncpoint(pPlan, fRollback, dwIndex++, pPlan->rgCacheActions[23].syncpoint.hEvent);
132 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, NULL); 130 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN, BOOTSTRAPPER_ACTION_STATE_UNINSTALL, NULL);
133 Assert::Equal(dwIndex, pPlan->cExecuteActions); 131 Assert::Equal(dwIndex, pPlan->cExecuteActions);
134 132
135 fRollback = TRUE; 133 fRollback = TRUE;
136 dwIndex = 0; 134 dwIndex = 0;
137 dwExecuteCheckpointId = 2; 135 dwExecuteCheckpointId = 2;
138 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE); 136 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
139 ValidateExecuteRegistration(pPlan, fRollback, dwIndex++, FALSE);
140 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA"); 137 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
141 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 138 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
142 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER); 139 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
143 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 140 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
144 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 141 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
145 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 142 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
146 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER); 143 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
147 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 144 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -166,7 +163,7 @@ namespace Bootstrapper
166 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 163 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
167 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 164 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
168 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 165 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
169 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_INSTALL, NULL); 166 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN, BOOTSTRAPPER_ACTION_STATE_INSTALL, NULL);
170 Assert::Equal(dwIndex, pPlan->cRollbackActions); 167 Assert::Equal(dwIndex, pPlan->cRollbackActions);
171 168
172 Assert::Equal(4ul, pPlan->cExecutePackagesTotal); 169 Assert::Equal(4ul, pPlan->cExecutePackagesTotal);
@@ -197,7 +194,6 @@ namespace Bootstrapper
197 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 194 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
198 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 195 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
199 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 196 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
200 Assert::Equal<BOOL>(TRUE, pPlan->fKeepRegistrationDefault);
201 197
202 BOOL fRollback = FALSE; 198 BOOL fRollback = FALSE;
203 DWORD dwIndex = 0; 199 DWORD dwIndex = 0;
@@ -220,13 +216,13 @@ namespace Bootstrapper
220 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageC", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER); 216 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageC", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
221 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 217 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
222 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", BURN_DEPENDENCY_ACTION_UNREGISTER); 218 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", BURN_DEPENDENCY_ACTION_UNREGISTER);
223 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageC", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 219 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageC", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
224 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 220 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
225 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 221 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
226 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageB", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER); 222 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageB", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
227 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 223 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
228 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", BURN_DEPENDENCY_ACTION_UNREGISTER); 224 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", BURN_DEPENDENCY_ACTION_UNREGISTER);
229 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageB", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 225 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageB", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
230 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 226 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
231 ValidateExecuteCommitMsiTransaction(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ"); 227 ValidateExecuteCommitMsiTransaction(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ");
232 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 228 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -236,8 +232,7 @@ namespace Bootstrapper
236 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 232 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
237 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER); 233 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
238 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 234 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
239 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 235 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
240 ValidateExecuteRegistration(pPlan, fRollback, dwIndex++, FALSE);
241 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 236 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
242 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 237 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
243 Assert::Equal(dwIndex, pPlan->cExecuteActions); 238 Assert::Equal(dwIndex, pPlan->cExecuteActions);
@@ -263,9 +258,8 @@ namespace Bootstrapper
263 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 258 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
264 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER); 259 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
265 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 260 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
266 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 261 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
267 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 262 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
268 ValidateExecuteRegistration(pPlan, fRollback, dwIndex++, TRUE);
269 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 263 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
270 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 264 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
271 Assert::Equal(dwIndex, pPlan->cRollbackActions); 265 Assert::Equal(dwIndex, pPlan->cRollbackActions);
@@ -274,9 +268,9 @@ namespace Bootstrapper
274 Assert::Equal(3ul, pPlan->cOverallProgressTicksTotal); 268 Assert::Equal(3ul, pPlan->cOverallProgressTicksTotal);
275 269
276 dwIndex = 0; 270 dwIndex = 0;
277 ValidateCleanAction(pPlan, dwIndex++, L"PackageC"); 271 ValidateCleanAction(pPlan, dwIndex++, L"PackageC", BURN_PACKAGE_REGISTRATION_STATE_ABSENT);
278 ValidateCleanAction(pPlan, dwIndex++, L"PackageB"); 272 ValidateCleanAction(pPlan, dwIndex++, L"PackageB", BURN_PACKAGE_REGISTRATION_STATE_ABSENT);
279 ValidateCleanAction(pPlan, dwIndex++, L"PackageA"); 273 ValidateCleanAction(pPlan, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT);
280 Assert::Equal(dwIndex, pPlan->cCleanActions); 274 Assert::Equal(dwIndex, pPlan->cCleanActions);
281 275
282 UINT uIndex = 0; 276 UINT uIndex = 0;
@@ -306,13 +300,12 @@ namespace Bootstrapper
306 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_CACHE, pPlan->action); 300 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_CACHE, pPlan->action);
307 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 301 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
308 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 302 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
309 Assert::Equal<BOOL>(FALSE, pPlan->fKeepRegistrationDefault);
310 303
311 BOOL fRollback = FALSE; 304 BOOL fRollback = FALSE;
312 DWORD dwIndex = 0; 305 DWORD dwIndex = 0;
313 DWORD dwPackageStart = 0; 306 DWORD dwPackageStart = 0;
314 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); 307 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
315 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PackageA", 5, 2, 33743, FALSE); 308 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, 5, 2, 33743, FALSE);
316 ValidateCacheExtractContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE, BURN_PLAN_INVALID_ACTION_INDEX, 2); 309 ValidateCacheExtractContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE, BURN_PLAN_INVALID_ACTION_INDEX, 2);
317 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"PackageA", TRUE, FALSE, dwPackageStart); 310 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"PackageA", TRUE, FALSE, dwPackageStart);
318 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"cab9Ins_fTP3wNwq5Gxo41ch5VUPaQ", TRUE, FALSE, dwPackageStart); 311 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"cab9Ins_fTP3wNwq5Gxo41ch5VUPaQ", TRUE, FALSE, dwPackageStart);
@@ -378,13 +371,12 @@ namespace Bootstrapper
378 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 371 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
379 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 372 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
380 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 373 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
381 Assert::Equal<BOOL>(FALSE, pPlan->fKeepRegistrationDefault);
382 374
383 BOOL fRollback = FALSE; 375 BOOL fRollback = FALSE;
384 DWORD dwIndex = 0; 376 DWORD dwIndex = 0;
385 DWORD dwPackageStart = 0; 377 DWORD dwPackageStart = 0;
386 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1); 378 ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
387 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PackageA", 5, 2, 33743, FALSE); 379 dwPackageStart = ValidateCachePackageStart(pPlan, fRollback, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, 5, 2, 33743, FALSE);
388 ValidateCacheExtractContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE, BURN_PLAN_INVALID_ACTION_INDEX, 2); 380 ValidateCacheExtractContainer(pPlan, fRollback, dwIndex++, L"WixAttachedContainer", FALSE, BURN_PLAN_INVALID_ACTION_INDEX, 2);
389 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"PackageA", TRUE, FALSE, dwPackageStart); 381 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"PackageA", TRUE, FALSE, dwPackageStart);
390 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"cab9Ins_fTP3wNwq5Gxo41ch5VUPaQ", TRUE, FALSE, dwPackageStart); 382 ValidateCacheCachePayload(pPlan, fRollback, dwIndex++, L"PackageA", L"cab9Ins_fTP3wNwq5Gxo41ch5VUPaQ", TRUE, FALSE, dwPackageStart);
@@ -410,32 +402,30 @@ namespace Bootstrapper
410 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 402 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
411 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER); 403 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
412 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 404 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
413 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 405 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
414 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 406 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
415 ValidateExecuteRegistration(pPlan, fRollback, dwIndex++, TRUE);
416 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER); 407 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
417 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 408 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
418 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 409 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
419 ValidateExecuteWaitSyncpoint(pPlan, fRollback, dwIndex++, pPlan->rgCacheActions[6].syncpoint.hEvent); 410 ValidateExecuteWaitSyncpoint(pPlan, fRollback, dwIndex++, pPlan->rgCacheActions[6].syncpoint.hEvent);
420 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, NULL); 411 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN, BOOTSTRAPPER_ACTION_STATE_UNINSTALL, NULL);
421 Assert::Equal(dwIndex, pPlan->cExecuteActions); 412 Assert::Equal(dwIndex, pPlan->cExecuteActions);
422 413
423 fRollback = TRUE; 414 fRollback = TRUE;
424 dwIndex = 0; 415 dwIndex = 0;
425 dwExecuteCheckpointId = 2; 416 dwExecuteCheckpointId = 2;
426 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE); 417 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
427 ValidateExecuteRegistration(pPlan, fRollback, dwIndex++, FALSE);
428 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA"); 418 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
429 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 419 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
430 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER); 420 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
431 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 421 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
432 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 422 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
433 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 423 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
434 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER); 424 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER);
435 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 425 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
436 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 426 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
437 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 427 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
438 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_INSTALL, NULL); 428 ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN, BOOTSTRAPPER_ACTION_STATE_INSTALL, NULL);
439 Assert::Equal(dwIndex, pPlan->cRollbackActions); 429 Assert::Equal(dwIndex, pPlan->cRollbackActions);
440 430
441 Assert::Equal(2ul, pPlan->cExecutePackagesTotal); 431 Assert::Equal(2ul, pPlan->cExecutePackagesTotal);
@@ -450,6 +440,62 @@ namespace Bootstrapper
450 } 440 }
451 441
452 [Fact] 442 [Fact]
443 void SingleMsiInstalledWithNoInstalledPackagesModifyTest()
444 {
445 HRESULT hr = S_OK;
446 BURN_ENGINE_STATE engineState = { };
447 BURN_ENGINE_STATE* pEngineState = &engineState;
448 BURN_PLAN* pPlan = &engineState.plan;
449
450 InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState);
451 PlanTestDetect(pEngineState);
452
453 pEngineState->registration.fInstalled = TRUE;
454
455 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_MODIFY);
456 NativeAssert::Succeeded(hr, "CorePlan failed");
457
458 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_MODIFY, pPlan->action);
459 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
460 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
461
462 BOOL fRollback = FALSE;
463 DWORD dwIndex = 0;
464 Assert::Equal(dwIndex, pPlan->cCacheActions);
465
466 fRollback = TRUE;
467 dwIndex = 0;
468 Assert::Equal(dwIndex, pPlan->cRollbackCacheActions);
469
470 Assert::Equal(0ull, pPlan->qwEstimatedSize);
471 Assert::Equal(0ull, pPlan->qwCacheSizeTotal);
472
473 fRollback = FALSE;
474 dwIndex = 0;
475 DWORD dwExecuteCheckpointId = 1;
476 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
477 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
478 Assert::Equal(dwIndex, pPlan->cExecuteActions);
479
480 fRollback = TRUE;
481 dwIndex = 0;
482 dwExecuteCheckpointId = 1;
483 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
484 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
485 Assert::Equal(dwIndex, pPlan->cRollbackActions);
486
487 Assert::Equal(0ul, pPlan->cExecutePackagesTotal);
488 Assert::Equal(0ul, pPlan->cOverallProgressTicksTotal);
489
490 dwIndex = 0;
491 Assert::Equal(dwIndex, pPlan->cCleanActions);
492
493 UINT uIndex = 0;
494 ValidatePlannedProvider(pPlan, uIndex++, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", NULL);
495 Assert::Equal(uIndex, pPlan->cPlannedProviders);
496 }
497
498 [Fact]
453 void SingleMsiUninstallTest() 499 void SingleMsiUninstallTest()
454 { 500 {
455 HRESULT hr = S_OK; 501 HRESULT hr = S_OK;
@@ -466,7 +512,6 @@ namespace Bootstrapper
466 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 512 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
467 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine); 513 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
468 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback); 514 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
469 Assert::Equal<BOOL>(TRUE, pPlan->fKeepRegistrationDefault);
470 515
471 BOOL fRollback = FALSE; 516 BOOL fRollback = FALSE;
472 DWORD dwIndex = 0; 517 DWORD dwIndex = 0;
@@ -488,8 +533,7 @@ namespace Bootstrapper
488 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 533 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
489 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER); 534 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
490 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 535 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
491 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 536 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
492 ValidateExecuteRegistration(pPlan, fRollback, dwIndex++, FALSE);
493 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 537 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
494 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 538 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
495 Assert::Equal(dwIndex, pPlan->cExecuteActions); 539 Assert::Equal(dwIndex, pPlan->cExecuteActions);
@@ -502,9 +546,8 @@ namespace Bootstrapper
502 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 546 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
503 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER); 547 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
504 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 548 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
505 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0); 549 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
506 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 550 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
507 ValidateExecuteRegistration(pPlan, fRollback, dwIndex++, TRUE);
508 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 551 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
509 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 552 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
510 Assert::Equal(dwIndex, pPlan->cRollbackActions); 553 Assert::Equal(dwIndex, pPlan->cRollbackActions);
@@ -513,7 +556,7 @@ namespace Bootstrapper
513 Assert::Equal(1ul, pPlan->cOverallProgressTicksTotal); 556 Assert::Equal(1ul, pPlan->cOverallProgressTicksTotal);
514 557
515 dwIndex = 0; 558 dwIndex = 0;
516 ValidateCleanAction(pPlan, dwIndex++, L"PackageA"); 559 ValidateCleanAction(pPlan, dwIndex++, L"PackageA", BURN_PACKAGE_REGISTRATION_STATE_ABSENT);
517 Assert::Equal(dwIndex, pPlan->cCleanActions); 560 Assert::Equal(dwIndex, pPlan->cCleanActions);
518 561
519 UINT uIndex = 0; 562 UINT uIndex = 0;
@@ -522,6 +565,66 @@ namespace Bootstrapper
522 Assert::Equal(uIndex, pPlan->cPlannedProviders); 565 Assert::Equal(uIndex, pPlan->cPlannedProviders);
523 } 566 }
524 567
568 [Fact]
569 void SingleMsiUninstallTestFromUpgradeBundleWithSameExactPackage()
570 {
571 HRESULT hr = S_OK;
572 BURN_ENGINE_STATE engineState = { };
573 BURN_ENGINE_STATE* pEngineState = &engineState;
574 BURN_PLAN* pPlan = &engineState.plan;
575
576 InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState);
577 DetectAsRelatedUpgradeBundle(&engineState, L"{02940F3E-C83E-452D-BFCF-C943777ACEAE}", L"2.0.0.0");
578
579 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL);
580 NativeAssert::Succeeded(hr, "CorePlan failed");
581
582 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
583 Assert::Equal<BOOL>(TRUE, pPlan->fPerMachine);
584 Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
585
586 BOOL fRollback = FALSE;
587 DWORD dwIndex = 0;
588 Assert::Equal(dwIndex, pPlan->cCacheActions);
589
590 fRollback = TRUE;
591 dwIndex = 0;
592 Assert::Equal(dwIndex, pPlan->cRollbackCacheActions);
593
594 Assert::Equal(0ull, pPlan->qwEstimatedSize);
595 Assert::Equal(0ull, pPlan->qwCacheSizeTotal);
596
597 fRollback = FALSE;
598 dwIndex = 0;
599 DWORD dwExecuteCheckpointId = 1;
600 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
601 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
602 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER);
603 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
604 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
605 Assert::Equal(dwIndex, pPlan->cExecuteActions);
606
607 fRollback = TRUE;
608 dwIndex = 0;
609 dwExecuteCheckpointId = 1;
610 ValidateExecuteRollbackBoundary(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
611 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
612 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
613 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
614 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
615 Assert::Equal(dwIndex, pPlan->cRollbackActions);
616
617 Assert::Equal(0ul, pPlan->cExecutePackagesTotal);
618 Assert::Equal(0ul, pPlan->cOverallProgressTicksTotal);
619
620 dwIndex = 0;
621 Assert::Equal(dwIndex, pPlan->cCleanActions);
622
623 UINT uIndex = 0;
624 ValidatePlannedProvider(pPlan, uIndex++, L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", NULL);
625 Assert::Equal(uIndex, pPlan->cPlannedProviders);
626 }
627
525 private: 628 private:
526 // This doesn't initialize everything, just enough for CorePlan to work. 629 // This doesn't initialize everything, just enough for CorePlan to work.
527 void InitializeEngineStateForCorePlan(LPCWSTR wzManifestFileName, BURN_ENGINE_STATE* pEngineState) 630 void InitializeEngineStateForCorePlan(LPCWSTR wzManifestFileName, BURN_ENGINE_STATE* pEngineState)
@@ -586,12 +689,22 @@ namespace Bootstrapper
586 void DetectPackageAsAbsent(BURN_PACKAGE* pPackage) 689 void DetectPackageAsAbsent(BURN_PACKAGE* pPackage)
587 { 690 {
588 pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT; 691 pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT;
692 if (pPackage->fCanAffectRegistration)
693 {
694 pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_ABSENT;
695 pPackage->installRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_ABSENT;
696 }
589 } 697 }
590 698
591 void DetectPackageAsPresentAndCached(BURN_PACKAGE* pPackage) 699 void DetectPackageAsPresentAndCached(BURN_PACKAGE* pPackage)
592 { 700 {
593 pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_PRESENT; 701 pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_PRESENT;
594 pPackage->cache = BURN_CACHE_STATE_COMPLETE; 702 pPackage->cache = BURN_CACHE_STATE_COMPLETE;
703 if (pPackage->fCanAffectRegistration)
704 {
705 pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_PRESENT;
706 pPackage->installRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_PRESENT;
707 }
595 708
596 for (DWORD i = 0; i < pPackage->cPayloads; ++i) 709 for (DWORD i = 0; i < pPackage->cPayloads; ++i)
597 { 710 {
@@ -599,6 +712,19 @@ namespace Bootstrapper
599 } 712 }
600 } 713 }
601 714
715 void DetectPackageDependent(BURN_PACKAGE* pPackage, LPCWSTR wzId)
716 {
717 HRESULT hr = S_OK;
718
719 for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i)
720 {
721 BURN_DEPENDENCY_PROVIDER* pProvider = pPackage->rgDependencyProviders + i;
722
723 hr = DepDependencyArrayAlloc(&pProvider->rgDependents, &pProvider->cDependents, wzId, NULL);
724 NativeAssert::Succeeded(hr, "Failed to add package dependent");
725 }
726 }
727
602 void DetectPackagesAsAbsent(BURN_ENGINE_STATE* pEngineState) 728 void DetectPackagesAsAbsent(BURN_ENGINE_STATE* pEngineState)
603 { 729 {
604 PlanTestDetect(pEngineState); 730 PlanTestDetect(pEngineState);
@@ -620,6 +746,7 @@ namespace Bootstrapper
620 { 746 {
621 BURN_PACKAGE* pPackage = pEngineState->packages.rgPackages + i; 747 BURN_PACKAGE* pPackage = pEngineState->packages.rgPackages + i;
622 DetectPackageAsPresentAndCached(pPackage); 748 DetectPackageAsPresentAndCached(pPackage);
749 DetectPackageDependent(pPackage, pEngineState->registration.sczId);
623 } 750 }
624 } 751 }
625 752
@@ -639,11 +766,12 @@ namespace Bootstrapper
639 else 766 else
640 { 767 {
641 DetectPackageAsPresentAndCached(pPackage); 768 DetectPackageAsPresentAndCached(pPackage);
769 DetectPackageDependent(pPackage, pEngineState->registration.sczId);
642 } 770 }
643 } 771 }
644 } 772 }
645 773
646 HRESULT DetectUpgradeBundle( 774 void DetectUpgradeBundle(
647 __in BURN_ENGINE_STATE* pEngineState, 775 __in BURN_ENGINE_STATE* pEngineState,
648 __in LPCWSTR wzId, 776 __in LPCWSTR wzId,
649 __in LPCWSTR wzVersion 777 __in LPCWSTR wzVersion
@@ -654,30 +782,48 @@ namespace Bootstrapper
654 BURN_DEPENDENCY_PROVIDER dependencyProvider = { }; 782 BURN_DEPENDENCY_PROVIDER dependencyProvider = { };
655 783
656 hr = StrAllocString(&dependencyProvider.sczKey, wzId, 0); 784 hr = StrAllocString(&dependencyProvider.sczKey, wzId, 0);
657 ExitOnFailure(hr, "Failed to copy provider key"); 785 NativeAssert::Succeeded(hr, "Failed to copy provider key");
658 786
659 dependencyProvider.fImported = TRUE; 787 dependencyProvider.fImported = TRUE;
660 788
661 hr = StrAllocString(&dependencyProvider.sczVersion, wzVersion, 0); 789 hr = StrAllocString(&dependencyProvider.sczVersion, wzVersion, 0);
662 ExitOnFailure(hr, "Failed to copy version"); 790 NativeAssert::Succeeded(hr, "Failed to copy version");
663 791
664 hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&pRelatedBundles->rgRelatedBundles), pRelatedBundles->cRelatedBundles + 1, sizeof(BURN_RELATED_BUNDLE), 5); 792 hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&pRelatedBundles->rgRelatedBundles), pRelatedBundles->cRelatedBundles + 1, sizeof(BURN_RELATED_BUNDLE), 5);
665 ExitOnFailure(hr, "Failed to ensure there is space for related bundles."); 793 NativeAssert::Succeeded(hr, "Failed to ensure there is space for related bundles.");
666 794
667 BURN_RELATED_BUNDLE* pRelatedBundle = pRelatedBundles->rgRelatedBundles + pRelatedBundles->cRelatedBundles; 795 BURN_RELATED_BUNDLE* pRelatedBundle = pRelatedBundles->rgRelatedBundles + pRelatedBundles->cRelatedBundles;
668 796
669 hr = VerParseVersion(wzVersion, 0, FALSE, &pRelatedBundle->pVersion); 797 hr = VerParseVersion(wzVersion, 0, FALSE, &pRelatedBundle->pVersion);
670 ExitOnFailure(hr, "Failed to parse pseudo bundle version: %ls", wzVersion); 798 NativeAssert::Succeeded(hr, "Failed to parse pseudo bundle version: %ls", wzVersion);
671 799
672 pRelatedBundle->relationType = BOOTSTRAPPER_RELATION_UPGRADE; 800 pRelatedBundle->relationType = BOOTSTRAPPER_RELATION_UPGRADE;
673 801
674 hr = PseudoBundleInitialize(0, &pRelatedBundle->package, TRUE, wzId, pRelatedBundle->relationType, BOOTSTRAPPER_PACKAGE_STATE_PRESENT, NULL, NULL, NULL, 0, FALSE, L"-quiet", L"-repair -quiet", L"-uninstall -quiet", &dependencyProvider, NULL, 0); 802 hr = PseudoBundleInitialize(0, &pRelatedBundle->package, TRUE, wzId, pRelatedBundle->relationType, BOOTSTRAPPER_PACKAGE_STATE_PRESENT, NULL, NULL, NULL, 0, FALSE, L"-quiet", L"-repair -quiet", L"-uninstall -quiet", &dependencyProvider, NULL, 0);
675 ExitOnFailure(hr, "Failed to initialize related bundle to represent bundle: %ls", wzId); 803 NativeAssert::Succeeded(hr, "Failed to initialize related bundle to represent bundle: %ls", wzId);
676 804
677 ++pRelatedBundles->cRelatedBundles; 805 ++pRelatedBundles->cRelatedBundles;
806 }
807
808 void DetectAsRelatedUpgradeBundle(
809 __in BURN_ENGINE_STATE* pEngineState,
810 __in LPCWSTR wzId,
811 __in LPCWSTR wzVersion
812 )
813 {
814 HRESULT hr = StrAllocString(&pEngineState->registration.sczAncestors, wzId, 0);
815 NativeAssert::Succeeded(hr, "Failed to set registration's ancestors");
816
817 pEngineState->command.relationType = BOOTSTRAPPER_RELATION_UPGRADE;
678 818
679 LExit: 819 DetectPackagesAsPresentAndCached(pEngineState);
680 return hr; 820 DetectUpgradeBundle(pEngineState, wzId, wzVersion);
821
822 for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i)
823 {
824 BURN_PACKAGE* pPackage = pEngineState->packages.rgPackages + i;
825 DetectPackageDependent(pPackage, wzId);
826 }
681 } 827 }
682 828
683 void ValidateCacheAcquireContainer( 829 void ValidateCacheAcquireContainer(
@@ -755,6 +901,7 @@ namespace Bootstrapper
755 __in BOOL fRollback, 901 __in BOOL fRollback,
756 __in DWORD dwIndex, 902 __in DWORD dwIndex,
757 __in LPCWSTR wzPackageId, 903 __in LPCWSTR wzPackageId,
904 __in BURN_PACKAGE_REGISTRATION_STATE expectedCacheRegistrationState,
758 __in DWORD iPackageCompleteAction, 905 __in DWORD iPackageCompleteAction,
759 __in DWORD cCachePayloads, 906 __in DWORD cCachePayloads,
760 __in DWORD64 qwCachePayloadSizeTotal, 907 __in DWORD64 qwCachePayloadSizeTotal,
@@ -764,6 +911,7 @@ namespace Bootstrapper
764 BURN_CACHE_ACTION* pAction = ValidateCacheActionExists(pPlan, fRollback, dwIndex); 911 BURN_CACHE_ACTION* pAction = ValidateCacheActionExists(pPlan, fRollback, dwIndex);
765 Assert::Equal<DWORD>(BURN_CACHE_ACTION_TYPE_PACKAGE_START, pAction->type); 912 Assert::Equal<DWORD>(BURN_CACHE_ACTION_TYPE_PACKAGE_START, pAction->type);
766 NativeAssert::StringEqual(wzPackageId, pAction->packageStart.pPackage->sczId); 913 NativeAssert::StringEqual(wzPackageId, pAction->packageStart.pPackage->sczId);
914 Assert::Equal<DWORD>(expectedCacheRegistrationState, pAction->packageStart.pPackage->expectedCacheRegistrationState);
767 Assert::Equal(iPackageCompleteAction, pAction->packageStart.iPackageCompleteAction); 915 Assert::Equal(iPackageCompleteAction, pAction->packageStart.iPackageCompleteAction);
768 Assert::Equal(cCachePayloads, pAction->packageStart.cCachePayloads); 916 Assert::Equal(cCachePayloads, pAction->packageStart.cCachePayloads);
769 Assert::Equal(qwCachePayloadSizeTotal, pAction->packageStart.qwCachePayloadSizeTotal); 917 Assert::Equal(qwCachePayloadSizeTotal, pAction->packageStart.qwCachePayloadSizeTotal);
@@ -815,7 +963,8 @@ namespace Bootstrapper
815 void ValidateCleanAction( 963 void ValidateCleanAction(
816 __in BURN_PLAN* pPlan, 964 __in BURN_PLAN* pPlan,
817 __in DWORD dwIndex, 965 __in DWORD dwIndex,
818 __in LPCWSTR wzPackageId 966 __in LPCWSTR wzPackageId,
967 __in BURN_PACKAGE_REGISTRATION_STATE expectedCacheRegistrationState
819 ) 968 )
820 { 969 {
821 Assert::InRange(dwIndex + 1ul, 1ul, pPlan->cCleanActions); 970 Assert::InRange(dwIndex + 1ul, 1ul, pPlan->cCleanActions);
@@ -823,6 +972,7 @@ namespace Bootstrapper
823 BURN_CLEAN_ACTION* pCleanAction = pPlan->rgCleanActions + dwIndex; 972 BURN_CLEAN_ACTION* pCleanAction = pPlan->rgCleanActions + dwIndex;
824 Assert::NotEqual((DWORD_PTR)0, (DWORD_PTR)pCleanAction->pPackage); 973 Assert::NotEqual((DWORD_PTR)0, (DWORD_PTR)pCleanAction->pPackage);
825 NativeAssert::StringEqual(wzPackageId, pCleanAction->pPackage->sczId); 974 NativeAssert::StringEqual(wzPackageId, pCleanAction->pPackage->sczId);
975 Assert::Equal<DWORD>(expectedCacheRegistrationState, pCleanAction->pPackage->expectedCacheRegistrationState);
826 } 976 }
827 977
828 BURN_EXECUTE_ACTION* ValidateExecuteActionExists(BURN_PLAN* pPlan, BOOL fRollback, DWORD dwIndex) 978 BURN_EXECUTE_ACTION* ValidateExecuteActionExists(BURN_PLAN* pPlan, BOOL fRollback, DWORD dwIndex)
@@ -872,6 +1022,7 @@ namespace Bootstrapper
872 __in BOOL fRollback, 1022 __in BOOL fRollback,
873 __in DWORD dwIndex, 1023 __in DWORD dwIndex,
874 __in LPCWSTR wzPackageId, 1024 __in LPCWSTR wzPackageId,
1025 __in BURN_PACKAGE_REGISTRATION_STATE expectedInstallRegistrationState,
875 __in BOOTSTRAPPER_ACTION_STATE action, 1026 __in BOOTSTRAPPER_ACTION_STATE action,
876 __in LPCWSTR wzIgnoreDependencies 1027 __in LPCWSTR wzIgnoreDependencies
877 ) 1028 )
@@ -879,6 +1030,7 @@ namespace Bootstrapper
879 BURN_EXECUTE_ACTION* pAction = ValidateExecuteActionExists(pPlan, fRollback, dwIndex); 1030 BURN_EXECUTE_ACTION* pAction = ValidateExecuteActionExists(pPlan, fRollback, dwIndex);
880 Assert::Equal<DWORD>(BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE, pAction->type); 1031 Assert::Equal<DWORD>(BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE, pAction->type);
881 NativeAssert::StringEqual(wzPackageId, pAction->exePackage.pPackage->sczId); 1032 NativeAssert::StringEqual(wzPackageId, pAction->exePackage.pPackage->sczId);
1033 Assert::Equal<DWORD>(expectedInstallRegistrationState, pAction->exePackage.pPackage->expectedInstallRegistrationState);
882 Assert::Equal<DWORD>(action, pAction->exePackage.action); 1034 Assert::Equal<DWORD>(action, pAction->exePackage.action);
883 NativeAssert::StringEqual(wzIgnoreDependencies, pAction->exePackage.sczIgnoreDependencies); 1035 NativeAssert::StringEqual(wzIgnoreDependencies, pAction->exePackage.sczIgnoreDependencies);
884 } 1036 }
@@ -888,6 +1040,7 @@ namespace Bootstrapper
888 __in BOOL fRollback, 1040 __in BOOL fRollback,
889 __in DWORD dwIndex, 1041 __in DWORD dwIndex,
890 __in LPCWSTR wzPackageId, 1042 __in LPCWSTR wzPackageId,
1043 __in BURN_PACKAGE_REGISTRATION_STATE expectedInstallRegistrationState,
891 __in BOOTSTRAPPER_ACTION_STATE action, 1044 __in BOOTSTRAPPER_ACTION_STATE action,
892 __in BURN_MSI_PROPERTY actionMsiProperty, 1045 __in BURN_MSI_PROPERTY actionMsiProperty,
893 __in DWORD uiLevel, 1046 __in DWORD uiLevel,
@@ -898,6 +1051,7 @@ namespace Bootstrapper
898 BURN_EXECUTE_ACTION* pAction = ValidateExecuteActionExists(pPlan, fRollback, dwIndex); 1051 BURN_EXECUTE_ACTION* pAction = ValidateExecuteActionExists(pPlan, fRollback, dwIndex);
899 Assert::Equal<DWORD>(BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE, pAction->type); 1052 Assert::Equal<DWORD>(BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE, pAction->type);
900 NativeAssert::StringEqual(wzPackageId, pAction->msiPackage.pPackage->sczId); 1053 NativeAssert::StringEqual(wzPackageId, pAction->msiPackage.pPackage->sczId);
1054 Assert::Equal<DWORD>(expectedInstallRegistrationState, pAction->msiPackage.pPackage->expectedInstallRegistrationState);
901 Assert::Equal<DWORD>(action, pAction->msiPackage.action); 1055 Assert::Equal<DWORD>(action, pAction->msiPackage.action);
902 Assert::Equal<DWORD>(actionMsiProperty, pAction->msiPackage.actionMsiProperty); 1056 Assert::Equal<DWORD>(actionMsiProperty, pAction->msiPackage.actionMsiProperty);
903 Assert::Equal<DWORD>(uiLevel, pAction->msiPackage.uiLevel); 1057 Assert::Equal<DWORD>(uiLevel, pAction->msiPackage.uiLevel);
@@ -936,18 +1090,6 @@ namespace Bootstrapper
936 Assert::Equal<DWORD>(action, pAction->packageProvider.action); 1090 Assert::Equal<DWORD>(action, pAction->packageProvider.action);
937 } 1091 }
938 1092
939 void ValidateExecuteRegistration(
940 __in BURN_PLAN* pPlan,
941 __in BOOL fRollback,
942 __in DWORD dwIndex,
943 __in BOOL fKeep
944 )
945 {
946 BURN_EXECUTE_ACTION* pAction = ValidateExecuteActionExists(pPlan, fRollback, dwIndex);
947 Assert::Equal<DWORD>(BURN_EXECUTE_ACTION_TYPE_REGISTRATION, pAction->type);
948 Assert::Equal<BOOL>(fKeep, pAction->registration.fKeep);
949 }
950
951 void ValidateExecuteRollbackBoundary( 1093 void ValidateExecuteRollbackBoundary(
952 __in BURN_PLAN* pPlan, 1094 __in BURN_PLAN* pPlan,
953 __in BOOL fRollback, 1095 __in BOOL fRollback,