Support v3 bundles in BundlePackage and "burn extract" command.
Sean Hall committed
Apr 1, 2022 at 19:28 UTC
8faa28db427119b3541733290d87783dd699d425
11 files changed
+257
-41
src/test/burn/TestData/BundlePackageTests/V3BundlePackageBundle/V3BundlePackageBundle.wixproj
new
+22
@@ -0,0 +1,22 @@
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
+ <BA>TestBA_x64</BA>
6
+ <UpgradeCode>{B6CAE45D-A7E5-4302-9FCF-4D05632F9FD7}</UpgradeCode>
7
+ <InstallerPlatform>x64</InstallerPlatform>
8
+ </PropertyGroup>
9
+ <ItemGroup>
10
+ <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
11
+ </ItemGroup>
12
+ <ItemGroup>
13
+ <BindInputPaths Include="..\..\..\..\..\wix\test\WixToolsetTest.CoreIntegration\TestData\.Data" />
14
+ </ItemGroup>
15
+ <ItemGroup>
16
+ <ProjectReference Include="..\..\TestBA\TestBAWixlib_x64\testbawixlib_x64.wixproj" />
17
+ </ItemGroup>
18
+ <ItemGroup>
19
+ <PackageReference Include="WixToolset.Bal.wixext" />
20
+ <PackageReference Include="WixToolset.NetFx.wixext" />
21
+ </ItemGroup>
22
+</Project>
\ No newline at end of file
src/test/burn/TestData/BundlePackageTests/V3BundlePackageBundle/V3BundlePackageBundle.wxs
new
+10
@@ -0,0 +1,10 @@
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
+
4
+<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5
+ <Fragment>
6
+ <PackageGroup Id="BundlePackages">
7
+ <BundlePackage SourceFile="v3bundle.exe" />
8
+ </PackageGroup>
9
+ </Fragment>
10
+</Wix>
src/test/burn/WixToolsetTest.BurnE2E/BundlePackageTests.cs
+12
@@ -3,6 +3,7 @@
3
namespace WixToolsetTest.BurnE2E
4
{
5
using System.IO;
6
+ using WixTestTools;
7
using Xunit;
8
using Xunit.Abstractions;
9
@@ -63,6 +64,17 @@ namespace WixToolsetTest.BurnE2E
64
bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
65
}
66
67
+ [Fact]
68
+ public void CanInstallV3BundlePackage()
69
+ {
70
+ var v3BundlePackageBundle = this.CreateBundleInstaller("V3BundlePackageBundle");
71
+
72
+ var logPath = v3BundlePackageBundle.Install();
73
+ v3BundlePackageBundle.VerifyRegisteredAndInPackageCache();
74
+
75
+ Assert.True(LogVerifier.MessageInLogFile(logPath, "Applied execute package: v3bundle.exe, result: 0x0, restart: None"));
76
+ }
77
+
78
[Fact]
79
public void CanSkipObsoleteBundlePackage()
80
{
src/wix/WixToolset.Core.Burn/Bundles/BurnCommon.cs
+21
@@ -58,11 +58,32 @@ namespace WixToolset.Core.Burn.Bundles
58
protected const uint IMAGE_NT_SIGNATURE = 0x00004550;
59
protected const ulong IMAGE_SECTION_WIXBURN_NAME = 0x6E7275627869772E; // ".wixburn", as a qword.
60
61
+ public const ushort IMAGE_FILE_MACHINE_AM33 = 0x1D3;
62
public const ushort IMAGE_FILE_MACHINE_AMD64 = 0x8664;
63
public const ushort IMAGE_FILE_MACHINE_ARM = 0x1C0;
64
public const ushort IMAGE_FILE_MACHINE_ARM64 = 0xAA64;
65
public const ushort IMAGE_FILE_MACHINE_ARMNT = 0x1C4;
66
+ public const ushort IMAGE_FILE_MACHINE_EBC = 0xEBC;
67
public const ushort IMAGE_FILE_MACHINE_I386 = 0x14C;
68
+ public const ushort IMAGE_FILE_MACHINE_IA64 = 0x200;
69
+ public const ushort IMAGE_FILE_MACHINE_LOONGARCH32 = 0x6232;
70
+ public const ushort IMAGE_FILE_MACHINE_LOONGARCH64 = 0x6264;
71
+ public const ushort IMAGE_FILE_MACHINE_M32R = 0x9041;
72
+ public const ushort IMAGE_FILE_MACHINE_MIPS16 = 0x266;
73
+ public const ushort IMAGE_FILE_MACHINE_MIPSFPU = 0x366;
74
+ public const ushort IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466;
75
+ public const ushort IMAGE_FILE_MACHINE_POWERPC = 0x1F0;
76
+ public const ushort IMAGE_FILE_MACHINE_POWERPCFP = 0x1F1;
77
+ public const ushort IMAGE_FILE_MACHINE_R4000 = 0x166;
78
+ public const ushort IMAGE_FILE_MACHINE_RISCV32 = 0x5032;
79
+ public const ushort IMAGE_FILE_MACHINE_RISCV64 = 0x5064;
80
+ public const ushort IMAGE_FILE_MACHINE_RISCV128 = 0x5128;
81
+ public const ushort IMAGE_FILE_MACHINE_SH3 = 0x1A2;
82
+ public const ushort IMAGE_FILE_MACHINE_SH3DSP = 0x1A3;
83
+ public const ushort IMAGE_FILE_MACHINE_SH4 = 0x1A6;
84
+ public const ushort IMAGE_FILE_MACHINE_SH5 = 0x1A8;
85
+ public const ushort IMAGE_FILE_MACHINE_THUMB = 0x1C2;
86
+ public const ushort IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169;
87
88
// The ".wixburn" section contains:
89
// 0- 3: magic number
src/wix/WixToolset.Core.Burn/Bundles/BurnReader.cs
+1
-1
@@ -102,7 +102,7 @@ namespace WixToolset.Core.Burn.Bundles
102
var document = new XmlDocument();
103
document.Load(manifestPath);
104
var namespaceManager = new XmlNamespaceManager(document.NameTable);
105
- namespaceManager.AddNamespace("burn", BurnCommon.BurnNamespace);
105
+ namespaceManager.AddNamespace("burn", document.DocumentElement.NamespaceURI);
106
var uxPayloads = document.SelectNodes("/burn:BurnManifest/burn:UX/burn:Payload", namespaceManager);
107
var payloads = document.SelectNodes("/burn:BurnManifest/burn:Payload", namespaceManager);
108
src/wix/WixToolset.Core.Burn/Bundles/ProcessBundlePackageCommand.cs
+76
-40
@@ -71,16 +71,37 @@ namespace WixToolset.Core.Burn.Bundles
71
72
switch (burnReader.MachineType)
73
{
74
+ case BurnCommon.IMAGE_FILE_MACHINE_AM33:
75
case BurnCommon.IMAGE_FILE_MACHINE_ARM:
76
case BurnCommon.IMAGE_FILE_MACHINE_ARMNT:
77
case BurnCommon.IMAGE_FILE_MACHINE_I386:
78
+ case BurnCommon.IMAGE_FILE_MACHINE_LOONGARCH32:
79
+ case BurnCommon.IMAGE_FILE_MACHINE_M32R:
80
break;
81
case BurnCommon.IMAGE_FILE_MACHINE_AMD64:
82
case BurnCommon.IMAGE_FILE_MACHINE_ARM64:
83
+ case BurnCommon.IMAGE_FILE_MACHINE_IA64:
84
+ case BurnCommon.IMAGE_FILE_MACHINE_LOONGARCH64:
85
bundlePackage.Win64 = true;
86
break;
87
+ case BurnCommon.IMAGE_FILE_MACHINE_EBC:
88
+ case BurnCommon.IMAGE_FILE_MACHINE_MIPS16:
89
+ case BurnCommon.IMAGE_FILE_MACHINE_MIPSFPU:
90
+ case BurnCommon.IMAGE_FILE_MACHINE_MIPSFPU16:
91
+ case BurnCommon.IMAGE_FILE_MACHINE_POWERPC:
92
+ case BurnCommon.IMAGE_FILE_MACHINE_POWERPCFP:
93
+ case BurnCommon.IMAGE_FILE_MACHINE_R4000:
94
+ case BurnCommon.IMAGE_FILE_MACHINE_RISCV32:
95
+ case BurnCommon.IMAGE_FILE_MACHINE_RISCV64:
96
+ case BurnCommon.IMAGE_FILE_MACHINE_RISCV128:
97
+ case BurnCommon.IMAGE_FILE_MACHINE_SH3:
98
+ case BurnCommon.IMAGE_FILE_MACHINE_SH3DSP:
99
+ case BurnCommon.IMAGE_FILE_MACHINE_SH4:
100
+ case BurnCommon.IMAGE_FILE_MACHINE_SH5:
101
+ case BurnCommon.IMAGE_FILE_MACHINE_THUMB:
102
+ case BurnCommon.IMAGE_FILE_MACHINE_WCEMIPSV2:
103
default:
83
- Debug.Assert(false, "Unknown machine type");
104
+ this.Messaging.Write(BurnBackendWarnings.UnknownCoffMachineType(packagePayload.SourceLineNumbers, sourcePath, burnReader.MachineType));
105
break;
106
}
107
@@ -90,46 +111,60 @@ namespace WixToolset.Core.Burn.Bundles
111
// This should be a safe assumption since we will need to add the protocol version to the section to support this harvesting.
112
bundlePackage.SupportsBurnProtocol = burnReader.Version == 2;
113
93
- var document = new XmlDocument();
94
- document.Load(Path.Combine(baFolderPath, "manifest.xml"));
95
- var namespaceManager = new XmlNamespaceManager(document.NameTable);
96
- namespaceManager.AddNamespace("burn", BurnCommon.BurnNamespace); // TODO: support v3 bundles
97
- var registrationElement = document.SelectSingleNode("/burn:BurnManifest/burn:Registration", namespaceManager) as XmlElement;
98
- var arpElement = document.SelectSingleNode("/burn:BurnManifest/burn:Registration/burn:Arp", namespaceManager) as XmlElement;
99
-
100
- var perMachine = registrationElement.GetAttribute("PerMachine") == "yes";
101
- this.Facade.PackageSymbol.PerMachine = perMachine ? YesNoDefaultType.Yes : YesNoDefaultType.No;
102
-
103
- var version = registrationElement.GetAttribute("Version");
104
- packagePayload.Version = version;
105
- bundlePackage.Version = version;
106
- this.Facade.PackageSymbol.Version = version;
107
-
108
- if (String.IsNullOrEmpty(this.Facade.PackageSymbol.CacheId))
114
+ try
115
{
110
- this.Facade.PackageSymbol.CacheId = String.Format("{0}v{1}", bundlePackage.BundleId, version);
116
+ var document = new XmlDocument();
117
+ document.Load(Path.Combine(baFolderPath, "manifest.xml"));
118
+ var namespaceManager = new XmlNamespaceManager(document.NameTable);
119
+
120
+ if (document.DocumentElement.LocalName != "BurnManifest")
121
+ {
122
+ this.Messaging.Write(BurnBackendErrors.InvalidBundleManifest(packagePayload.SourceLineNumbers, sourcePath, $"Expected root element to be 'Manifest' but was '{document.DocumentElement.LocalName}'."));
123
+ return;
124
+ }
125
+
126
+ namespaceManager.AddNamespace("burn", document.DocumentElement.NamespaceURI);
127
+ var registrationElement = document.SelectSingleNode("/burn:BurnManifest/burn:Registration", namespaceManager) as XmlElement;
128
+ var arpElement = document.SelectSingleNode("/burn:BurnManifest/burn:Registration/burn:Arp", namespaceManager) as XmlElement;
129
+
130
+ var perMachine = registrationElement.GetAttribute("PerMachine") == "yes";
131
+ this.Facade.PackageSymbol.PerMachine = perMachine ? YesNoDefaultType.Yes : YesNoDefaultType.No;
132
+
133
+ var version = registrationElement.GetAttribute("Version");
134
+ packagePayload.Version = version;
135
+ bundlePackage.Version = version;
136
+ this.Facade.PackageSymbol.Version = version;
137
+
138
+ if (String.IsNullOrEmpty(this.Facade.PackageSymbol.CacheId))
139
+ {
140
+ this.Facade.PackageSymbol.CacheId = String.Format("{0}v{1}", bundlePackage.BundleId, version);
141
+ }
142
+
143
+ var providerKey = registrationElement.GetAttribute("ProviderKey");
144
+ var depId = new Identifier(AccessModifier.Section, this.BackendHelper.GenerateIdentifier("dep", bundlePackage.Id.Id, providerKey));
145
+ this.Section.AddSymbol(new WixDependencyProviderSymbol(packagePayload.SourceLineNumbers, depId)
146
+ {
147
+ ParentRef = bundlePackage.Id.Id,
148
+ ProviderKey = providerKey,
149
+ Version = version,
150
+ Attributes = WixDependencyProviderAttributes.ProvidesAttributesImported,
151
+ });
152
+
153
+ if (String.IsNullOrEmpty(this.Facade.PackageSymbol.DisplayName))
154
+ {
155
+ this.Facade.PackageSymbol.DisplayName = arpElement.GetAttribute("DisplayName");
156
+ }
157
+
158
+ this.ProcessPackages(document, namespaceManager);
159
+
160
+ this.ProcessRelatedBundles(document, namespaceManager, packagePayload, sourcePath);
161
+
162
+ // TODO: Add payloads?
163
}
112
-
113
- var providerKey = registrationElement.GetAttribute("ProviderKey");
114
- var depId = new Identifier(AccessModifier.Section, this.BackendHelper.GenerateIdentifier("dep", bundlePackage.Id.Id, providerKey));
115
- this.Section.AddSymbol(new WixDependencyProviderSymbol(packagePayload.SourceLineNumbers, depId)
116
- {
117
- ParentRef = bundlePackage.Id.Id,
118
- ProviderKey = providerKey,
119
- Version = version,
120
- Attributes = WixDependencyProviderAttributes.ProvidesAttributesImported,
121
- });
122
-
123
- if (String.IsNullOrEmpty(this.Facade.PackageSymbol.DisplayName))
164
+ catch (Exception e)
165
{
125
- this.Facade.PackageSymbol.DisplayName = arpElement.GetAttribute("DisplayName");
166
+ this.Messaging.Write(BurnBackendErrors.InvalidBundleManifest(packagePayload.SourceLineNumbers, sourcePath, e.ToString()));
167
}
127
-
128
- this.ProcessPackages(document, namespaceManager);
129
-
130
- this.ProcessRelatedBundles(document, namespaceManager);
131
-
132
- // TODO: Add payloads?
168
}
169
}
170
@@ -153,15 +188,16 @@ namespace WixToolset.Core.Burn.Bundles
188
this.Facade.PackageSymbol.InstallSize = packageInstallSize;
189
}
190
156
- private void ProcessRelatedBundles(XmlDocument document, XmlNamespaceManager namespaceManager)
191
+ private void ProcessRelatedBundles(XmlDocument document, XmlNamespaceManager namespaceManager, WixBundlePayloadSymbol packagePayload, string sourcePath)
192
{
193
foreach (XmlElement relatedBundleElement in document.SelectNodes("/burn:BurnManifest/burn:RelatedBundle", namespaceManager))
194
{
195
var id = relatedBundleElement.GetAttribute("Id");
196
+ var actionValue = relatedBundleElement.GetAttribute("Action");
197
162
- if (!Enum.TryParse(relatedBundleElement.GetAttribute("Action"), out RelatedBundleActionType action))
198
+ if (!Enum.TryParse(actionValue, out RelatedBundleActionType action))
199
{
164
- // TODO: warning
200
+ this.Messaging.Write(BurnBackendWarnings.UnknownBundleRelationAction(packagePayload.SourceLineNumbers, sourcePath, actionValue));
201
continue;
202
}
203
src/wix/WixToolset.Core.Burn/BurnBackendErrors.cs
+6
@@ -85,6 +85,11 @@ namespace WixToolset.Core.Burn
85
return Message(null, Ids.UnsupportedRemotePackagePayload, "The first remote payload must be a supported package type of .exe or .msu. Use the -packageType switch to override the inferred extension: {0} from file: {1}", extension, path);
86
}
87
88
+ public static Message InvalidBundleManifest(SourceLineNumber sourceLineNumbers, string bundleExecutable, string reason)
89
+ {
90
+ return Message(sourceLineNumbers, Ids.InvalidBundleManifest, "Unable to harvest bundle executable '{0}'. The manifest was invalid. {1}", bundleExecutable, reason);
91
+ }
92
+
93
private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
94
{
95
return new Message(sourceLineNumber, MessageLevel.Error, (int)id, format, args);
@@ -104,6 +109,7 @@ namespace WixToolset.Core.Burn
109
IncompatibleWixBurnSection = 8009,
110
UnsupportedRemotePackagePayload = 8010,
111
FailedToAddIconOrSplashScreenToBundle = 8011,
112
+ InvalidBundleManifest = 8012,
113
} // last available is 8499. 8500 is BurnBackendWarnings.
114
}
115
}
src/wix/WixToolset.Core.Burn/BurnBackendWarnings.cs
+12
@@ -26,6 +26,16 @@ namespace WixToolset.Core.Burn
26
return Message(sourceLineNumbers, Ids.FailedToExtractAttachedContainers, "Failed to extract attached container. This most often happens when extracting a stripped bundle from the package cache, which is not supported.");
27
}
28
29
+ public static Message UnknownCoffMachineType(SourceLineNumber sourceLineNumbers, string bundleExecutable, ushort machineType)
30
+ {
31
+ return Message(sourceLineNumbers, Ids.UnknownCoffMachineType, "The bundle '{0}' has an unknown COFF machine type: {1}. It is assumed to be 32-bit.", bundleExecutable, machineType);
32
+ }
33
+
34
+ public static Message UnknownBundleRelationAction(SourceLineNumber sourceLineNumbers, string bundleExecutable, string action)
35
+ {
36
+ return Message(sourceLineNumbers, Ids.UnknownBundleRelationAction, "The manifest for the bundle '{0}' contains an unknown related bundle action '{1}'. It will be ignored.", bundleExecutable, action);
37
+ }
38
+
39
private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
40
{
41
return new Message(sourceLineNumber, MessageLevel.Warning, (int)id, format, args);
@@ -37,6 +47,8 @@ namespace WixToolset.Core.Burn
47
AttachedContainerPayloadCollision2 = 8501,
48
EmptyContainer = 8502,
49
FailedToExtractAttachedContainers = 8503,
50
+ UnknownCoffMachineType = 8504,
51
+ UnknownBundleRelationAction = 8505,
52
} // last available is 8999. 9000 is VerboseMessages.
53
}
54
}
src/wix/test/WixToolsetTest.CoreIntegration/BundlePackageFixture.cs
+87
@@ -127,5 +127,92 @@ namespace WixToolsetTest.CoreIntegration
127
}, packageElements);
128
}
129
}
130
+
131
+ [Fact]
132
+ public void CanBuildBundleWithV3BundlePackage()
133
+ {
134
+ var folder = TestData.Get(@"TestData");
135
+
136
+ using (var fs = new DisposableFileSystem())
137
+ {
138
+ var baseFolder = fs.GetFolder();
139
+ var parentIntermediateFolder = Path.Combine(baseFolder, "obj", "Parent");
140
+ var binFolder = Path.Combine(baseFolder, "bin");
141
+ var parentBundlePath = Path.Combine(binFolder, "parent.exe");
142
+ var parentPdbPath = Path.Combine(binFolder, "parent.wixpdb");
143
+ var baFolderPath = Path.Combine(baseFolder, "ba");
144
+ var extractFolderPath = Path.Combine(baseFolder, "extract");
145
+ string chainBundleId = "{215A70DB-AB35-48C7-BE51-D66EAAC87177}";
146
+
147
+ var result = WixRunner.Execute(new[]
148
+ {
149
+ "build",
150
+ Path.Combine(folder, "BundlePackage", "V3BundlePackage.wxs"),
151
+ "-bindpath", Path.Combine(folder, ".Data"),
152
+ "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
153
+ "-intermediateFolder", parentIntermediateFolder,
154
+ "-o", parentBundlePath,
155
+ });
156
+
157
+ result.AssertSuccess();
158
+
159
+ Assert.True(File.Exists(parentBundlePath));
160
+
161
+ string parentBundleId;
162
+ using (var wixOutput = WixOutput.Read(parentPdbPath))
163
+ {
164
+
165
+ var intermediate = Intermediate.Load(wixOutput);
166
+ var section = intermediate.Sections.Single();
167
+
168
+ var bundleSymbol = section.Symbols.OfType<WixBundleSymbol>().Single();
169
+ parentBundleId = bundleSymbol.BundleId;
170
+ }
171
+
172
+ var extractResult = BundleExtractor.ExtractBAContainer(null, parentBundlePath, baFolderPath, extractFolderPath);
173
+ extractResult.AssertSuccess();
174
+
175
+ var ignoreAttributesByElementName = new Dictionary<string, List<string>>
176
+ {
177
+ { "BundlePackage", new List<string> { "Size" } },
178
+ };
179
+ var bundlePackages = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:BundlePackage")
180
+ .Cast<XmlElement>()
181
+ .Select(e => e.GetTestXml(ignoreAttributesByElementName))
182
+ .ToArray();
183
+ WixAssert.CompareLineByLine(new string[]
184
+ {
185
+ $"<BundlePackage Id='v3bundle.exe' Cache='keep' CacheId='{chainBundleId}v1.0.0.0' InstallSize='1135' Size='*' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_v3bundle.exe' RollbackLogPathVariable='WixBundleRollbackLog_v3bundle.exe' BundleId='{chainBundleId}' Version='1.0.0.0' InstallArguments='' UninstallArguments='' RepairArguments='' SupportsBurnProtocol='yes' Win64='no'>" +
186
+ "<Provides Key='{215a70db-ab35-48c7-be51-d66eaac87177}' Version='1.0.0.0' DisplayName='CustomV3Theme' Imported='yes' />" +
187
+ "<RelatedBundle Id='{2BF4C01F-C132-4E70-97AB-2BC68C7CCD10}' Action='Upgrade' />" +
188
+ "<PayloadRef Id='v3bundle.exe' />" +
189
+ "</BundlePackage>",
190
+ }, bundlePackages);
191
+
192
+ var registrations = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Registration")
193
+ .Cast<XmlElement>()
194
+ .Select(e => e.GetTestXml())
195
+ .ToArray();
196
+ WixAssert.CompareLineByLine(new string[]
197
+ {
198
+ $"<Registration Id='{parentBundleId}' ExecutableName='parent.exe' PerMachine='yes' Tag='' Version='1.1.1.1' ProviderKey='{parentBundleId}'>" +
199
+ "<Arp Register='yes' DisplayName='V3BundlePackageBundle' DisplayVersion='1.1.1.1' Publisher='Example Corporation' />" +
200
+ "</Registration>"
201
+ }, registrations);
202
+
203
+ ignoreAttributesByElementName = new Dictionary<string, List<string>>
204
+ {
205
+ { "WixPackageProperties", new List<string> { "DownloadSize", "PackageSize" } },
206
+ };
207
+ var packageElements = extractResult.SelectBADataNodes("/ba:BootstrapperApplicationData/ba:WixPackageProperties")
208
+ .Cast<XmlElement>()
209
+ .Select(e => e.GetTestXml(ignoreAttributesByElementName))
210
+ .ToArray();
211
+ WixAssert.CompareLineByLine(new string[]
212
+ {
213
+ "<WixPackageProperties Package='v3bundle.exe' Vital='yes' DisplayName='CustomV3Theme' Description='CustomV3Theme' DownloadSize='*' PackageSize='*' InstalledSize='1135' PackageType='Bundle' Permanent='no' LogPathVariable='WixBundleLog_v3bundle.exe' RollbackLogPathVariable='WixBundleRollbackLog_v3bundle.exe' Compressed='yes' Version='1.0.0.0' Cache='keep' />",
214
+ }, packageElements);
215
+ }
216
+ }
217
}
218
}
src/wix/test/WixToolsetTest.CoreIntegration/TestData/.Data/v3bundle.exe
Binary files /dev/null and b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/.Data/v3bundle.exe differ
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundlePackage/V3BundlePackage.wxs
new
+10
@@ -0,0 +1,10 @@
1
+<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2
+ <Bundle Name="V3BundlePackageBundle" Version="1.1.1.1" Manufacturer="Example Corporation" UpgradeCode="{01369E89-159B-4622-8B91-70F51DEBCFE5}">
3
+ <BootstrapperApplication>
4
+ <BootstrapperApplicationDll SourceFile="fakeba.dll" />
5
+ </BootstrapperApplication>
6
+ <Chain>
7
+ <BundlePackage SourceFile="v3bundle.exe" />
8
+ </Chain>
9
+ </Bundle>
10
+</Wix>