@joebigelow / wix / commits / 6f6e4ced

Implement ArpEntry flavored ExePackage.

6772

Sean Hall committed Jun 9, 2022 at 15:30 UTC 6f6e4ced9f398ff37a44b91fdba62479cde29d06
58 files changed +1957 -267
src/api/wix/WixToolset.Data/ErrorMessages.cs
+23 -6
@@ -388,7 +388,7 @@ namespace WixToolset.Data
388 return Message(sourceLineNumbers, Ids.ExpectedAttribute, "The {0}/@{1} attribute was not found; it is required.", elementName, attributeName);
389 }
390
391 - public static Message ExpectedAttribute(SourceLineNumber sourceLineNumbers, string elementName, string attribute1Name, string attribute2Name, Boolean eitherOr)
391 + public static Message ExpectedAttribute(SourceLineNumber sourceLineNumbers, string elementName, string attribute1Name, string attribute2Name, bool eitherOr)
392 {
393 return Message(sourceLineNumbers, Ids.ExpectedAttribute, "The {0} element must have a value for exactly one of the {1} or {2} attributes.", elementName, attribute1Name, attribute2Name, eitherOr);
394 }
@@ -403,7 +403,7 @@ namespace WixToolset.Data
403 return Message(sourceLineNumbers, Ids.ExpectedAttribute, "The {0}/@{1} attribute was not found; it is required when attribute {2} has a value of '{3}'.", elementName, attributeName, otherAttributeName, otherAttributeValue);
404 }
405
406 - public static Message ExpectedAttribute(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string otherAttributeName, string otherAttributeValue, Boolean otherAttributeValueUnless)
406 + public static Message ExpectedAttribute(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string otherAttributeName, string otherAttributeValue, bool otherAttributeValueUnless)
407 {
408 return Message(sourceLineNumbers, Ids.ExpectedAttribute, "The {0}/@{1} attribute was not found; it is required unless the attribute {2} has a value of '{3}'.", elementName, attributeName, otherAttributeName, otherAttributeValue, otherAttributeValueUnless);
409 }
@@ -428,6 +428,21 @@ namespace WixToolset.Data
428 return Message(sourceLineNumbers, Ids.ExpectedAttributeOrElement, "Element '{0}' missing attribute '{1}' or child element '{2}'. Exactly one of those is required.", parentElement, attribute, childElement);
429 }
430
431 + public static Message ExpectedAttributeOrElementWithOtherAttribute(SourceLineNumber sourceLineNumbers, string parentElement, string attribute, string childElement, string otherAttribute)
432 + {
433 + return Message(sourceLineNumbers, Ids.ExpectedAttributeOrElementWithOtherAttribute, "Element '{0}' missing attribute '{1}' or child element '{2}'. Exactly one of those is required when attribute '{3}' is specified.", parentElement, attribute, childElement, otherAttribute);
434 + }
435 +
436 + public static Message ExpectedAttributeOrElementWithOtherAttribute(SourceLineNumber sourceLineNumbers, string parentElement, string attribute, string childElement, string otherAttribute, string otherAttributeValue)
437 + {
438 + return Message(sourceLineNumbers, Ids.ExpectedAttributeOrElementWithOtherAttribute, "Element '{0}' missing attribute '{1}' or child element '{2}'. Exactly one of those is required when attribute '{3}' is specified with value '{4}'.", parentElement, attribute, childElement, otherAttribute, otherAttributeValue);
439 + }
440 +
441 + public static Message ExpectedAttributeOrElementWithoutOtherAttribute(SourceLineNumber sourceLineNumbers, string parentElement, string attribute, string childElement, string otherAttribute)
442 + {
443 + return Message(sourceLineNumbers, Ids.ExpectedAttributeOrElementWithoutOtherAttribute, "Element '{0}' missing attribute '{1}' or child element '{2}'. Exactly one of those is required when attribute '{3}' is not specified.", parentElement, attribute, childElement, otherAttribute);
444 + }
445 +
446 public static Message ExpectedAttributes(SourceLineNumber sourceLineNumbers, string elementName, string attributeName1, string attributeName2)
447 {
448 return Message(sourceLineNumbers, Ids.ExpectedAttributes, "The {0} element's {1} or {2} attribute was not found; one of these is required.", elementName, attributeName1, attributeName2);
@@ -839,7 +854,7 @@ namespace WixToolset.Data
854 return Message(sourceLineNumbers, Ids.IllegalAttributeWithoutOtherAttributes, "The {0}/@{1} attribute can only be specified with one of the following attributes: {2} or {3} present.", elementName, attributeName, otherAttributeName1, otherAttributeName2);
855 }
856
842 - public static Message IllegalAttributeWithoutOtherAttributes(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string otherAttributeName1, string otherAttributeName2, string otherAttributeValue, Boolean uniquifier)
857 + public static Message IllegalAttributeWithoutOtherAttributes(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string otherAttributeName1, string otherAttributeName2, string otherAttributeValue, bool uniquifier)
858 {
859 return Message(sourceLineNumbers, Ids.IllegalAttributeWithoutOtherAttributes, "The {0}/@{1} attribute can only be specified with one of the following attributes: {2} or {3} present with value '{4}'.", elementName, attributeName, otherAttributeName1, otherAttributeName2, otherAttributeValue, uniquifier);
860 }
@@ -899,7 +914,7 @@ namespace WixToolset.Data
914 return Message(sourceLineNumbers, Ids.IllegalComponentWithAutoGeneratedGuid, "The Component/@Guid attribute's value '*' is not valid for this component because it does not meet the criteria for having an automatically generated guid. Components using a Directory as a KeyPath or containing ODBCDataSource child elements cannot use an automatically generated guid. Make sure your component doesn't have a Directory as the KeyPath and move any ODBCDataSource child elements to components with explicit component guids.");
915 }
916
902 - public static Message IllegalComponentWithAutoGeneratedGuid(SourceLineNumber sourceLineNumbers, Boolean registryKeyPath)
917 + public static Message IllegalComponentWithAutoGeneratedGuid(SourceLineNumber sourceLineNumbers, bool registryKeyPath)
918 {
919 return Message(sourceLineNumbers, Ids.IllegalComponentWithAutoGeneratedGuid, "The Component/@Guid attribute's value '*' is not valid for this component because it does not meet the criteria for having an automatically generated guid. Components with registry keypaths and files cannot use an automatically generated guid. Create multiple components, each with one file and/or one registry value keypath, to use automatically generated guids.", registryKeyPath);
920 }
@@ -1414,12 +1429,12 @@ namespace WixToolset.Data
1429 return Message(sourceLineNumbers, Ids.MergeFeatureRequired, "The {0} table contains a row with primary key(s) '{1}' which requires a feature to properly merge from the merge module '{2}'. Nest a MergeRef element with an Id attribute set to the value '{3}' under a Feature element to fix this error.", tableName, primaryKeys, mergeModuleFile, mergeId);
1430 }
1431
1417 - public static Message MergeLanguageFailed(SourceLineNumber sourceLineNumbers, Int16 language, string mergeModuleFile)
1432 + public static Message MergeLanguageFailed(SourceLineNumber sourceLineNumbers, short language, string mergeModuleFile)
1433 {
1434 return Message(sourceLineNumbers, Ids.MergeLanguageFailed, "The language '{0}' is supported but uses an invalid language transform in the merge module '{1}'.", language, mergeModuleFile);
1435 }
1436
1422 - public static Message MergeLanguageUnsupported(SourceLineNumber sourceLineNumbers, Int16 language, string mergeModuleFile)
1437 + public static Message MergeLanguageUnsupported(SourceLineNumber sourceLineNumbers, short language, string mergeModuleFile)
1438 {
1439 return Message(sourceLineNumbers, Ids.MergeLanguageUnsupported, "Could not locate language '{0}' (or a transform for this language) in the merge module '{1}'. This is likely due to an incorrectly authored Merge/@Language attribute.", language, mergeModuleFile);
1440 }
@@ -2710,6 +2725,8 @@ namespace WixToolset.Data
2725 MsiTransactionX86BeforeX64Package2 = 410,
2726 MsiTransactionInvalidPackage = 411,
2727 MsiTransactionInvalidPackage2 = 412,
2728 + ExpectedAttributeOrElementWithOtherAttribute = 413,
2729 + ExpectedAttributeOrElementWithoutOtherAttribute = 414,
2730 }
2731 }
2732 }
src/api/wix/WixToolset.Data/Symbols/WixBundleExePackageSymbol.cs
+51
@@ -16,6 +16,9 @@ namespace WixToolset.Data
16 new IntermediateFieldDefinition(nameof(WixBundleExePackageSymbolFields.RepairCommand), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(WixBundleExePackageSymbolFields.UninstallCommand), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(WixBundleExePackageSymbolFields.ExeProtocol), IntermediateFieldType.String),
19 + new IntermediateFieldDefinition(nameof(WixBundleExePackageSymbolFields.DetectionType), IntermediateFieldType.Number),
20 + new IntermediateFieldDefinition(nameof(WixBundleExePackageSymbolFields.ArpId), IntermediateFieldType.String),
21 + new IntermediateFieldDefinition(nameof(WixBundleExePackageSymbolFields.ArpDisplayVersion), IntermediateFieldType.String),
22 },
23 typeof(WixBundleExePackageSymbol));
24 }
@@ -33,6 +36,19 @@ namespace WixToolset.Data.Symbols
36 RepairCommand,
37 UninstallCommand,
38 ExeProtocol,
39 + DetectionType,
40 + ArpId,
41 + ArpDisplayVersion,
42 + }
43 +
44 + /// <summary>
45 + /// How Burn will detect the ExePackage.
46 + /// </summary>
47 + public enum WixBundleExePackageDetectionType
48 + {
49 + None,
50 + Condition,
51 + Arp,
52 }
53
54 [Flags]
@@ -40,6 +56,7 @@ namespace WixToolset.Data.Symbols
56 {
57 None = 0,
58 Bundle = 1,
59 + ArpWin64 = 2,
60 }
61
62 public class WixBundleExePackageSymbol : IntermediateSymbol
@@ -90,6 +107,24 @@ namespace WixToolset.Data.Symbols
107 set => this.Set((int)WixBundleExePackageSymbolFields.ExeProtocol, value);
108 }
109
110 + public WixBundleExePackageDetectionType DetectionType
111 + {
112 + get => (WixBundleExePackageDetectionType)this.Fields[(int)WixBundleExePackageSymbolFields.DetectionType].AsNumber();
113 + set => this.Set((int)WixBundleExePackageSymbolFields.DetectionType, (int)value);
114 + }
115 +
116 + public string ArpId
117 + {
118 + get => (string)this.Fields[(int)WixBundleExePackageSymbolFields.ArpId];
119 + set => this.Set((int)WixBundleExePackageSymbolFields.ArpId, value);
120 + }
121 +
122 + public string ArpDisplayVersion
123 + {
124 + get => (string)this.Fields[(int)WixBundleExePackageSymbolFields.ArpDisplayVersion];
125 + set => this.Set((int)WixBundleExePackageSymbolFields.ArpDisplayVersion, value);
126 + }
127 +
128 public bool IsBundle
129 {
130 get { return this.Attributes.HasFlag(WixBundleExePackageAttributes.Bundle); }
@@ -106,6 +141,22 @@ namespace WixToolset.Data.Symbols
141 }
142 }
143
144 + public bool ArpWin64
145 + {
146 + get { return this.Attributes.HasFlag(WixBundleExePackageAttributes.ArpWin64); }
147 + set
148 + {
149 + if (value)
150 + {
151 + this.Attributes |= WixBundleExePackageAttributes.ArpWin64;
152 + }
153 + else
154 + {
155 + this.Attributes &= ~WixBundleExePackageAttributes.ArpWin64;
156 + }
157 + }
158 + }
159 +
160 public bool Repairable => this.RepairCommand != null;
161
162 public bool Uninstallable => this.UninstallCommand != null;
src/api/wix/WixToolset.Data/WarningMessages.cs
+16 -4
@@ -237,6 +237,11 @@ namespace WixToolset.Data
237 return Message(sourceLineNumbers, Ids.DetectConditionRecommended, "The {0}/@DetectCondition attribute is recommended so the package is only installed when absent.", elementName);
238 }
239
240 + public static Message ExePackageDetectInformationRecommended(SourceLineNumber sourceLineNumbers)
241 + {
242 + return Message(sourceLineNumbers, Ids.ExePackageDetectInformationRecommended, "The ExePackage/@DetectCondition attribute or child element ArpEntry is recommended so the package is only installed when absent.");
243 + }
244 +
245 public static Message DownloadUrlNotSupportedForAttachedContainers(SourceLineNumber sourceLineNumbers, string containerId)
246 {
247 return Message(sourceLineNumbers, Ids.DownloadUrlNotSupportedForAttachedContainers, "The Container '{0}' is attached but included a @DownloadUrl attribute. Attached Containers cannot be downloaded so the download URL is being ignored.", containerId);
@@ -267,7 +272,7 @@ namespace WixToolset.Data
272 return Message(sourceLineNumbers, Ids.EmptyCabinet, "The cabinet '{0}' does not contain any files. If this installation contains no files, this warning can likely be safely ignored. Otherwise, please add files to the cabinet or remove it.", cabinetName);
273 }
274
270 - public static Message EmptyCabinet(SourceLineNumber sourceLineNumbers, string cabinetName, Boolean isPatch)
275 + public static Message EmptyCabinet(SourceLineNumber sourceLineNumbers, string cabinetName, bool isPatch)
276 {
277 return Message(sourceLineNumbers, Ids.EmptyCabinet, "The cabinet '{0}' does not contain any files. If this patch contains no files, this warning can likely be safely ignored. Otherwise, try passing -p to torch.exe when first building the transforms, or add a ComponentRef to your PatchFamily authoring to pull changed files into the cabinet.", cabinetName, isPatch);
278 }
@@ -322,7 +327,7 @@ namespace WixToolset.Data
327 return Message(sourceLineNumbers, Ids.IllegalActionInSequence, "The {0} table contains an action '{1}' which is not allowed in this table. If this is a standard action then it is not valid for this table, if it is a custom action or dialog then this table does not accept actions of that type. This action will be left out of the decompiled output.", sequenceTableName, actionName);
328 }
329
325 - public static Message IllegalColumnValue(SourceLineNumber sourceLineNumbers, string tableName, string columnName, Object value)
330 + public static Message IllegalColumnValue(SourceLineNumber sourceLineNumbers, string tableName, string columnName, object value)
331 {
332 return Message(sourceLineNumbers, Ids.IllegalColumnValue, "The {0}.{1} column's value, '{2}', is not a recognized legal value. This information will be left out of the decompiled output.", tableName, columnName, value);
333 }
@@ -407,7 +412,7 @@ namespace WixToolset.Data
412 return Message(sourceLineNumbers, Ids.MsiTransactionLimitations, "MSI transactions have limitations that make it hard to use them successfully in a bundle. Test the bundle thoroughly, especially in upgrade scenarios and the scenario that required them in the first place.");
413 }
414
410 - public static Message NestedInstall(SourceLineNumber sourceLineNumbers, string tableName, string columnName, Object value)
415 + public static Message NestedInstall(SourceLineNumber sourceLineNumbers, string tableName, string columnName, object value)
416 {
417 return Message(sourceLineNumbers, Ids.NestedInstall, "The {0}.{1} column's value, '{2}', indicates a nested install. Nested installations are not supported by the WiX team. This action will be left out of the decompiled output.", tableName, columnName, value);
418 }
@@ -628,7 +633,7 @@ namespace WixToolset.Data
633 return Message(sourceLineNumbers, Ids.UnknownPermission, "The {0} table contains a row with primary key '{1}' which has an unknown permission at bit {2}.", tableName, primaryKey, bitPosition);
634 }
635
631 - public static Message UnrepresentableColumnValue(SourceLineNumber sourceLineNumbers, string tableName, string columnName, Object value)
636 + public static Message UnrepresentableColumnValue(SourceLineNumber sourceLineNumbers, string tableName, string columnName, object value)
637 {
638 return Message(sourceLineNumbers, Ids.UnrepresentableColumnValue, "The {0}.{1} column's value, '{2}', cannot currently be represented in the WiX schema.", tableName, columnName, value);
639 }
@@ -688,6 +693,11 @@ namespace WixToolset.Data
693 return Message(sourceLineNumbers, Ids.WindowsInstallerFileTooLarge, "The Windows Installer does not support {0} files larger than 2GB in size. Reduce the size or number of files embedded in '{1}' or the installation will likely fail with an unexpected error.", fileDescription, path);
694 }
695
696 + public static Message InvalidWixVersion(SourceLineNumber sourceLineNumbers, string version, string elementName, string attributeName)
697 + {
698 + return Message(sourceLineNumbers, Ids.InvalidWixVersion, "Invalid WixVersion '{0}' in {1}/@'{2}'. Comparisons may yield unexpected results.", version, elementName, attributeName);
699 + }
700 +
701 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
702 {
703 return new Message(sourceLineNumber, MessageLevel.Warning, (int)id, format, args);
@@ -827,6 +837,8 @@ namespace WixToolset.Data
837 WindowsInstallerFileTooLarge = 1158,
838 UnavailableBundleConditionVariable = 1159,
839 DiscardedRollbackBoundary2 = 1160,
840 + ExePackageDetectInformationRecommended = 1161,
841 + InvalidWixVersion = 1162,
842 }
843 }
844 }
src/burn/engine/approvedexe.cpp
+4 -4
@@ -213,7 +213,7 @@ LExit:
213 extern "C" HRESULT ApprovedExesVerifySecureLocation(
214 __in BURN_CACHE* pCache,
215 __in BURN_VARIABLES* pVariables,
216 - __in BURN_LAUNCH_APPROVED_EXE* pLaunchApprovedExe
216 + __in LPCWSTR wzExecutablePath
217 )
218 {
219 HRESULT hr = S_OK;
@@ -232,7 +232,7 @@ extern "C" HRESULT ApprovedExesVerifySecureLocation(
232 hr = VariableGetString(pVariables, wzSecureFolderVariable, &scz);
233 if (SUCCEEDED(hr))
234 {
235 - hr = PathDirectoryContainsPath(scz, pLaunchApprovedExe->sczExecutablePath);
235 + hr = PathDirectoryContainsPath(scz, wzExecutablePath);
236 if (S_OK == hr)
237 {
238 ExitFunction();
@@ -252,14 +252,14 @@ extern "C" HRESULT ApprovedExesVerifySecureLocation(
252 // If the package cache is redirected, hr is S_FALSE.
253 if (S_FALSE == hr)
254 {
255 - hr = PathDirectoryContainsPath(sczSecondary, pLaunchApprovedExe->sczExecutablePath);
255 + hr = PathDirectoryContainsPath(sczSecondary, wzExecutablePath);
256 if (S_OK == hr)
257 {
258 ExitFunction();
259 }
260 }
261
262 - hr = PathDirectoryContainsPath(scz, pLaunchApprovedExe->sczExecutablePath);
262 + hr = PathDirectoryContainsPath(scz, wzExecutablePath);
263 if (S_OK == hr)
264 {
265 ExitFunction();
src/burn/engine/approvedexe.h
+1 -1
@@ -67,7 +67,7 @@ HRESULT ApprovedExesLaunch(
67 HRESULT ApprovedExesVerifySecureLocation(
68 __in BURN_CACHE* pCache,
69 __in BURN_VARIABLES* pVariables,
70 - __in BURN_LAUNCH_APPROVED_EXE* pLaunchApprovedExe
70 + __in LPCWSTR wzExecutablePath
71 );
72
73
src/burn/engine/bundlepackageengine.cpp
+2 -4
@@ -365,8 +365,7 @@ extern "C" HRESULT BundlePackageEnginePlanCalculatePackage(
365 break;
366
367 default:
368 - hr = E_INVALIDARG;
369 - ExitOnRootFailure(hr, "Invalid package current state: %d.", pPackage->currentState);
368 + ExitWithRootFailure(hr, E_INVALIDARG, "Invalid package current state: %d.", pPackage->currentState);
369 }
370
371 // Calculate the rollback action if there is an execute action.
@@ -413,8 +412,7 @@ extern "C" HRESULT BundlePackageEnginePlanCalculatePackage(
412 break;
413
414 default:
416 - hr = E_INVALIDARG;
417 - ExitOnRootFailure(hr, "Invalid package expected state.");
415 + ExitWithRootFailure(hr, E_INVALIDARG, "Invalid package expected state.");
416 }
417 }
418
src/burn/engine/elevation.cpp
+1 -1
@@ -3858,7 +3858,7 @@ static HRESULT OnLaunchApprovedExe(
3858 hr = RegReadString(hKey, pApprovedExe->sczValueName, &pLaunchApprovedExe->sczExecutablePath);
3859 ExitOnFailure(hr, "Failed to read the value for the approved exe path.");
3860
3861 - hr = ApprovedExesVerifySecureLocation(pCache, pVariables, pLaunchApprovedExe);
3861 + hr = ApprovedExesVerifySecureLocation(pCache, pVariables, pLaunchApprovedExe->sczExecutablePath);
3862 ExitOnFailure(hr, "Failed to verify the executable path is in a secure location: %ls", pLaunchApprovedExe->sczExecutablePath);
3863 if (S_FALSE == hr)
3864 {
src/burn/engine/engine.mc
+7
@@ -331,6 +331,13 @@ Language=English
331 Detected msi package with invalid version, product code: '%1!ls!', version: '%2!ls!'
332 .
333
334 +MessageId=124
335 +Severity=Warning
336 +SymbolicName=MSG_DETECTED_EXE_PACKAGE_INVALID_VERSION
337 +Language=English
338 +Detected exe package with invalid version, arp id: '%1!ls!', version: '%2!ls!'
339 +.
340 +
341 MessageId=151
342 Severity=Error
343 SymbolicName=MSG_FAILED_DETECT_PACKAGE
src/burn/engine/exeengine.cpp
+265 -30
@@ -2,6 +2,16 @@
2
3 #include "precomp.h"
4
5 +static HRESULT DetectArpEntry(
6 + __in const BURN_PACKAGE* pPackage,
7 + __out BOOTSTRAPPER_PACKAGE_STATE* pPackageState,
8 + __out_opt LPWSTR* psczQuietUninstallString
9 + );
10 +static HRESULT ParseArpUninstallString(
11 + __in_z LPCWSTR wzArpUninstallString,
12 + __inout LPWSTR* psczExecutablePath,
13 + __inout LPWSTR* psczArguments
14 + );
15
16 // function definitions
17
@@ -16,18 +26,73 @@ extern "C" HRESULT ExeEngineParsePackageFromXml(
26 IXMLDOMNode* pixnNode = NULL;
27 LPWSTR scz = NULL;
28
19 - // @DetectCondition
20 - hr = XmlGetAttributeEx(pixnExePackage, L"DetectCondition", &pPackage->Exe.sczDetectCondition);
21 - ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @DetectCondition.");
29 + // @DetectionType
30 + hr = XmlGetAttributeEx(pixnExePackage, L"DetectionType", &scz);
31 + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @DetectionType.");
32 +
33 + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"condition", -1))
34 + {
35 + pPackage->Exe.detectionType = BURN_EXE_DETECTION_TYPE_CONDITION;
36 + }
37 + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"arp", -1))
38 + {
39 + pPackage->Exe.detectionType = BURN_EXE_DETECTION_TYPE_ARP;
40 + }
41 + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"none", -1))
42 + {
43 + pPackage->Exe.detectionType = BURN_EXE_DETECTION_TYPE_NONE;
44 + }
45 + else
46 + {
47 + ExitWithRootFailure(hr, E_UNEXPECTED, "Invalid detection type: %ls", scz);
48 + }
49 +
50 + if (BURN_EXE_DETECTION_TYPE_CONDITION == pPackage->Exe.detectionType)
51 + {
52 + // @DetectCondition
53 + hr = XmlGetAttributeEx(pixnExePackage, L"DetectCondition", &pPackage->Exe.sczDetectCondition);
54 + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @DetectCondition.");
55 +
56 + // @UninstallArguments
57 + hr = XmlGetAttributeEx(pixnExePackage, L"UninstallArguments", &pPackage->Exe.sczUninstallArguments);
58 + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @UninstallArguments.");
59 +
60 + // @Uninstallable
61 + hr = XmlGetYesNoAttribute(pixnExePackage, L"Uninstallable", &pPackage->Exe.fUninstallable);
62 + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @Uninstallable.");
63 + }
64 + else if (BURN_EXE_DETECTION_TYPE_ARP == pPackage->Exe.detectionType)
65 + {
66 + // @ArpId
67 + hr = XmlGetAttributeEx(pixnExePackage, L"ArpId", &scz);
68 + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @ArpId.");
69 +
70 + hr = PathConcatRelativeToBase(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\", scz, &pPackage->Exe.sczArpKeyPath);
71 + ExitOnFailure(hr, "Failed to build full key path.");
72 +
73 + // @ArpDisplayVersion
74 + hr = XmlGetAttributeEx(pixnExePackage, L"ArpDisplayVersion", &scz);
75 + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @ArpDisplayVersion.");
76 +
77 + hr = VerParseVersion(scz, 0, FALSE, &pPackage->Exe.pArpDisplayVersion);
78 + ExitOnFailure(hr, "Failed to parse @ArpDisplayVersion: %ls", scz);
79 +
80 + if (pPackage->Exe.pArpDisplayVersion->fInvalid)
81 + {
82 + LogId(REPORT_WARNING, MSG_MANIFEST_INVALID_VERSION, scz);
83 + }
84 +
85 + // @ArpWin64
86 + hr = XmlGetYesNoAttribute(pixnExePackage, L"ArpWin64", &pPackage->Exe.fArpWin64);
87 + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @ArpWin64.");
88 +
89 + pPackage->Exe.fUninstallable = TRUE;
90 + }
91
92 // @InstallArguments
93 hr = XmlGetAttributeEx(pixnExePackage, L"InstallArguments", &pPackage->Exe.sczInstallArguments);
94 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @InstallArguments.");
95
27 - // @UninstallArguments
28 - hr = XmlGetAttributeEx(pixnExePackage, L"UninstallArguments", &pPackage->Exe.sczUninstallArguments);
29 - ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @UninstallArguments.");
30 -
96 // @RepairArguments
97 hr = XmlGetAttributeEx(pixnExePackage, L"RepairArguments", &pPackage->Exe.sczRepairArguments);
98 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @RepairArguments.");
@@ -36,10 +101,6 @@ extern "C" HRESULT ExeEngineParsePackageFromXml(
101 hr = XmlGetYesNoAttribute(pixnExePackage, L"Repairable", &pPackage->Exe.fRepairable);
102 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @Repairable.");
103
39 - // @Uninstallable
40 - hr = XmlGetYesNoAttribute(pixnExePackage, L"Uninstallable", &pPackage->Exe.fUninstallable);
41 - ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @Uninstallable.");
42 -
104 // @Bundle
105 hr = XmlGetYesNoAttribute(pixnExePackage, L"Bundle", &pPackage->Exe.fBundle);
106 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @Bundle.");
@@ -64,8 +125,7 @@ extern "C" HRESULT ExeEngineParsePackageFromXml(
125 }
126 else
127 {
67 - hr = E_UNEXPECTED;
68 - ExitOnFailure(hr, "Invalid protocol type: %ls", scz);
128 + ExitWithRootFailure(hr, E_UNEXPECTED, "Invalid protocol type: %ls", scz);
129 }
130 }
131
@@ -91,6 +151,8 @@ extern "C" void ExeEnginePackageUninitialize(
151 ReleaseStr(pPackage->Exe.sczInstallArguments);
152 ReleaseStr(pPackage->Exe.sczRepairArguments);
153 ReleaseStr(pPackage->Exe.sczUninstallArguments);
154 + ReleaseStr(pPackage->Exe.sczArpKeyPath);
155 + ReleaseVerutilVersion(pPackage->Exe.pArpDisplayVersion);
156 ReleaseMem(pPackage->Exe.rgExitCodes);
157
158 // free command-line arguments
@@ -126,15 +188,31 @@ extern "C" HRESULT ExeEngineDetectPackage(
188 HRESULT hr = S_OK;
189 BOOL fDetected = FALSE;
190
129 - // evaluate detect condition
130 - if (pPackage->Exe.sczDetectCondition && *pPackage->Exe.sczDetectCondition)
191 + switch (pPackage->Exe.detectionType)
192 {
132 - hr = ConditionEvaluate(pVariables, pPackage->Exe.sczDetectCondition, &fDetected);
133 - ExitOnFailure(hr, "Failed to evaluate executable package detect condition.");
134 - }
193 + case BURN_EXE_DETECTION_TYPE_NONE:
194 + pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT;
195 + break;
196 + case BURN_EXE_DETECTION_TYPE_CONDITION:
197 + // evaluate detect condition
198 + if (pPackage->Exe.sczDetectCondition && *pPackage->Exe.sczDetectCondition)
199 + {
200 + hr = ConditionEvaluate(pVariables, pPackage->Exe.sczDetectCondition, &fDetected);
201 + ExitOnFailure(hr, "Failed to evaluate EXE package detect condition.");
202 + }
203 +
204 + // update detect state
205 + pPackage->currentState = fDetected ? BOOTSTRAPPER_PACKAGE_STATE_PRESENT : BOOTSTRAPPER_PACKAGE_STATE_ABSENT;
206
136 - // update detect state
137 - pPackage->currentState = fDetected ? BOOTSTRAPPER_PACKAGE_STATE_PRESENT : BOOTSTRAPPER_PACKAGE_STATE_ABSENT;
207 + break;
208 + case BURN_EXE_DETECTION_TYPE_ARP:
209 + hr = DetectArpEntry(pPackage, &pPackage->currentState, NULL);
210 + ExitOnFailure(hr, "Failed to detect EXE package by ArpEntry.");
211 +
212 + break;
213 + default:
214 + ExitWithRootFailure(hr, E_INVALIDARG, "Unknown EXE package detection type: %d.", pPackage->Exe.detectionType);
215 + }
216
217 if (pPackage->fCanAffectRegistration)
218 {
@@ -187,6 +265,7 @@ extern "C" HRESULT ExeEnginePlanCalculatePackage(
265 }
266 break;
267
268 + case BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE: __fallthrough;
269 case BOOTSTRAPPER_PACKAGE_STATE_ABSENT:
270 switch (pPackage->requested)
271 {
@@ -205,8 +284,7 @@ extern "C" HRESULT ExeEnginePlanCalculatePackage(
284 break;
285
286 default:
208 - hr = E_INVALIDARG;
209 - ExitOnRootFailure(hr, "Invalid package current state: %d.", pPackage->currentState);
287 + ExitWithRootFailure(hr, E_INVALIDARG, "Invalid package current state: %d.", pPackage->currentState);
288 }
289
290 // Calculate the rollback action if there is an execute action.
@@ -232,6 +310,7 @@ extern "C" HRESULT ExeEnginePlanCalculatePackage(
310 }
311 break;
312
313 + case BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE: __fallthrough;
314 case BOOTSTRAPPER_PACKAGE_STATE_ABSENT:
315 switch (pPackage->requested)
316 {
@@ -251,8 +330,7 @@ extern "C" HRESULT ExeEnginePlanCalculatePackage(
330 break;
331
332 default:
254 - hr = E_INVALIDARG;
255 - ExitOnRootFailure(hr, "Invalid package expected state.");
333 + ExitWithRootFailure(hr, E_INVALIDARG, "Invalid package expected state.");
334 }
335 }
336
@@ -356,10 +434,41 @@ extern "C" HRESULT ExeEngineExecutePackage(
434 LPWSTR sczUserArgs = NULL;
435 LPWSTR sczUserArgsObfuscated = NULL;
436 LPWSTR sczCommandObfuscated = NULL;
437 + LPWSTR sczArpUninstallString = NULL;
438 + LPWSTR sczArpArguments = NULL;
439 + BOOTSTRAPPER_PACKAGE_STATE applyState = BOOTSTRAPPER_PACKAGE_STATE_UNKNOWN;
440 HANDLE hExecutableFile = INVALID_HANDLE_VALUE;
441 DWORD dwExitCode = 0;
442 BURN_PACKAGE* pPackage = pExecuteAction->exePackage.pPackage;
443 BURN_PAYLOAD* pPackagePayload = pPackage->payloads.rgItems[0].pPayload;
444 + LPCWSTR wzUninstallArguments = pPackage->Exe.sczUninstallArguments;
445 +
446 + if (BURN_EXE_DETECTION_TYPE_ARP == pPackage->Exe.detectionType &&
447 + (BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pExecuteAction->exePackage.action ||
448 + BOOTSTRAPPER_ACTION_STATE_INSTALL == pExecuteAction->exePackage.action && fRollback))
449 + {
450 + hr = DetectArpEntry(pPackage, &applyState, &sczArpUninstallString);
451 + ExitOnFailure(hr, "Failed to query ArpEntry for uninstall.");
452 +
453 + if (BOOTSTRAPPER_PACKAGE_STATE_ABSENT == applyState && BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pExecuteAction->exePackage.action)
454 + {
455 + if (fRollback)
456 + {
457 + LogId(REPORT_STANDARD, MSG_ROLLBACK_PACKAGE_SKIPPED, pPackage->sczId, LoggingActionStateToString(pExecuteAction->exePackage.action), LoggingPackageStateToString(applyState));
458 + }
459 + else
460 + {
461 + LogId(REPORT_STANDARD, MSG_ATTEMPTED_UNINSTALL_ABSENT_PACKAGE, pPackage->sczId);
462 + }
463 +
464 + ExitFunction();
465 + }
466 + else if (BOOTSTRAPPER_PACKAGE_STATE_ABSENT != applyState && BOOTSTRAPPER_ACTION_STATE_INSTALL == pExecuteAction->exePackage.action)
467 + {
468 + LogId(REPORT_STANDARD, MSG_ROLLBACK_PACKAGE_SKIPPED, pPackage->sczId, LoggingActionStateToString(pExecuteAction->exePackage.action), LoggingPackageStateToString(applyState));
469 + ExitFunction();
470 + }
471 + }
472
473 if (pPackage->Exe.fPseudoPackage && BURN_PAYLOAD_VERIFICATION_UPDATE_BUNDLE != pPackagePayload->verification)
474 {
@@ -372,7 +481,30 @@ extern "C" HRESULT ExeEngineExecutePackage(
481 ExitOnFailure(hr, "Failed to build executable path.");
482
483 hr = PathGetDirectory(sczExecutablePath, &sczCachedDirectory);
375 - ExitOnFailure(hr, "Failed to get cached path for pseudo-package: %ls", pPackage->sczId);
484 + ExitOnFailure(hr, "Failed to get parent directory for pseudo-package: %ls", pPackage->sczId);
485 + }
486 + else if (BURN_EXE_DETECTION_TYPE_ARP == pPackage->Exe.detectionType && BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pExecuteAction->exePackage.action)
487 + {
488 + ExitOnNull(sczArpUninstallString, hr, E_INVALIDARG, "QuietUninstallString is null.");
489 +
490 + hr = ParseArpUninstallString(sczArpUninstallString, &sczExecutablePath, &sczArpArguments);
491 + ExitOnFailure(hr, "Failed to parse QuietUninstallString: %ls.", sczArpUninstallString);
492 +
493 + if (pPackage->fPerMachine)
494 + {
495 + hr = ApprovedExesVerifySecureLocation(pCache, pVariables, sczExecutablePath);
496 + ExitOnFailure(hr, "Failed to verify the QuietUninstallString executable path is in a secure location: %ls", sczExecutablePath);
497 + if (S_FALSE == hr)
498 + {
499 + LogStringLine(REPORT_STANDARD, "The QuietUninstallString executable path is not in a secure location: %ls", sczExecutablePath);
500 + ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED));
501 + }
502 + }
503 +
504 + hr = PathGetDirectory(sczExecutablePath, &sczCachedDirectory);
505 + ExitOnFailure(hr, "Failed to get parent directory for QuietUninstallString executable path: %ls", sczExecutablePath);
506 +
507 + wzUninstallArguments = sczArpArguments;
508 }
509 else
510 {
@@ -396,7 +528,7 @@ extern "C" HRESULT ExeEngineExecutePackage(
528 break;
529
530 case BOOTSTRAPPER_ACTION_STATE_UNINSTALL:
399 - wzArguments = pPackage->Exe.sczUninstallArguments;
531 + wzArguments = wzUninstallArguments;
532 break;
533
534 case BOOTSTRAPPER_ACTION_STATE_REPAIR:
@@ -404,8 +536,7 @@ extern "C" HRESULT ExeEngineExecutePackage(
536 break;
537
538 default:
407 - hr = E_INVALIDARG;
408 - ExitOnFailure(hr, "Invalid Exe package action: %d.", pExecuteAction->exePackage.action);
539 + ExitWithRootFailure(hr, E_INVALIDARG, "Invalid Exe package action: %d.", pExecuteAction->exePackage.action);
540 }
541
542 // now add optional arguments
@@ -443,8 +574,7 @@ extern "C" HRESULT ExeEngineExecutePackage(
574 break;
575
576 default:
446 - hr = E_INVALIDARG;
447 - ExitOnFailure(hr, "Invalid Exe package action: %d.", pExecuteAction->exePackage.action);
577 + ExitWithRootFailure(hr, E_INVALIDARG, "Invalid Exe package action: %d.", pExecuteAction->exePackage.action);
578 }
579 }
580 }
@@ -524,6 +654,8 @@ LExit:
654 StrSecureZeroFreeString(sczUserArgs);
655 ReleaseStr(sczUserArgsObfuscated);
656 ReleaseStr(sczCommandObfuscated);
657 + ReleaseStr(sczArpUninstallString);
658 + ReleaseStr(sczArpArguments);
659
660 ReleaseFileHandle(hExecutableFile);
661
@@ -894,3 +1026,106 @@ extern "C" HRESULT ExeEngineHandleExitCode(
1026 //LExit:
1027 return hr;
1028 }
1029 +
1030 +static HRESULT DetectArpEntry(
1031 + __in const BURN_PACKAGE* pPackage,
1032 + __out BOOTSTRAPPER_PACKAGE_STATE* pPackageState,
1033 + __out_opt LPWSTR* psczQuietUninstallString
1034 + )
1035 +{
1036 + HRESULT hr = S_OK;
1037 + HKEY hKey = NULL;
1038 + VERUTIL_VERSION* pVersion = NULL;
1039 + int nCompareResult = 0;
1040 + HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
1041 + REG_KEY_BITNESS keyBitness = pPackage->Exe.fArpWin64 ? REG_KEY_64BIT : REG_KEY_32BIT;
1042 +
1043 + *pPackageState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT;
1044 + if (psczQuietUninstallString)
1045 + {
1046 + ReleaseNullStr(*psczQuietUninstallString);
1047 + }
1048 +
1049 + hr = RegOpenEx(hkRoot, pPackage->Exe.sczArpKeyPath, KEY_READ, keyBitness, &hKey);
1050 + if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
1051 + {
1052 + ExitFunction1(hr = S_OK);
1053 + }
1054 + ExitOnFailure(hr, "Failed to open registry key: %ls.", pPackage->Exe.sczArpKeyPath);
1055 +
1056 + hr = RegReadWixVersion(hKey, L"DisplayVersion", &pVersion);
1057 + if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
1058 + {
1059 + ExitFunction1(hr = S_OK);
1060 + }
1061 + ExitOnFailure(hr, "Failed to read DisplayVersion.");
1062 +
1063 + if (pVersion->fInvalid)
1064 + {
1065 + LogId(REPORT_WARNING, MSG_DETECTED_EXE_PACKAGE_INVALID_VERSION, pPackage->Exe.sczArpKeyPath, pVersion->sczVersion);
1066 + }
1067 +
1068 + hr = VerCompareParsedVersions(pPackage->Exe.pArpDisplayVersion, pVersion, &nCompareResult);
1069 + ExitOnFailure(hr, "Failed to compare versions.");
1070 +
1071 + if (nCompareResult < 0)
1072 + {
1073 + *pPackageState = BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE;
1074 + }
1075 + else if (nCompareResult > 0)
1076 + {
1077 + *pPackageState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT;
1078 + }
1079 + else
1080 + {
1081 + *pPackageState = BOOTSTRAPPER_PACKAGE_STATE_PRESENT;
1082 + }
1083 +
1084 + if (psczQuietUninstallString)
1085 + {
1086 + hr = RegReadString(hKey, L"QuietUninstallString", psczQuietUninstallString);
1087 + if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
1088 + {
1089 + hr = S_OK;
1090 + }
1091 + ExitOnFailure(hr, "Failed to read QuietUninstallString.");
1092 + }
1093 +
1094 +LExit:
1095 + ReleaseRegKey(hKey);
1096 + ReleaseVerutilVersion(pVersion);
1097 +
1098 + return hr;
1099 +}
1100 +
1101 +static HRESULT ParseArpUninstallString(
1102 + __in_z LPCWSTR wzArpUninstallString,
1103 + __inout LPWSTR* psczExecutablePath,
1104 + __inout LPWSTR* psczArguments
1105 + )
1106 +{
1107 + HRESULT hr = S_OK;
1108 + int argc = 0;
1109 + LPWSTR* argv = NULL;
1110 +
1111 + hr = AppParseCommandLine(wzArpUninstallString, &argc, &argv);
1112 + ExitOnFailure(hr, "Failed to parse uninstall string as command line: %ls.", wzArpUninstallString);
1113 + ExitOnNull(argc, hr, E_INVALIDARG, "Uninstall string must contain an executable path.");
1114 +
1115 + hr = StrAllocString(psczExecutablePath, argv[0], 0);
1116 + ExitOnFailure(hr, "Failed to copy executable path for ArpCommand.");
1117 +
1118 + for (int i = 1; i < argc; ++i)
1119 + {
1120 + hr = AppAppendCommandLineArgument(psczArguments, argv[i]);
1121 + ExitOnFailure(hr, "Failed to append argument for ArpCommand.");
1122 + }
1123 +
1124 +LExit:
1125 + if (argv)
1126 + {
1127 + AppFreeCommandLineArgs(argv);
1128 + }
1129 +
1130 + return hr;
1131 +}
src/burn/engine/package.h
+13
@@ -16,6 +16,13 @@ typedef _BURN_PACKAGE BURN_PACKAGE;
16
17 const DWORD BURN_PACKAGE_INVALID_PATCH_INDEX = 0x80000000;
18
19 +enum BURN_EXE_DETECTION_TYPE
20 +{
21 + BURN_EXE_DETECTION_TYPE_NONE,
22 + BURN_EXE_DETECTION_TYPE_CONDITION,
23 + BURN_EXE_DETECTION_TYPE_ARP,
24 +};
25 +
26 enum BURN_EXE_EXIT_CODE_TYPE
27 {
28 BURN_EXE_EXIT_CODE_TYPE_NONE,
@@ -338,6 +345,12 @@ typedef struct _BURN_PACKAGE
345 } Bundle;
346 struct
347 {
348 + BURN_EXE_DETECTION_TYPE detectionType;
349 +
350 + BOOL fArpWin64;
351 + LPWSTR sczArpKeyPath;
352 + VERUTIL_VERSION* pArpDisplayVersion;
353 +
354 LPWSTR sczDetectCondition;
355 LPWSTR sczInstallArguments;
356 LPWSTR sczRepairArguments;
src/burn/engine/plan.cpp
+2 -1
@@ -2798,7 +2798,8 @@ static BOOL NeedsCache(
2798 {
2799 BOOTSTRAPPER_ACTION_STATE action = fExecute ? pPackage->execute : pPackage->rollback;
2800 // TODO: bundles could theoretically use package cache
2801 - if (BURN_PACKAGE_TYPE_BUNDLE == pPackage->type || BURN_PACKAGE_TYPE_EXE == pPackage->type) // Bundle and Exe packages require the package for all operations (even uninstall).
2801 + if (BURN_PACKAGE_TYPE_BUNDLE == pPackage->type || // Bundle and Exe packages require the package for all operations (even uninstall).
2802 + BURN_PACKAGE_TYPE_EXE == pPackage->type && BURN_EXE_DETECTION_TYPE_ARP != pPackage->Exe.detectionType)
2803 {
2804 return BOOTSTRAPPER_ACTION_STATE_NONE != action;
2805 }
src/burn/test/BurnUnitTest/BurnUnitTest.vcxproj
+1
@@ -81,6 +81,7 @@
81 <None Include="TestData\CacheTest\CacheSignatureTest.File" CopyToOutputDirectory="PreserveNewest" />
82 <None Include="TestData\PlanTest\BasicFunctionality_BundleA_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
83 <None Include="TestData\PlanTest\BundlePackage_Multiple_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
84 + <None Include="TestData\PlanTest\ExePackage_PerUserArpEntry_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
85 <None Include="TestData\PlanTest\Failure_BundleD_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
86 <None Include="TestData\PlanTest\MsiTransaction_BundleAv1_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
87 <None Include="TestData\PlanTest\MsuPackageFixture_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
src/burn/test/BurnUnitTest/PlanTest.cpp
+261
@@ -9,6 +9,7 @@ static HRESULT WINAPI PlanTestBAProc(
9 __in_opt LPVOID pvContext
10 );
11
12 +static LPCWSTR wzArpEntryExeManifestFileName = L"ExePackage_PerUserArpEntry_manifest.xml";
13 static LPCWSTR wzMsiTransactionManifestFileName = L"MsiTransaction_BundleAv1_manifest.xml";
14 static LPCWSTR wzMultipleBundlePackageManifestFileName = L"BundlePackage_Multiple_manifest.xml";
15 static LPCWSTR wzSingleExeManifestFileName = L"Failure_BundleD_manifest.xml";
@@ -47,6 +48,266 @@ namespace Bootstrapper
48 {
49 }
50
51 + [Fact]
52 + void ArpEntryExeInstallTest()
53 + {
54 + HRESULT hr = S_OK;
55 + BURN_ENGINE_STATE engineState = { };
56 + BURN_ENGINE_STATE* pEngineState = &engineState;
57 + BURN_PLAN* pPlan = &engineState.plan;
58 +
59 + InitializeEngineStateForCorePlan(wzArpEntryExeManifestFileName, pEngineState);
60 + DetectAttachedContainerAsAttached(pEngineState);
61 + DetectPermanentPackagesAsPresentAndCached(pEngineState);
62 +
63 + hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL);
64 + NativeAssert::Succeeded(hr, "CorePlan failed");
65 +
66 + Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
67 + NativeAssert::StringEqual(L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", pPlan->wzBundleId);
68 + NativeAssert::StringEqual(L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", pPlan->wzBundleProviderKey);
69 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
70 + Assert::Equal<BOOL>(FALSE, pPlan->fPerMachine);
71 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
72 + Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
73 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
74 + Assert::Equal<BOOL>(FALSE, pPlan->fDowngrade);
75 + Assert::Equal<DWORD>(BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE | BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_PROVIDER_KEY, pPlan->dwRegistrationOperations);
76 +
77 + BOOL fRollback = FALSE;
78 + DWORD dwIndex = 0;
79 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}");
80 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
81 +
82 + fRollback = TRUE;
83 + dwIndex = 0;
84 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}");
85 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
86 +
87 + fRollback = FALSE;
88 + dwIndex = 0;
89 + ValidateCacheCheckpoint(pPlan, fRollback, dwIndex++, 1);
90 + ValidateCachePackage(pPlan, fRollback, dwIndex++, L"TestExe");
91 + ValidateCacheSignalSyncpoint(pPlan, fRollback, dwIndex++);
92 + Assert::Equal(dwIndex, pPlan->cCacheActions);
93 +
94 + fRollback = TRUE;
95 + dwIndex = 0;
96 + Assert::Equal(dwIndex, pPlan->cRollbackCacheActions);
97 +
98 + Assert::Equal(119695ull, pPlan->qwCacheSizeTotal);
99 +
100 + fRollback = FALSE;
101 + dwIndex = 0;
102 + DWORD dwExecuteCheckpointId = 2;
103 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
104 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
105 + ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"TestExe");
106 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
107 + ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"TestExe", BOOTSTRAPPER_ACTION_STATE_INSTALL);
108 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
109 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
110 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
111 + Assert::Equal(dwIndex, pPlan->cExecuteActions);
112 +
113 + fRollback = TRUE;
114 + dwIndex = 0;
115 + dwExecuteCheckpointId = 2;
116 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
117 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
118 + ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"TestExe", BOOTSTRAPPER_ACTION_STATE_UNINSTALL);
119 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
120 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
121 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
122 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
123 + Assert::Equal(dwIndex, pPlan->cRollbackActions);
124 +
125 + Assert::Equal(1ul, pPlan->cExecutePackagesTotal);
126 + Assert::Equal(2ul, pPlan->cOverallProgressTicksTotal);
127 +
128 + dwIndex = 0;
129 + Assert::Equal(dwIndex, pPlan->cRestoreRelatedBundleActions);
130 +
131 + dwIndex = 0;
132 + ValidateCleanAction(pPlan, dwIndex++, L"NetFx48Web");
133 + Assert::Equal(dwIndex, pPlan->cCleanActions);
134 +
135 + UINT uIndex = 0;
136 + ValidatePlannedProvider(pPlan, uIndex++, L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", NULL);
137 + Assert::Equal(uIndex, pPlan->cPlannedProviders);
138 +
139 + Assert::Equal(2ul, pEngineState->packages.cPackages);
140 + ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[1], L"TestExe", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, BURN_PACKAGE_REGISTRATION_STATE_PRESENT);
141 + }
142 +
143 + [Fact]
144 + void ArpEntryExeInstallObsoleteTest()
145 + {
146 + HRESULT hr = S_OK;
147 + BURN_ENGINE_STATE engineState = { };
148 + BURN_ENGINE_STATE* pEngineState = &engineState;
149 + BURN_PLAN* pPlan = &engineState.plan;
150 +
151 + InitializeEngineStateForCorePlan(wzArpEntryExeManifestFileName, pEngineState);
152 + DetectAttachedContainerAsAttached(pEngineState);
153 + DetectPermanentPackagesAsPresentAndCached(pEngineState);
154 +
155 + pEngineState->packages.rgPackages[1].currentState = BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE;
156 +
157 + hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL);
158 + NativeAssert::Succeeded(hr, "CorePlan failed");
159 +
160 + Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
161 + NativeAssert::StringEqual(L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", pPlan->wzBundleId);
162 + NativeAssert::StringEqual(L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", pPlan->wzBundleProviderKey);
163 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
164 + Assert::Equal<BOOL>(FALSE, pPlan->fPerMachine);
165 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
166 + Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
167 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
168 + Assert::Equal<BOOL>(FALSE, pPlan->fDowngrade);
169 + Assert::Equal<DWORD>(BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE | BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_PROVIDER_KEY, pPlan->dwRegistrationOperations);
170 +
171 + BOOL fRollback = FALSE;
172 + DWORD dwIndex = 0;
173 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}");
174 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
175 +
176 + fRollback = TRUE;
177 + dwIndex = 0;
178 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}");
179 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
180 +
181 + fRollback = FALSE;
182 + dwIndex = 0;
183 + Assert::Equal(dwIndex, pPlan->cCacheActions);
184 +
185 + fRollback = TRUE;
186 + dwIndex = 0;
187 + Assert::Equal(dwIndex, pPlan->cRollbackCacheActions);
188 +
189 + Assert::Equal(0ull, pPlan->qwCacheSizeTotal);
190 +
191 + fRollback = FALSE;
192 + dwIndex = 0;
193 + DWORD dwExecuteCheckpointId = 1;
194 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
195 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
196 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
197 + Assert::Equal(dwIndex, pPlan->cExecuteActions);
198 +
199 + fRollback = TRUE;
200 + dwIndex = 0;
201 + dwExecuteCheckpointId = 1;
202 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
203 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
204 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
205 + Assert::Equal(dwIndex, pPlan->cRollbackActions);
206 +
207 + Assert::Equal(0ul, pPlan->cExecutePackagesTotal);
208 + Assert::Equal(0ul, pPlan->cOverallProgressTicksTotal);
209 +
210 + dwIndex = 0;
211 + Assert::Equal(dwIndex, pPlan->cRestoreRelatedBundleActions);
212 +
213 + dwIndex = 0;
214 + ValidateCleanAction(pPlan, dwIndex++, L"NetFx48Web");
215 + Assert::Equal(dwIndex, pPlan->cCleanActions);
216 +
217 + UINT uIndex = 0;
218 + ValidatePlannedProvider(pPlan, uIndex++, L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", NULL);
219 + Assert::Equal(uIndex, pPlan->cPlannedProviders);
220 +
221 + Assert::Equal(2ul, pEngineState->packages.cPackages);
222 + ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[1], L"TestExe", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BURN_PACKAGE_REGISTRATION_STATE_ABSENT);
223 + }
224 +
225 + [Fact]
226 + void ArpEntryExeUninstallTest()
227 + {
228 + HRESULT hr = S_OK;
229 + BURN_ENGINE_STATE engineState = { };
230 + BURN_ENGINE_STATE* pEngineState = &engineState;
231 + BURN_PLAN* pPlan = &engineState.plan;
232 +
233 + InitializeEngineStateForCorePlan(wzArpEntryExeManifestFileName, pEngineState);
234 + DetectPackagesAsPresentAndCached(pEngineState);
235 +
236 + hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL);
237 + NativeAssert::Succeeded(hr, "CorePlan failed");
238 +
239 + Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
240 + NativeAssert::StringEqual(L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", pPlan->wzBundleId);
241 + NativeAssert::StringEqual(L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", pPlan->wzBundleProviderKey);
242 + Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
243 + Assert::Equal<BOOL>(FALSE, pPlan->fPerMachine);
244 + Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
245 + Assert::Equal<BOOL>(FALSE, pPlan->fDisableRollback);
246 + Assert::Equal<BOOL>(FALSE, pPlan->fDisallowRemoval);
247 + Assert::Equal<BOOL>(FALSE, pPlan->fDowngrade);
248 + Assert::Equal<DWORD>(BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE | BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_PROVIDER_KEY, pPlan->dwRegistrationOperations);
249 +
250 + BOOL fRollback = FALSE;
251 + DWORD dwIndex = 0;
252 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, FALSE, L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}");
253 + Assert::Equal(dwIndex, pPlan->cRegistrationActions);
254 +
255 + fRollback = TRUE;
256 + dwIndex = 0;
257 + ValidateDependentRegistrationAction(pPlan, fRollback, dwIndex++, TRUE, L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}");
258 + Assert::Equal(dwIndex, pPlan->cRollbackRegistrationActions);
259 +
260 + fRollback = FALSE;
261 + dwIndex = 0;
262 + Assert::Equal(dwIndex, pPlan->cCacheActions);
263 +
264 + fRollback = TRUE;
265 + dwIndex = 0;
266 + Assert::Equal(dwIndex, pPlan->cRollbackCacheActions);
267 +
268 + Assert::Equal(0ull, pPlan->qwCacheSizeTotal);
269 +
270 + fRollback = FALSE;
271 + dwIndex = 0;
272 + DWORD dwExecuteCheckpointId = 1;
273 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
274 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
275 + ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"TestExe", BOOTSTRAPPER_ACTION_STATE_UNINSTALL);
276 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
277 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
278 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
279 + Assert::Equal(dwIndex, pPlan->cExecuteActions);
280 +
281 + fRollback = TRUE;
282 + dwIndex = 0;
283 + dwExecuteCheckpointId = 1;
284 + ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
285 + ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"TestExe", BOOTSTRAPPER_ACTION_STATE_INSTALL);
286 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
287 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
288 + ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
289 + ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
290 + Assert::Equal(dwIndex, pPlan->cRollbackActions);
291 +
292 + Assert::Equal(1ul, pPlan->cExecutePackagesTotal);
293 + Assert::Equal(1ul, pPlan->cOverallProgressTicksTotal);
294 +
295 + dwIndex = 0;
296 + Assert::Equal(dwIndex, pPlan->cRestoreRelatedBundleActions);
297 +
298 + dwIndex = 0;
299 + ValidateCleanAction(pPlan, dwIndex++, L"TestExe");
300 + ValidateCleanAction(pPlan, dwIndex++, L"NetFx48Web");
301 + Assert::Equal(dwIndex, pPlan->cCleanActions);
302 +
303 + UINT uIndex = 0;
304 + ValidatePlannedProvider(pPlan, uIndex++, L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", NULL);
305 + Assert::Equal(uIndex, pPlan->cPlannedProviders);
306 +
307 + Assert::Equal(2ul, pEngineState->packages.cPackages);
308 + ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[1], L"TestExe", BURN_PACKAGE_REGISTRATION_STATE_ABSENT, BURN_PACKAGE_REGISTRATION_STATE_ABSENT);
309 + }
310 +
311 [Fact]
312 void MsiTransactionInstallTest()
313 {
src/burn/test/BurnUnitTest/TestData/PlanTest/BundlePackage_Multiple_manifest.xml
+1 -1
@@ -1 +1 @@
1 -<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="~BundlePackageTests_MultipleBundlePackagesBundle" Extension=".log" /><RelatedBundle Id="{86D214FB-8D74-456C-99B3-6557ECA6159C}" Action="Upgrade" /><Variable Id="TestGroupName" Value="BundlePackageTests" Type="string" Hidden="no" Persisted="no" /><Variable Id="WixBundleInProgressName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Type="value" VariableType="string" /><UX><Payload Id="WixManagedBootstrapperApplicationHost" FilePath="mbahost.dll" SourcePath="u30" /><Payload Id="payO60IVK4ATGzPpMz3rwVbUWl6DyU" FilePath="WixToolset.Mba.Host.config" SourcePath="u0" /><Payload Id="payxj4zDAKL2NVlz4ohp0GvwFHepyI" FilePath="TestBA.dll" SourcePath="u1" /><Payload Id="pay1hOSAUC8_D633cD2TXpIXCL30OU" FilePath="mbanative.dll" SourcePath="u2" /><Payload Id="payujy6Izl_BlUNfHt2eI.ADfjYAv4" FilePath="WixToolset.Mba.Core.dll" SourcePath="u3" /><Payload Id="payR4EbR4OTDZpPEycWaSSM_gZRBWM" FilePath="mbapreq.thm" SourcePath="u4" /><Payload Id="paylVCy2Ecl8pHPdJTCQZryUG4T9us" FilePath="mbapreq.png" SourcePath="u5" /><Payload Id="payTaG4B_lob1aLcKFaOqSSG3MPMpU" FilePath="mbapreq.wxl" SourcePath="u6" /><Payload Id="payZwIGuiezVTitZOoZKxyh2DdRSGs" FilePath="1028\mbapreq.wxl" SourcePath="u7" /><Payload Id="pay.herBWX.LlOh8jLsx24aWdunV_0" FilePath="1029\mbapreq.wxl" SourcePath="u8" /><Payload Id="pay8DkMszYsoxxdgX14huLDMYXylQg" FilePath="1030\mbapreq.wxl" SourcePath="u9" /><Payload Id="payPaHpoTeOdkW.TK99IDwktNLhTAg" FilePath="1031\mbapreq.wxl" SourcePath="u10" /><Payload Id="pay45AtAzterLTMzZgdxxtuYvaiXwU" FilePath="1032\mbapreq.wxl" SourcePath="u11" /><Payload Id="payA2VEKIqhePyNIEmr14eyH3JoVLc" FilePath="1035\mbapreq.wxl" SourcePath="u12" /><Payload Id="payvre23ObscjzhcaFIifUAkXMdPa8" FilePath="1036\mbapreq.wxl" SourcePath="u13" /><Payload Id="paytxUV3vuBbG2c.a9c.d_sZX2x6wA" FilePath="1038\mbapreq.wxl" SourcePath="u14" /><Payload Id="payYvMWRK9xelo5.sQn7jRkJIaBp9A" FilePath="1040\mbapreq.wxl" SourcePath="u15" /><Payload Id="pay68KKSApyQimbA25t6kSbqhdeH10" FilePath="1041\mbapreq.wxl" SourcePath="u16" /><Payload Id="paypiqxaHpYZqx.9eDVjQrj1igLbRY" FilePath="1042\mbapreq.wxl" SourcePath="u17" /><Payload Id="payTO0YwZzxKpbqdrBVUcVRTu3BFe8" FilePath="1043\mbapreq.wxl" SourcePath="u18" /><Payload Id="payIXg2ldBJukRzhqWolJVOEbTmF34" FilePath="1044\mbapreq.wxl" SourcePath="u19" /><Payload Id="payOHIZbSkIvrpwKkkXI173tv3u3B4" FilePath="1045\mbapreq.wxl" SourcePath="u20" /><Payload Id="payQRQ_UZl_R2UtV0xDXB2yeH2bg3E" FilePath="1046\mbapreq.wxl" SourcePath="u21" /><Payload Id="payhrejLLBfc1i27iN._QPhQ4K337I" FilePath="1049\mbapreq.wxl" SourcePath="u22" /><Payload Id="payqEzaDNzxB68vGp29jgDcCos6dvg" FilePath="1051\mbapreq.wxl" SourcePath="u23" /><Payload Id="paydz8Vk8xSTyYohgGXTSIxWGXL5.Q" FilePath="1053\mbapreq.wxl" SourcePath="u24" /><Payload Id="pay0HRUZTlbC3taSOffJBsEj92Br8Y" FilePath="1055\mbapreq.wxl" SourcePath="u25" /><Payload Id="payIvUOkc_EMH7laMFehefNolV8hZo" FilePath="1060\mbapreq.wxl" SourcePath="u26" /><Payload Id="payLFhOb.rHuk4sW5CYAPMShG0NjGI" FilePath="2052\mbapreq.wxl" SourcePath="u27" /><Payload Id="payqIKCmERK7Nhxx_nNXvRxdKqKDbI" FilePath="2070\mbapreq.wxl" SourcePath="u28" /><Payload Id="payqeWUzIVaEqjuRXN0z8ECC3Y4tCc" FilePath="3082\mbapreq.wxl" SourcePath="u29" /><Payload Id="paylfeHEjJSSTnNzY9QMZM2Ye3Ipy4" FilePath="mbapreq.dll" SourcePath="u31" /><Payload Id="payDPxs6uy8nbky.R7zhir2RRAfc.c" FilePath="WixToolset.Mba.Host.dll" SourcePath="u32" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u33" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" SourcePath="u34" /></UX><Container Id="WixAttachedContainer" FileSize="15696370" Hash="0F9966B421400E481D394DB4C4D7F0F92548E5BEB79B98880C926E817E8C1F381EC8A17053E2E66AE7132A3C9ECE441629E6A1FB3452C5C9282280C40252F141" FilePath="MultipleBundlePackagesBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" /><Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1439328" CertificateRootPublicKeyIdentifier="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateRootThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /><Payload Id="PackageA" FilePath="BundleA.exe" FileSize="5241635" Hash="20E1AFF76DE4693CB2876DC6BCCA0152DB16BE49AEDE2CD581C03FC39AB89DEA12BC25CB435F06E4D7D2B4443CE8A8935D5E92E2E49A4981B60A273980E4B29B" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /><Payload Id="PackageB" FilePath="BundleB_x64.exe" FileSize="10450821" Hash="43A58873D61D6E0FA83F6C5266F2F05FEA9BC85D11C195493B7FD9F0B4AA799C1EFCB78D76DCED32124D2EC62A4E7114B62CDE6F0B87E42A7E28CDBB0DA0FF8E" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{35192ED0-C70A-49B2-9D12-3B1FA39B5E6F}" ExecutableName="MultipleBundlePackagesBundle.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{35192ED0-C70A-49B2-9D12-3B1FA39B5E6F}"><Arp Register="yes" DisplayName="~BundlePackageTests - MultipleBundlePackagesBundle" DisplayVersion="1.0.0.0" /></Registration><Chain><ExePackage Id="NetFx48Web" Cache="remove" CacheId="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" InstallSize="1439328" Size="1439328" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" Uninstallable="no" RepairArguments="" Repairable="no" Protocol="netfx4"><PayloadRef Id="NetFx48Web" /></ExePackage><BundlePackage Id="PackageA" Cache="keep" CacheId="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}v1.0.0.0" InstallSize="2169" Size="5241635" Version="1.0.0.0" PerMachine="yes" Permanent="no" Vital="yes" RepairCondition="0" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" BundleId="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}" InstallArguments="" UninstallArguments="" RepairArguments="" SupportsBurnProtocol="yes" Win64="no"><Provides Key="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}" Version="1.0.0.0" DisplayName="~BasicFunctionalityTests - BundleA" Imported="yes" /><RelatedBundle Id="{8C7E2C47-1EE7-4BBE-99A2-EAB7F3693F48}" Action="Upgrade" /><PayloadRef Id="PackageA" /></BundlePackage><BundlePackage Id="PackageB" Cache="keep" CacheId="{7506235A-7C59-4750-82C7-EB460A87ED3A}v1.0.0.0" InstallSize="1441497" Size="10450821" Version="1.0.0.0" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageB" RollbackLogPathVariable="WixBundleRollbackLog_PackageB" BundleId="{7506235A-7C59-4750-82C7-EB460A87ED3A}" InstallArguments="" UninstallArguments="" RepairArguments="" SupportsBurnProtocol="yes" Win64="yes"><Provides Key="{7506235A-7C59-4750-82C7-EB460A87ED3A}" Version="1.0.0.0" DisplayName="~BasicFunctionalityTests - BundleB_x64" Imported="yes" /><RelatedBundle Id="{79F45B7A-D990-46E4-819B-078D87C3321A}" Action="Upgrade" /><PayloadRef Id="PackageB" /></BundlePackage></Chain><CommandLine Variables="upperCase" /></BurnManifest>
1 +<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="~BundlePackageTests_MultipleBundlePackagesBundle" Extension=".log" /><RelatedBundle Id="{86D214FB-8D74-456C-99B3-6557ECA6159C}" Action="Upgrade" /><Variable Id="TestGroupName" Value="BundlePackageTests" Type="string" Hidden="no" Persisted="no" /><Variable Id="WixBundleInProgressName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Type="value" VariableType="string" /><UX><Payload Id="WixManagedBootstrapperApplicationHost" FilePath="mbahost.dll" SourcePath="u30" /><Payload Id="payO60IVK4ATGzPpMz3rwVbUWl6DyU" FilePath="WixToolset.Mba.Host.config" SourcePath="u0" /><Payload Id="payxj4zDAKL2NVlz4ohp0GvwFHepyI" FilePath="TestBA.dll" SourcePath="u1" /><Payload Id="pay1hOSAUC8_D633cD2TXpIXCL30OU" FilePath="mbanative.dll" SourcePath="u2" /><Payload Id="payujy6Izl_BlUNfHt2eI.ADfjYAv4" FilePath="WixToolset.Mba.Core.dll" SourcePath="u3" /><Payload Id="payR4EbR4OTDZpPEycWaSSM_gZRBWM" FilePath="mbapreq.thm" SourcePath="u4" /><Payload Id="paylVCy2Ecl8pHPdJTCQZryUG4T9us" FilePath="mbapreq.png" SourcePath="u5" /><Payload Id="payTaG4B_lob1aLcKFaOqSSG3MPMpU" FilePath="mbapreq.wxl" SourcePath="u6" /><Payload Id="payZwIGuiezVTitZOoZKxyh2DdRSGs" FilePath="1028\mbapreq.wxl" SourcePath="u7" /><Payload Id="pay.herBWX.LlOh8jLsx24aWdunV_0" FilePath="1029\mbapreq.wxl" SourcePath="u8" /><Payload Id="pay8DkMszYsoxxdgX14huLDMYXylQg" FilePath="1030\mbapreq.wxl" SourcePath="u9" /><Payload Id="payPaHpoTeOdkW.TK99IDwktNLhTAg" FilePath="1031\mbapreq.wxl" SourcePath="u10" /><Payload Id="pay45AtAzterLTMzZgdxxtuYvaiXwU" FilePath="1032\mbapreq.wxl" SourcePath="u11" /><Payload Id="payA2VEKIqhePyNIEmr14eyH3JoVLc" FilePath="1035\mbapreq.wxl" SourcePath="u12" /><Payload Id="payvre23ObscjzhcaFIifUAkXMdPa8" FilePath="1036\mbapreq.wxl" SourcePath="u13" /><Payload Id="paytxUV3vuBbG2c.a9c.d_sZX2x6wA" FilePath="1038\mbapreq.wxl" SourcePath="u14" /><Payload Id="payYvMWRK9xelo5.sQn7jRkJIaBp9A" FilePath="1040\mbapreq.wxl" SourcePath="u15" /><Payload Id="pay68KKSApyQimbA25t6kSbqhdeH10" FilePath="1041\mbapreq.wxl" SourcePath="u16" /><Payload Id="paypiqxaHpYZqx.9eDVjQrj1igLbRY" FilePath="1042\mbapreq.wxl" SourcePath="u17" /><Payload Id="payTO0YwZzxKpbqdrBVUcVRTu3BFe8" FilePath="1043\mbapreq.wxl" SourcePath="u18" /><Payload Id="payIXg2ldBJukRzhqWolJVOEbTmF34" FilePath="1044\mbapreq.wxl" SourcePath="u19" /><Payload Id="payOHIZbSkIvrpwKkkXI173tv3u3B4" FilePath="1045\mbapreq.wxl" SourcePath="u20" /><Payload Id="payQRQ_UZl_R2UtV0xDXB2yeH2bg3E" FilePath="1046\mbapreq.wxl" SourcePath="u21" /><Payload Id="payhrejLLBfc1i27iN._QPhQ4K337I" FilePath="1049\mbapreq.wxl" SourcePath="u22" /><Payload Id="payqEzaDNzxB68vGp29jgDcCos6dvg" FilePath="1051\mbapreq.wxl" SourcePath="u23" /><Payload Id="paydz8Vk8xSTyYohgGXTSIxWGXL5.Q" FilePath="1053\mbapreq.wxl" SourcePath="u24" /><Payload Id="pay0HRUZTlbC3taSOffJBsEj92Br8Y" FilePath="1055\mbapreq.wxl" SourcePath="u25" /><Payload Id="payIvUOkc_EMH7laMFehefNolV8hZo" FilePath="1060\mbapreq.wxl" SourcePath="u26" /><Payload Id="payLFhOb.rHuk4sW5CYAPMShG0NjGI" FilePath="2052\mbapreq.wxl" SourcePath="u27" /><Payload Id="payqIKCmERK7Nhxx_nNXvRxdKqKDbI" FilePath="2070\mbapreq.wxl" SourcePath="u28" /><Payload Id="payqeWUzIVaEqjuRXN0z8ECC3Y4tCc" FilePath="3082\mbapreq.wxl" SourcePath="u29" /><Payload Id="paylfeHEjJSSTnNzY9QMZM2Ye3Ipy4" FilePath="mbapreq.dll" SourcePath="u31" /><Payload Id="payDPxs6uy8nbky.R7zhir2RRAfc.c" FilePath="WixToolset.Mba.Host.dll" SourcePath="u32" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u33" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" SourcePath="u34" /></UX><Container Id="WixAttachedContainer" FileSize="15696370" Hash="0F9966B421400E481D394DB4C4D7F0F92548E5BEB79B98880C926E817E8C1F381EC8A17053E2E66AE7132A3C9ECE441629E6A1FB3452C5C9282280C40252F141" FilePath="MultipleBundlePackagesBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" /><Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1439328" CertificateRootPublicKeyIdentifier="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateRootThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /><Payload Id="PackageA" FilePath="BundleA.exe" FileSize="5241635" Hash="20E1AFF76DE4693CB2876DC6BCCA0152DB16BE49AEDE2CD581C03FC39AB89DEA12BC25CB435F06E4D7D2B4443CE8A8935D5E92E2E49A4981B60A273980E4B29B" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /><Payload Id="PackageB" FilePath="BundleB_x64.exe" FileSize="10450821" Hash="43A58873D61D6E0FA83F6C5266F2F05FEA9BC85D11C195493B7FD9F0B4AA799C1EFCB78D76DCED32124D2EC62A4E7114B62CDE6F0B87E42A7E28CDBB0DA0FF8E" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{35192ED0-C70A-49B2-9D12-3B1FA39B5E6F}" ExecutableName="MultipleBundlePackagesBundle.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{35192ED0-C70A-49B2-9D12-3B1FA39B5E6F}"><Arp Register="yes" DisplayName="~BundlePackageTests - MultipleBundlePackagesBundle" DisplayVersion="1.0.0.0" /></Registration><Chain><ExePackage Id="NetFx48Web" Cache="remove" CacheId="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" InstallSize="1439328" Size="1439328" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" Uninstallable="no" RepairArguments="" Repairable="no" Protocol="netfx4" DetectionType="condition"><PayloadRef Id="NetFx48Web" /></ExePackage><BundlePackage Id="PackageA" Cache="keep" CacheId="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}v1.0.0.0" InstallSize="2169" Size="5241635" Version="1.0.0.0" PerMachine="yes" Permanent="no" Vital="yes" RepairCondition="0" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" BundleId="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}" InstallArguments="" UninstallArguments="" RepairArguments="" SupportsBurnProtocol="yes" Win64="no"><Provides Key="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}" Version="1.0.0.0" DisplayName="~BasicFunctionalityTests - BundleA" Imported="yes" /><RelatedBundle Id="{8C7E2C47-1EE7-4BBE-99A2-EAB7F3693F48}" Action="Upgrade" /><PayloadRef Id="PackageA" /></BundlePackage><BundlePackage Id="PackageB" Cache="keep" CacheId="{7506235A-7C59-4750-82C7-EB460A87ED3A}v1.0.0.0" InstallSize="1441497" Size="10450821" Version="1.0.0.0" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageB" RollbackLogPathVariable="WixBundleRollbackLog_PackageB" BundleId="{7506235A-7C59-4750-82C7-EB460A87ED3A}" InstallArguments="" UninstallArguments="" RepairArguments="" SupportsBurnProtocol="yes" Win64="yes"><Provides Key="{7506235A-7C59-4750-82C7-EB460A87ED3A}" Version="1.0.0.0" DisplayName="~BasicFunctionalityTests - BundleB_x64" Imported="yes" /><RelatedBundle Id="{79F45B7A-D990-46E4-819B-078D87C3321A}" Action="Upgrade" /><PayloadRef Id="PackageB" /></BundlePackage></Chain><CommandLine Variables="upperCase" /></BurnManifest>
src/burn/test/BurnUnitTest/TestData/PlanTest/ExePackage_PerUserArpEntry_manifest.xml new
+1
@@ -0,0 +1 @@
1 +<?xml version="1.0" encoding="utf-8"?><BurnManifest EngineVersion="4.0.0.409" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="~ExePackageTests_PerUserArpEntryExePackage" Extension=".log" /><RelatedBundle Id="{E4683E88-AF03-40D0-B308-5C084B0E1FA0}" Action="Upgrade" /><Variable Id="TestGroupName" Value="ExePackageTests" Type="string" Hidden="no" Persisted="no" /><Variable Id="WixBundleInProgressName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Type="value" VariableType="string" /><UX><Payload Id="WixManagedBootstrapperApplicationHost" FilePath="mbahost.dll" SourcePath="u30" /><Payload Id="payO60IVK4ATGzPpMz3rwVbUWl6DyU" FilePath="WixToolset.Mba.Host.config" SourcePath="u0" /><Payload Id="payxj4zDAKL2NVlz4ohp0GvwFHepyI" FilePath="TestBA.dll" SourcePath="u1" /><Payload Id="pay1hOSAUC8_D633cD2TXpIXCL30OU" FilePath="mbanative.dll" SourcePath="u2" /><Payload Id="payujy6Izl_BlUNfHt2eI.ADfjYAv4" FilePath="WixToolset.Mba.Core.dll" SourcePath="u3" /><Payload Id="payR4EbR4OTDZpPEycWaSSM_gZRBWM" FilePath="mbapreq.thm" SourcePath="u4" /><Payload Id="paylVCy2Ecl8pHPdJTCQZryUG4T9us" FilePath="mbapreq.png" SourcePath="u5" /><Payload Id="payTaG4B_lob1aLcKFaOqSSG3MPMpU" FilePath="mbapreq.wxl" SourcePath="u6" /><Payload Id="payZwIGuiezVTitZOoZKxyh2DdRSGs" FilePath="1028\mbapreq.wxl" SourcePath="u7" /><Payload Id="pay.herBWX.LlOh8jLsx24aWdunV_0" FilePath="1029\mbapreq.wxl" SourcePath="u8" /><Payload Id="pay8DkMszYsoxxdgX14huLDMYXylQg" FilePath="1030\mbapreq.wxl" SourcePath="u9" /><Payload Id="payPaHpoTeOdkW.TK99IDwktNLhTAg" FilePath="1031\mbapreq.wxl" SourcePath="u10" /><Payload Id="pay45AtAzterLTMzZgdxxtuYvaiXwU" FilePath="1032\mbapreq.wxl" SourcePath="u11" /><Payload Id="payA2VEKIqhePyNIEmr14eyH3JoVLc" FilePath="1035\mbapreq.wxl" SourcePath="u12" /><Payload Id="payvre23ObscjzhcaFIifUAkXMdPa8" FilePath="1036\mbapreq.wxl" SourcePath="u13" /><Payload Id="paytxUV3vuBbG2c.a9c.d_sZX2x6wA" FilePath="1038\mbapreq.wxl" SourcePath="u14" /><Payload Id="payYvMWRK9xelo5.sQn7jRkJIaBp9A" FilePath="1040\mbapreq.wxl" SourcePath="u15" /><Payload Id="pay68KKSApyQimbA25t6kSbqhdeH10" FilePath="1041\mbapreq.wxl" SourcePath="u16" /><Payload Id="paypiqxaHpYZqx.9eDVjQrj1igLbRY" FilePath="1042\mbapreq.wxl" SourcePath="u17" /><Payload Id="payTO0YwZzxKpbqdrBVUcVRTu3BFe8" FilePath="1043\mbapreq.wxl" SourcePath="u18" /><Payload Id="payIXg2ldBJukRzhqWolJVOEbTmF34" FilePath="1044\mbapreq.wxl" SourcePath="u19" /><Payload Id="payOHIZbSkIvrpwKkkXI173tv3u3B4" FilePath="1045\mbapreq.wxl" SourcePath="u20" /><Payload Id="payQRQ_UZl_R2UtV0xDXB2yeH2bg3E" FilePath="1046\mbapreq.wxl" SourcePath="u21" /><Payload Id="payhrejLLBfc1i27iN._QPhQ4K337I" FilePath="1049\mbapreq.wxl" SourcePath="u22" /><Payload Id="payqEzaDNzxB68vGp29jgDcCos6dvg" FilePath="1051\mbapreq.wxl" SourcePath="u23" /><Payload Id="paydz8Vk8xSTyYohgGXTSIxWGXL5.Q" FilePath="1053\mbapreq.wxl" SourcePath="u24" /><Payload Id="pay0HRUZTlbC3taSOffJBsEj92Br8Y" FilePath="1055\mbapreq.wxl" SourcePath="u25" /><Payload Id="payIvUOkc_EMH7laMFehefNolV8hZo" FilePath="1060\mbapreq.wxl" SourcePath="u26" /><Payload Id="payLFhOb.rHuk4sW5CYAPMShG0NjGI" FilePath="2052\mbapreq.wxl" SourcePath="u27" /><Payload Id="payqIKCmERK7Nhxx_nNXvRxdKqKDbI" FilePath="2070\mbapreq.wxl" SourcePath="u28" /><Payload Id="payqeWUzIVaEqjuRXN0z8ECC3Y4tCc" FilePath="3082\mbapreq.wxl" SourcePath="u29" /><Payload Id="paylfeHEjJSSTnNzY9QMZM2Ye3Ipy4" FilePath="mbapreq.dll" SourcePath="u31" /><Payload Id="payDPxs6uy8nbky.R7zhir2RRAfc.c" FilePath="WixToolset.Mba.Host.dll" SourcePath="u32" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u33" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" SourcePath="u34" /></UX><Container Id="WixAttachedContainer" FileSize="24029" Hash="E54459AA91F60561F8AFBBCB5AEA19DB0377DB53FC3B4944E46995C2D5F97FE23E7487148DC25C14E7888CF841664EA65540529DB5E191591A83B30075098506" FilePath="PerUserArpEntryExePackage.exe" AttachedIndex="1" Attached="yes" Primary="yes" /><Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1439328" CertificateRootPublicKeyIdentifier="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateRootThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /><Payload Id="TestExe.exe" FilePath="TestExe.exe" FileSize="23552" Hash="8A3CAD62E7C15EE88B3B78A5F61EFA6D4C9AED67049075688A641EE65E1526589797B0C52398DEB520A7911E41F2A6F73C178D19C9FFBC03ECF964A822E6438E" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /><Payload Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" FilePath="TestExe.exe.config" FileSize="387" Hash="8C819A9E835F3921FA80C5C783AB0C42DDAADF0C0F2BEF8630EA122ABCB9DC8EAF0B14E061C46B37C92F55114BB09A8D5B1B613947A76A648953F2C63C0ACA63" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}" ExecutableName="PerUserArpEntryExePackage.exe" PerMachine="no" Tag="" Version="1.0.0.0" ProviderKey="{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}"><Arp DisplayName="~ExePackageTests - PerUserArpEntryExePackage" DisplayVersion="1.0.0.0" /></Registration><Chain><ExePackage Id="NetFx48Web" Cache="remove" CacheId="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" InstallSize="1439328" Size="1439328" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" RepairArguments="" Repairable="no" DetectionType="condition" DetectCondition="NETFRAMEWORK45 &gt;= 528040" Protocol="netfx4"><PayloadRef Id="NetFx48Web" /></ExePackage><ExePackage Id="TestExe" Cache="keep" CacheId="8A3CAD62E7C15EE88B3B78A5F61EFA6D4C9AED67049075688A641EE65E1526589797B0C52398DEB520A7911E41F2A6F73C178D19C9FFBC03ECF964A822E6438E" InstallSize="23939" Size="23939" PerMachine="no" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_TestExe" RollbackLogPathVariable="WixBundleRollbackLog_TestExe" InstallArguments="/regw &quot;HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF},DisplayVersion,String,1.0.0.0&quot; /regw &quot;HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF},QuietUninstallString,String,\&quot;[WixBundleExecutePackageCacheFolder]testexe.exe\&quot; /regd \&quot;HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF}\&quot;&quot;" RepairArguments="" Repairable="no" DetectionType="arp" ArpId="{9B5300C7-9B34-4670-9614-185B02AB87EF}" ArpDisplayVersion="1.0.0.0"><PayloadRef Id="TestExe.exe" /><PayloadRef Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" /></ExePackage></Chain><CommandLine Variables="upperCase" /></BurnManifest>
\ No newline at end of file
src/burn/test/BurnUnitTest/TestData/PlanTest/Failure_BundleD_manifest.xml
+1 -1
@@ -1 +1 @@
1 -<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="~FailureTests_BundleD" Extension=".log" /><RelatedBundle Id="{3C1A4842-81AC-4C90-8B35-A5E18F034C8D}" Action="Upgrade" /><Variable Id="TestGroupName" Value="FailureTests" Type="string" Hidden="no" Persisted="no" /><Variable Id="WixBundleInProgressName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Type="value" VariableType="string" /><RegistrySearch Id="wrsQ7JTGqvaQuDYjfHJoyjxtkLlR6c" Variable="ExeA_Version" Root="HKLM" Key="Software\WiX\Tests\FailureTests\ExeA" Value="Version" Type="value" VariableType="string" /><UX><Payload Id="WixManagedBootstrapperApplicationHost" FilePath="mbahost.dll" SourcePath="u30" /><Payload Id="payO60IVK4ATGzPpMz3rwVbUWl6DyU" FilePath="WixToolset.Mba.Host.config" SourcePath="u0" /><Payload Id="payxj4zDAKL2NVlz4ohp0GvwFHepyI" FilePath="TestBA.dll" SourcePath="u1" /><Payload Id="pay1hOSAUC8_D633cD2TXpIXCL30OU" FilePath="mbanative.dll" SourcePath="u2" /><Payload Id="payujy6Izl_BlUNfHt2eI.ADfjYAv4" FilePath="WixToolset.Mba.Core.dll" SourcePath="u3" /><Payload Id="payR4EbR4OTDZpPEycWaSSM_gZRBWM" FilePath="mbapreq.thm" SourcePath="u4" /><Payload Id="paylVCy2Ecl8pHPdJTCQZryUG4T9us" FilePath="mbapreq.png" SourcePath="u5" /><Payload Id="payTaG4B_lob1aLcKFaOqSSG3MPMpU" FilePath="mbapreq.wxl" SourcePath="u6" /><Payload Id="payZwIGuiezVTitZOoZKxyh2DdRSGs" FilePath="1028\mbapreq.wxl" SourcePath="u7" /><Payload Id="pay.herBWX.LlOh8jLsx24aWdunV_0" FilePath="1029\mbapreq.wxl" SourcePath="u8" /><Payload Id="pay8DkMszYsoxxdgX14huLDMYXylQg" FilePath="1030\mbapreq.wxl" SourcePath="u9" /><Payload Id="payPaHpoTeOdkW.TK99IDwktNLhTAg" FilePath="1031\mbapreq.wxl" SourcePath="u10" /><Payload Id="pay45AtAzterLTMzZgdxxtuYvaiXwU" FilePath="1032\mbapreq.wxl" SourcePath="u11" /><Payload Id="payA2VEKIqhePyNIEmr14eyH3JoVLc" FilePath="1035\mbapreq.wxl" SourcePath="u12" /><Payload Id="payvre23ObscjzhcaFIifUAkXMdPa8" FilePath="1036\mbapreq.wxl" SourcePath="u13" /><Payload Id="paytxUV3vuBbG2c.a9c.d_sZX2x6wA" FilePath="1038\mbapreq.wxl" SourcePath="u14" /><Payload Id="payYvMWRK9xelo5.sQn7jRkJIaBp9A" FilePath="1040\mbapreq.wxl" SourcePath="u15" /><Payload Id="pay68KKSApyQimbA25t6kSbqhdeH10" FilePath="1041\mbapreq.wxl" SourcePath="u16" /><Payload Id="paypiqxaHpYZqx.9eDVjQrj1igLbRY" FilePath="1042\mbapreq.wxl" SourcePath="u17" /><Payload Id="payTO0YwZzxKpbqdrBVUcVRTu3BFe8" FilePath="1043\mbapreq.wxl" SourcePath="u18" /><Payload Id="payIXg2ldBJukRzhqWolJVOEbTmF34" FilePath="1044\mbapreq.wxl" SourcePath="u19" /><Payload Id="payOHIZbSkIvrpwKkkXI173tv3u3B4" FilePath="1045\mbapreq.wxl" SourcePath="u20" /><Payload Id="payQRQ_UZl_R2UtV0xDXB2yeH2bg3E" FilePath="1046\mbapreq.wxl" SourcePath="u21" /><Payload Id="payhrejLLBfc1i27iN._QPhQ4K337I" FilePath="1049\mbapreq.wxl" SourcePath="u22" /><Payload Id="payqEzaDNzxB68vGp29jgDcCos6dvg" FilePath="1051\mbapreq.wxl" SourcePath="u23" /><Payload Id="paydz8Vk8xSTyYohgGXTSIxWGXL5.Q" FilePath="1053\mbapreq.wxl" SourcePath="u24" /><Payload Id="pay0HRUZTlbC3taSOffJBsEj92Br8Y" FilePath="1055\mbapreq.wxl" SourcePath="u25" /><Payload Id="payIvUOkc_EMH7laMFehefNolV8hZo" FilePath="1060\mbapreq.wxl" SourcePath="u26" /><Payload Id="payLFhOb.rHuk4sW5CYAPMShG0NjGI" FilePath="2052\mbapreq.wxl" SourcePath="u27" /><Payload Id="payqIKCmERK7Nhxx_nNXvRxdKqKDbI" FilePath="2070\mbapreq.wxl" SourcePath="u28" /><Payload Id="payqeWUzIVaEqjuRXN0z8ECC3Y4tCc" FilePath="3082\mbapreq.wxl" SourcePath="u29" /><Payload Id="paylfeHEjJSSTnNzY9QMZM2Ye3Ipy4" FilePath="mbapreq.dll" SourcePath="u31" /><Payload Id="payDPxs6uy8nbky.R7zhir2RRAfc.c" FilePath="WixToolset.Mba.Host.dll" SourcePath="u32" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u33" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" SourcePath="u34" /></UX><Container Id="WixAttachedContainer" FileSize="24029" Hash="03F9C95A2ADA5563D3D937C0161F22A76E12F2F0AF2AA6BE567292D0AB122E2C42990E97CA9C1EE9A5F43A571B01C4ED7A3EA5759A6836AC8BFD959D7FFDCB18" FilePath="BundleD.exe" AttachedIndex="1" Attached="yes" Primary="yes" /><Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1439328" CertificateRootPublicKeyIdentifier="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateRootThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /><Payload Id="TestExe.exe" FilePath="TestExe.exe" FileSize="23552" Hash="4344604ECBA4DFE5DE7C680CB1AA5BD6FAA29BF95CE07740F02878C2BB1EF6DE6432944A0DB79B034D1C6F68CF80842EEE442EA8A551816E52D3F68901C50AB9" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /><Payload Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" FilePath="TestExe.exe.config" FileSize="387" Hash="8C819A9E835F3921FA80C5C783AB0C42DDAADF0C0F2BEF8630EA122ABCB9DC8EAF0B14E061C46B37C92F55114BB09A8D5B1B613947A76A648953F2C63C0ACA63" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{9C184683-04FB-49AD-9D79-65101BDC3EE3}" ExecutableName="BundleD.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{9C184683-04FB-49AD-9D79-65101BDC3EE3}"><Arp Register="yes" DisplayName="~FailureTests - BundleD" DisplayVersion="1.0.0.0" /></Registration><Chain><ExePackage Id="NetFx48Web" Cache="remove" CacheId="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" InstallSize="1439328" Size="1439328" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" Uninstallable="no" RepairArguments="" Repairable="no" Protocol="netfx4"><PayloadRef Id="NetFx48Web" /></ExePackage><ExePackage Id="ExeA" Cache="remove" CacheId="4344604ECBA4DFE5DE7C680CB1AA5BD6FAA29BF95CE07740F02878C2BB1EF6DE6432944A0DB79B034D1C6F68CF80842EEE442EA8A551816E52D3F68901C50AB9" InstallSize="23939" Size="23939" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_ExeA" RollbackLogPathVariable="WixBundleRollbackLog_ExeA" DetectCondition="ExeA_Version AND ExeA_Version &gt;= v1.0.0.0" InstallArguments="/s 5000 /regw &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0&quot;" UninstallArguments="/regd &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version&quot;" Uninstallable="yes" RepairArguments="/regw &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0&quot;" Repairable="yes"><PayloadRef Id="TestExe.exe" /><PayloadRef Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" /></ExePackage></Chain><CommandLine Variables="upperCase" /></BurnManifest>
\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="~FailureTests_BundleD" Extension=".log" /><RelatedBundle Id="{3C1A4842-81AC-4C90-8B35-A5E18F034C8D}" Action="Upgrade" /><Variable Id="TestGroupName" Value="FailureTests" Type="string" Hidden="no" Persisted="no" /><Variable Id="WixBundleInProgressName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Type="value" VariableType="string" /><RegistrySearch Id="wrsQ7JTGqvaQuDYjfHJoyjxtkLlR6c" Variable="ExeA_Version" Root="HKLM" Key="Software\WiX\Tests\FailureTests\ExeA" Value="Version" Type="value" VariableType="string" /><UX><Payload Id="WixManagedBootstrapperApplicationHost" FilePath="mbahost.dll" SourcePath="u30" /><Payload Id="payO60IVK4ATGzPpMz3rwVbUWl6DyU" FilePath="WixToolset.Mba.Host.config" SourcePath="u0" /><Payload Id="payxj4zDAKL2NVlz4ohp0GvwFHepyI" FilePath="TestBA.dll" SourcePath="u1" /><Payload Id="pay1hOSAUC8_D633cD2TXpIXCL30OU" FilePath="mbanative.dll" SourcePath="u2" /><Payload Id="payujy6Izl_BlUNfHt2eI.ADfjYAv4" FilePath="WixToolset.Mba.Core.dll" SourcePath="u3" /><Payload Id="payR4EbR4OTDZpPEycWaSSM_gZRBWM" FilePath="mbapreq.thm" SourcePath="u4" /><Payload Id="paylVCy2Ecl8pHPdJTCQZryUG4T9us" FilePath="mbapreq.png" SourcePath="u5" /><Payload Id="payTaG4B_lob1aLcKFaOqSSG3MPMpU" FilePath="mbapreq.wxl" SourcePath="u6" /><Payload Id="payZwIGuiezVTitZOoZKxyh2DdRSGs" FilePath="1028\mbapreq.wxl" SourcePath="u7" /><Payload Id="pay.herBWX.LlOh8jLsx24aWdunV_0" FilePath="1029\mbapreq.wxl" SourcePath="u8" /><Payload Id="pay8DkMszYsoxxdgX14huLDMYXylQg" FilePath="1030\mbapreq.wxl" SourcePath="u9" /><Payload Id="payPaHpoTeOdkW.TK99IDwktNLhTAg" FilePath="1031\mbapreq.wxl" SourcePath="u10" /><Payload Id="pay45AtAzterLTMzZgdxxtuYvaiXwU" FilePath="1032\mbapreq.wxl" SourcePath="u11" /><Payload Id="payA2VEKIqhePyNIEmr14eyH3JoVLc" FilePath="1035\mbapreq.wxl" SourcePath="u12" /><Payload Id="payvre23ObscjzhcaFIifUAkXMdPa8" FilePath="1036\mbapreq.wxl" SourcePath="u13" /><Payload Id="paytxUV3vuBbG2c.a9c.d_sZX2x6wA" FilePath="1038\mbapreq.wxl" SourcePath="u14" /><Payload Id="payYvMWRK9xelo5.sQn7jRkJIaBp9A" FilePath="1040\mbapreq.wxl" SourcePath="u15" /><Payload Id="pay68KKSApyQimbA25t6kSbqhdeH10" FilePath="1041\mbapreq.wxl" SourcePath="u16" /><Payload Id="paypiqxaHpYZqx.9eDVjQrj1igLbRY" FilePath="1042\mbapreq.wxl" SourcePath="u17" /><Payload Id="payTO0YwZzxKpbqdrBVUcVRTu3BFe8" FilePath="1043\mbapreq.wxl" SourcePath="u18" /><Payload Id="payIXg2ldBJukRzhqWolJVOEbTmF34" FilePath="1044\mbapreq.wxl" SourcePath="u19" /><Payload Id="payOHIZbSkIvrpwKkkXI173tv3u3B4" FilePath="1045\mbapreq.wxl" SourcePath="u20" /><Payload Id="payQRQ_UZl_R2UtV0xDXB2yeH2bg3E" FilePath="1046\mbapreq.wxl" SourcePath="u21" /><Payload Id="payhrejLLBfc1i27iN._QPhQ4K337I" FilePath="1049\mbapreq.wxl" SourcePath="u22" /><Payload Id="payqEzaDNzxB68vGp29jgDcCos6dvg" FilePath="1051\mbapreq.wxl" SourcePath="u23" /><Payload Id="paydz8Vk8xSTyYohgGXTSIxWGXL5.Q" FilePath="1053\mbapreq.wxl" SourcePath="u24" /><Payload Id="pay0HRUZTlbC3taSOffJBsEj92Br8Y" FilePath="1055\mbapreq.wxl" SourcePath="u25" /><Payload Id="payIvUOkc_EMH7laMFehefNolV8hZo" FilePath="1060\mbapreq.wxl" SourcePath="u26" /><Payload Id="payLFhOb.rHuk4sW5CYAPMShG0NjGI" FilePath="2052\mbapreq.wxl" SourcePath="u27" /><Payload Id="payqIKCmERK7Nhxx_nNXvRxdKqKDbI" FilePath="2070\mbapreq.wxl" SourcePath="u28" /><Payload Id="payqeWUzIVaEqjuRXN0z8ECC3Y4tCc" FilePath="3082\mbapreq.wxl" SourcePath="u29" /><Payload Id="paylfeHEjJSSTnNzY9QMZM2Ye3Ipy4" FilePath="mbapreq.dll" SourcePath="u31" /><Payload Id="payDPxs6uy8nbky.R7zhir2RRAfc.c" FilePath="WixToolset.Mba.Host.dll" SourcePath="u32" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u33" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" SourcePath="u34" /></UX><Container Id="WixAttachedContainer" FileSize="24029" Hash="03F9C95A2ADA5563D3D937C0161F22A76E12F2F0AF2AA6BE567292D0AB122E2C42990E97CA9C1EE9A5F43A571B01C4ED7A3EA5759A6836AC8BFD959D7FFDCB18" FilePath="BundleD.exe" AttachedIndex="1" Attached="yes" Primary="yes" /><Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1439328" CertificateRootPublicKeyIdentifier="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateRootThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /><Payload Id="TestExe.exe" FilePath="TestExe.exe" FileSize="23552" Hash="4344604ECBA4DFE5DE7C680CB1AA5BD6FAA29BF95CE07740F02878C2BB1EF6DE6432944A0DB79B034D1C6F68CF80842EEE442EA8A551816E52D3F68901C50AB9" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /><Payload Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" FilePath="TestExe.exe.config" FileSize="387" Hash="8C819A9E835F3921FA80C5C783AB0C42DDAADF0C0F2BEF8630EA122ABCB9DC8EAF0B14E061C46B37C92F55114BB09A8D5B1B613947A76A648953F2C63C0ACA63" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{9C184683-04FB-49AD-9D79-65101BDC3EE3}" ExecutableName="BundleD.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{9C184683-04FB-49AD-9D79-65101BDC3EE3}"><Arp Register="yes" DisplayName="~FailureTests - BundleD" DisplayVersion="1.0.0.0" /></Registration><Chain><ExePackage Id="NetFx48Web" Cache="remove" CacheId="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" InstallSize="1439328" Size="1439328" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" Uninstallable="no" RepairArguments="" Repairable="no" Protocol="netfx4" DetectionType="condition"><PayloadRef Id="NetFx48Web" /></ExePackage><ExePackage Id="ExeA" Cache="remove" CacheId="4344604ECBA4DFE5DE7C680CB1AA5BD6FAA29BF95CE07740F02878C2BB1EF6DE6432944A0DB79B034D1C6F68CF80842EEE442EA8A551816E52D3F68901C50AB9" InstallSize="23939" Size="23939" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_ExeA" RollbackLogPathVariable="WixBundleRollbackLog_ExeA" DetectCondition="ExeA_Version AND ExeA_Version &gt;= v1.0.0.0" InstallArguments="/s 5000 /regw &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0&quot;" UninstallArguments="/regd &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version&quot;" Uninstallable="yes" RepairArguments="/regw &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0&quot;" Repairable="yes" DetectionType="condition"><PayloadRef Id="TestExe.exe" /><PayloadRef Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" /></ExePackage></Chain><CommandLine Variables="upperCase" /></BurnManifest>
\ No newline at end of file
src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_manifest.xml
+1 -1
@@ -1 +1 @@
1 -<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="~SlipstreamTests_BundleA" Extension=".log" /><RelatedBundle Id="{62C28DAF-A13E-4F55-ACA1-FB843630789C}" Action="Upgrade" /><Variable Id="TestGroupName" Value="SlipstreamTests" Type="string" Hidden="no" Persisted="no" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Type="value" VariableType="string" /><UX><Payload Id="WixManagedBootstrapperApplicationHost" FilePath="mbahost.dll" FileSize="140288" Hash="4569C53566B1025E243E0C29A96C608BD4019979" Packaging="embedded" SourcePath="u30" /><Payload Id="payO60IVK4ATGzPpMz3rwVbUWl6DyU" FilePath="WixToolset.Mba.Host.config" FileSize="783" Hash="B5BDD5E7179A94C2C817069913CA8C099DF811B9" Packaging="embedded" SourcePath="u0" /><Payload Id="payxj4zDAKL2NVlz4ohp0GvwFHepyI" FilePath="TestBA.dll" FileSize="25088" Hash="DB12DB6565CDBC4E9705204830E421ACEB710129" Packaging="embedded" SourcePath="u1" /><Payload Id="pay1hOSAUC8_D633cD2TXpIXCL30OU" FilePath="mbanative.dll" FileSize="118272" Hash="3A7A20D97B0546A23A025EE5774BE237C14D2957" Packaging="embedded" SourcePath="u2" /><Payload Id="payujy6Izl_BlUNfHt2eI.ADfjYAv4" FilePath="WixToolset.Mba.Core.dll" FileSize="114688" Hash="56BA3EA94BEBF8EB562C914495E1594E74F05DBE" Packaging="embedded" SourcePath="u3" /><Payload Id="payR4EbR4OTDZpPEycWaSSM_gZRBWM" FilePath="mbapreq.thm" FileSize="3599" Hash="8D9797C1E1A50AECB8B85FFCEA6A2A2EF611BD7F" Packaging="embedded" SourcePath="u4" /><Payload Id="paylVCy2Ecl8pHPdJTCQZryUG4T9us" FilePath="mbapreq.png" FileSize="797" Hash="75AE41181581FD6376CA9CA88147011E48BF9A30" Packaging="embedded" SourcePath="u5" /><Payload Id="payTaG4B_lob1aLcKFaOqSSG3MPMpU" FilePath="mbapreq.wxl" FileSize="2237" Hash="068B3C5E27AECE7987EABAA2802C9EB07B39EAF8" Packaging="embedded" SourcePath="u6" /><Payload Id="payZwIGuiezVTitZOoZKxyh2DdRSGs" FilePath="1028\mbapreq.wxl" FileSize="1998" Hash="A989D9B892F497215D81F903591ECB6CD50CFFFC" Packaging="embedded" SourcePath="u7" /><Payload Id="pay.herBWX.LlOh8jLsx24aWdunV_0" FilePath="1029\mbapreq.wxl" FileSize="2428" Hash="E6B8E4B1AA89430EB6A5A1E997CA3D1D2F968285" Packaging="embedded" SourcePath="u8" /><Payload Id="pay8DkMszYsoxxdgX14huLDMYXylQg" FilePath="1030\mbapreq.wxl" FileSize="2256" Hash="612CD2FD0CF3800639385C0BF4D805B24507D356" Packaging="embedded" SourcePath="u9" /><Payload Id="payPaHpoTeOdkW.TK99IDwktNLhTAg" FilePath="1031\mbapreq.wxl" FileSize="2409" Hash="E59A8F11D95AC17FC70BD718706EE36BFA50EF02" Packaging="embedded" SourcePath="u10" /><Payload Id="pay45AtAzterLTMzZgdxxtuYvaiXwU" FilePath="1032\mbapreq.wxl" FileSize="3368" Hash="154E0A658BA7EE59889224A231423634A9725547" Packaging="embedded" SourcePath="u11" /><Payload Id="payA2VEKIqhePyNIEmr14eyH3JoVLc" FilePath="1035\mbapreq.wxl" FileSize="2205" Hash="6AAE55269E42F99A5D88ADD18C433384DEB9E956" Packaging="embedded" SourcePath="u12" /><Payload Id="payvre23ObscjzhcaFIifUAkXMdPa8" FilePath="1036\mbapreq.wxl" FileSize="2276" Hash="7DC74874357F50AE8C4871D8F4DC06B337CF6352" Packaging="embedded" SourcePath="u13" /><Payload Id="paytxUV3vuBbG2c.a9c.d_sZX2x6wA" FilePath="1038\mbapreq.wxl" FileSize="2362" Hash="B60C34DE38E6E48BA0841E8A962C17179FC1B69A" Packaging="embedded" SourcePath="u14" /><Payload Id="payYvMWRK9xelo5.sQn7jRkJIaBp9A" FilePath="1040\mbapreq.wxl" FileSize="2273" Hash="902D231AD6306087F215DEABB7F2AB2F8072C401" Packaging="embedded" SourcePath="u15" /><Payload Id="pay68KKSApyQimbA25t6kSbqhdeH10" FilePath="1041\mbapreq.wxl" FileSize="2518" Hash="4095A1AFCF18C01F7DA51A1A389C2FBBB1A82A12" Packaging="embedded" SourcePath="u16" /><Payload Id="paypiqxaHpYZqx.9eDVjQrj1igLbRY" FilePath="1042\mbapreq.wxl" FileSize="2209" Hash="99CE8B42300EF656E6BD44F01766DC638CB0496F" Packaging="embedded" SourcePath="u17" /><Payload Id="payTO0YwZzxKpbqdrBVUcVRTu3BFe8" FilePath="1043\mbapreq.wxl" FileSize="2282" Hash="87117EE32E0004E25DDCEB1A7D417F3A02856A50" Packaging="embedded" SourcePath="u18" /><Payload Id="payIXg2ldBJukRzhqWolJVOEbTmF34" FilePath="1044\mbapreq.wxl" FileSize="2141" Hash="5AED841C6A870C3A8BAF8A10D00F887A781D0CF0" Packaging="embedded" SourcePath="u19" /><Payload Id="payOHIZbSkIvrpwKkkXI173tv3u3B4" FilePath="1045\mbapreq.wxl" FileSize="2338" Hash="07E37CBC59298F24A5C8C3B8FEB7A45DADF8CD07" Packaging="embedded" SourcePath="u20" /><Payload Id="payQRQ_UZl_R2UtV0xDXB2yeH2bg3E" FilePath="1046\mbapreq.wxl" FileSize="2118" Hash="AEC0CE51E8E335E9B86F1AC7E39CCD172B896582" Packaging="embedded" SourcePath="u21" /><Payload Id="payhrejLLBfc1i27iN._QPhQ4K337I" FilePath="1049\mbapreq.wxl" FileSize="2851" Hash="9628BADB173B171ED85D902634D9AA5D91FE9721" Packaging="embedded" SourcePath="u22" /><Payload Id="payqEzaDNzxB68vGp29jgDcCos6dvg" FilePath="1051\mbapreq.wxl" FileSize="2304" Hash="B584E8C0D7F9B7A1BB70BC00E42BFD35BED5D81D" Packaging="embedded" SourcePath="u23" /><Payload Id="paydz8Vk8xSTyYohgGXTSIxWGXL5.Q" FilePath="1053\mbapreq.wxl" FileSize="2102" Hash="67E93F555DBFEF8508E79F7CA8CE76B881308760" Packaging="embedded" SourcePath="u24" /><Payload Id="pay0HRUZTlbC3taSOffJBsEj92Br8Y" FilePath="1055\mbapreq.wxl" FileSize="2273" Hash="AEB8C90D66942A5CD73EA52A6F2ADD4F7D518A0D" Packaging="embedded" SourcePath="u25" /><Payload Id="payIvUOkc_EMH7laMFehefNolV8hZo" FilePath="1060\mbapreq.wxl" FileSize="2170" Hash="B1D4B71907B8BD82DD8B047404AF10FDBBE5CBA0" Packaging="embedded" SourcePath="u26" /><Payload Id="payLFhOb.rHuk4sW5CYAPMShG0NjGI" FilePath="2052\mbapreq.wxl" FileSize="1953" Hash="C8FB8982EC71C48D6EA021ADD9AAA7BCB0656281" Packaging="embedded" SourcePath="u27" /><Payload Id="payqIKCmERK7Nhxx_nNXvRxdKqKDbI" FilePath="2070\mbapreq.wxl" FileSize="2182" Hash="825F27A543907ED27E815EC67DFD48AF7BF5831E" Packaging="embedded" SourcePath="u28" /><Payload Id="payqeWUzIVaEqjuRXN0z8ECC3Y4tCc" FilePath="3082\mbapreq.wxl" FileSize="2369" Hash="39C07C31077AAFDC0DD208273AA41654CAD80FDD" Packaging="embedded" SourcePath="u29" /><Payload Id="paylfeHEjJSSTnNzY9QMZM2Ye3Ipy4" FilePath="mbapreq.dll" FileSize="245760" Hash="6499FA21D178131DDE13A4EF44ABEC32E91D65D4" Packaging="embedded" SourcePath="u31" /><Payload Id="payDPxs6uy8nbky.R7zhir2RRAfc.c" FilePath="WixToolset.Mba.Host.dll" FileSize="11264" Hash="9E6452891E401EB211DD41550A09FDF98EC0992F" Packaging="embedded" SourcePath="u32" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" FileSize="14292" Hash="CDF09A0723F4F33C13670BBAFCFFA7E660E15DFC" Packaging="embedded" SourcePath="u33" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" FileSize="252" Hash="86688B13D3364ADB90BBA552F544D4D546AFD63D" Packaging="embedded" SourcePath="u34" /></UX><Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1479400" Hash="5A84A8E612E270E27D0061D58DB6B470153BE1F9" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /><Payload Id="PackageA" FilePath="PackageAv1.msi" FileSize="32768" Hash="2369B16B7219B3C834DFBC5D2AF8B2EF8803D43D" Packaging="external" SourcePath="PackageAv1.msi" /><Payload Id="PatchA" FilePath="PatchA.msp" FileSize="20480" Hash="FABC6C18E4A778E127E84CDF67F93A291CAEC8BB" Packaging="external" SourcePath="PatchA.msp" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{22D1DDBA-284D-40A7-BD14-95EA07906F21}" ExecutableName="BundleA.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{22D1DDBA-284D-40A7-BD14-95EA07906F21}"><Arp Register="yes" DisplayName="~SlipstreamTests - BundleA" DisplayVersion="1.0.0.0" /></Registration><Chain><ExePackage Id="NetFx48Web" Cache="keep" CacheId="5A84A8E612E270E27D0061D58DB6B470153BE1F9" InstallSize="1479400" Size="1479400" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" RepairArguments="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" Repairable="yes" Uninstallable="yes" Protocol="netfx4"><PayloadRef Id="NetFx48Web" /></ExePackage><MsiPackage Id="PackageA" Cache="keep" CacheId="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}v1.0.0.0" InstallSize="2103" Size="32768" PerMachine="yes" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Language="1033" Version="1.0.0.0" UpgradeCode="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}"><MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /><MsiProperty Id="MSIFASTINSTALL" Value="7" /><SlipstreamMsp Id="PatchA" /><Provides Key="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Version="1.0.0.0" DisplayName="~SlipstreamTests - PackageA" /><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="no"><Language Id="1033" /></RelatedPackage><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="no"><Language Id="1033" /></RelatedPackage><PayloadRef Id="PackageA" /></MsiPackage><MspPackage Id="PatchA" Cache="keep" CacheId="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" InstallSize="20480" Size="20480" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PatchA" RollbackLogPathVariable="WixBundleRollbackLog_PatchA" PatchCode="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" PatchXml="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;MsiPatch xmlns=&quot;http://www.microsoft.com/msi/patch_applicability.xsd&quot; SchemaVersion=&quot;1.0.0.0&quot; PatchGUID=&quot;{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}&quot; MinMsiVersion=&quot;5&quot; TargetsRTM=&quot;true&quot;&gt;&lt;TargetProduct MinMsiVersion=&quot;500&quot;&gt;&lt;TargetProductCode Validate=&quot;true&quot;&gt;{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}&lt;/TargetProductCode&gt;&lt;TargetVersion Validate=&quot;true&quot; ComparisonType=&quot;Equal&quot; ComparisonFilter=&quot;MajorMinorUpdate&quot;&gt;1.0.0.0&lt;/TargetVersion&gt;&lt;UpdatedVersion&gt;1.0.1.0&lt;/UpdatedVersion&gt;&lt;TargetLanguage Validate=&quot;false&quot;&gt;1033&lt;/TargetLanguage&gt;&lt;UpdatedLanguages&gt;1033&lt;/UpdatedLanguages&gt;&lt;UpgradeCode Validate=&quot;true&quot;&gt;{DB87BB66-FE5D-4293-81AC-EE313D3F864B}&lt;/UpgradeCode&gt;&lt;/TargetProduct&gt;&lt;TargetProductCode&gt;{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}&lt;/TargetProductCode&gt;&lt;/MsiPatch&gt;"><Provides Key="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" DisplayName="SlipstreamTests - Patch A" /><PayloadRef Id="PatchA" /></MspPackage></Chain><PatchTargetCode TargetCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Product="yes" /><CommandLine Variables="upperCase" /></BurnManifest>
1 +<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="~SlipstreamTests_BundleA" Extension=".log" /><RelatedBundle Id="{62C28DAF-A13E-4F55-ACA1-FB843630789C}" Action="Upgrade" /><Variable Id="TestGroupName" Value="SlipstreamTests" Type="string" Hidden="no" Persisted="no" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Type="value" VariableType="string" /><UX><Payload Id="WixManagedBootstrapperApplicationHost" FilePath="mbahost.dll" FileSize="140288" Hash="4569C53566B1025E243E0C29A96C608BD4019979" Packaging="embedded" SourcePath="u30" /><Payload Id="payO60IVK4ATGzPpMz3rwVbUWl6DyU" FilePath="WixToolset.Mba.Host.config" FileSize="783" Hash="B5BDD5E7179A94C2C817069913CA8C099DF811B9" Packaging="embedded" SourcePath="u0" /><Payload Id="payxj4zDAKL2NVlz4ohp0GvwFHepyI" FilePath="TestBA.dll" FileSize="25088" Hash="DB12DB6565CDBC4E9705204830E421ACEB710129" Packaging="embedded" SourcePath="u1" /><Payload Id="pay1hOSAUC8_D633cD2TXpIXCL30OU" FilePath="mbanative.dll" FileSize="118272" Hash="3A7A20D97B0546A23A025EE5774BE237C14D2957" Packaging="embedded" SourcePath="u2" /><Payload Id="payujy6Izl_BlUNfHt2eI.ADfjYAv4" FilePath="WixToolset.Mba.Core.dll" FileSize="114688" Hash="56BA3EA94BEBF8EB562C914495E1594E74F05DBE" Packaging="embedded" SourcePath="u3" /><Payload Id="payR4EbR4OTDZpPEycWaSSM_gZRBWM" FilePath="mbapreq.thm" FileSize="3599" Hash="8D9797C1E1A50AECB8B85FFCEA6A2A2EF611BD7F" Packaging="embedded" SourcePath="u4" /><Payload Id="paylVCy2Ecl8pHPdJTCQZryUG4T9us" FilePath="mbapreq.png" FileSize="797" Hash="75AE41181581FD6376CA9CA88147011E48BF9A30" Packaging="embedded" SourcePath="u5" /><Payload Id="payTaG4B_lob1aLcKFaOqSSG3MPMpU" FilePath="mbapreq.wxl" FileSize="2237" Hash="068B3C5E27AECE7987EABAA2802C9EB07B39EAF8" Packaging="embedded" SourcePath="u6" /><Payload Id="payZwIGuiezVTitZOoZKxyh2DdRSGs" FilePath="1028\mbapreq.wxl" FileSize="1998" Hash="A989D9B892F497215D81F903591ECB6CD50CFFFC" Packaging="embedded" SourcePath="u7" /><Payload Id="pay.herBWX.LlOh8jLsx24aWdunV_0" FilePath="1029\mbapreq.wxl" FileSize="2428" Hash="E6B8E4B1AA89430EB6A5A1E997CA3D1D2F968285" Packaging="embedded" SourcePath="u8" /><Payload Id="pay8DkMszYsoxxdgX14huLDMYXylQg" FilePath="1030\mbapreq.wxl" FileSize="2256" Hash="612CD2FD0CF3800639385C0BF4D805B24507D356" Packaging="embedded" SourcePath="u9" /><Payload Id="payPaHpoTeOdkW.TK99IDwktNLhTAg" FilePath="1031\mbapreq.wxl" FileSize="2409" Hash="E59A8F11D95AC17FC70BD718706EE36BFA50EF02" Packaging="embedded" SourcePath="u10" /><Payload Id="pay45AtAzterLTMzZgdxxtuYvaiXwU" FilePath="1032\mbapreq.wxl" FileSize="3368" Hash="154E0A658BA7EE59889224A231423634A9725547" Packaging="embedded" SourcePath="u11" /><Payload Id="payA2VEKIqhePyNIEmr14eyH3JoVLc" FilePath="1035\mbapreq.wxl" FileSize="2205" Hash="6AAE55269E42F99A5D88ADD18C433384DEB9E956" Packaging="embedded" SourcePath="u12" /><Payload Id="payvre23ObscjzhcaFIifUAkXMdPa8" FilePath="1036\mbapreq.wxl" FileSize="2276" Hash="7DC74874357F50AE8C4871D8F4DC06B337CF6352" Packaging="embedded" SourcePath="u13" /><Payload Id="paytxUV3vuBbG2c.a9c.d_sZX2x6wA" FilePath="1038\mbapreq.wxl" FileSize="2362" Hash="B60C34DE38E6E48BA0841E8A962C17179FC1B69A" Packaging="embedded" SourcePath="u14" /><Payload Id="payYvMWRK9xelo5.sQn7jRkJIaBp9A" FilePath="1040\mbapreq.wxl" FileSize="2273" Hash="902D231AD6306087F215DEABB7F2AB2F8072C401" Packaging="embedded" SourcePath="u15" /><Payload Id="pay68KKSApyQimbA25t6kSbqhdeH10" FilePath="1041\mbapreq.wxl" FileSize="2518" Hash="4095A1AFCF18C01F7DA51A1A389C2FBBB1A82A12" Packaging="embedded" SourcePath="u16" /><Payload Id="paypiqxaHpYZqx.9eDVjQrj1igLbRY" FilePath="1042\mbapreq.wxl" FileSize="2209" Hash="99CE8B42300EF656E6BD44F01766DC638CB0496F" Packaging="embedded" SourcePath="u17" /><Payload Id="payTO0YwZzxKpbqdrBVUcVRTu3BFe8" FilePath="1043\mbapreq.wxl" FileSize="2282" Hash="87117EE32E0004E25DDCEB1A7D417F3A02856A50" Packaging="embedded" SourcePath="u18" /><Payload Id="payIXg2ldBJukRzhqWolJVOEbTmF34" FilePath="1044\mbapreq.wxl" FileSize="2141" Hash="5AED841C6A870C3A8BAF8A10D00F887A781D0CF0" Packaging="embedded" SourcePath="u19" /><Payload Id="payOHIZbSkIvrpwKkkXI173tv3u3B4" FilePath="1045\mbapreq.wxl" FileSize="2338" Hash="07E37CBC59298F24A5C8C3B8FEB7A45DADF8CD07" Packaging="embedded" SourcePath="u20" /><Payload Id="payQRQ_UZl_R2UtV0xDXB2yeH2bg3E" FilePath="1046\mbapreq.wxl" FileSize="2118" Hash="AEC0CE51E8E335E9B86F1AC7E39CCD172B896582" Packaging="embedded" SourcePath="u21" /><Payload Id="payhrejLLBfc1i27iN._QPhQ4K337I" FilePath="1049\mbapreq.wxl" FileSize="2851" Hash="9628BADB173B171ED85D902634D9AA5D91FE9721" Packaging="embedded" SourcePath="u22" /><Payload Id="payqEzaDNzxB68vGp29jgDcCos6dvg" FilePath="1051\mbapreq.wxl" FileSize="2304" Hash="B584E8C0D7F9B7A1BB70BC00E42BFD35BED5D81D" Packaging="embedded" SourcePath="u23" /><Payload Id="paydz8Vk8xSTyYohgGXTSIxWGXL5.Q" FilePath="1053\mbapreq.wxl" FileSize="2102" Hash="67E93F555DBFEF8508E79F7CA8CE76B881308760" Packaging="embedded" SourcePath="u24" /><Payload Id="pay0HRUZTlbC3taSOffJBsEj92Br8Y" FilePath="1055\mbapreq.wxl" FileSize="2273" Hash="AEB8C90D66942A5CD73EA52A6F2ADD4F7D518A0D" Packaging="embedded" SourcePath="u25" /><Payload Id="payIvUOkc_EMH7laMFehefNolV8hZo" FilePath="1060\mbapreq.wxl" FileSize="2170" Hash="B1D4B71907B8BD82DD8B047404AF10FDBBE5CBA0" Packaging="embedded" SourcePath="u26" /><Payload Id="payLFhOb.rHuk4sW5CYAPMShG0NjGI" FilePath="2052\mbapreq.wxl" FileSize="1953" Hash="C8FB8982EC71C48D6EA021ADD9AAA7BCB0656281" Packaging="embedded" SourcePath="u27" /><Payload Id="payqIKCmERK7Nhxx_nNXvRxdKqKDbI" FilePath="2070\mbapreq.wxl" FileSize="2182" Hash="825F27A543907ED27E815EC67DFD48AF7BF5831E" Packaging="embedded" SourcePath="u28" /><Payload Id="payqeWUzIVaEqjuRXN0z8ECC3Y4tCc" FilePath="3082\mbapreq.wxl" FileSize="2369" Hash="39C07C31077AAFDC0DD208273AA41654CAD80FDD" Packaging="embedded" SourcePath="u29" /><Payload Id="paylfeHEjJSSTnNzY9QMZM2Ye3Ipy4" FilePath="mbapreq.dll" FileSize="245760" Hash="6499FA21D178131DDE13A4EF44ABEC32E91D65D4" Packaging="embedded" SourcePath="u31" /><Payload Id="payDPxs6uy8nbky.R7zhir2RRAfc.c" FilePath="WixToolset.Mba.Host.dll" FileSize="11264" Hash="9E6452891E401EB211DD41550A09FDF98EC0992F" Packaging="embedded" SourcePath="u32" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" FileSize="14292" Hash="CDF09A0723F4F33C13670BBAFCFFA7E660E15DFC" Packaging="embedded" SourcePath="u33" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" FileSize="252" Hash="86688B13D3364ADB90BBA552F544D4D546AFD63D" Packaging="embedded" SourcePath="u34" /></UX><Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1479400" Hash="5A84A8E612E270E27D0061D58DB6B470153BE1F9" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /><Payload Id="PackageA" FilePath="PackageAv1.msi" FileSize="32768" Hash="2369B16B7219B3C834DFBC5D2AF8B2EF8803D43D" Packaging="external" SourcePath="PackageAv1.msi" /><Payload Id="PatchA" FilePath="PatchA.msp" FileSize="20480" Hash="FABC6C18E4A778E127E84CDF67F93A291CAEC8BB" Packaging="external" SourcePath="PatchA.msp" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{22D1DDBA-284D-40A7-BD14-95EA07906F21}" ExecutableName="BundleA.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{22D1DDBA-284D-40A7-BD14-95EA07906F21}"><Arp Register="yes" DisplayName="~SlipstreamTests - BundleA" DisplayVersion="1.0.0.0" /></Registration><Chain><ExePackage Id="NetFx48Web" Cache="keep" CacheId="5A84A8E612E270E27D0061D58DB6B470153BE1F9" InstallSize="1479400" Size="1479400" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" RepairArguments="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" Repairable="yes" Uninstallable="yes" Protocol="netfx4" DetectionType="condition"><PayloadRef Id="NetFx48Web" /></ExePackage><MsiPackage Id="PackageA" Cache="keep" CacheId="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}v1.0.0.0" InstallSize="2103" Size="32768" PerMachine="yes" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Language="1033" Version="1.0.0.0" UpgradeCode="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}"><MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /><MsiProperty Id="MSIFASTINSTALL" Value="7" /><SlipstreamMsp Id="PatchA" /><Provides Key="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Version="1.0.0.0" DisplayName="~SlipstreamTests - PackageA" /><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="no"><Language Id="1033" /></RelatedPackage><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="no"><Language Id="1033" /></RelatedPackage><PayloadRef Id="PackageA" /></MsiPackage><MspPackage Id="PatchA" Cache="keep" CacheId="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" InstallSize="20480" Size="20480" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PatchA" RollbackLogPathVariable="WixBundleRollbackLog_PatchA" PatchCode="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" PatchXml="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;MsiPatch xmlns=&quot;http://www.microsoft.com/msi/patch_applicability.xsd&quot; SchemaVersion=&quot;1.0.0.0&quot; PatchGUID=&quot;{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}&quot; MinMsiVersion=&quot;5&quot; TargetsRTM=&quot;true&quot;&gt;&lt;TargetProduct MinMsiVersion=&quot;500&quot;&gt;&lt;TargetProductCode Validate=&quot;true&quot;&gt;{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}&lt;/TargetProductCode&gt;&lt;TargetVersion Validate=&quot;true&quot; ComparisonType=&quot;Equal&quot; ComparisonFilter=&quot;MajorMinorUpdate&quot;&gt;1.0.0.0&lt;/TargetVersion&gt;&lt;UpdatedVersion&gt;1.0.1.0&lt;/UpdatedVersion&gt;&lt;TargetLanguage Validate=&quot;false&quot;&gt;1033&lt;/TargetLanguage&gt;&lt;UpdatedLanguages&gt;1033&lt;/UpdatedLanguages&gt;&lt;UpgradeCode Validate=&quot;true&quot;&gt;{DB87BB66-FE5D-4293-81AC-EE313D3F864B}&lt;/UpgradeCode&gt;&lt;/TargetProduct&gt;&lt;TargetProductCode&gt;{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}&lt;/TargetProductCode&gt;&lt;/MsiPatch&gt;"><Provides Key="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" DisplayName="SlipstreamTests - Patch A" /><PayloadRef Id="PatchA" /></MspPackage></Chain><PatchTargetCode TargetCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Product="yes" /><CommandLine Variables="upperCase" /></BurnManifest>
src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml
+1 -1
@@ -1 +1 @@
1 -<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="~SlipstreamTests_BundleA" Extension=".log" /><RelatedBundle Id="{62C28DAF-A13E-4F55-ACA1-FB843630789C}" Action="Upgrade" /><Variable Id="TestGroupName" Value="SlipstreamTests" Type="string" Hidden="no" Persisted="no" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Type="value" VariableType="string" /><UX><Payload Id="WixManagedBootstrapperApplicationHost" FilePath="mbahost.dll" FileSize="140288" Hash="4569C53566B1025E243E0C29A96C608BD4019979" Packaging="embedded" SourcePath="u30" /><Payload Id="payO60IVK4ATGzPpMz3rwVbUWl6DyU" FilePath="WixToolset.Mba.Host.config" FileSize="783" Hash="B5BDD5E7179A94C2C817069913CA8C099DF811B9" Packaging="embedded" SourcePath="u0" /><Payload Id="payxj4zDAKL2NVlz4ohp0GvwFHepyI" FilePath="TestBA.dll" FileSize="25088" Hash="DB12DB6565CDBC4E9705204830E421ACEB710129" Packaging="embedded" SourcePath="u1" /><Payload Id="pay1hOSAUC8_D633cD2TXpIXCL30OU" FilePath="mbanative.dll" FileSize="118272" Hash="3A7A20D97B0546A23A025EE5774BE237C14D2957" Packaging="embedded" SourcePath="u2" /><Payload Id="payujy6Izl_BlUNfHt2eI.ADfjYAv4" FilePath="WixToolset.Mba.Core.dll" FileSize="114688" Hash="56BA3EA94BEBF8EB562C914495E1594E74F05DBE" Packaging="embedded" SourcePath="u3" /><Payload Id="payR4EbR4OTDZpPEycWaSSM_gZRBWM" FilePath="mbapreq.thm" FileSize="3599" Hash="8D9797C1E1A50AECB8B85FFCEA6A2A2EF611BD7F" Packaging="embedded" SourcePath="u4" /><Payload Id="paylVCy2Ecl8pHPdJTCQZryUG4T9us" FilePath="mbapreq.png" FileSize="797" Hash="75AE41181581FD6376CA9CA88147011E48BF9A30" Packaging="embedded" SourcePath="u5" /><Payload Id="payTaG4B_lob1aLcKFaOqSSG3MPMpU" FilePath="mbapreq.wxl" FileSize="2237" Hash="068B3C5E27AECE7987EABAA2802C9EB07B39EAF8" Packaging="embedded" SourcePath="u6" /><Payload Id="payZwIGuiezVTitZOoZKxyh2DdRSGs" FilePath="1028\mbapreq.wxl" FileSize="1998" Hash="A989D9B892F497215D81F903591ECB6CD50CFFFC" Packaging="embedded" SourcePath="u7" /><Payload Id="pay.herBWX.LlOh8jLsx24aWdunV_0" FilePath="1029\mbapreq.wxl" FileSize="2428" Hash="E6B8E4B1AA89430EB6A5A1E997CA3D1D2F968285" Packaging="embedded" SourcePath="u8" /><Payload Id="pay8DkMszYsoxxdgX14huLDMYXylQg" FilePath="1030\mbapreq.wxl" FileSize="2256" Hash="612CD2FD0CF3800639385C0BF4D805B24507D356" Packaging="embedded" SourcePath="u9" /><Payload Id="payPaHpoTeOdkW.TK99IDwktNLhTAg" FilePath="1031\mbapreq.wxl" FileSize="2409" Hash="E59A8F11D95AC17FC70BD718706EE36BFA50EF02" Packaging="embedded" SourcePath="u10" /><Payload Id="pay45AtAzterLTMzZgdxxtuYvaiXwU" FilePath="1032\mbapreq.wxl" FileSize="3368" Hash="154E0A658BA7EE59889224A231423634A9725547" Packaging="embedded" SourcePath="u11" /><Payload Id="payA2VEKIqhePyNIEmr14eyH3JoVLc" FilePath="1035\mbapreq.wxl" FileSize="2205" Hash="6AAE55269E42F99A5D88ADD18C433384DEB9E956" Packaging="embedded" SourcePath="u12" /><Payload Id="payvre23ObscjzhcaFIifUAkXMdPa8" FilePath="1036\mbapreq.wxl" FileSize="2276" Hash="7DC74874357F50AE8C4871D8F4DC06B337CF6352" Packaging="embedded" SourcePath="u13" /><Payload Id="paytxUV3vuBbG2c.a9c.d_sZX2x6wA" FilePath="1038\mbapreq.wxl" FileSize="2362" Hash="B60C34DE38E6E48BA0841E8A962C17179FC1B69A" Packaging="embedded" SourcePath="u14" /><Payload Id="payYvMWRK9xelo5.sQn7jRkJIaBp9A" FilePath="1040\mbapreq.wxl" FileSize="2273" Hash="902D231AD6306087F215DEABB7F2AB2F8072C401" Packaging="embedded" SourcePath="u15" /><Payload Id="pay68KKSApyQimbA25t6kSbqhdeH10" FilePath="1041\mbapreq.wxl" FileSize="2518" Hash="4095A1AFCF18C01F7DA51A1A389C2FBBB1A82A12" Packaging="embedded" SourcePath="u16" /><Payload Id="paypiqxaHpYZqx.9eDVjQrj1igLbRY" FilePath="1042\mbapreq.wxl" FileSize="2209" Hash="99CE8B42300EF656E6BD44F01766DC638CB0496F" Packaging="embedded" SourcePath="u17" /><Payload Id="payTO0YwZzxKpbqdrBVUcVRTu3BFe8" FilePath="1043\mbapreq.wxl" FileSize="2282" Hash="87117EE32E0004E25DDCEB1A7D417F3A02856A50" Packaging="embedded" SourcePath="u18" /><Payload Id="payIXg2ldBJukRzhqWolJVOEbTmF34" FilePath="1044\mbapreq.wxl" FileSize="2141" Hash="5AED841C6A870C3A8BAF8A10D00F887A781D0CF0" Packaging="embedded" SourcePath="u19" /><Payload Id="payOHIZbSkIvrpwKkkXI173tv3u3B4" FilePath="1045\mbapreq.wxl" FileSize="2338" Hash="07E37CBC59298F24A5C8C3B8FEB7A45DADF8CD07" Packaging="embedded" SourcePath="u20" /><Payload Id="payQRQ_UZl_R2UtV0xDXB2yeH2bg3E" FilePath="1046\mbapreq.wxl" FileSize="2118" Hash="AEC0CE51E8E335E9B86F1AC7E39CCD172B896582" Packaging="embedded" SourcePath="u21" /><Payload Id="payhrejLLBfc1i27iN._QPhQ4K337I" FilePath="1049\mbapreq.wxl" FileSize="2851" Hash="9628BADB173B171ED85D902634D9AA5D91FE9721" Packaging="embedded" SourcePath="u22" /><Payload Id="payqEzaDNzxB68vGp29jgDcCos6dvg" FilePath="1051\mbapreq.wxl" FileSize="2304" Hash="B584E8C0D7F9B7A1BB70BC00E42BFD35BED5D81D" Packaging="embedded" SourcePath="u23" /><Payload Id="paydz8Vk8xSTyYohgGXTSIxWGXL5.Q" FilePath="1053\mbapreq.wxl" FileSize="2102" Hash="67E93F555DBFEF8508E79F7CA8CE76B881308760" Packaging="embedded" SourcePath="u24" /><Payload Id="pay0HRUZTlbC3taSOffJBsEj92Br8Y" FilePath="1055\mbapreq.wxl" FileSize="2273" Hash="AEB8C90D66942A5CD73EA52A6F2ADD4F7D518A0D" Packaging="embedded" SourcePath="u25" /><Payload Id="payIvUOkc_EMH7laMFehefNolV8hZo" FilePath="1060\mbapreq.wxl" FileSize="2170" Hash="B1D4B71907B8BD82DD8B047404AF10FDBBE5CBA0" Packaging="embedded" SourcePath="u26" /><Payload Id="payLFhOb.rHuk4sW5CYAPMShG0NjGI" FilePath="2052\mbapreq.wxl" FileSize="1953" Hash="C8FB8982EC71C48D6EA021ADD9AAA7BCB0656281" Packaging="embedded" SourcePath="u27" /><Payload Id="payqIKCmERK7Nhxx_nNXvRxdKqKDbI" FilePath="2070\mbapreq.wxl" FileSize="2182" Hash="825F27A543907ED27E815EC67DFD48AF7BF5831E" Packaging="embedded" SourcePath="u28" /><Payload Id="payqeWUzIVaEqjuRXN0z8ECC3Y4tCc" FilePath="3082\mbapreq.wxl" FileSize="2369" Hash="39C07C31077AAFDC0DD208273AA41654CAD80FDD" Packaging="embedded" SourcePath="u29" /><Payload Id="paylfeHEjJSSTnNzY9QMZM2Ye3Ipy4" FilePath="mbapreq.dll" FileSize="245760" Hash="6499FA21D178131DDE13A4EF44ABEC32E91D65D4" Packaging="embedded" SourcePath="u31" /><Payload Id="payDPxs6uy8nbky.R7zhir2RRAfc.c" FilePath="WixToolset.Mba.Host.dll" FileSize="11264" Hash="9E6452891E401EB211DD41550A09FDF98EC0992F" Packaging="embedded" SourcePath="u32" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" FileSize="14292" Hash="CDF09A0723F4F33C13670BBAFCFFA7E660E15DFC" Packaging="embedded" SourcePath="u33" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" FileSize="252" Hash="86688B13D3364ADB90BBA552F544D4D546AFD63D" Packaging="embedded" SourcePath="u34" /></UX><Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1479400" Hash="5A84A8E612E270E27D0061D58DB6B470153BE1F9" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /><Payload Id="PackageA" FilePath="PackageAv1.msi" FileSize="32768" Hash="2369B16B7219B3C834DFBC5D2AF8B2EF8803D43D" Packaging="external" SourcePath="PackageAv1.msi" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{22D1DDBA-284D-40A7-BD14-95EA07906F21}" ExecutableName="BundleA.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{DC94A8E0-4BF4-4026-B80B-2755DAFC05D3}"><Arp Register="yes" DisplayName="~SlipstreamTests - BundleA" DisplayVersion="1.0.0.0" /></Registration><Chain><ExePackage Id="NetFx48Web" Cache="keep" CacheId="5A84A8E612E270E27D0061D58DB6B470153BE1F9" InstallSize="1479400" Size="1479400" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" RepairArguments="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" Repairable="yes" Uninstallable="no" Protocol="netfx4"><PayloadRef Id="NetFx48Web" /></ExePackage><MsiPackage Id="PackageA" Cache="keep" CacheId="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}v1.0.0.0" InstallSize="2103" Size="32768" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Language="1033" Version="1.0.0.0" UpgradeCode="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}"><MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /><MsiProperty Id="MSIFASTINSTALL" Value="7" /><Provides Key="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Version="1.0.0.0" DisplayName="~SlipstreamTests - PackageA" /><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="no"><Language Id="1033" /></RelatedPackage><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="no"><Language Id="1033" /></RelatedPackage><PayloadRef Id="PackageA" /></MsiPackage></Chain><PatchTargetCode TargetCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Product="yes" /><CommandLine Variables="upperCase" /></BurnManifest>
1 +<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="~SlipstreamTests_BundleA" Extension=".log" /><RelatedBundle Id="{62C28DAF-A13E-4F55-ACA1-FB843630789C}" Action="Upgrade" /><Variable Id="TestGroupName" Value="SlipstreamTests" Type="string" Hidden="no" Persisted="no" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Type="value" VariableType="string" /><UX><Payload Id="WixManagedBootstrapperApplicationHost" FilePath="mbahost.dll" FileSize="140288" Hash="4569C53566B1025E243E0C29A96C608BD4019979" Packaging="embedded" SourcePath="u30" /><Payload Id="payO60IVK4ATGzPpMz3rwVbUWl6DyU" FilePath="WixToolset.Mba.Host.config" FileSize="783" Hash="B5BDD5E7179A94C2C817069913CA8C099DF811B9" Packaging="embedded" SourcePath="u0" /><Payload Id="payxj4zDAKL2NVlz4ohp0GvwFHepyI" FilePath="TestBA.dll" FileSize="25088" Hash="DB12DB6565CDBC4E9705204830E421ACEB710129" Packaging="embedded" SourcePath="u1" /><Payload Id="pay1hOSAUC8_D633cD2TXpIXCL30OU" FilePath="mbanative.dll" FileSize="118272" Hash="3A7A20D97B0546A23A025EE5774BE237C14D2957" Packaging="embedded" SourcePath="u2" /><Payload Id="payujy6Izl_BlUNfHt2eI.ADfjYAv4" FilePath="WixToolset.Mba.Core.dll" FileSize="114688" Hash="56BA3EA94BEBF8EB562C914495E1594E74F05DBE" Packaging="embedded" SourcePath="u3" /><Payload Id="payR4EbR4OTDZpPEycWaSSM_gZRBWM" FilePath="mbapreq.thm" FileSize="3599" Hash="8D9797C1E1A50AECB8B85FFCEA6A2A2EF611BD7F" Packaging="embedded" SourcePath="u4" /><Payload Id="paylVCy2Ecl8pHPdJTCQZryUG4T9us" FilePath="mbapreq.png" FileSize="797" Hash="75AE41181581FD6376CA9CA88147011E48BF9A30" Packaging="embedded" SourcePath="u5" /><Payload Id="payTaG4B_lob1aLcKFaOqSSG3MPMpU" FilePath="mbapreq.wxl" FileSize="2237" Hash="068B3C5E27AECE7987EABAA2802C9EB07B39EAF8" Packaging="embedded" SourcePath="u6" /><Payload Id="payZwIGuiezVTitZOoZKxyh2DdRSGs" FilePath="1028\mbapreq.wxl" FileSize="1998" Hash="A989D9B892F497215D81F903591ECB6CD50CFFFC" Packaging="embedded" SourcePath="u7" /><Payload Id="pay.herBWX.LlOh8jLsx24aWdunV_0" FilePath="1029\mbapreq.wxl" FileSize="2428" Hash="E6B8E4B1AA89430EB6A5A1E997CA3D1D2F968285" Packaging="embedded" SourcePath="u8" /><Payload Id="pay8DkMszYsoxxdgX14huLDMYXylQg" FilePath="1030\mbapreq.wxl" FileSize="2256" Hash="612CD2FD0CF3800639385C0BF4D805B24507D356" Packaging="embedded" SourcePath="u9" /><Payload Id="payPaHpoTeOdkW.TK99IDwktNLhTAg" FilePath="1031\mbapreq.wxl" FileSize="2409" Hash="E59A8F11D95AC17FC70BD718706EE36BFA50EF02" Packaging="embedded" SourcePath="u10" /><Payload Id="pay45AtAzterLTMzZgdxxtuYvaiXwU" FilePath="1032\mbapreq.wxl" FileSize="3368" Hash="154E0A658BA7EE59889224A231423634A9725547" Packaging="embedded" SourcePath="u11" /><Payload Id="payA2VEKIqhePyNIEmr14eyH3JoVLc" FilePath="1035\mbapreq.wxl" FileSize="2205" Hash="6AAE55269E42F99A5D88ADD18C433384DEB9E956" Packaging="embedded" SourcePath="u12" /><Payload Id="payvre23ObscjzhcaFIifUAkXMdPa8" FilePath="1036\mbapreq.wxl" FileSize="2276" Hash="7DC74874357F50AE8C4871D8F4DC06B337CF6352" Packaging="embedded" SourcePath="u13" /><Payload Id="paytxUV3vuBbG2c.a9c.d_sZX2x6wA" FilePath="1038\mbapreq.wxl" FileSize="2362" Hash="B60C34DE38E6E48BA0841E8A962C17179FC1B69A" Packaging="embedded" SourcePath="u14" /><Payload Id="payYvMWRK9xelo5.sQn7jRkJIaBp9A" FilePath="1040\mbapreq.wxl" FileSize="2273" Hash="902D231AD6306087F215DEABB7F2AB2F8072C401" Packaging="embedded" SourcePath="u15" /><Payload Id="pay68KKSApyQimbA25t6kSbqhdeH10" FilePath="1041\mbapreq.wxl" FileSize="2518" Hash="4095A1AFCF18C01F7DA51A1A389C2FBBB1A82A12" Packaging="embedded" SourcePath="u16" /><Payload Id="paypiqxaHpYZqx.9eDVjQrj1igLbRY" FilePath="1042\mbapreq.wxl" FileSize="2209" Hash="99CE8B42300EF656E6BD44F01766DC638CB0496F" Packaging="embedded" SourcePath="u17" /><Payload Id="payTO0YwZzxKpbqdrBVUcVRTu3BFe8" FilePath="1043\mbapreq.wxl" FileSize="2282" Hash="87117EE32E0004E25DDCEB1A7D417F3A02856A50" Packaging="embedded" SourcePath="u18" /><Payload Id="payIXg2ldBJukRzhqWolJVOEbTmF34" FilePath="1044\mbapreq.wxl" FileSize="2141" Hash="5AED841C6A870C3A8BAF8A10D00F887A781D0CF0" Packaging="embedded" SourcePath="u19" /><Payload Id="payOHIZbSkIvrpwKkkXI173tv3u3B4" FilePath="1045\mbapreq.wxl" FileSize="2338" Hash="07E37CBC59298F24A5C8C3B8FEB7A45DADF8CD07" Packaging="embedded" SourcePath="u20" /><Payload Id="payQRQ_UZl_R2UtV0xDXB2yeH2bg3E" FilePath="1046\mbapreq.wxl" FileSize="2118" Hash="AEC0CE51E8E335E9B86F1AC7E39CCD172B896582" Packaging="embedded" SourcePath="u21" /><Payload Id="payhrejLLBfc1i27iN._QPhQ4K337I" FilePath="1049\mbapreq.wxl" FileSize="2851" Hash="9628BADB173B171ED85D902634D9AA5D91FE9721" Packaging="embedded" SourcePath="u22" /><Payload Id="payqEzaDNzxB68vGp29jgDcCos6dvg" FilePath="1051\mbapreq.wxl" FileSize="2304" Hash="B584E8C0D7F9B7A1BB70BC00E42BFD35BED5D81D" Packaging="embedded" SourcePath="u23" /><Payload Id="paydz8Vk8xSTyYohgGXTSIxWGXL5.Q" FilePath="1053\mbapreq.wxl" FileSize="2102" Hash="67E93F555DBFEF8508E79F7CA8CE76B881308760" Packaging="embedded" SourcePath="u24" /><Payload Id="pay0HRUZTlbC3taSOffJBsEj92Br8Y" FilePath="1055\mbapreq.wxl" FileSize="2273" Hash="AEB8C90D66942A5CD73EA52A6F2ADD4F7D518A0D" Packaging="embedded" SourcePath="u25" /><Payload Id="payIvUOkc_EMH7laMFehefNolV8hZo" FilePath="1060\mbapreq.wxl" FileSize="2170" Hash="B1D4B71907B8BD82DD8B047404AF10FDBBE5CBA0" Packaging="embedded" SourcePath="u26" /><Payload Id="payLFhOb.rHuk4sW5CYAPMShG0NjGI" FilePath="2052\mbapreq.wxl" FileSize="1953" Hash="C8FB8982EC71C48D6EA021ADD9AAA7BCB0656281" Packaging="embedded" SourcePath="u27" /><Payload Id="payqIKCmERK7Nhxx_nNXvRxdKqKDbI" FilePath="2070\mbapreq.wxl" FileSize="2182" Hash="825F27A543907ED27E815EC67DFD48AF7BF5831E" Packaging="embedded" SourcePath="u28" /><Payload Id="payqeWUzIVaEqjuRXN0z8ECC3Y4tCc" FilePath="3082\mbapreq.wxl" FileSize="2369" Hash="39C07C31077AAFDC0DD208273AA41654CAD80FDD" Packaging="embedded" SourcePath="u29" /><Payload Id="paylfeHEjJSSTnNzY9QMZM2Ye3Ipy4" FilePath="mbapreq.dll" FileSize="245760" Hash="6499FA21D178131DDE13A4EF44ABEC32E91D65D4" Packaging="embedded" SourcePath="u31" /><Payload Id="payDPxs6uy8nbky.R7zhir2RRAfc.c" FilePath="WixToolset.Mba.Host.dll" FileSize="11264" Hash="9E6452891E401EB211DD41550A09FDF98EC0992F" Packaging="embedded" SourcePath="u32" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" FileSize="14292" Hash="CDF09A0723F4F33C13670BBAFCFFA7E660E15DFC" Packaging="embedded" SourcePath="u33" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" FileSize="252" Hash="86688B13D3364ADB90BBA552F544D4D546AFD63D" Packaging="embedded" SourcePath="u34" /></UX><Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1479400" Hash="5A84A8E612E270E27D0061D58DB6B470153BE1F9" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /><Payload Id="PackageA" FilePath="PackageAv1.msi" FileSize="32768" Hash="2369B16B7219B3C834DFBC5D2AF8B2EF8803D43D" Packaging="external" SourcePath="PackageAv1.msi" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{22D1DDBA-284D-40A7-BD14-95EA07906F21}" ExecutableName="BundleA.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{DC94A8E0-4BF4-4026-B80B-2755DAFC05D3}"><Arp Register="yes" DisplayName="~SlipstreamTests - BundleA" DisplayVersion="1.0.0.0" /></Registration><Chain><ExePackage Id="NetFx48Web" Cache="keep" CacheId="5A84A8E612E270E27D0061D58DB6B470153BE1F9" InstallSize="1479400" Size="1479400" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" RepairArguments="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" Repairable="yes" Uninstallable="no" Protocol="netfx4" DetectionType="condition"><PayloadRef Id="NetFx48Web" /></ExePackage><MsiPackage Id="PackageA" Cache="keep" CacheId="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}v1.0.0.0" InstallSize="2103" Size="32768" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Language="1033" Version="1.0.0.0" UpgradeCode="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}"><MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /><MsiProperty Id="MSIFASTINSTALL" Value="7" /><Provides Key="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Version="1.0.0.0" DisplayName="~SlipstreamTests - PackageA" /><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="no"><Language Id="1033" /></RelatedPackage><RelatedPackage Id="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="no"><Language Id="1033" /></RelatedPackage><PayloadRef Id="PackageA" /></MsiPackage></Chain><PatchTargetCode TargetCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Product="yes" /><CommandLine Variables="upperCase" /></BurnManifest>
src/test/burn/TestData/DependencyTests/BundleD/BundleD.wxs
+1 -1
@@ -4,7 +4,7 @@
4 <Fragment>
5 <PackageGroup Id="BundlePackages">
6 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
7 - <ExePackage Id="TestExe" Cache="remove" PerMachine="yes" Permanent="yes" InstallArguments="/ec 1603">
7 + <ExePackage Id="TestExe" Cache="remove" PerMachine="yes" Permanent="yes" DetectCondition="" InstallArguments="/ec 1603">
8 <PayloadGroupRef Id="TestExePayloads" />
9 </ExePackage>
10 </PackageGroup>
src/test/burn/TestData/ExePackageTests/BrokenPerUserArpEntryExePackage/BrokenPerUserArpEntryExePackage.wixproj new
+17
@@ -0,0 +1,17 @@
1 +<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2 +<Project Sdk="WixToolset.Sdk">
3 + <PropertyGroup>
4 + <OutputType>Bundle</OutputType>
5 + <UpgradeCode>{A843CC02-6814-48F5-997D-052073BAE744}</UpgradeCode>
6 + </PropertyGroup>
7 + <ItemGroup>
8 + <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
9 + </ItemGroup>
10 + <ItemGroup>
11 + <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
12 + </ItemGroup>
13 + <ItemGroup>
14 + <PackageReference Include="WixToolset.Bal.wixext" />
15 + <PackageReference Include="WixToolset.NetFx.wixext" />
16 + </ItemGroup>
17 +</Project>
\ No newline at end of file
src/test/burn/TestData/ExePackageTests/BrokenPerUserArpEntryExePackage/BrokenPerUserArpEntryExePackage.wxs new
+18
@@ -0,0 +1,18 @@
1 +<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2 +
3 +<?define ArpId = {DE9F8594-5856-4454-AB10-3C01ED246D7D}?>
4 +<?define ArpKeyPath = HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(var.ArpId)?>
5 +<?define ArpVersion = 1.0.0.0?>
6 +
7 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
8 + <Fragment>
9 + <PackageGroup Id="BundlePackages">
10 + <ExePackage Id="TestExe" PerMachine="no"
11 + InstallArguments="/regw &quot;$(var.ArpKeyPath),DisplayVersion,String,$(var.ArpVersion)&quot;">
12 + <ArpEntry Id="$(var.ArpId)" Version="$(var.ArpVersion)" Win64="no" />
13 +
14 + <PayloadGroupRef Id="TestExePayloads" />
15 + </ExePackage>
16 + </PackageGroup>
17 + </Fragment>
18 +</Wix>
src/test/burn/TestData/ExePackageTests/PackageFail/PackageFail.wixproj new
+12
@@ -0,0 +1,12 @@
1 +<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2 +<Project Sdk="WixToolset.Sdk">
3 + <PropertyGroup>
4 + <UpgradeCode>{6C5A2C71-2009-4B52-BC20-C1C6A5C87EA6}</UpgradeCode>
5 + </PropertyGroup>
6 + <ItemGroup>
7 + <Compile Include="..\..\Templates\PackageFail.wxs" Link="PackageFail.wxs" />
8 + </ItemGroup>
9 + <ItemGroup>
10 + <PackageReference Include="WixToolset.Util.wixext" />
11 + </ItemGroup>
12 +</Project>
\ No newline at end of file
src/test/burn/TestData/ExePackageTests/PerMachineArpEntryExePackage/PerMachineArpEntryExePackage.wixproj new
+19
@@ -0,0 +1,19 @@
1 +<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2 +<Project Sdk="WixToolset.Sdk">
3 + <PropertyGroup>
4 + <OutputType>Bundle</OutputType>
5 + <InstallerPlatform>x64</InstallerPlatform>
6 + <BA>TestBA_x64</BA>
7 + <UpgradeCode>{5923A558-091E-4015-A9CC-BA92E7A2405A}</UpgradeCode>
8 + </PropertyGroup>
9 + <ItemGroup>
10 + <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
11 + </ItemGroup>
12 + <ItemGroup>
13 + <ProjectReference Include="..\..\TestBA\TestBAWixlib_x64\testbawixlib_x64.wixproj" />
14 + </ItemGroup>
15 + <ItemGroup>
16 + <PackageReference Include="WixToolset.Bal.wixext" />
17 + <PackageReference Include="WixToolset.NetFx.wixext" />
18 + </ItemGroup>
19 +</Project>
\ No newline at end of file
src/test/burn/TestData/ExePackageTests/PerMachineArpEntryExePackage/PerMachineArpEntryExePackage.wxs new
+18
@@ -0,0 +1,18 @@
1 +<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2 +
3 +<?define ArpId = {4D9EC36A-1E63-4244-875C-3ECB0A2CAE30}?>
4 +<?define ArpKeyPath = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(var.ArpId)?>
5 +<?define ArpVersion = 1.0.0.0?>
6 +
7 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
8 + <Fragment>
9 + <PackageGroup Id="BundlePackages">
10 + <ExePackage Id="TestExe" PerMachine="yes"
11 + InstallArguments="/regw &quot;$(var.ArpKeyPath),DisplayVersion,String,$(var.ArpVersion)&quot; /regw &quot;$(var.ArpKeyPath),QuietUninstallString,String,\&quot;[WixBundleExecutePackageCacheFolder]testexe.exe\&quot; /regd \&quot;$(var.ArpKeyPath)\&quot;&quot;">
12 + <ArpEntry Id="$(var.ArpId)" Version="$(var.ArpVersion)" Win64="yes" />
13 +
14 + <PayloadGroupRef Id="TestExePayloads_x64" />
15 + </ExePackage>
16 + </PackageGroup>
17 + </Fragment>
18 +</Wix>
src/test/burn/TestData/ExePackageTests/PerMachineArpEntryExePackageFailure/PerMachineArpEntryExePackageFailure.wixproj new
+18
@@ -0,0 +1,18 @@
1 +<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2 +<Project Sdk="WixToolset.Sdk">
3 + <PropertyGroup>
4 + <OutputType>Bundle</OutputType>
5 + <UpgradeCode>{6436F747-08F7-416F-BE92-DB48F282AFC1}</UpgradeCode>
6 + </PropertyGroup>
7 + <ItemGroup>
8 + <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
9 + </ItemGroup>
10 + <ItemGroup>
11 + <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
12 + <ProjectReference Include="..\PackageFail\PackageFail.wixproj" />
13 + </ItemGroup>
14 + <ItemGroup>
15 + <PackageReference Include="WixToolset.Bal.wixext" />
16 + <PackageReference Include="WixToolset.NetFx.wixext" />
17 + </ItemGroup>
18 +</Project>
\ No newline at end of file
src/test/burn/TestData/ExePackageTests/PerMachineArpEntryExePackageFailure/PerMachineArpEntryExePackageFailure.wxs new
+19
@@ -0,0 +1,19 @@
1 +<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2 +
3 +<?define ArpId = {80E90929-EEA5-48A7-A680-A0237A1CAD84}?>
4 +<?define ArpKeyPath = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(var.ArpId)?>
5 +<?define ArpVersion = 1.0.0.0?>
6 +
7 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
8 + <Fragment>
9 + <PackageGroup Id="BundlePackages">
10 + <ExePackage Id="TestExe" PerMachine="yes"
11 + InstallArguments="/regw &quot;$(var.ArpKeyPath),DisplayVersion,String,$(var.ArpVersion)&quot; /regw &quot;$(var.ArpKeyPath),QuietUninstallString,String,\&quot;[WixBundleExecutePackageCacheFolder]testexe.exe\&quot; /regd \&quot;$(var.ArpKeyPath)\&quot;&quot;">
12 + <ArpEntry Id="$(var.ArpId)" Version="$(var.ArpVersion)" Win64="no" />
13 +
14 + <PayloadGroupRef Id="TestExePayloads" />
15 + </ExePackage>
16 + <MsiPackage Id="PackageFail" SourceFile="$(var.PackageFail.TargetPath)" />
17 + </PackageGroup>
18 + </Fragment>
19 +</Wix>
src/test/burn/TestData/ExePackageTests/PerUserArpEntryExePackage/PerUserArpEntryExePackage.wixproj new
+17
@@ -0,0 +1,17 @@
1 +<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2 +<Project Sdk="WixToolset.Sdk">
3 + <PropertyGroup>
4 + <OutputType>Bundle</OutputType>
5 + <UpgradeCode>{E4683E88-AF03-40D0-B308-5C084B0E1FA0}</UpgradeCode>
6 + </PropertyGroup>
7 + <ItemGroup>
8 + <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
9 + </ItemGroup>
10 + <ItemGroup>
11 + <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
12 + </ItemGroup>
13 + <ItemGroup>
14 + <PackageReference Include="WixToolset.Bal.wixext" />
15 + <PackageReference Include="WixToolset.NetFx.wixext" />
16 + </ItemGroup>
17 +</Project>
\ No newline at end of file
src/test/burn/TestData/ExePackageTests/PerUserArpEntryExePackage/PerUserArpEntryExePackage.wxs new
+18
@@ -0,0 +1,18 @@
1 +<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2 +
3 +<?define ArpId = {9B5300C7-9B34-4670-9614-185B02AB87EF}?>
4 +<?define ArpKeyPath = HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(var.ArpId)?>
5 +<?define ArpVersion = 1.0.0.0?>
6 +
7 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
8 + <Fragment>
9 + <PackageGroup Id="BundlePackages">
10 + <ExePackage Id="TestExe" PerMachine="no"
11 + InstallArguments="/regw &quot;$(var.ArpKeyPath),DisplayVersion,String,$(var.ArpVersion)&quot; /regw &quot;$(var.ArpKeyPath),QuietUninstallString,String,\&quot;[WixBundleExecutePackageCacheFolder]testexe.exe\&quot; /regd \&quot;$(var.ArpKeyPath)\&quot;&quot;">
12 + <ArpEntry Id="$(var.ArpId)" Version="$(var.ArpVersion)" Win64="no" />
13 +
14 + <PayloadGroupRef Id="TestExePayloads" />
15 + </ExePackage>
16 + </PackageGroup>
17 + </Fragment>
18 +</Wix>
src/test/burn/WixTestTools/ArpEntryInstaller.cs new
+43
@@ -0,0 +1,43 @@
1 +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 +
3 +namespace WixTestTools
4 +{
5 + using System;
6 + using Xunit;
7 +
8 + public partial class ArpEntryInstaller : IDisposable
9 + {
10 + public ArpEntryInstaller(WixTestContext testContext, string id, bool perMachine = true, bool x64 = false)
11 + {
12 + this.ArpId = id;
13 + this.PerMachine = perMachine;
14 + this.X64 = x64;
15 + this.TestContext = testContext;
16 + }
17 +
18 + public string ArpId { get; }
19 +
20 + public bool PerMachine { get; }
21 +
22 + public bool X64 { get; }
23 +
24 + private WixTestContext TestContext { get; }
25 +
26 + public void Unregister(bool assertIfMissing = true)
27 + {
28 + if (this.TryGetRegistration(out var registration))
29 + {
30 + registration.Delete();
31 + }
32 + else
33 + {
34 + Assert.True(false, "Tried to unregister when not registered.");
35 + }
36 + }
37 +
38 + public void Dispose()
39 + {
40 + this.Unregister(false);
41 + }
42 + }
43 +}
src/test/burn/WixTestTools/ArpEntryVerifier.cs new
+24
@@ -0,0 +1,24 @@
1 +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 +
3 +namespace WixTestTools
4 +{
5 + using Xunit;
6 +
7 + public partial class ArpEntryInstaller
8 + {
9 + public bool TryGetRegistration(out GenericArpRegistration registration)
10 + {
11 + bool success = !this.PerMachine ? GenericArpRegistration.TryGetPerUserRegistrationById(this.ArpId, out registration)
12 + : GenericArpRegistration.TryGetPerMachineRegistrationById(this.ArpId, this.X64, out registration);
13 +
14 + return success;
15 + }
16 +
17 + public void VerifyRegistered(bool registered)
18 + {
19 + bool success = this.TryGetRegistration(out _);
20 +
21 + Assert.Equal(registered, success);
22 + }
23 + }
24 +}
src/test/burn/WixTestTools/BundleRegistration.cs
+17 -104
@@ -5,108 +5,51 @@ namespace WixTestTools
5 using System;
6 using Microsoft.Win32;
7
8 - public class BundleRegistration
8 + public class BundleRegistration : GenericArpRegistration
9 {
10 - public const string BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
11 - public const string BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY_WOW6432NODE = "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
12 - public const string BURN_REGISTRATION_REGISTRY_BUNDLE_CACHE_PATH = "BundleCachePath";
10 public const string BURN_REGISTRATION_REGISTRY_BUNDLE_ADDON_CODE = "BundleAddonCode";
11 + public const string BURN_REGISTRATION_REGISTRY_BUNDLE_CACHE_PATH = "BundleCachePath";
12 public const string BURN_REGISTRATION_REGISTRY_BUNDLE_DETECT_CODE = "BundleDetectCode";
13 public const string BURN_REGISTRATION_REGISTRY_BUNDLE_PATCH_CODE = "BundlePatchCode";
14 + public const string BURN_REGISTRATION_REGISTRY_BUNDLE_PROVIDER_KEY = "BundleProviderKey";
15 + public const string BURN_REGISTRATION_REGISTRY_BUNDLE_RESUME_COMMAND_LINE = "BundleResumeCommandLine";
16 + public const string BURN_REGISTRATION_REGISTRY_BUNDLE_TAG = "BundleTag";
17 public const string BURN_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE = "BundleUpgradeCode";
17 - public const string BURN_REGISTRATION_REGISTRY_BUNDLE_DISPLAY_NAME = "DisplayName";
18 public const string BURN_REGISTRATION_REGISTRY_BUNDLE_VERSION = "BundleVersion";
19 public const string BURN_REGISTRATION_REGISTRY_ENGINE_VERSION = "EngineVersion";
20 - public const string BURN_REGISTRATION_REGISTRY_BUNDLE_PROVIDER_KEY = "BundleProviderKey";
21 - public const string BURN_REGISTRATION_REGISTRY_BUNDLE_TAG = "BundleTag";
22 - public const string REGISTRY_REBOOT_PENDING_FORMAT = "{0}.RebootRequired";
23 - public const string REGISTRY_BUNDLE_INSTALLED = "Installed";
24 - public const string REGISTRY_BUNDLE_DISPLAY_ICON = "DisplayIcon";
25 - public const string REGISTRY_BUNDLE_DISPLAY_VERSION = "DisplayVersion";
26 - public const string REGISTRY_BUNDLE_ESTIMATED_SIZE = "EstimatedSize";
27 - public const string REGISTRY_BUNDLE_PUBLISHER = "Publisher";
28 - public const string REGISTRY_BUNDLE_HELP_LINK = "HelpLink";
29 - public const string REGISTRY_BUNDLE_HELP_TELEPHONE = "HelpTelephone";
30 - public const string REGISTRY_BUNDLE_URL_INFO_ABOUT = "URLInfoAbout";
31 - public const string REGISTRY_BUNDLE_URL_UPDATE_INFO = "URLUpdateInfo";
32 - public const string REGISTRY_BUNDLE_PARENT_DISPLAY_NAME = "ParentDisplayName";
33 - public const string REGISTRY_BUNDLE_PARENT_KEY_NAME = "ParentKeyName";
34 - public const string REGISTRY_BUNDLE_COMMENTS = "Comments";
35 - public const string REGISTRY_BUNDLE_CONTACT = "Contact";
36 - public const string REGISTRY_BUNDLE_NO_MODIFY = "NoModify";
37 - public const string REGISTRY_BUNDLE_MODIFY_PATH = "ModifyPath";
38 - public const string REGISTRY_BUNDLE_NO_ELEVATE_ON_MODIFY = "NoElevateOnModify";
39 - public const string REGISTRY_BUNDLE_NO_REMOVE = "NoRemove";
40 - public const string REGISTRY_BUNDLE_SYSTEM_COMPONENT = "SystemComponent";
41 - public const string REGISTRY_BUNDLE_QUIET_UNINSTALL_STRING = "QuietUninstallString";
42 - public const string REGISTRY_BUNDLE_UNINSTALL_STRING = "UninstallString";
43 - public const string REGISTRY_BUNDLE_RESUME_COMMAND_LINE = "BundleResumeCommandLine";
44 - public const string REGISTRY_BUNDLE_VERSION_MAJOR = "VersionMajor";
45 - public const string REGISTRY_BUNDLE_VERSION_MINOR = "VersionMinor";
20
21 public string[] AddonCodes { get; set; }
22
49 - public string CachePath { get; set; }
23 + public string BundleVersion { get; set; }
24
51 - public string DisplayName { get; set; }
25 + public string CachePath { get; set; }
26
27 public string[] DetectCodes { get; set; }
28
29 public string EngineVersion { get; set; }
30
57 - public int? EstimatedSize { get; set; }
58 -
59 - public int? Installed { get; set; }
60 -
61 - public string ModifyPath { get; set; }
62 -
31 public string[] PatchCodes { get; set; }
32
33 public string ProviderKey { get; set; }
34
67 - public string Publisher { get; set; }
68 -
69 - public int? SystemComponent { get; set; }
70 -
71 - public string QuietUninstallString { get; set; }
72 -
73 - public string QuietUninstallCommand { get; set; }
74 -
75 - public string QuietUninstallCommandArguments { get; set; }
76 -
35 public string Tag { get; set; }
36
79 - public string UninstallCommand { get; set; }
80 -
81 - public string UninstallCommandArguments { get; set; }
82 -
83 - public string UninstallString { get; set; }
84 -
37 public string[] UpgradeCodes { get; set; }
38
87 - public string UrlInfoAbout { get; set; }
88 -
89 - public string UrlUpdateInfo { get; set; }
90 -
91 - public string Version { get; set; }
39 + public static bool TryGetPerMachineBundleRegistrationById(string id, bool x64, out BundleRegistration registration)
40 + {
41 + return TryGetRegistrationById(id, x64, false, out registration);
42 + }
43
93 - public static bool TryGetPerMachineBundleRegistrationById(string bundleId, bool x64, out BundleRegistration registration)
44 + public static bool TryGetPerUserBundleRegistrationById(string id, out BundleRegistration registration)
45 {
95 - var baseKeyPath = x64 ? BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY : BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY_WOW6432NODE;
96 - var registrationKeyPath = $"{baseKeyPath}\\{bundleId}";
97 - using var registrationKey = Registry.LocalMachine.OpenSubKey(registrationKeyPath);
98 - var success = registrationKey != null;
99 - registration = success ? GetBundleRegistration(registrationKey) : null;
100 - return success;
46 + return TryGetRegistrationById(id, true, true, out registration);
47 }
48
103 - public static bool TryGetPerUserBundleRegistrationById(string bundleId, out BundleRegistration registration)
49 + private static bool TryGetRegistrationById(string id, bool x64, bool perUser, out BundleRegistration registration)
50 {
105 - var registrationKeyPath = $"{BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY}\\{bundleId}";
106 - using var registrationKey = Registry.CurrentUser.OpenSubKey(registrationKeyPath);
107 - var success = registrationKey != null;
108 - registration = success ? GetBundleRegistration(registrationKey) : null;
109 - return success;
51 + registration = GetGenericArpRegistration(id, x64, perUser, key => GetBundleRegistration(key));
52 + return registration != null;
53 }
54
55 private static BundleRegistration GetBundleRegistration(RegistryKey idKey)
@@ -120,38 +63,8 @@ namespace WixTestTools
63 registration.ProviderKey = idKey.GetValue(BURN_REGISTRATION_REGISTRY_BUNDLE_PROVIDER_KEY) as string;
64 registration.Tag = idKey.GetValue(BURN_REGISTRATION_REGISTRY_BUNDLE_TAG) as string;
65 registration.UpgradeCodes = idKey.GetValue(BURN_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE) as string[];
123 - registration.Version = idKey.GetValue(BURN_REGISTRATION_REGISTRY_BUNDLE_VERSION) as string;
124 - registration.DisplayName = idKey.GetValue(BURN_REGISTRATION_REGISTRY_BUNDLE_DISPLAY_NAME) as string;
66 + registration.BundleVersion = idKey.GetValue(BURN_REGISTRATION_REGISTRY_BUNDLE_VERSION) as string;
67 registration.EngineVersion = idKey.GetValue(BURN_REGISTRATION_REGISTRY_ENGINE_VERSION) as string;
126 - registration.EstimatedSize = idKey.GetValue(REGISTRY_BUNDLE_ESTIMATED_SIZE) as int?;
127 - registration.Installed = idKey.GetValue(REGISTRY_BUNDLE_INSTALLED) as int?;
128 - registration.ModifyPath = idKey.GetValue(REGISTRY_BUNDLE_MODIFY_PATH) as string;
129 - registration.Publisher = idKey.GetValue(REGISTRY_BUNDLE_PUBLISHER) as string;
130 - registration.SystemComponent = idKey.GetValue(REGISTRY_BUNDLE_SYSTEM_COMPONENT) as int?;
131 - registration.UrlInfoAbout = idKey.GetValue(REGISTRY_BUNDLE_URL_INFO_ABOUT) as string;
132 - registration.UrlUpdateInfo = idKey.GetValue(REGISTRY_BUNDLE_URL_UPDATE_INFO) as string;
133 -
134 - registration.QuietUninstallString = idKey.GetValue(REGISTRY_BUNDLE_QUIET_UNINSTALL_STRING) as string;
135 - if (!String.IsNullOrEmpty(registration.QuietUninstallString))
136 - {
137 - var closeQuote = registration.QuietUninstallString.IndexOf("\"", 1);
138 - if (closeQuote > 0)
139 - {
140 - registration.QuietUninstallCommand = registration.QuietUninstallString.Substring(1, closeQuote - 1).Trim();
141 - registration.QuietUninstallCommandArguments = registration.QuietUninstallString.Substring(closeQuote + 1).Trim();
142 - }
143 - }
144 -
145 - registration.UninstallString = idKey.GetValue(REGISTRY_BUNDLE_UNINSTALL_STRING) as string;
146 - if (!String.IsNullOrEmpty(registration.UninstallString))
147 - {
148 - var closeQuote = registration.UninstallString.IndexOf("\"", 1);
149 - if (closeQuote > 0)
150 - {
151 - registration.UninstallCommand = registration.UninstallString.Substring(1, closeQuote - 1).Trim();
152 - registration.UninstallCommandArguments = registration.UninstallString.Substring(closeQuote + 1).Trim();
153 - }
154 - }
68
69 return registration;
70 }
src/test/burn/WixTestTools/BundleVerifier.cs
+23
@@ -80,6 +80,29 @@ namespace WixTestTools
80 File.Delete(expectedCachePath);
81 }
82
83 + public bool TryGetArpEntryExePackageConfiguration(string packageId, out string arpId, out string arpVersion, out bool arpWin64, out bool perMachine)
84 + {
85 + using var wixOutput = WixOutput.Read(this.BundlePdb);
86 + var intermediate = Intermediate.Load(wixOutput);
87 + var section = intermediate.Sections.Single();
88 + var packageSymbol = section.Symbols.OfType<WixBundlePackageSymbol>().SingleOrDefault(p => p.Id.Id == packageId);
89 + var exePackageSymbol = section.Symbols.OfType<WixBundleExePackageSymbol>().SingleOrDefault(p => p.Id.Id == packageId);
90 + if (packageSymbol == null || exePackageSymbol == null || exePackageSymbol.DetectionType != WixBundleExePackageDetectionType.Arp)
91 + {
92 + arpId = null;
93 + arpVersion = null;
94 + arpWin64 = false;
95 + perMachine = false;
96 + return false;
97 + }
98 +
99 + arpId = exePackageSymbol.ArpId;
100 + arpVersion = exePackageSymbol.ArpDisplayVersion;
101 + arpWin64 = exePackageSymbol.ArpWin64;
102 + perMachine = packageSymbol.PerMachine == true;
103 + return true;
104 + }
105 +
106 public bool TryGetRegistration(out BundleRegistration registration)
107 {
108 var bundleSymbol = this.GetBundleSymbol();
src/test/burn/WixTestTools/GenericArpRegistration.cs new
+143
@@ -0,0 +1,143 @@
1 +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 +
3 +namespace WixTestTools
4 +{
5 + using System;
6 + using Microsoft.Win32;
7 +
8 + public class GenericArpRegistration
9 + {
10 + public const string UNINSTALL_KEY = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
11 + public const string UNINSTALL_KEY_WOW6432NODE = "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
12 +
13 + public const string REGISTRY_ARP_INSTALLED = "Installed";
14 + public const string REGISTRY_ARP_DISPLAY_ICON = "DisplayIcon";
15 + public const string REGISTRY_ARP_DISPLAY_NAME = "DisplayName";
16 + public const string REGISTRY_ARP_DISPLAY_VERSION = "DisplayVersion";
17 + public const string REGISTRY_ARP_ESTIMATED_SIZE = "EstimatedSize";
18 + public const string REGISTRY_ARP_PUBLISHER = "Publisher";
19 + public const string REGISTRY_ARP_HELP_LINK = "HelpLink";
20 + public const string REGISTRY_ARP_HELP_TELEPHONE = "HelpTelephone";
21 + public const string REGISTRY_ARP_URL_INFO_ABOUT = "URLInfoAbout";
22 + public const string REGISTRY_ARP_URL_UPDATE_INFO = "URLUpdateInfo";
23 + public const string REGISTRY_ARP_COMMENTS = "Comments";
24 + public const string REGISTRY_ARP_CONTACT = "Contact";
25 + public const string REGISTRY_ARP_NO_MODIFY = "NoModify";
26 + public const string REGISTRY_ARP_MODIFY_PATH = "ModifyPath";
27 + public const string REGISTRY_ARP_NO_ELEVATE_ON_MODIFY = "NoElevateOnModify";
28 + public const string REGISTRY_ARP_NO_REMOVE = "NoRemove";
29 + public const string REGISTRY_ARP_SYSTEM_COMPONENT = "SystemComponent";
30 + public const string REGISTRY_ARP_QUIET_UNINSTALL_STRING = "QuietUninstallString";
31 + public const string REGISTRY_ARP_UNINSTALL_STRING = "UninstallString";
32 + public const string REGISTRY_ARP_VERSION_MAJOR = "VersionMajor";
33 + public const string REGISTRY_ARP_VERSION_MINOR = "VersionMinor";
34 +
35 + public RegistryKey BaseKey { get; set; }
36 +
37 + public string KeyPath { get; set; }
38 +
39 + public string DisplayName { get; set; }
40 +
41 + public string DisplayVersion { get; set; }
42 +
43 + public int? EstimatedSize { get; set; }
44 +
45 + public int? Installed { get; set; }
46 +
47 + public string ModifyPath { get; set; }
48 +
49 + public string Publisher { get; set; }
50 +
51 + public int? SystemComponent { get; set; }
52 +
53 + public string QuietUninstallString { get; set; }
54 +
55 + public string QuietUninstallCommand { get; set; }
56 +
57 + public string QuietUninstallCommandArguments { get; set; }
58 +
59 + public string UninstallCommand { get; set; }
60 +
61 + public string UninstallCommandArguments { get; set; }
62 +
63 + public string UninstallString { get; set; }
64 +
65 + public string UrlInfoAbout { get; set; }
66 +
67 + public string UrlUpdateInfo { get; set; }
68 +
69 + public static bool TryGetPerMachineRegistrationById(string id, bool x64, out GenericArpRegistration registration)
70 + {
71 + return TryGetRegistrationById(id, x64, false, out registration);
72 + }
73 +
74 + public static bool TryGetPerUserRegistrationById(string id, out GenericArpRegistration registration)
75 + {
76 + return TryGetRegistrationById(id, true, true, out registration);
77 + }
78 +
79 + private static bool TryGetRegistrationById(string id, bool x64, bool perUser, out GenericArpRegistration registration)
80 + {
81 + registration = GetGenericArpRegistration(id, x64, perUser, key => new GenericArpRegistration());
82 + return registration != null;
83 + }
84 +
85 + protected static T GetGenericArpRegistration<T>(string id, bool x64, bool perUser, Func<RegistryKey, T> fnCreate)
86 + where T : GenericArpRegistration
87 + {
88 + var baseKey = perUser ? Registry.CurrentUser : Registry.LocalMachine;
89 + var baseKeyPath = x64 ? UNINSTALL_KEY : UNINSTALL_KEY_WOW6432NODE;
90 + var registrationKeyPath = $"{baseKeyPath}\\{id}";
91 + using var idKey = baseKey.OpenSubKey(registrationKeyPath);
92 +
93 + if (idKey == null)
94 + {
95 + return null;
96 + }
97 +
98 + var registration = fnCreate(idKey);
99 +
100 + registration.BaseKey = baseKey;
101 + registration.KeyPath = registrationKeyPath;
102 +
103 + registration.DisplayName = idKey.GetValue(REGISTRY_ARP_DISPLAY_NAME) as string;
104 + registration.DisplayVersion = idKey.GetValue(REGISTRY_ARP_DISPLAY_VERSION) as string;
105 + registration.EstimatedSize = idKey.GetValue(REGISTRY_ARP_ESTIMATED_SIZE) as int?;
106 + registration.Installed = idKey.GetValue(REGISTRY_ARP_INSTALLED) as int?;
107 + registration.ModifyPath = idKey.GetValue(REGISTRY_ARP_MODIFY_PATH) as string;
108 + registration.Publisher = idKey.GetValue(REGISTRY_ARP_PUBLISHER) as string;
109 + registration.SystemComponent = idKey.GetValue(REGISTRY_ARP_SYSTEM_COMPONENT) as int?;
110 + registration.UrlInfoAbout = idKey.GetValue(REGISTRY_ARP_URL_INFO_ABOUT) as string;
111 + registration.UrlUpdateInfo = idKey.GetValue(REGISTRY_ARP_URL_UPDATE_INFO) as string;
112 +
113 + registration.QuietUninstallString = idKey.GetValue(REGISTRY_ARP_QUIET_UNINSTALL_STRING) as string;
114 + if (!String.IsNullOrEmpty(registration.QuietUninstallString))
115 + {
116 + var closeQuote = registration.QuietUninstallString.IndexOf("\"", 1);
117 + if (closeQuote > 0)
118 + {
119 + registration.QuietUninstallCommand = registration.QuietUninstallString.Substring(1, closeQuote - 1).Trim();
120 + registration.QuietUninstallCommandArguments = registration.QuietUninstallString.Substring(closeQuote + 1).Trim();
121 + }
122 + }
123 +
124 + registration.UninstallString = idKey.GetValue(REGISTRY_ARP_UNINSTALL_STRING) as string;
125 + if (!String.IsNullOrEmpty(registration.UninstallString))
126 + {
127 + var closeQuote = registration.UninstallString.IndexOf("\"", 1);
128 + if (closeQuote > 0)
129 + {
130 + registration.UninstallCommand = registration.UninstallString.Substring(1, closeQuote - 1).Trim();
131 + registration.UninstallCommandArguments = registration.UninstallString.Substring(closeQuote + 1).Trim();
132 + }
133 + }
134 +
135 + return registration;
136 + }
137 +
138 + public void Delete()
139 + {
140 + this.BaseKey.DeleteSubKeyTree(this.KeyPath);
141 + }
142 + }
143 +}
src/test/burn/WixToolsetTest.BurnE2E/BurnE2ETests.cs
+17
@@ -31,6 +31,23 @@ namespace WixToolsetTest.BurnE2E
31 this.Installers.Push(installer);
32 }
33
34 + protected ArpEntryInstaller CreateArpEntryInstaller(string id, bool perMachine = true, bool x64 = false)
35 + {
36 + var installer = new ArpEntryInstaller(this.TestContext, id, perMachine, x64);
37 + this.Installers.Push(installer);
38 + return installer;
39 + }
40 +
41 + protected ArpEntryInstaller CreateArpEntryInstaller(BundleInstaller bundleInstaller, string packageId)
42 + {
43 + if (!bundleInstaller.TryGetArpEntryExePackageConfiguration(packageId, out var arpId, out _, out var arpWin64, out var perMachine))
44 + {
45 + return null;
46 + }
47 +
48 + return this.CreateArpEntryInstaller(arpId, perMachine, arpWin64);
49 + }
50 +
51 protected BundleInstaller CreateBundleInstaller(string name)
52 {
53 var installer = new BundleInstaller(this.TestContext, name);
src/test/burn/WixToolsetTest.BurnE2E/CacheTests.cs
+2 -2
@@ -33,12 +33,12 @@ namespace WixToolsetTest.BurnE2E
33
34 if (!File.Exists(targetFilePath))
35 {
36 - var testTool = new TestTool(Path.Combine(TestData.Get(), "win-x86", "TestExe.exe"))
36 + var testExeTool = new TestExeTool
37 {
38 Arguments = "/lf \"" + targetFilePath + $"|{FiveGB}\"",
39 ExpectedExitCode = 0,
40 };
41 - testTool.Run(true);
41 + testExeTool.Run(true);
42 }
43 }
44
src/test/burn/WixToolsetTest.BurnE2E/ExePackageTests.cs new
+99
@@ -0,0 +1,99 @@
1 +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 +
3 +namespace WixToolsetTest.BurnE2E
4 +{
5 + using WixTestTools;
6 + using Xunit;
7 + using Xunit.Abstractions;
8 +
9 + public class ExePackageTests : BurnE2ETests
10 + {
11 + public ExePackageTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { }
12 +
13 + [RuntimeFact]
14 + public void CanInstallAndUninstallPerMachineArpEntryExePackage()
15 + {
16 + const string arpId = "{4D9EC36A-1E63-4244-875C-3ECB0A2CAE30}";
17 + var perMachineArpEntryExePackageBundle = this.CreateBundleInstaller(@"PerMachineArpEntryExePackage");
18 + var arpEntryExePackage = this.CreateArpEntryInstaller(perMachineArpEntryExePackageBundle, "TestExe");
19 +
20 + arpEntryExePackage.VerifyRegistered(false);
21 +
22 + var installLogPath = perMachineArpEntryExePackageBundle.Install();
23 + perMachineArpEntryExePackageBundle.VerifyRegisteredAndInPackageCache();
24 + arpEntryExePackage.VerifyRegistered(true);
25 +
26 + LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},QuietUninstallString,String,\\\"");
27 +
28 + var uninstallLogPath = perMachineArpEntryExePackageBundle.Uninstall();
29 + perMachineArpEntryExePackageBundle.VerifyUnregisteredAndRemovedFromPackageCache();
30 + arpEntryExePackage.VerifyRegistered(false);
31 +
32 + LogVerifier.MessageInLogFile(uninstallLogPath, $"testexe.exe\" /regd HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId}");
33 + }
34 +
35 + [RuntimeFact]
36 + public void CanUninstallPerMachineArpEntryExePackageOnRollback()
37 + {
38 + const string arpId = "{80E90929-EEA5-48A7-A680-A0237A1CAD84}";
39 + var perMachineArpEntryExePackageFailureBundle = this.CreateBundleInstaller(@"PerMachineArpEntryExePackageFailure");
40 + var arpEntryExePackage = this.CreateArpEntryInstaller(perMachineArpEntryExePackageFailureBundle, "TestExe");
41 +
42 + arpEntryExePackage.VerifyRegistered(false);
43 +
44 + var installLogPath = perMachineArpEntryExePackageFailureBundle.Install((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE);
45 + perMachineArpEntryExePackageFailureBundle.VerifyUnregisteredAndRemovedFromPackageCache();
46 + arpEntryExePackage.VerifyRegistered(false);
47 +
48 + LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},QuietUninstallString,String,\\\"");
49 + LogVerifier.MessageInLogFile(installLogPath, $"testexe.exe\" /regd HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId}");
50 + }
51 +
52 + [RuntimeFact]
53 + public void CanInstallAndUninstallPerUserArpEntryExePackage()
54 + {
55 + const string arpId = "{9B5300C7-9B34-4670-9614-185B02AB87EF}";
56 + var perUserArpEntryExePackageBundle = this.CreateBundleInstaller(@"PerUserArpEntryExePackage");
57 + var arpEntryExePackage = this.CreateArpEntryInstaller(perUserArpEntryExePackageBundle, "TestExe");
58 +
59 + arpEntryExePackage.VerifyRegistered(false);
60 +
61 + var installLogPath = perUserArpEntryExePackageBundle.Install();
62 + perUserArpEntryExePackageBundle.VerifyRegisteredAndInPackageCache();
63 + arpEntryExePackage.VerifyRegistered(true);
64 +
65 + LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},QuietUninstallString,String,\\\"");
66 +
67 + var uninstallLogPath = perUserArpEntryExePackageBundle.Uninstall();
68 + perUserArpEntryExePackageBundle.VerifyUnregisteredAndRemovedFromPackageCache();
69 + arpEntryExePackage.VerifyRegistered(false);
70 +
71 + LogVerifier.MessageInLogFile(uninstallLogPath, $"testexe.exe\" /regd HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId}");
72 + }
73 +
74 + [RuntimeFact]
75 + public void FailsUninstallWhenPerUserArpEntryExePackageMissingQuietUninstallString()
76 + {
77 + const string arpId = "{DE9F8594-5856-4454-AB10-3C01ED246D7D}";
78 + var brokenPerUserArpEntryExePackageBundle = this.CreateBundleInstaller(@"BrokenPerUserArpEntryExePackage");
79 + var arpEntryExePackage = this.CreateArpEntryInstaller(brokenPerUserArpEntryExePackageBundle, "TestExe");
80 +
81 + arpEntryExePackage.VerifyRegistered(false);
82 + brokenPerUserArpEntryExePackageBundle.VerifyUnregisteredAndRemovedFromPackageCache();
83 +
84 + var installLogPath = brokenPerUserArpEntryExePackageBundle.Install();
85 + brokenPerUserArpEntryExePackageBundle.VerifyRegisteredAndInPackageCache();
86 + arpEntryExePackage.VerifyRegistered(true);
87 +
88 + LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\"");
89 +
90 + brokenPerUserArpEntryExePackageBundle.Uninstall((int)MSIExec.MSIExecReturnCode.ERROR_INVALID_PARAMETER);
91 + brokenPerUserArpEntryExePackageBundle.VerifyRegisteredAndInPackageCache();
92 +
93 + arpEntryExePackage.Unregister();
94 +
95 + brokenPerUserArpEntryExePackageBundle.Uninstall();
96 + brokenPerUserArpEntryExePackageBundle.VerifyUnregisteredAndRemovedFromPackageCache();
97 + }
98 + }
99 +}
src/test/burn/WixToolsetTest.BurnE2E/Utilities/IWebServer.cs renamed
src/test/burn/WixToolsetTest.BurnE2E/Utilities/TestBAController.cs renamed
src/test/burn/WixToolsetTest.BurnE2E/Utilities/TestExeTool.cs new
+17
@@ -0,0 +1,17 @@
1 +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 +
3 +namespace WixTestTools
4 +{
5 + using System.IO;
6 + using WixBuildTools.TestSupport;
7 +
8 + public class TestExeTool : TestTool
9 + {
10 + private static readonly string TestExePath32 = Path.Combine(TestData.Get(), "win-x86", "TestExe.exe");
11 +
12 + public TestExeTool()
13 + : base(TestExePath32)
14 + {
15 + }
16 + }
17 +}
src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
+27 -3
@@ -411,13 +411,37 @@ namespace WixToolset.Core.Burn.Bundles
411 }
412 else if (package.SpecificPackageSymbol is WixBundleExePackageSymbol exePackage) // EXE
413 {
414 - writer.WriteAttributeString("DetectCondition", exePackage.DetectCondition);
414 writer.WriteAttributeString("InstallArguments", exePackage.InstallCommand);
416 - writer.WriteAttributeString("UninstallArguments", exePackage.UninstallCommand);
417 - writer.WriteAttributeString("Uninstallable", exePackage.Uninstallable ? "yes" : "no");
415 writer.WriteAttributeString("RepairArguments", exePackage.RepairCommand);
416 writer.WriteAttributeString("Repairable", exePackage.Repairable ? "yes" : "no");
417
418 + switch (exePackage.DetectionType)
419 + {
420 + case WixBundleExePackageDetectionType.Condition:
421 + writer.WriteAttributeString("DetectionType", "condition");
422 + writer.WriteAttributeString("DetectCondition", exePackage.DetectCondition);
423 +
424 + if (exePackage.Uninstallable)
425 + {
426 + writer.WriteAttributeString("UninstallArguments", exePackage.UninstallCommand);
427 + writer.WriteAttributeString("Uninstallable", "yes");
428 + }
429 + break;
430 + case WixBundleExePackageDetectionType.Arp:
431 + writer.WriteAttributeString("DetectionType", "arp");
432 + writer.WriteAttributeString("ArpId", exePackage.ArpId);
433 + writer.WriteAttributeString("ArpDisplayVersion", exePackage.ArpDisplayVersion);
434 +
435 + if (exePackage.ArpWin64)
436 + {
437 + writer.WriteAttributeString("ArpWin64", "yes");
438 + }
439 + break;
440 + case WixBundleExePackageDetectionType.None:
441 + writer.WriteAttributeString("DetectionType", "none");
442 + break;
443 + }
444 +
445 if (!String.IsNullOrEmpty(exePackage.ExeProtocol))
446 {
447 writer.WriteAttributeString("Protocol", exePackage.ExeProtocol);
src/wix/WixToolset.Core.Burn/Bundles/PerformBundleBackendValidationCommand.cs
+11 -1
@@ -109,7 +109,17 @@ namespace WixToolset.Core.Burn.Bundles
109
110 if (!packageSymbol.Permanent)
111 {
112 - this.BackendHelper.ValidateBundleCondition(symbol.SourceLineNumbers, "ExePackage", "DetectCondition", symbol.DetectCondition, BundleConditionPhase.Detect);
112 + if (symbol.DetectionType == WixBundleExePackageDetectionType.Condition)
113 + {
114 + this.BackendHelper.ValidateBundleCondition(symbol.SourceLineNumbers, "ExePackage", "DetectCondition", symbol.DetectCondition, BundleConditionPhase.Detect);
115 + }
116 + else if (symbol.DetectionType == WixBundleExePackageDetectionType.Arp)
117 + {
118 + if (!this.BackendHelper.IsValidWixVersion(symbol.ArpDisplayVersion))
119 + {
120 + this.Messaging.Write(WarningMessages.InvalidWixVersion(symbol.SourceLineNumbers, symbol.ArpDisplayVersion, "ArpEntry", "Version"));
121 + }
122 + }
123 }
124 }
125
src/wix/WixToolset.Core/Compiler_Bundle.cs
+216 -92
@@ -2026,6 +2026,10 @@ namespace WixToolset.Core
2026 var bundle = YesNoType.NotSet;
2027 var slipstream = YesNoType.NotSet;
2028 var hasPayloadInfo = false;
2029 + WixBundleExePackageDetectionType? exeDetectionType = WixBundleExePackageDetectionType.None;
2030 + string arpId = null;
2031 + string arpDisplayVersion = null;
2032 + var arpWin64 = YesNoType.NotSet;
2033
2034 var expectedNetFx4Args = new string[] { "/q", "/norestart" };
2035
@@ -2204,6 +2208,112 @@ namespace WixToolset.Core
2208 compilerPayload.FinishCompilingPackage();
2209 var id = compilerPayload.Id;
2210
2211 + // Now that the package ID is known, we can parse the extension attributes...
2212 + var contextValues = new Dictionary<string, string>() { { "PackageId", id.Id } };
2213 + foreach (var attribute in extensionAttributes)
2214 + {
2215 + this.Core.ParseExtensionAttribute(node, attribute, contextValues);
2216 + }
2217 +
2218 + if (packageType == WixBundlePackageType.Exe && (detectCondition != null || uninstallArguments != null))
2219 + {
2220 + exeDetectionType = WixBundleExePackageDetectionType.Condition;
2221 + }
2222 +
2223 + foreach (var child in node.Elements())
2224 + {
2225 + if (CompilerCore.WixNamespace == child.Name.Namespace)
2226 + {
2227 + var allowed = true;
2228 + switch (child.Name.LocalName)
2229 + {
2230 + case "ArpEntry":
2231 + allowed = packageType == WixBundlePackageType.Exe;
2232 + if (allowed)
2233 + {
2234 + if (exeDetectionType == WixBundleExePackageDetectionType.Arp)
2235 + {
2236 + this.Core.Write(ErrorMessages.TooManyChildren(Preprocessor.GetSourceLineNumbers(child), node.Name.LocalName, child.Name.LocalName));
2237 + }
2238 + else if (!exeDetectionType.HasValue || exeDetectionType.Value == WixBundleExePackageDetectionType.Condition)
2239 + {
2240 + exeDetectionType = null;
2241 + }
2242 + else
2243 + {
2244 + if (exeDetectionType.Value != WixBundleExePackageDetectionType.None)
2245 + {
2246 + throw new WixException($"Unexpected WixBundleExePackageDetectionType: {exeDetectionType}");
2247 + }
2248 +
2249 + exeDetectionType = WixBundleExePackageDetectionType.Arp;
2250 + }
2251 +
2252 + this.ParseExePackageArpEntryElement(child, out arpId, out arpDisplayVersion, out arpWin64);
2253 + }
2254 + break;
2255 + case "SlipstreamMsp":
2256 + allowed = (packageType == WixBundlePackageType.Msi);
2257 + if (allowed)
2258 + {
2259 + this.ParseSlipstreamMspElement(child, id.Id);
2260 + }
2261 + break;
2262 + case "MsiProperty":
2263 + allowed = (packageType == WixBundlePackageType.Msi || packageType == WixBundlePackageType.Msp);
2264 + if (allowed)
2265 + {
2266 + this.ParseMsiPropertyElement(child, id.Id);
2267 + }
2268 + break;
2269 + case "Payload":
2270 + this.ParsePayloadElement(child, ComplexReferenceParentType.Package, id);
2271 + break;
2272 + case "PayloadGroupRef":
2273 + this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Package, id);
2274 + break;
2275 + case "Provides":
2276 + this.ParseProvidesElement(child, packageType, id.Id, out _);
2277 + break;
2278 + case "ExitCode":
2279 + allowed = (packageType == WixBundlePackageType.Bundle || packageType == WixBundlePackageType.Exe);
2280 + if (allowed)
2281 + {
2282 + this.ParseExitCodeElement(child, id.Id);
2283 + }
2284 + break;
2285 + case "CommandLine":
2286 + allowed = (packageType == WixBundlePackageType.Bundle || packageType == WixBundlePackageType.Exe);
2287 + if (allowed)
2288 + {
2289 + this.ParseCommandLineElement(child, id.Id);
2290 + }
2291 + break;
2292 + case "BundlePackagePayload":
2293 + case "ExePackagePayload":
2294 + case "MsiPackagePayload":
2295 + case "MspPackagePayload":
2296 + case "MsuPackagePayload":
2297 + allowed = packagePayloadElementName == child.Name.LocalName;
2298 + // Handled previously
2299 + break;
2300 + default:
2301 + allowed = false;
2302 + break;
2303 + }
2304 +
2305 + if (!allowed)
2306 + {
2307 + this.Core.UnexpectedElement(node, child);
2308 + }
2309 + }
2310 + else
2311 + {
2312 + var context = new Dictionary<string, string>() { { "Id", id.Id } };
2313 + this.Core.ParseExtensionElement(node, child, context);
2314 + }
2315 + }
2316 +
2317 if (id.Id == BurnConstants.BundleDefaultBoundaryId)
2318 {
2319 this.Messaging.Write(CompilerErrors.ReservedValue(sourceLineNumbers, node.Name.LocalName, "Id", id.Id));
@@ -2234,37 +2344,72 @@ namespace WixToolset.Core
2344 perMachine = YesNoDefaultType.Default;
2345 }
2346
2237 - if (permanent == YesNoType.No)
2347 + if (exeDetectionType == WixBundleExePackageDetectionType.Arp)
2348 {
2239 - if (uninstallArguments == null)
2240 - {
2241 - this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", "Permanent", "no"));
2242 - }
2349 + // Missing attributes are reported when parsing the element.
2350 }
2244 - else if (permanent == YesNoType.NotSet)
2351 + else if (exeDetectionType == WixBundleExePackageDetectionType.Condition)
2352 {
2353 + if (String.IsNullOrEmpty(detectCondition))
2354 + {
2355 + if (permanent == YesNoType.No)
2356 + {
2357 + this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "Permanent", "no"));
2358 + }
2359 + else if (permanent == YesNoType.NotSet)
2360 + {
2361 + this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "Permanent"));
2362 + }
2363 + else if (repairArguments != null)
2364 + {
2365 + this.Core.Write(ErrorMessages.ExpectedAttributeWithValueWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "RepairArguments"));
2366 + }
2367 + else if (uninstallArguments != null)
2368 + {
2369 + this.Core.Write(ErrorMessages.ExpectedAttributeWithValueWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "UninstallArguments"));
2370 + }
2371 + else
2372 + {
2373 + Debug.Assert(detectCondition == String.Empty);
2374 + exeDetectionType = WixBundleExePackageDetectionType.None;
2375 + }
2376 + }
2377 +
2378 if (uninstallArguments == null)
2379 {
2248 - this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", "Permanent"));
2380 + if (permanent == YesNoType.No)
2381 + {
2382 + this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", "Permanent", "no"));
2383 + }
2384 + else if (permanent == YesNoType.NotSet)
2385 + {
2386 + this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", "Permanent"));
2387 + }
2388 }
2389 }
2251 -
2252 - // Detect condition is recommended or required for Exe packages (depending on whether repair or uninstall arguments were provided).
2253 - if (String.IsNullOrEmpty(detectCondition))
2390 + else if (exeDetectionType == WixBundleExePackageDetectionType.None)
2391 {
2255 - if (repairArguments != null)
2392 + if (permanent == YesNoType.No)
2393 + {
2394 + this.Core.Write(ErrorMessages.ExpectedAttributeOrElementWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "ArpEntry", "Permanent", "no"));
2395 + }
2396 + else if (permanent == YesNoType.NotSet)
2397 {
2257 - this.Core.Write(ErrorMessages.ExpectedAttributeWithValueWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "RepairArguments"));
2398 + this.Core.Write(ErrorMessages.ExpectedAttributeOrElementWithoutOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "ArpEntry", "Permanent"));
2399 }
2259 - else if (uninstallArguments != null)
2400 + else if (repairArguments != null)
2401 {
2261 - this.Core.Write(ErrorMessages.ExpectedAttributeWithValueWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "UninstallArguments"));
2402 + this.Core.Write(ErrorMessages.ExpectedAttributeOrElementWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "ArpEntry", "RepairArguments"));
2403 }
2404 else
2405 {
2265 - this.Core.Write(WarningMessages.DetectConditionRecommended(sourceLineNumbers, node.Name.LocalName));
2406 + this.Core.Write(WarningMessages.ExePackageDetectInformationRecommended(sourceLineNumbers));
2407 }
2408 }
2409 + else
2410 + {
2411 + this.Core.Write(ErrorMessages.UnexpectedElementWithAttribute(sourceLineNumbers, node.Name.LocalName, "ArpEntry", String.IsNullOrEmpty(detectCondition) ? "UninstallArguments" : "DetectCondition"));
2412 + }
2413
2414 if (repairArguments == null && repairCondition != null)
2415 {
@@ -2341,82 +2486,6 @@ namespace WixToolset.Core
2486 }
2487 }
2488
2344 - // Now that the package ID is known, we can parse the extension attributes...
2345 - var contextValues = new Dictionary<string, string>() { { "PackageId", id.Id } };
2346 - foreach (var attribute in extensionAttributes)
2347 - {
2348 - this.Core.ParseExtensionAttribute(node, attribute, contextValues);
2349 - }
2350 -
2351 - foreach (var child in node.Elements())
2352 - {
2353 - if (CompilerCore.WixNamespace == child.Name.Namespace)
2354 - {
2355 - var allowed = true;
2356 - switch (child.Name.LocalName)
2357 - {
2358 - case "SlipstreamMsp":
2359 - allowed = (packageType == WixBundlePackageType.Msi);
2360 - if (allowed)
2361 - {
2362 - this.ParseSlipstreamMspElement(child, id.Id);
2363 - }
2364 - break;
2365 - case "MsiProperty":
2366 - allowed = (packageType == WixBundlePackageType.Msi || packageType == WixBundlePackageType.Msp);
2367 - if (allowed)
2368 - {
2369 - this.ParseMsiPropertyElement(child, id.Id);
2370 - }
2371 - break;
2372 - case "Payload":
2373 - this.ParsePayloadElement(child, ComplexReferenceParentType.Package, id);
2374 - break;
2375 - case "PayloadGroupRef":
2376 - this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Package, id);
2377 - break;
2378 - case "Provides":
2379 - this.ParseProvidesElement(child, packageType, id.Id, out _);
2380 - break;
2381 - case "ExitCode":
2382 - allowed = (packageType == WixBundlePackageType.Bundle || packageType == WixBundlePackageType.Exe);
2383 - if (allowed)
2384 - {
2385 - this.ParseExitCodeElement(child, id.Id);
2386 - }
2387 - break;
2388 - case "CommandLine":
2389 - allowed = (packageType == WixBundlePackageType.Bundle || packageType == WixBundlePackageType.Exe);
2390 - if (allowed)
2391 - {
2392 - this.ParseCommandLineElement(child, id.Id);
2393 - }
2394 - break;
2395 - case "BundlePackagePayload":
2396 - case "ExePackagePayload":
2397 - case "MsiPackagePayload":
2398 - case "MspPackagePayload":
2399 - case "MsuPackagePayload":
2400 - allowed = packagePayloadElementName == child.Name.LocalName;
2401 - // Handled previously
2402 - break;
2403 - default:
2404 - allowed = false;
2405 - break;
2406 - }
2407 -
2408 - if (!allowed)
2409 - {
2410 - this.Core.UnexpectedElement(node, child);
2411 - }
2412 - }
2413 - else
2414 - {
2415 - var context = new Dictionary<string, string>() { { "Id", id.Id } };
2416 - this.Core.ParseExtensionElement(node, child, context);
2417 - }
2418 - }
2419 -
2489 if (!this.Core.EncounteredError)
2490 {
2491 var compilerPackagePayload = childCompilerPackagePayload ?? (hasPayloadInfo ? new CompilerPackagePayload(compilerPayload, packageType) : null);
@@ -2474,6 +2543,7 @@ namespace WixToolset.Core
2543 case WixBundlePackageType.Exe:
2544 WixBundleExePackageAttributes exeAttributes = 0;
2545 exeAttributes |= (YesNoType.Yes == bundle) ? WixBundleExePackageAttributes.Bundle : 0;
2546 + exeAttributes |= (YesNoType.Yes == arpWin64) ? WixBundleExePackageAttributes.ArpWin64 : 0;
2547
2548 this.Core.AddSymbol(new WixBundleExePackageSymbol(sourceLineNumbers, id)
2549 {
@@ -2482,7 +2552,10 @@ namespace WixToolset.Core
2552 InstallCommand = installArguments,
2553 RepairCommand = repairArguments,
2554 UninstallCommand = uninstallArguments,
2485 - ExeProtocol = protocol
2555 + ExeProtocol = protocol,
2556 + DetectionType = exeDetectionType.Value,
2557 + ArpId = arpId,
2558 + ArpDisplayVersion = arpDisplayVersion,
2559 });
2560 break;
2561
@@ -2946,6 +3019,57 @@ namespace WixToolset.Core
3019 }
3020 }
3021
3022 + private void ParseExePackageArpEntryElement(XElement node, out string id, out string version, out YesNoType win64)
3023 + {
3024 + var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
3025 + id = null;
3026 + version = null;
3027 + win64 = YesNoType.NotSet;
3028 +
3029 + foreach (var attrib in node.Attributes())
3030 + {
3031 + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || CompilerCore.WixNamespace == attrib.Name.Namespace)
3032 + {
3033 + switch (attrib.Name.LocalName)
3034 + {
3035 + case "Id":
3036 + id = this.Core.GetAttributeLongFilename(sourceLineNumbers, attrib);
3037 + break;
3038 + case "Version":
3039 + version = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
3040 + break;
3041 + case "Win64":
3042 + win64 = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3043 + break;
3044 + default:
3045 + this.Core.UnexpectedAttribute(node, attrib);
3046 + break;
3047 + }
3048 + }
3049 + else
3050 + {
3051 + this.Core.ParseExtensionAttribute(node, attrib);
3052 + }
3053 + }
3054 +
3055 + this.Core.ParseForExtensionElements(node);
3056 +
3057 + if (String.IsNullOrEmpty(id))
3058 + {
3059 + this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id"));
3060 + }
3061 +
3062 + if (String.IsNullOrEmpty(version))
3063 + {
3064 + this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Version"));
3065 + }
3066 +
3067 + if (win64 == YesNoType.NotSet)
3068 + {
3069 + this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Win64"));
3070 + }
3071 + }
3072 +
3073 /// <summary>
3074 /// Parse CommandLine element.
3075 /// </summary>
src/wix/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs
+2 -2
@@ -354,8 +354,8 @@ namespace WixToolsetTest.CoreIntegration
354 { "ExePackage", new List<string> { "CacheId", "InstallSize", "Size" } },
355 };
356 Assert.Equal(2, exePackageElements.Count);
357 - Assert.Equal("<ExePackage Id='credwiz.exe' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' LogPathVariable='WixBundleLog_credwiz.exe' RollbackLogPathVariable='WixBundleRollbackLog_credwiz.exe' DetectCondition='none' InstallArguments='' UninstallArguments='-foo' Uninstallable='yes' RepairArguments='' Repairable='no' Protocol='burn' Bundle='yes'><PayloadRef Id='credwiz.exe' /><PayloadRef Id='SourceFilePayload' /></ExePackage>", exePackageElements[0].GetTestXml(ignoreAttributesByElementName));
358 - Assert.Equal("<ExePackage Id='cscript.exe' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_cscript.exe' RollbackLogPathVariable='WixBundleRollbackLog_cscript.exe' DetectCondition='none' InstallArguments='' UninstallArguments='' Uninstallable='yes' RepairArguments='' Repairable='no' Protocol='none' Bundle='yes'><PayloadRef Id='cscript.exe' /><PayloadRef Id='SourceFilePayload' /></ExePackage>", exePackageElements[1].GetTestXml(ignoreAttributesByElementName));
357 + Assert.Equal("<ExePackage Id='credwiz.exe' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' LogPathVariable='WixBundleLog_credwiz.exe' RollbackLogPathVariable='WixBundleRollbackLog_credwiz.exe' InstallArguments='' RepairArguments='' Repairable='no' DetectionType='condition' DetectCondition='none' UninstallArguments='-foo' Uninstallable='yes' Protocol='burn' Bundle='yes'><PayloadRef Id='credwiz.exe' /><PayloadRef Id='SourceFilePayload' /></ExePackage>", exePackageElements[0].GetTestXml(ignoreAttributesByElementName));
358 + Assert.Equal("<ExePackage Id='cscript.exe' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_cscript.exe' RollbackLogPathVariable='WixBundleRollbackLog_cscript.exe' InstallArguments='' RepairArguments='' Repairable='no' DetectionType='condition' DetectCondition='none' UninstallArguments='' Uninstallable='yes' Protocol='none' Bundle='yes'><PayloadRef Id='cscript.exe' /><PayloadRef Id='SourceFilePayload' /></ExePackage>", exePackageElements[1].GetTestXml(ignoreAttributesByElementName));
359 }
360 }
361
src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
+383 -6
@@ -2,8 +2,10 @@
2
3 namespace WixToolsetTest.CoreIntegration
4 {
5 + using System.Collections.Generic;
6 using System.IO;
7 using System.Linq;
8 + using System.Xml;
9 using WixBuildTools.TestSupport;
10 using WixToolset.Core.TestPackage;
11 using Xunit;
@@ -11,7 +13,259 @@ namespace WixToolsetTest.CoreIntegration
13 public class ExePackageFixture
14 {
15 [Fact]
14 - public void ErrorWhenMissingDetectCondition()
16 + public void CanBuildWithArpEntry()
17 + {
18 + var folder = TestData.Get(@"TestData");
19 +
20 + using (var fs = new DisposableFileSystem())
21 + {
22 + var baseFolder = fs.GetFolder();
23 + var intermediateFolder = Path.Combine(baseFolder, "obj");
24 + var binFolder = Path.Combine(baseFolder, "bin");
25 + var bundlePath = Path.Combine(binFolder, "test.exe");
26 + var baFolderPath = Path.Combine(baseFolder, "ba");
27 + var extractFolderPath = Path.Combine(baseFolder, "extract");
28 +
29 + var result = WixRunner.Execute(new[]
30 + {
31 + "build",
32 + Path.Combine(folder, "ExePackage", "ArpEntry.wxs"),
33 + Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
34 + "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
35 + "-bindpath", Path.Combine(folder, ".Data"),
36 + "-intermediateFolder", intermediateFolder,
37 + "-o", bundlePath,
38 + });
39 +
40 + result.AssertSuccess();
41 +
42 + Assert.True(File.Exists(bundlePath));
43 +
44 + var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
45 + extractResult.AssertSuccess();
46 +
47 + var ignoreAttributes = new Dictionary<string, List<string>>
48 + {
49 + { "ExePackage", new List<string> { "CacheId", "Size" } },
50 + };
51 + var exePackages = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:ExePackage")
52 + .Cast<XmlElement>()
53 + .Select(e => e.GetTestXml(ignoreAttributes))
54 + .ToArray();
55 + WixAssert.CompareLineByLine(new string[]
56 + {
57 + "<ExePackage Id='burn.exe' Cache='keep' CacheId='*' InstallSize='463360' Size='*' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_burn.exe' RollbackLogPathVariable='WixBundleRollbackLog_burn.exe' InstallArguments='-install' RepairArguments='-repair' Repairable='yes' DetectionType='arp' ArpId='id' ArpDisplayVersion='1.0.0.0'>" +
58 + "<PayloadRef Id='burn.exe' />" +
59 + "</ExePackage>",
60 + }, exePackages);
61 + }
62 + }
63 +
64 + [Fact]
65 + public void WarningWhenInvalidArpEntryVersion()
66 + {
67 + var folder = TestData.Get(@"TestData");
68 +
69 + using (var fs = new DisposableFileSystem())
70 + {
71 + var baseFolder = fs.GetFolder();
72 + var intermediateFolder = Path.Combine(baseFolder, "obj");
73 + var binFolder = Path.Combine(baseFolder, "bin");
74 + var bundlePath = Path.Combine(binFolder, "test.exe");
75 + var baFolderPath = Path.Combine(baseFolder, "ba");
76 + var extractFolderPath = Path.Combine(baseFolder, "extract");
77 +
78 + var result = WixRunner.Execute(false, new[]
79 + {
80 + "build",
81 + Path.Combine(folder, "ExePackage", "InvalidArpEntryVersion.wxs"),
82 + Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
83 + "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
84 + "-bindpath", Path.Combine(folder, ".Data"),
85 + "-intermediateFolder", intermediateFolder,
86 + "-o", bundlePath,
87 + });
88 +
89 + WixAssert.CompareLineByLine(new[]
90 + {
91 + "Invalid WixVersion '1.0.0.abc' in ArpEntry/@'Version'. Comparisons may yield unexpected results."
92 + }, result.Messages.Select(m => m.ToString()).ToArray());
93 + result.AssertSuccess();
94 +
95 + Assert.True(File.Exists(bundlePath));
96 +
97 + var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
98 + extractResult.AssertSuccess();
99 +
100 + var ignoreAttributes = new Dictionary<string, List<string>>
101 + {
102 + { "ExePackage", new List<string> { "CacheId", "Size" } },
103 + };
104 + var exePackages = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:ExePackage")
105 + .Cast<XmlElement>()
106 + .Select(e => e.GetTestXml(ignoreAttributes))
107 + .ToArray();
108 + WixAssert.CompareLineByLine(new string[]
109 + {
110 + "<ExePackage Id='burn.exe' Cache='keep' CacheId='*' InstallSize='463360' Size='*' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_burn.exe' RollbackLogPathVariable='WixBundleRollbackLog_burn.exe' InstallArguments='-install' RepairArguments='' Repairable='no' DetectionType='arp' ArpId='id' ArpDisplayVersion='1.0.0.abc'>" +
111 + "<PayloadRef Id='burn.exe' />" +
112 + "</ExePackage>",
113 + }, exePackages);
114 + }
115 + }
116 +
117 + [Fact]
118 + public void WarningWhenPermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry()
119 + {
120 + var folder = TestData.Get(@"TestData");
121 +
122 + using (var fs = new DisposableFileSystem())
123 + {
124 + var baseFolder = fs.GetFolder();
125 + var intermediateFolder = Path.Combine(baseFolder, "obj");
126 + var binFolder = Path.Combine(baseFolder, "bin");
127 + var bundlePath = Path.Combine(binFolder, "test.exe");
128 + var baFolderPath = Path.Combine(baseFolder, "ba");
129 + var extractFolderPath = Path.Combine(baseFolder, "extract");
130 +
131 + var result = WixRunner.Execute(false, new[]
132 + {
133 + "build",
134 + Path.Combine(folder, "ExePackage", "PermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry.wxs"),
135 + Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
136 + "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
137 + "-bindpath", Path.Combine(folder, ".Data"),
138 + "-intermediateFolder", intermediateFolder,
139 + "-o", bundlePath,
140 + });
141 +
142 + WixAssert.CompareLineByLine(new[]
143 + {
144 + "The ExePackage/@DetectCondition attribute or child element ArpEntry is recommended so the package is only installed when absent."
145 + }, result.Messages.Select(m => m.ToString()).ToArray());
146 + result.AssertSuccess();
147 +
148 + Assert.True(File.Exists(bundlePath));
149 +
150 + var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
151 + extractResult.AssertSuccess();
152 +
153 + var ignoreAttributes = new Dictionary<string, List<string>>
154 + {
155 + { "ExePackage", new List<string> { "CacheId", "Size" } },
156 + };
157 + var exePackages = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:ExePackage")
158 + .Cast<XmlElement>()
159 + .Select(e => e.GetTestXml(ignoreAttributes))
160 + .ToArray();
161 + WixAssert.CompareLineByLine(new string[]
162 + {
163 + "<ExePackage Id='burn.exe' Cache='keep' CacheId='*' InstallSize='463360' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_burn.exe' RollbackLogPathVariable='WixBundleRollbackLog_burn.exe' InstallArguments='-install' RepairArguments='' Repairable='no' DetectionType='none'>" +
164 + "<PayloadRef Id='burn.exe' />" +
165 + "</ExePackage>",
166 + }, exePackages);
167 + }
168 + }
169 +
170 + [Fact]
171 + public void NoWarningWhenPermanentWithEmptyDetectCondition()
172 + {
173 + var folder = TestData.Get(@"TestData");
174 +
175 + using (var fs = new DisposableFileSystem())
176 + {
177 + var baseFolder = fs.GetFolder();
178 + var intermediateFolder = Path.Combine(baseFolder, "obj");
179 + var binFolder = Path.Combine(baseFolder, "bin");
180 + var bundlePath = Path.Combine(binFolder, "test.exe");
181 + var baFolderPath = Path.Combine(baseFolder, "ba");
182 + var extractFolderPath = Path.Combine(baseFolder, "extract");
183 +
184 + var result = WixRunner.Execute(new[]
185 + {
186 + "build",
187 + Path.Combine(folder, "ExePackage", "PermanentWithEmptyDetectCondition.wxs"),
188 + Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
189 + "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
190 + "-bindpath", Path.Combine(folder, ".Data"),
191 + "-intermediateFolder", intermediateFolder,
192 + "-o", bundlePath,
193 + });
194 +
195 + result.AssertSuccess();
196 +
197 + Assert.True(File.Exists(bundlePath));
198 +
199 + var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
200 + extractResult.AssertSuccess();
201 +
202 + var ignoreAttributes = new Dictionary<string, List<string>>
203 + {
204 + { "ExePackage", new List<string> { "CacheId", "Size" } },
205 + };
206 + var exePackages = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:ExePackage")
207 + .Cast<XmlElement>()
208 + .Select(e => e.GetTestXml(ignoreAttributes))
209 + .ToArray();
210 + WixAssert.CompareLineByLine(new string[]
211 + {
212 + "<ExePackage Id='burn.exe' Cache='keep' CacheId='*' InstallSize='463360' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_burn.exe' RollbackLogPathVariable='WixBundleRollbackLog_burn.exe' InstallArguments='-install' RepairArguments='' Repairable='no' DetectionType='none'>" +
213 + "<PayloadRef Id='burn.exe' />" +
214 + "</ExePackage>",
215 + }, exePackages);
216 + }
217 + }
218 +
219 + [Fact]
220 + public void ErrorWhenArpEntryWithDetectCondition()
221 + {
222 + var folder = TestData.Get(@"TestData", "ExePackage");
223 +
224 + using (var fs = new DisposableFileSystem())
225 + {
226 + var baseFolder = fs.GetFolder();
227 +
228 + var result = WixRunner.Execute(new[]
229 + {
230 + "build",
231 + Path.Combine(folder, "ArpEntryWithDetectCondition.wxs"),
232 + "-o", Path.Combine(baseFolder, "test.wixlib")
233 + });
234 +
235 + WixAssert.CompareLineByLine(new[]
236 + {
237 + "The ExePackage element cannot have a child element 'ArpEntry' when attribute 'DetectCondition' is set.",
238 + }, result.Messages.Select(m => m.ToString()).ToArray());
239 + Assert.Equal(372, result.ExitCode);
240 + }
241 + }
242 +
243 + [Fact]
244 + public void ErrorWhenArpEntryWithUninstallArguments()
245 + {
246 + var folder = TestData.Get(@"TestData", "ExePackage");
247 +
248 + using (var fs = new DisposableFileSystem())
249 + {
250 + var baseFolder = fs.GetFolder();
251 +
252 + var result = WixRunner.Execute(new[]
253 + {
254 + "build",
255 + Path.Combine(folder, "ArpEntryWithUninstallArguments.wxs"),
256 + "-o", Path.Combine(baseFolder, "test.wixlib")
257 + });
258 +
259 + WixAssert.CompareLineByLine(new[]
260 + {
261 + "The ExePackage element cannot have a child element 'ArpEntry' when attribute 'UninstallArguments' is set.",
262 + }, result.Messages.Select(m => m.ToString()).ToArray());
263 + Assert.Equal(372, result.ExitCode);
264 + }
265 + }
266 +
267 + [Fact]
268 + public void ErrorWhenArpEntryWithInvalidId()
269 {
270 var folder = TestData.Get(@"TestData", "ExePackage");
271
@@ -22,16 +276,135 @@ namespace WixToolsetTest.CoreIntegration
276 var result = WixRunner.Execute(new[]
277 {
278 "build",
25 - Path.Combine(folder, "MissingDetectCondition.wxs"),
279 + Path.Combine(folder, "InvalidArpEntryId.wxs"),
280 + "-o", Path.Combine(baseFolder, "test.wixlib")
281 + });
282 +
283 + WixAssert.CompareLineByLine(new[]
284 + {
285 + "The ArpEntry/@Id attribute's value, '..\\id', is not a valid filename because it contains illegal characters. Legal filenames contain no more than 260 characters and must contain at least one non-period character. Any character except for the follow may be used: \\ ? | > < : / * \".",
286 + }, result.Messages.Select(m => m.ToString()).ToArray());
287 + Assert.Equal(27, result.ExitCode);
288 + }
289 + }
290 +
291 + [Fact]
292 + public void ErrorWhenNonPermanentWithOnlyDetectCondition()
293 + {
294 + var folder = TestData.Get(@"TestData", "ExePackage");
295 +
296 + using (var fs = new DisposableFileSystem())
297 + {
298 + var baseFolder = fs.GetFolder();
299 +
300 + var result = WixRunner.Execute(new[]
301 + {
302 + "build",
303 + Path.Combine(folder, "NonPermanentWithOnlyDetectCondition.wxs"),
304 "-o", Path.Combine(baseFolder, "test.wixlib")
305 });
306
307 WixAssert.CompareLineByLine(new[]
308 {
309 "The ExePackage element's UninstallArguments attribute was not found; it is required without attribute Permanent present.",
32 - "The ExePackage/@DetectCondition attribute is recommended so the package is only installed when absent."
310 }, result.Messages.Select(m => m.ToString()).ToArray());
34 - Assert.Equal(1153, result.ExitCode);
311 + Assert.Equal(408, result.ExitCode);
312 + }
313 + }
314 +
315 + [Fact]
316 + public void ErrorWhenNonPermanentWithOnlyUninstallArguments()
317 + {
318 + var folder = TestData.Get(@"TestData", "ExePackage");
319 +
320 + using (var fs = new DisposableFileSystem())
321 + {
322 + var baseFolder = fs.GetFolder();
323 +
324 + var result = WixRunner.Execute(new[]
325 + {
326 + "build",
327 + Path.Combine(folder, "NonPermanentWithOnlyUninstallArguments.wxs"),
328 + "-o", Path.Combine(baseFolder, "test.wixlib")
329 + });
330 +
331 + WixAssert.CompareLineByLine(new[]
332 + {
333 + "The ExePackage element's DetectCondition attribute was not found; it is required without attribute Permanent present.",
334 + }, result.Messages.Select(m => m.ToString()).ToArray());
335 + Assert.Equal(408, result.ExitCode);
336 + }
337 + }
338 +
339 + [Fact]
340 + public void ErrorWhenRepairablePermanentWithoutDetectCondition()
341 + {
342 + var folder = TestData.Get(@"TestData", "ExePackage");
343 +
344 + using (var fs = new DisposableFileSystem())
345 + {
346 + var baseFolder = fs.GetFolder();
347 +
348 + var result = WixRunner.Execute(new[]
349 + {
350 + "build",
351 + Path.Combine(folder, "RepairablePermanentWithoutDetectCondition.wxs"),
352 + "-o", Path.Combine(baseFolder, "test.wixlib")
353 + });
354 +
355 + WixAssert.CompareLineByLine(new[]
356 + {
357 + "The ExePackage/@DetectCondition attribute is required to have a value when attribute RepairArguments is present.",
358 + }, result.Messages.Select(m => m.ToString()).ToArray());
359 + Assert.Equal(401, result.ExitCode);
360 + }
361 + }
362 +
363 + [Fact]
364 + public void ErrorWhenRepairablePermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry()
365 + {
366 + var folder = TestData.Get(@"TestData", "ExePackage");
367 +
368 + using (var fs = new DisposableFileSystem())
369 + {
370 + var baseFolder = fs.GetFolder();
371 +
372 + var result = WixRunner.Execute(new[]
373 + {
374 + "build",
375 + Path.Combine(folder, "RepairablePermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry.wxs"),
376 + "-o", Path.Combine(baseFolder, "test.wixlib")
377 + });
378 +
379 + WixAssert.CompareLineByLine(new[]
380 + {
381 + "Element 'ExePackage' missing attribute 'DetectCondition' or child element 'ArpEntry'. Exactly one of those is required when attribute 'RepairArguments' is specified.",
382 + }, result.Messages.Select(m => m.ToString()).ToArray());
383 + Assert.Equal(413, result.ExitCode);
384 + }
385 + }
386 +
387 + [Fact]
388 + public void ErrorWhenNonPermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry()
389 + {
390 + var folder = TestData.Get(@"TestData", "ExePackage");
391 +
392 + using (var fs = new DisposableFileSystem())
393 + {
394 + var baseFolder = fs.GetFolder();
395 +
396 + var result = WixRunner.Execute(new[]
397 + {
398 + "build",
399 + Path.Combine(folder, "NonPermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry.wxs"),
400 + "-o", Path.Combine(baseFolder, "test.wixlib")
401 + });
402 +
403 + WixAssert.CompareLineByLine(new[]
404 + {
405 + "Element 'ExePackage' missing attribute 'DetectCondition' or child element 'ArpEntry'. Exactly one of those is required when attribute 'Permanent' is not specified.",
406 + }, result.Messages.Select(m => m.ToString()).ToArray());
407 + Assert.Equal(414, result.ExitCode);
408 }
409 }
410
@@ -60,7 +433,7 @@ namespace WixToolsetTest.CoreIntegration
433 }
434
435 [Fact]
63 - public void ErrorWhenRequireDetectCondition()
436 + public void ErrorWhenUninstallArgumentsWithoutDetectCondition()
437 {
438 var folder = TestData.Get(@"TestData", "ExePackage");
439
@@ -71,10 +444,14 @@ namespace WixToolsetTest.CoreIntegration
444 var result = WixRunner.Execute(new[]
445 {
446 "build",
74 - Path.Combine(folder, "RequireDetectCondition.wxs"),
447 + Path.Combine(folder, "UninstallArgumentsWithoutDetectCondition.wxs"),
448 "-o", Path.Combine(baseFolder, "test.wixlib")
449 });
450
451 + WixAssert.CompareLineByLine(new[]
452 + {
453 + "The ExePackage/@DetectCondition attribute is required to have a value when attribute UninstallArguments is present.",
454 + }, result.Messages.Select(m => m.ToString()).ToArray());
455 Assert.Equal(401, result.ExitCode);
456 }
457 }
src/wix/test/WixToolsetTest.CoreIntegration/PackagePayloadFixture.cs
+1 -1
@@ -126,7 +126,7 @@ namespace WixToolsetTest.CoreIntegration
126 { "ExePackage", new List<string> { "CacheId", "InstallSize", "Size" } },
127 };
128 Assert.Equal(1, exePackageElements.Count);
129 - Assert.Equal("<ExePackage Id='PackagePayloadInPayloadGroup' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_PackagePayloadInPayloadGroup' RollbackLogPathVariable='WixBundleRollbackLog_PackagePayloadInPayloadGroup' DetectCondition='none' InstallArguments='' UninstallArguments='' Uninstallable='no' RepairArguments='' Repairable='no'><PayloadRef Id='burn.exe' /></ExePackage>", exePackageElements[0].GetTestXml(ignoreAttributesByElementName));
129 + Assert.Equal("<ExePackage Id='PackagePayloadInPayloadGroup' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='yes' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_PackagePayloadInPayloadGroup' RollbackLogPathVariable='WixBundleRollbackLog_PackagePayloadInPayloadGroup' InstallArguments='' RepairArguments='' Repairable='no' DetectionType='condition' DetectCondition='none'><PayloadRef Id='burn.exe' /></ExePackage>", exePackageElements[0].GetTestXml(ignoreAttributesByElementName));
130
131 var payloadElements = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Payload[@Id='burn.exe']");
132 Assert.Equal(1, payloadElements.Count);
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/ArpEntry.wxs new
+12
@@ -0,0 +1,12 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="BundlePackages">
5 + <ExePackage InstallArguments="-install"
6 + RepairArguments="-repair"
7 + SourceFile="burn.exe">
8 + <ArpEntry Id="id" Version="1.0.0.0" Win64="no" />
9 + </ExePackage>
10 + </PackageGroup>
11 + </Fragment>
12 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/ArpEntryWithDetectCondition.wxs new
+12
@@ -0,0 +1,12 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="TestPackageGroup">
5 + <ExePackage InstallArguments="-install"
6 + DetectCondition="none"
7 + SourceFile="testsetup.exe">
8 + <ArpEntry Id="id" Version="1.0.0.0" Win64="no" />
9 + </ExePackage>
10 + </PackageGroup>
11 + </Fragment>
12 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/ArpEntryWithUninstallArguments.wxs new
+12
@@ -0,0 +1,12 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="TestPackageGroup">
5 + <ExePackage InstallArguments="-install"
6 + UninstallArguments="none"
7 + SourceFile="testsetup.exe">
8 + <ArpEntry Id="id" Version="1.0.0.0" Win64="no" />
9 + </ExePackage>
10 + </PackageGroup>
11 + </Fragment>
12 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/InvalidArpEntryId.wxs new
+11
@@ -0,0 +1,11 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="BundlePackages">
5 + <ExePackage InstallArguments="-install"
6 + SourceFile="burn.exe">
7 + <ArpEntry Id="..\id" Version="1.0.0" Win64="no" />
8 + </ExePackage>
9 + </PackageGroup>
10 + </Fragment>
11 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/InvalidArpEntryVersion.wxs new
+11
@@ -0,0 +1,11 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="BundlePackages">
5 + <ExePackage InstallArguments="-install"
6 + SourceFile="burn.exe">
7 + <ArpEntry Id="id" Version="1.0.0.abc" Win64="no" />
8 + </ExePackage>
9 + </PackageGroup>
10 + </Fragment>
11 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/NonPermanentWithOnlyDetectCondition.wxs new
+10
@@ -0,0 +1,10 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="TestPackageGroup">
5 + <ExePackage InstallArguments="-install"
6 + DetectCondition="none"
7 + SourceFile="testsetup.exe" />
8 + </PackageGroup>
9 + </Fragment>
10 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/NonPermanentWithOnlyUninstallArguments.wxs new
+10
@@ -0,0 +1,10 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="TestPackageGroup">
5 + <ExePackage InstallArguments="-install"
6 + UninstallArguments="none"
7 + SourceFile="testsetup.exe" />
8 + </PackageGroup>
9 + </Fragment>
10 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/NonPermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry.wxs renamed
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/PermanentWithEmptyDetectCondition.wxs new
+11
@@ -0,0 +1,11 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="BundlePackages">
5 + <ExePackage InstallArguments="-install"
6 + SourceFile="burn.exe"
7 + DetectCondition=""
8 + Permanent="yes" />
9 + </PackageGroup>
10 + </Fragment>
11 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/PermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry.wxs new
+10
@@ -0,0 +1,10 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="BundlePackages">
5 + <ExePackage InstallArguments="-install"
6 + SourceFile="burn.exe"
7 + Permanent="yes" />
8 + </PackageGroup>
9 + </Fragment>
10 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/RepairablePermanentWithoutDetectCondition.wxs new
+12
@@ -0,0 +1,12 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="TestPackageGroup">
5 + <ExePackage InstallArguments="-install"
6 + SourceFile="testsetup.exe"
7 + RepairArguments="-repair"
8 + UninstallArguments="-uninstall"
9 + Permanent="yes" />
10 + </PackageGroup>
11 + </Fragment>
12 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/RepairablePermanentWithoutDetectConditionOrUninstallArgumentsOrArpEntry.wxs new
+11
@@ -0,0 +1,11 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="TestPackageGroup">
5 + <ExePackage InstallArguments="-install"
6 + SourceFile="testsetup.exe"
7 + RepairArguments="-repair"
8 + Permanent="yes" />
9 + </PackageGroup>
10 + </Fragment>
11 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/UninstallArgumentsWithoutDetectCondition.wxs renamed
+1
@@ -5,6 +5,7 @@
5 <ExePackage DetectCondition=""
6 InstallArguments="-install"
7 UninstallArguments="-uninstall"
8 + Permanent="yes"
9 SourceFile="testsetup.exe" />
10 </PackageGroup>
11 </Fragment>