From 8b7545c2b692098957cc5737e92415bbe4f7823d Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sat, 24 Apr 2021 17:46:14 -0500 Subject: Include LayoutOnly payloads in BootstrapperApplicationData.xml. #6399 --- src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs | 2 +- ...CreateBootstrapperApplicationManifestCommand.cs | 49 ++++++++++++------- .../BundleManifestFixture.cs | 8 ++-- .../ContainerFixture.cs | 55 ++++++++++++++++++++++ 4 files changed, 91 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs index b88251af..deab4d78 100644 --- a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs +++ b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs @@ -390,7 +390,7 @@ namespace WixToolset.Core.Burn // Generate the core-defined BA manifest tables... string baManifestPath; { - var command = new CreateBootstrapperApplicationManifestCommand(section, bundleSymbol, orderedFacades, uxPayloadIndex, packagesPayloads, this.IntermediateFolder, this.InternalBurnBackendHelper); + var command = new CreateBootstrapperApplicationManifestCommand(section, bundleSymbol, orderedFacades, uxPayloadIndex, payloadSymbols, packagesPayloads, this.IntermediateFolder, this.InternalBurnBackendHelper); command.Execute(); var baManifestPayload = command.BootstrapperApplicationManifestPayloadRow; diff --git a/src/WixToolset.Core.Burn/Bundles/CreateBootstrapperApplicationManifestCommand.cs b/src/WixToolset.Core.Burn/Bundles/CreateBootstrapperApplicationManifestCommand.cs index 115ea671..a0ee606d 100644 --- a/src/WixToolset.Core.Burn/Bundles/CreateBootstrapperApplicationManifestCommand.cs +++ b/src/WixToolset.Core.Burn/Bundles/CreateBootstrapperApplicationManifestCommand.cs @@ -15,12 +15,13 @@ namespace WixToolset.Core.Burn.Bundles internal class CreateBootstrapperApplicationManifestCommand { - public CreateBootstrapperApplicationManifestCommand(IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable chainPackages, int lastUXPayloadIndex, Dictionary> packagesPayloads, string intermediateFolder, IInternalBurnBackendHelper internalBurnBackendHelper) + public CreateBootstrapperApplicationManifestCommand(IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable chainPackages, int lastUXPayloadIndex, Dictionary payloadSymbols, Dictionary> packagesPayloads, string intermediateFolder, IInternalBurnBackendHelper internalBurnBackendHelper) { this.Section = section; this.BundleSymbol = bundleSymbol; this.ChainPackages = chainPackages; this.LastUXPayloadIndex = lastUXPayloadIndex; + this.Payloads = payloadSymbols; this.PackagesPayloads = packagesPayloads; this.IntermediateFolder = intermediateFolder; this.InternalBurnBackendHelper = internalBurnBackendHelper; @@ -36,6 +37,8 @@ namespace WixToolset.Core.Burn.Bundles private int LastUXPayloadIndex { get; } + private Dictionary Payloads { get; } + private Dictionary> PackagesPayloads { get; } private string IntermediateFolder { get; } @@ -216,7 +219,6 @@ namespace WixToolset.Core.Burn.Bundles private void WritePayloadInfo(XmlTextWriter writer) { - // TODO: check v3 - should this be only include package payloads or include all non-UX container payloads? foreach (var kvp in this.PackagesPayloads.OrderBy(kvp => kvp.Key, StringComparer.Ordinal)) { var packageId = kvp.Key; @@ -224,30 +226,41 @@ namespace WixToolset.Core.Burn.Bundles foreach (var payloadSymbol in payloadsById.Values.OrderBy(p => p.Id.Id, StringComparer.Ordinal)) { - writer.WriteStartElement("WixPayloadProperties"); + this.WritePayloadInfo(writer, payloadSymbol, packageId); + } + } - writer.WriteAttributeString("Package", packageId); + foreach (var payloadSymbol in this.Payloads.Values.Where(p => p.LayoutOnly).OrderBy(p => p.Id.Id, StringComparer.Ordinal)) + { + this.WritePayloadInfo(writer, payloadSymbol, null); + } + } - writer.WriteAttributeString("Payload", payloadSymbol.Id.Id); + private void WritePayloadInfo(XmlTextWriter writer, WixBundlePayloadSymbol payloadSymbol, string packageId) + { + writer.WriteStartElement("WixPayloadProperties"); - if (!String.IsNullOrEmpty(payloadSymbol.ContainerRef)) - { - writer.WriteAttributeString("Container", payloadSymbol.ContainerRef); - } + if (!String.IsNullOrEmpty(packageId)) + { + writer.WriteAttributeString("Package", packageId); + } - writer.WriteAttributeString("Name", payloadSymbol.Name); - writer.WriteAttributeString("Size", payloadSymbol.FileSize.Value.ToString(CultureInfo.InvariantCulture)); + writer.WriteAttributeString("Payload", payloadSymbol.Id.Id); - if (!String.IsNullOrEmpty(payloadSymbol.DownloadUrl)) - { - writer.WriteAttributeString("DownloadUrl", payloadSymbol.DownloadUrl); - } + if (!String.IsNullOrEmpty(payloadSymbol.ContainerRef)) + { + writer.WriteAttributeString("Container", payloadSymbol.ContainerRef); + } - writer.WriteAttributeString("LayoutOnly", payloadSymbol.LayoutOnly ? "yes" : "no"); + writer.WriteAttributeString("Name", payloadSymbol.Name); + writer.WriteAttributeString("Size", payloadSymbol.FileSize.Value.ToString(CultureInfo.InvariantCulture)); - writer.WriteEndElement(); - } + if (!String.IsNullOrEmpty(payloadSymbol.DownloadUrl)) + { + writer.WriteAttributeString("DownloadUrl", payloadSymbol.DownloadUrl); } + + writer.WriteEndElement(); } private WixBundlePayloadSymbol CreateBootstrapperApplicationManifestPayloadRow(string baManifestPath) diff --git a/src/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs b/src/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs index 29c741dc..6d769bd6 100644 --- a/src/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs @@ -131,10 +131,10 @@ namespace WixToolsetTest.CoreIntegration { "WixPayloadProperties", new List { "Size" } }, }; Assert.Equal(4, payloadElements.Count); - Assert.Equal("", payloadElements[0].GetTestXml(ignoreAttributesByElementName)); - Assert.Equal("", payloadElements[1].GetTestXml(ignoreAttributesByElementName)); - Assert.Equal("", payloadElements[2].GetTestXml(ignoreAttributesByElementName)); - Assert.Equal("", payloadElements[3].GetTestXml(ignoreAttributesByElementName)); + Assert.Equal("", payloadElements[0].GetTestXml(ignoreAttributesByElementName)); + Assert.Equal("", payloadElements[1].GetTestXml(ignoreAttributesByElementName)); + Assert.Equal("", payloadElements[2].GetTestXml(ignoreAttributesByElementName)); + Assert.Equal("", payloadElements[3].GetTestXml(ignoreAttributesByElementName)); } } diff --git a/src/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs b/src/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs index ffeda069..ff48ee05 100644 --- a/src/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs @@ -254,6 +254,61 @@ namespace WixToolsetTest.CoreIntegration } } + [Fact] + public void PopulatesBAManifestWithLayoutOnlyPayloads() + { + var folder = TestData.Get(@"TestData"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(); + var intermediateFolder = Path.Combine(baseFolder, "obj"); + var binFolder = Path.Combine(baseFolder, "bin"); + var bundlePath = Path.Combine(binFolder, "test.exe"); + var baFolderPath = Path.Combine(baseFolder, "ba"); + var extractFolderPath = Path.Combine(baseFolder, "extract"); + + this.BuildMsis(folder, intermediateFolder, binFolder); + + var result = WixRunner.Execute(false, new[] + { + "build", + Path.Combine(folder, "Container", "LayoutPayloadInContainer.wxs"), + "-bindpath", Path.Combine(folder, "SimpleBundle", "data"), + "-bindpath", binFolder, + "-intermediateFolder", intermediateFolder, + "-o", bundlePath + }); + + WixAssert.CompareLineByLine(new string[] + { + "The layout-only Payload 'SharedPayload' is being added to Container 'FirstX64'. It will not be extracted during layout.", + }, result.Messages.Select(m => m.ToString()).ToArray()); + result.AssertSuccess(); + + Assert.True(File.Exists(bundlePath)); + + var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); + extractResult.AssertSuccess(); + + var ignoreAttributesByElementName = new Dictionary> + { + { "WixPayloadProperties", new List { "Size" } }, + }; + var payloads = extractResult.SelectBADataNodes("/ba:BootstrapperApplicationData/ba:WixPayloadProperties") + .Cast() + .Select(e => e.GetTestXml(ignoreAttributesByElementName)) + .ToArray(); + WixAssert.CompareLineByLine(new string[] + { + "", + "", + "", + "", + }, payloads); + } + } + private void BuildMsis(string folder, string intermediateFolder, string binFolder) { var result = WixRunner.Execute(new[] -- cgit v1.2.3-55-g6feb