From 0531df3e9f7b3e41434def0c569bd748adc721f6 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Wed, 21 Apr 2021 16:51:22 -0500 Subject: Detect payload collisions. #4574 --- src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs | 21 +++- .../Bundles/CreateNonUXContainers.cs | 10 +- .../Bundles/DetectPayloadCollisionsCommand.cs | 137 +++++++++++++++++++++ src/WixToolset.Core.Burn/BurnBackendErrors.cs | 36 ++++++ src/WixToolset.Core.Burn/BurnBackendWarnings.cs | 16 ++- .../WixToolset.Core.Burn.csproj | 3 + .../BundleFixture.cs | 40 +++++- .../MsiTransactionFixture.cs | 8 +- .../TestData/BadInput/DuplicatePayloadNames.wxs | 26 +++- .../BundleCustomTable/BundleCustomTable.wxs | 2 +- .../TestData/MsiTransaction/X64AfterX86Bundle.wxs | 8 +- .../TestData/MsiTransaction/X86AfterX64Bundle.wxs | 8 +- 12 files changed, 281 insertions(+), 34 deletions(-) create mode 100644 src/WixToolset.Core.Burn/Bundles/DetectPayloadCollisionsCommand.cs diff --git a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs index 4be72eec..b24481dc 100644 --- a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs +++ b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs @@ -436,13 +436,23 @@ namespace WixToolset.Core.Burn trackedFiles.Add(this.BackendHelper.TrackFile(bextManifestPath, TrackedFileType.Temporary)); } + var containers = section.Symbols.OfType().ToDictionary(t => t.Id.Id); + { + var command = new DetectPayloadCollisionsCommand(this.Messaging, containers, facades.Values, payloadSymbols, packagesPayloads); + command.Execute(); + } + + if (this.Messaging.EncounteredError) + { + return; + } + // Create all the containers except the UX container first so the manifest (that goes in the UX container) // can contain all size and hash information about the non-UX containers. WixBundleContainerSymbol uxContainer; IEnumerable uxPayloads; - IEnumerable containers; { - var command = new CreateNonUXContainers(this.BackendHelper, section, bundleApplicationDllSymbol, payloadSymbols, this.IntermediateFolder, layoutDirectory, this.DefaultCompressionLevel); + var command = new CreateNonUXContainers(this.BackendHelper, section, bundleApplicationDllSymbol, containers.Values, payloadSymbols, this.IntermediateFolder, layoutDirectory, this.DefaultCompressionLevel); command.Execute(); fileTransfers.AddRange(command.FileTransfers); @@ -450,12 +460,11 @@ namespace WixToolset.Core.Burn uxContainer = command.UXContainer; uxPayloads = command.UXContainerPayloads; - containers = command.Containers; } // Resolve the download URLs now that we have all of the containers and payloads calculated. { - var command = new ResolveDownloadUrlsCommand(this.Messaging, this.BackendExtensions, containers, payloadSymbols); + var command = new ResolveDownloadUrlsCommand(this.Messaging, this.BackendExtensions, containers.Values, payloadSymbols); command.Execute(); } @@ -464,7 +473,7 @@ namespace WixToolset.Core.Burn { var executableName = Path.GetFileName(this.OutputPath); - var command = new CreateBurnManifestCommand(executableName, section, bundleSymbol, containers, chainSymbol, orderedFacades, boundaries, uxPayloads, payloadSymbols, packagesPayloads, orderedSearches, this.IntermediateFolder); + var command = new CreateBurnManifestCommand(executableName, section, bundleSymbol, containers.Values, chainSymbol, orderedFacades, boundaries, uxPayloads, payloadSymbols, packagesPayloads, orderedSearches, this.IntermediateFolder); command.Execute(); manifestPath = command.OutputPath; @@ -483,7 +492,7 @@ namespace WixToolset.Core.Burn } { - var command = new CreateBundleExeCommand(this.Messaging, this.BackendHelper, this.IntermediateFolder, this.OutputPath, bundleApplicationDllSymbol, bundleSymbol, uxContainer, containers); + var command = new CreateBundleExeCommand(this.Messaging, this.BackendHelper, this.IntermediateFolder, this.OutputPath, bundleApplicationDllSymbol, bundleSymbol, uxContainer, containers.Values); command.Execute(); fileTransfers.Add(command.Transfer); diff --git a/src/WixToolset.Core.Burn/Bundles/CreateNonUXContainers.cs b/src/WixToolset.Core.Burn/Bundles/CreateNonUXContainers.cs index 0dd2ba15..7b5984c0 100644 --- a/src/WixToolset.Core.Burn/Bundles/CreateNonUXContainers.cs +++ b/src/WixToolset.Core.Burn/Bundles/CreateNonUXContainers.cs @@ -14,11 +14,12 @@ namespace WixToolset.Core.Burn.Bundles internal class CreateNonUXContainers { - public CreateNonUXContainers(IBackendHelper backendHelper, IntermediateSection section, WixBootstrapperApplicationDllSymbol bootstrapperApplicationDllSymbol, Dictionary payloadSymbols, string intermediateFolder, string layoutFolder, CompressionLevel? defaultCompressionLevel) + public CreateNonUXContainers(IBackendHelper backendHelper, IntermediateSection section, WixBootstrapperApplicationDllSymbol bootstrapperApplicationDllSymbol, IEnumerable containerSymbols, Dictionary payloadSymbols, string intermediateFolder, string layoutFolder, CompressionLevel? defaultCompressionLevel) { this.BackendHelper = backendHelper; this.Section = section; this.BootstrapperApplicationDllSymbol = bootstrapperApplicationDllSymbol; + this.Containers = containerSymbols; this.PayloadSymbols = payloadSymbols; this.IntermediateFolder = intermediateFolder; this.LayoutFolder = layoutFolder; @@ -33,7 +34,7 @@ namespace WixToolset.Core.Burn.Bundles public IEnumerable UXContainerPayloads { get; private set; } - public IEnumerable Containers { get; private set; } + private IEnumerable Containers { get; } private IBackendHelper BackendHelper { get; } @@ -57,11 +58,9 @@ namespace WixToolset.Core.Burn.Bundles var attachedContainerIndex = 1; // count starts at one because UX container is "0". - var containerSymbols = this.Section.Symbols.OfType().ToList(); - var payloadsByContainer = this.PayloadSymbols.Values.ToLookup(p => p.ContainerRef); - foreach (var container in containerSymbols) + foreach (var container in this.Containers) { var containerId = container.Id.Id; @@ -120,7 +119,6 @@ namespace WixToolset.Core.Burn.Bundles } } - this.Containers = containerSymbols; this.UXContainerPayloads = uxPayloadSymbols; this.FileTransfers = fileTransfers; this.TrackedFiles = trackedFiles; diff --git a/src/WixToolset.Core.Burn/Bundles/DetectPayloadCollisionsCommand.cs b/src/WixToolset.Core.Burn/Bundles/DetectPayloadCollisionsCommand.cs new file mode 100644 index 00000000..bfb6b918 --- /dev/null +++ b/src/WixToolset.Core.Burn/Bundles/DetectPayloadCollisionsCommand.cs @@ -0,0 +1,137 @@ +// 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. + +namespace WixToolset.Core.Burn.Bundles +{ + using System; + using System.Collections.Generic; + using System.Linq; + using WixToolset.Data; + using WixToolset.Data.Burn; + using WixToolset.Data.Symbols; + using WixToolset.Extensibility.Services; + + internal class DetectPayloadCollisionsCommand + { + public DetectPayloadCollisionsCommand(IMessaging messaging, Dictionary containerSymbols, IEnumerable packages, Dictionary payloadSymbols, Dictionary> packagePayloads) + { + this.Messaging = messaging; + this.Containers = containerSymbols; + this.Packages = packages; + this.PayloadSymbols = payloadSymbols; + this.PackagePayloads = packagePayloads; + } + + private IMessaging Messaging { get; } + + private Dictionary Containers { get; } + + private IEnumerable Packages { get; } + + private Dictionary PayloadSymbols { get; } + + private Dictionary> PackagePayloads { get; } + + public void Execute() + { + this.DetectAttachedContainerCollisions(); + this.DetectExternalCollisions(); + this.DetectPackageCacheCollisions(); + } + + public void DetectAttachedContainerCollisions() + { + var attachedContainerPayloadsByNameByContainer = new Dictionary>(); + + foreach (var payload in this.PayloadSymbols.Values.Where(p => p.Packaging == PackagingType.Embedded)) + { + var containerId = payload.ContainerRef; + var container = this.Containers[containerId]; + if (container.Type == ContainerType.Attached) + { + if (!attachedContainerPayloadsByNameByContainer.TryGetValue(containerId, out var attachedContainerPayloadsByName)) + { + attachedContainerPayloadsByName = new Dictionary(StringComparer.OrdinalIgnoreCase); + attachedContainerPayloadsByNameByContainer.Add(containerId, attachedContainerPayloadsByName); + } + + if (!attachedContainerPayloadsByName.TryGetValue(payload.Name, out var collisionPayload)) + { + attachedContainerPayloadsByName.Add(payload.Name, payload); + } + else + { + if (containerId == BurnConstants.BurnUXContainerName) + { + this.Messaging.Write(BurnBackendErrors.BAContainerPayloadCollision(payload.SourceLineNumbers, payload.Id.Id, payload.Name)); + this.Messaging.Write(BurnBackendErrors.BAContainerPayloadCollision2(collisionPayload.SourceLineNumbers)); + } + else + { + this.Messaging.Write(BurnBackendWarnings.AttachedContainerPayloadCollision(payload.SourceLineNumbers, payload.Id.Id, payload.Name)); + this.Messaging.Write(BurnBackendWarnings.AttachedContainerPayloadCollision2(collisionPayload.SourceLineNumbers)); + } + } + } + } + } + + public void DetectExternalCollisions() + { + var externalPayloadsByName = new Dictionary(StringComparer.OrdinalIgnoreCase); + + foreach (var payload in this.PayloadSymbols.Values.Where(p => p.Packaging == PackagingType.External)) + { + if (!externalPayloadsByName.TryGetValue(payload.Name, out var collisionSymbol)) + { + externalPayloadsByName.Add(payload.Name, payload); + } + else + { + this.Messaging.Write(BurnBackendErrors.ExternalPayloadCollision(payload.SourceLineNumbers, "Payload", payload.Id.Id, payload.Name)); + this.Messaging.Write(BurnBackendErrors.ExternalPayloadCollision2(collisionSymbol.SourceLineNumbers)); + } + } + + foreach (var container in this.Containers.Values.Where(c => c.Type == ContainerType.Detached)) + { + if (!externalPayloadsByName.TryGetValue(container.Name, out var collisionSymbol)) + { + externalPayloadsByName.Add(container.Name, container); + } + else + { + this.Messaging.Write(BurnBackendErrors.ExternalPayloadCollision(container.SourceLineNumbers, "Container", container.Id.Id, container.Name)); + this.Messaging.Write(BurnBackendErrors.ExternalPayloadCollision2(collisionSymbol.SourceLineNumbers)); + } + } + } + + public void DetectPackageCacheCollisions() + { + var packageCachePayloadsByNameByCacheId = new Dictionary>(); + + foreach (var packageFacade in this.Packages) + { + var packagePayloads = this.PackagePayloads[packageFacade.PackageId]; + if (!packageCachePayloadsByNameByCacheId.TryGetValue(packageFacade.PackageSymbol.CacheId, out var packageCachePayloadsByName)) + { + packageCachePayloadsByName = new Dictionary(StringComparer.OrdinalIgnoreCase); + packageCachePayloadsByNameByCacheId.Add(packageFacade.PackageSymbol.CacheId, packageCachePayloadsByName); + } + + foreach (var payload in packagePayloads.Values) + { + if (!packageCachePayloadsByName.TryGetValue(payload.Name, out var collisionPayload)) + { + packageCachePayloadsByName.Add(payload.Name, payload); + } + else + { + this.Messaging.Write(BurnBackendErrors.PackageCachePayloadCollision(payload.SourceLineNumbers, payload.Id.Id, payload.Name, packageFacade.PackageId)); + this.Messaging.Write(BurnBackendErrors.PackageCachePayloadCollision2(collisionPayload.SourceLineNumbers)); + } + } + } + } + } +} diff --git a/src/WixToolset.Core.Burn/BurnBackendErrors.cs b/src/WixToolset.Core.Burn/BurnBackendErrors.cs index 02ab1b5d..6f9a3706 100644 --- a/src/WixToolset.Core.Burn/BurnBackendErrors.cs +++ b/src/WixToolset.Core.Burn/BurnBackendErrors.cs @@ -6,6 +6,16 @@ namespace WixToolset.Core.Burn internal static class BurnBackendErrors { + public static Message BAContainerPayloadCollision(SourceLineNumber sourceLineNumbers, string payloadId, string payloadName) + { + return Message(sourceLineNumbers, Ids.BAContainerPayloadCollision, "The Payload '{0}' has a duplicate Name '{1}' in the BA container. When extracting the container at runtime, the file will get overwritten.", payloadId, payloadName); + } + + public static Message BAContainerPayloadCollision2(SourceLineNumber sourceLineNumbers) + { + return Message(sourceLineNumbers, Ids.BAContainerPayloadCollision2, "The location of the payload related to the previous error."); + } + public static Message DuplicateCacheIds(SourceLineNumber originalLineNumber, string cacheId, string packageId) { return Message(originalLineNumber, Ids.DuplicateCacheIds, "The CacheId '{0}' for package '{1}' is duplicated. Each package must have a unique CacheId.", cacheId, packageId); @@ -16,6 +26,26 @@ namespace WixToolset.Core.Burn return Message(duplicateLineNumber, Ids.DuplicateCacheIds2, "The location of the package related to the previous error."); } + public static Message ExternalPayloadCollision(SourceLineNumber sourceLineNumbers, string symbolName, string payloadId, string payloadName) + { + return Message(sourceLineNumbers, Ids.ExternalPayloadCollision, "The external {0} '{1}' has a duplicate Name '{2}'. When building the bundle or laying out the bundle, the file will get overwritten.", symbolName, payloadId, payloadName); + } + + public static Message ExternalPayloadCollision2(SourceLineNumber sourceLineNumbers) + { + return Message(sourceLineNumbers, Ids.ExternalPayloadCollision2, "The location of the symbol related to the previous error."); + } + + public static Message PackageCachePayloadCollision(SourceLineNumber sourceLineNumbers, string payloadId, string payloadName, string packageId) + { + return Message(sourceLineNumbers, Ids.PackageCachePayloadCollision, "The Payload '{0}' has a duplicate Name '{1}' in package '{2}'. When caching the package, the file will get overwritten.", payloadId, payloadName, packageId); + } + + public static Message PackageCachePayloadCollision2(SourceLineNumber sourceLineNumbers) + { + return Message(sourceLineNumbers, Ids.PackageCachePayloadCollision2, "The location of the payload related to the previous error."); + } + private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args) { return new Message(sourceLineNumber, MessageLevel.Error, (int)id, format, args); @@ -25,6 +55,12 @@ namespace WixToolset.Core.Burn { DuplicateCacheIds = 8000, DuplicateCacheIds2 = 8001, + BAContainerPayloadCollision = 8002, + BAContainerPayloadCollision2 = 8003, + ExternalPayloadCollision = 8004, + ExternalPayloadCollision2 = 8005, + PackageCachePayloadCollision = 8006, + PackageCachePayloadCollision2 = 8007, } } } diff --git a/src/WixToolset.Core.Burn/BurnBackendWarnings.cs b/src/WixToolset.Core.Burn/BurnBackendWarnings.cs index 9b2fa6c9..cbbc954e 100644 --- a/src/WixToolset.Core.Burn/BurnBackendWarnings.cs +++ b/src/WixToolset.Core.Burn/BurnBackendWarnings.cs @@ -6,10 +6,15 @@ namespace WixToolset.Core.Burn internal static class BurnBackendWarnings { - //public static Message ReplaceThisWithTheFirstWarning(SourceLineNumber sourceLineNumbers) - //{ - // return Message(sourceLineNumbers, Ids.ReplaceThisWithTheFirstWarning, "format string", arg1, arg2); - //} + public static Message AttachedContainerPayloadCollision(SourceLineNumber sourceLineNumbers, string payloadId, string payloadName) + { + return Message(sourceLineNumbers, Ids.AttachedContainerPayloadCollision, "The Payload '{0}' has a duplicate Name '{1}' in the attached container. When extracting the bundle with dark.exe, the file will get overwritten.", payloadId, payloadName); + } + + public static Message AttachedContainerPayloadCollision2(SourceLineNumber sourceLineNumbers) + { + return Message(sourceLineNumbers, Ids.AttachedContainerPayloadCollision2, "The location of the payload related to the previous error."); + } private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args) { @@ -18,7 +23,8 @@ namespace WixToolset.Core.Burn public enum Ids { - // ReplaceThisWithTheFirstWarning = 8500, + AttachedContainerPayloadCollision = 8500, + AttachedContainerPayloadCollision2 = 8501, } } } diff --git a/src/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj b/src/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj index 85bfae69..f2da8a50 100644 --- a/src/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj +++ b/src/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj @@ -19,6 +19,9 @@ <_Parameter1>WixToolsetTest.Core.Burn, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a9967ec28982f42ee51a47dd5204315975a6ed69294b982146a99a70130a2fa13e226aaddde14c17d1bf3af69e8956d69a86585e74d208efcc5ac98a0686055327b2e87960d3c39bf3a6bc1e572863327d19dbf4fd2616dda124dbea260755a2d1d39d3cf1049ea526493eb2bf996b8ad985e3012308529e5b9b0f5cd5fa04bd + + <_Parameter1>WixToolsetTest.CoreIntegration, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a9967ec28982f42ee51a47dd5204315975a6ed69294b982146a99a70130a2fa13e226aaddde14c17d1bf3af69e8956d69a86585e74d208efcc5ac98a0686055327b2e87960d3c39bf3a6bc1e572863327d19dbf4fd2616dda124dbea260755a2d1d39d3cf1049ea526493eb2bf996b8ad985e3012308529e5b9b0f5cd5fa04bd + diff --git a/src/test/WixToolsetTest.CoreIntegration/BundleFixture.cs b/src/test/WixToolsetTest.CoreIntegration/BundleFixture.cs index d121da0f..cc91d212 100644 --- a/src/test/WixToolsetTest.CoreIntegration/BundleFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/BundleFixture.cs @@ -10,6 +10,7 @@ namespace WixToolsetTest.CoreIntegration using System.Xml; using Example.Extension; using WixBuildTools.TestSupport; + using WixToolset.Core.Burn; using WixToolset.Core.TestPackage; using WixToolset.Data; using WixToolset.Data.Burn; @@ -306,7 +307,7 @@ namespace WixToolsetTest.CoreIntegration } } - [Fact(Skip = "https://github.com/wixtoolset/issues/issues/4574")] + [Fact] public void CantBuildWithDuplicatePayloadNames() { var folder = TestData.Get(@"TestData"); @@ -328,7 +329,42 @@ namespace WixToolsetTest.CoreIntegration "-o", exePath, }); - Assert.InRange(result.ExitCode, 2, Int32.MaxValue); + var attachedContainerWarnings = result.Messages.Where(m => m.Id == (int)BurnBackendWarnings.Ids.AttachedContainerPayloadCollision) + .Select(m => m.ToString()) + .ToArray(); + WixAssert.CompareLineByLine(new string[] + { + "The Payload 'Auto2' has a duplicate Name 'burn.exe' in the attached container. When extracting the bundle with dark.exe, the file will get overwritten.", + }, attachedContainerWarnings); + + var baContainerErrors = result.Messages.Where(m => m.Id == (int)BurnBackendErrors.Ids.BAContainerPayloadCollision) + .Select(m => m.ToString()) + .ToArray(); + WixAssert.CompareLineByLine(new string[] + { + "The Payload 'DuplicatePayloadNames.wxs' has a duplicate Name 'fakeba.dll' in the BA container. When extracting the container at runtime, the file will get overwritten.", + "The Payload 'uxTxMXPVMXwQrPTMIGa5WGt93w0Ns' has a duplicate Name 'BootstrapperApplicationData.xml' in the BA container. When extracting the container at runtime, the file will get overwritten.", + "The Payload 'uxYRbgitOs0K878jn5L_z7LdJ21KI' has a duplicate Name 'BundleExtensionData.xml' in the BA container. When extracting the container at runtime, the file will get overwritten.", + }, baContainerErrors); + + var externalErrors = result.Messages.Where(m => m.Id == (int)BurnBackendErrors.Ids.ExternalPayloadCollision) + .Select(m => m.ToString()) + .ToArray(); + WixAssert.CompareLineByLine(new string[] + { + "The external Payload 'HiddenPersistedBundleVariable.wxs' has a duplicate Name 'PayloadCollision'. When building the bundle or laying out the bundle, the file will get overwritten.", + "The external Container 'MsiPackagesContainer' has a duplicate Name 'ContainerCollision'. When building the bundle or laying out the bundle, the file will get overwritten.", + }, externalErrors); + + var packageCacheErrors = result.Messages.Where(m => m.Id == (int)BurnBackendErrors.Ids.PackageCachePayloadCollision) + .Select(m => m.ToString()) + .ToArray(); + WixAssert.CompareLineByLine(new string[] + { + "The Payload 'test.msi' has a duplicate Name 'test.msi' in package 'test.msi'. When caching the package, the file will get overwritten.", + }, packageCacheErrors); + + Assert.Equal(14, result.Messages.Length); } } diff --git a/src/test/WixToolsetTest.CoreIntegration/MsiTransactionFixture.cs b/src/test/WixToolsetTest.CoreIntegration/MsiTransactionFixture.cs index 7ec0ea93..a566b490 100644 --- a/src/test/WixToolsetTest.CoreIntegration/MsiTransactionFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/MsiTransactionFixture.cs @@ -81,7 +81,7 @@ namespace WixToolsetTest.CoreIntegration Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), "-bindpath", Path.Combine(folder, "SingleFile", "data"), "-intermediateFolder", intermediateFolder, - "-o", Path.Combine(binFolder, "FirstX86.msi"), + "-o", Path.Combine(binFolder, "FirstX86", "FirstX86.msi"), }); result.AssertSuccess(); @@ -94,7 +94,7 @@ namespace WixToolsetTest.CoreIntegration Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), "-bindpath", Path.Combine(folder, "SingleFile", "data"), "-intermediateFolder", intermediateFolder, - "-o", Path.Combine(binFolder, "SecondX86.msi"), + "-o", Path.Combine(binFolder, "SecondX86", "SecondX86.msi"), }); result.AssertSuccess(); @@ -108,7 +108,7 @@ namespace WixToolsetTest.CoreIntegration "-bindpath", Path.Combine(folder, "SingleFile", "data"), "-intermediateFolder", intermediateFolder, "-arch", "x64", - "-o", Path.Combine(binFolder, "FirstX64.msi"), + "-o", Path.Combine(binFolder, "FirstX64", "FirstX64.msi"), }); result.AssertSuccess(); @@ -122,7 +122,7 @@ namespace WixToolsetTest.CoreIntegration "-bindpath", Path.Combine(folder, "SingleFile", "data"), "-intermediateFolder", intermediateFolder, "-arch", "x64", - "-o", Path.Combine(binFolder, "SecondX64.msi"), + "-o", Path.Combine(binFolder, "SecondX64", "SecondX64.msi"), }); result.AssertSuccess(); diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/BadInput/DuplicatePayloadNames.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/BadInput/DuplicatePayloadNames.wxs index 2d4e8a3c..4fe7e097 100644 --- a/src/test/WixToolsetTest.CoreIntegration/TestData/BadInput/DuplicatePayloadNames.wxs +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/BadInput/DuplicatePayloadNames.wxs @@ -2,8 +2,30 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/BundleCustomTable/BundleCustomTable.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/BundleCustomTable/BundleCustomTable.wxs index db755171..e52302d4 100644 --- a/src/test/WixToolsetTest.CoreIntegration/TestData/BundleCustomTable/BundleCustomTable.wxs +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/BundleCustomTable/BundleCustomTable.wxs @@ -48,6 +48,6 @@ - + diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/MsiTransaction/X64AfterX86Bundle.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/MsiTransaction/X64AfterX86Bundle.wxs index 8f4fc8bd..e6527a36 100644 --- a/src/test/WixToolsetTest.CoreIntegration/TestData/MsiTransaction/X64AfterX86Bundle.wxs +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/MsiTransaction/X64AfterX86Bundle.wxs @@ -2,11 +2,11 @@ - + - - - + + + diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/MsiTransaction/X86AfterX64Bundle.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/MsiTransaction/X86AfterX64Bundle.wxs index 221f06c5..f1c939db 100644 --- a/src/test/WixToolsetTest.CoreIntegration/TestData/MsiTransaction/X86AfterX64Bundle.wxs +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/MsiTransaction/X86AfterX64Bundle.wxs @@ -2,11 +2,11 @@ - + - - - + + + -- cgit v1.2.3-55-g6feb