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 >= 528040" InstallArguments="/q /norestart /log "[NetFx48WebLog].html"" 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 >= 528040" InstallArguments="/q /norestart /log "[NetFx48WebLog].html"" 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 "[NetFx48WebLog].html"" RepairArguments="" Repairable="no" DetectionType="condition" DetectCondition="NETFRAMEWORK45 >= 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 "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF},DisplayVersion,String,1.0.0.0" /regw "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF},QuietUninstallString,String,\"[WixBundleExecutePackageCacheFolder]testexe.exe\" /regd \"HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF}\""" 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 >= 528040" InstallArguments="/q /norestart /log "[NetFx48WebLog].html"" 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 >= v1.0.0.0" InstallArguments="/s 5000 /regw "HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0"" UninstallArguments="/regd "HKLM\Software\WiX\Tests\FailureTests\ExeA,Version"" Uninstallable="yes" RepairArguments="/regw "HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0"" 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 >= 528040" InstallArguments="/q /norestart /log "[NetFx48WebLog].html"" 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 >= v1.0.0.0" InstallArguments="/s 5000 /regw "HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0"" UninstallArguments="/regd "HKLM\Software\WiX\Tests\FailureTests\ExeA,Version"" Uninstallable="yes" RepairArguments="/regw "HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0"" 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 >= 528040" InstallArguments="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" UninstallArguments="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" RepairArguments="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" 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="<?xml version="1.0" encoding="utf-16"?><MsiPatch xmlns="http://www.microsoft.com/msi/patch_applicability.xsd" SchemaVersion="1.0.0.0" PatchGUID="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" MinMsiVersion="5" TargetsRTM="true"><TargetProduct MinMsiVersion="500"><TargetProductCode Validate="true">{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}</TargetProductCode><TargetVersion Validate="true" ComparisonType="Equal" ComparisonFilter="MajorMinorUpdate">1.0.0.0</TargetVersion><UpdatedVersion>1.0.1.0</UpdatedVersion><TargetLanguage Validate="false">1033</TargetLanguage><UpdatedLanguages>1033</UpdatedLanguages><UpgradeCode Validate="true">{DB87BB66-FE5D-4293-81AC-EE313D3F864B}</UpgradeCode></TargetProduct><TargetProductCode>{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}</TargetProductCode></MsiPatch>"><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 >= 528040" InstallArguments="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" UninstallArguments="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" RepairArguments="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" 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="<?xml version="1.0" encoding="utf-16"?><MsiPatch xmlns="http://www.microsoft.com/msi/patch_applicability.xsd" SchemaVersion="1.0.0.0" PatchGUID="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" MinMsiVersion="5" TargetsRTM="true"><TargetProduct MinMsiVersion="500"><TargetProductCode Validate="true">{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}</TargetProductCode><TargetVersion Validate="true" ComparisonType="Equal" ComparisonFilter="MajorMinorUpdate">1.0.0.0</TargetVersion><UpdatedVersion>1.0.1.0</UpdatedVersion><TargetLanguage Validate="false">1033</TargetLanguage><UpdatedLanguages>1033</UpdatedLanguages><UpgradeCode Validate="true">{DB87BB66-FE5D-4293-81AC-EE313D3F864B}</UpgradeCode></TargetProduct><TargetProductCode>{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}</TargetProductCode></MsiPatch>"><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 >= 528040" InstallArguments="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" UninstallArguments="" RepairArguments="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" 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 >= 528040" InstallArguments="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" UninstallArguments="" RepairArguments="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx48WebLog].html"" 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 "$(var.ArpKeyPath),DisplayVersion,String,$(var.ArpVersion)"">
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 "$(var.ArpKeyPath),DisplayVersion,String,$(var.ArpVersion)" /regw "$(var.ArpKeyPath),QuietUninstallString,String,\"[WixBundleExecutePackageCacheFolder]testexe.exe\" /regd \"$(var.ArpKeyPath)\""">
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 "$(var.ArpKeyPath),DisplayVersion,String,$(var.ArpVersion)" /regw "$(var.ArpKeyPath),QuietUninstallString,String,\"[WixBundleExecutePackageCacheFolder]testexe.exe\" /regd \"$(var.ArpKeyPath)\""">
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 "$(var.ArpKeyPath),DisplayVersion,String,$(var.ArpVersion)" /regw "$(var.ArpKeyPath),QuietUninstallString,String,\"[WixBundleExecutePackageCacheFolder]testexe.exe\" /regd \"$(var.ArpKeyPath)\""">
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>