From c1605aa577e304fe0fb4c57056b58754bfaf3666 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Fri, 8 Jan 2021 13:46:36 -0800 Subject: Require or recommend ExePackage/@DetectCondition Fixes wixtoolset/issues#6197 --- src/WixToolset.Core/Compiler_Bundle.cs | 16 ++++++- .../ExePackageFixture.cs | 52 ++++++++++++++++++++++ .../TestData/ExePackage/MissingDetectCondition.wxs | 9 ++++ .../TestData/ExePackage/RequireDetectCondition.wxs | 11 +++++ .../SingleExeBundle/SingleExePackageGroup.wxs | 2 +- 5 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs create mode 100644 src/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/MissingDetectCondition.wxs create mode 100644 src/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/RequireDetectCondition.wxs (limited to 'src') diff --git a/src/WixToolset.Core/Compiler_Bundle.cs b/src/WixToolset.Core/Compiler_Bundle.cs index 40b44bbd..1bee3823 100644 --- a/src/WixToolset.Core/Compiler_Bundle.cs +++ b/src/WixToolset.Core/Compiler_Bundle.cs @@ -2232,7 +2232,7 @@ namespace WixToolset.Core allowed = (packageType == WixBundlePackageType.Exe || packageType == WixBundlePackageType.Msp); break; case "DetectCondition": - detectCondition = this.Core.GetAttributeValue(sourceLineNumbers, attrib); + detectCondition = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty); allowed = (packageType == WixBundlePackageType.Exe || packageType == WixBundlePackageType.Msu); break; case "Protocol": @@ -2394,6 +2394,20 @@ namespace WixToolset.Core perMachine = YesNoDefaultType.Default; } + // Detect condition is recommended or required for Exe and Msu packages + // (depending on whether uninstall arguments were provided). + if ((packageType == WixBundlePackageType.Exe || packageType == WixBundlePackageType.Msu) && String.IsNullOrEmpty(detectCondition)) + { + if (String.IsNullOrEmpty(uninstallCommand)) + { + this.Core.Write(WarningMessages.DetectConditionRecommended(sourceLineNumbers, node.Name.LocalName)); + } + else + { + this.Core.Write(ErrorMessages.ExpectedAttributeWithValueWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "UninstallCommand")); + } + } + // Now that the package ID is known, we can parse the extension attributes... var contextValues = new Dictionary() { { "PackageId", id.Id } }; foreach (var attribute in extensionAttributes) diff --git a/src/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs b/src/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs new file mode 100644 index 00000000..e2306dcd --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs @@ -0,0 +1,52 @@ +// 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 WixToolsetTest.CoreIntegration +{ + using System.IO; + using WixBuildTools.TestSupport; + using WixToolset.Core.TestPackage; + using Xunit; + + public class ExePackageFixture + { + [Fact] + public void ErrorWhenMissingDetectCondition() + { + var folder = TestData.Get(@"TestData", "ExePackage"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(); + + var result = WixRunner.Execute(new[] + { + "build", + Path.Combine(folder, "MissingDetectCondition.wxs"), + "-o", Path.Combine(baseFolder, "test.wixlib") + }); + + Assert.Equal(1153, result.ExitCode); + } + } + + [Fact] + public void ErrorWhenRequireDetectCondition() + { + var folder = TestData.Get(@"TestData", "ExePackage"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(); + + var result = WixRunner.Execute(new[] + { + "build", + Path.Combine(folder, "RequireDetectCondition.wxs"), + "-o", Path.Combine(baseFolder, "test.wixlib") + }); + + Assert.Equal(401, result.ExitCode); + } + } + } +} diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/MissingDetectCondition.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/MissingDetectCondition.wxs new file mode 100644 index 00000000..21b4269b --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/MissingDetectCondition.wxs @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/RequireDetectCondition.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/RequireDetectCondition.wxs new file mode 100644 index 00000000..42253f18 --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/RequireDetectCondition.wxs @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/SingleExeBundle/SingleExePackageGroup.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/SingleExeBundle/SingleExePackageGroup.wxs index 9d7a9511..cad1f049 100644 --- a/src/test/WixToolsetTest.CoreIntegration/TestData/SingleExeBundle/SingleExePackageGroup.wxs +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/SingleExeBundle/SingleExePackageGroup.wxs @@ -2,7 +2,7 @@ - + -- cgit v1.2.3-55-g6feb