From 7fa2390b06b643ec775d00d7938c1624f5c0fdfe Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 5 Mar 2021 18:28:01 -0600 Subject: Fix parsing ProviderKey for Bundle. --- src/WixToolset.Core/Compiler_Bundle.cs | 16 +++++-- .../DependencyExtensionFixture.cs | 53 +++++++++++++++++++++- .../Dependency/CustomProviderKeyBundle.wxs | 10 ++++ 3 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 src/test/WixToolsetTest.CoreIntegration/TestData/Dependency/CustomProviderKeyBundle.wxs diff --git a/src/WixToolset.Core/Compiler_Bundle.cs b/src/WixToolset.Core/Compiler_Bundle.cs index 46b79484..89ca94ba 100644 --- a/src/WixToolset.Core/Compiler_Bundle.cs +++ b/src/WixToolset.Core/Compiler_Bundle.cs @@ -197,7 +197,7 @@ namespace WixToolset.Core parentName = this.Core.GetAttributeValue(sourceLineNumbers, attrib); break; case "ProviderKey": - this.ParseBundleProviderKeyAttribute(sourceLineNumbers, node, attrib); + // This can't be processed until we create the section. break; case "SplashScreenSourceFile": splashScreenSourceFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib); @@ -261,10 +261,20 @@ namespace WixToolset.Core this.activeName = String.IsNullOrEmpty(name) ? Common.GenerateGuid() : name; this.Core.CreateActiveSection(this.activeName, SectionType.Bundle, 0, this.Context.CompilationId); - // Now that the active section is initialized, process only extension attributes. + // Now that the active section is initialized, process only extension attributes and the special ProviderKey attribute. foreach (var attrib in node.Attributes()) { - if (!String.IsNullOrEmpty(attrib.Name.NamespaceName) && CompilerCore.WixNamespace != attrib.Name.Namespace) + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || CompilerCore.WixNamespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "ProviderKey": + this.ParseBundleProviderKeyAttribute(sourceLineNumbers, node, attrib); + break; + // Unknown attributes were reported earlier. + } + } + else { this.Core.ParseExtensionAttribute(node, attrib); } diff --git a/src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs b/src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs index de038bde..48270ce4 100644 --- a/src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs @@ -57,12 +57,61 @@ namespace WixToolsetTest.CoreIntegration var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); extractResult.AssertSuccess(); - var provides = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:MsiPackage/burn:Provides"); + var provides = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:MsiPackage/burn:Provides") + .Cast() + .Select(e => e.GetTestXml()) + .ToArray(); WixAssert.CompareLineByLine(new string[] { "", "", - }, provides.Cast().Select(e => e.GetTestXml()).ToArray()); + }, provides); + } + } + + [Fact] + public void CanBuildBundleWithCustomProviderKey() + { + 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"); + + var result = WixRunner.Execute(new[] + { + "build", + Path.Combine(folder, "Dependency", "CustomProviderKeyBundle.wxs"), + Path.Combine(folder, "BundleWithPackageGroupRef", "MinimalPackageGroup.wxs"), + "-bindpath", Path.Combine(folder, "SimpleBundle", "data"), + "-intermediateFolder", intermediateFolder, + "-o", bundlePath, + }); + + result.AssertSuccess(); + + Assert.True(File.Exists(bundlePath)); + + var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); + extractResult.AssertSuccess(); + + var ignoreAttributesByElementName = new Dictionary> + { + { "Registration", new List { "Id" } }, + }; + var registration = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Registration") + .Cast() + .Select(e => e.GetTestXml(ignoreAttributesByElementName)) + .ToArray(); + WixAssert.CompareLineByLine(new string[] + { + "", + }, registration); } } diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/Dependency/CustomProviderKeyBundle.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/Dependency/CustomProviderKeyBundle.wxs new file mode 100644 index 00000000..6df8a7c0 --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/Dependency/CustomProviderKeyBundle.wxs @@ -0,0 +1,10 @@ + + + + + + + + + + -- cgit v1.2.3-55-g6feb