@joebigelow / wix-1 / commits / b673734c

Implement command line for SuppressAllWarnings and WarningsAsError.

Make WixRunner.Execute default to setting WarningsAsError to make sure tests are not accidentally causing warnings.

Sean Hall committed Jan 2, 2021 at 19:00 UTC b673734cce44dd28c1d4d1810da3069324466166
9 files changed +150 -20
src/WixToolset.Core.TestPackage/WixRunner.cs
+25 -5
@@ -21,23 +21,36 @@ namespace WixToolset.Core.TestPackage
21 /// </summary>
22 /// <param name="args"></param>
23 /// <param name="messages"></param>
24 + /// <param name="warningsAsErrors"></param>
25 /// <returns></returns>
25 - public static int Execute(string[] args, out List<Message> messages)
26 + public static int Execute(string[] args, out List<Message> messages, bool warningsAsErrors = true)
27 {
28 var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider();
28 - var task = Execute(args, serviceProvider, out messages);
29 + var task = Execute(args, serviceProvider, out messages, warningsAsErrors: warningsAsErrors);
30 return task.Result;
31 }
32
33 /// <summary>
34 /// Emulates calling wix.exe with standard backends.
35 + /// This overload always treats warnings as errors.
36 /// </summary>
37 /// <param name="args"></param>
38 /// <returns></returns>
39 public static WixRunnerResult Execute(params string[] args)
40 + {
41 + return Execute(true, args);
42 + }
43 +
44 + /// <summary>
45 + /// Emulates calling wix.exe with standard backends.
46 + /// </summary>
47 + /// <param name="warningsAsErrors"></param>
48 + /// <param name="args"></param>
49 + /// <returns></returns>
50 + public static WixRunnerResult Execute(bool warningsAsErrors, params string[] args)
51 {
52 var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider();
40 - var exitCode = Execute(args, serviceProvider, out var messages);
53 + var exitCode = Execute(args, serviceProvider, out var messages, warningsAsErrors: warningsAsErrors);
54 return new WixRunnerResult { ExitCode = exitCode.Result, Messages = messages.ToArray() };
55 }
56
@@ -47,8 +60,9 @@ namespace WixToolset.Core.TestPackage
60 /// <param name="args"></param>
61 /// <param name="coreProvider"></param>
62 /// <param name="messages"></param>
63 + /// <param name="warningsAsErrors"></param>
64 /// <returns></returns>
51 - public static Task<int> Execute(string[] args, IWixToolsetCoreServiceProvider coreProvider, out List<Message> messages)
65 + public static Task<int> Execute(string[] args, IWixToolsetCoreServiceProvider coreProvider, out List<Message> messages, bool warningsAsErrors = true)
66 {
67 coreProvider.AddWindowsInstallerBackend()
68 .AddBundleBackend();
@@ -60,8 +74,14 @@ namespace WixToolset.Core.TestPackage
74 var messaging = coreProvider.GetService<IMessaging>();
75 messaging.SetListener(listener);
76
77 + var arguments = new List<string>(args);
78 + if (warningsAsErrors)
79 + {
80 + arguments.Add("-wx");
81 + }
82 +
83 var commandLine = coreProvider.GetService<ICommandLine>();
64 - var command = commandLine.CreateCommand(args);
84 + var command = commandLine.CreateCommand(arguments.ToArray());
85 return command?.ExecuteAsync(CancellationToken.None) ?? Task.FromResult(1);
86 }
87 }
src/WixToolset.Core/CommandLine/BuildCommand.cs
+55 -13
@@ -549,8 +549,8 @@ namespace WixToolset.Core.CommandLine
549 {
550 if (parser.IsSwitch(arg))
551 {
552 - var parameter = arg.Substring(1);
553 - switch (parameter.ToLowerInvariant())
552 + var parameter = arg.Substring(1).ToLowerInvariant();
553 + switch (parameter)
554 {
555 case "?":
556 case "h":
@@ -583,7 +583,7 @@ namespace WixToolset.Core.CommandLine
583 this.BindPaths.Add(bindPath);
584 return true;
585 }
586 - break;
586 + return false;
587 }
588
589 case "cc":
@@ -649,7 +649,7 @@ namespace WixToolset.Core.CommandLine
649 this.PdbType = pdbType;
650 return true;
651 }
652 - break;
652 + return false;
653 }
654
655 case "nologo":
@@ -664,16 +664,22 @@ namespace WixToolset.Core.CommandLine
664 case "sval":
665 // todo: implement
666 return true;
667 + }
668
668 - case "sw":
669 - case "suppresswarning":
670 - var warning = parser.GetNextArgumentOrError(arg);
671 - if (!String.IsNullOrEmpty(warning))
672 - {
673 - var warningNumber = Convert.ToInt32(warning);
674 - this.Messaging.SuppressWarningMessage(warningNumber);
675 - }
676 - return true;
669 + if (parameter.StartsWith("sw"))
670 + {
671 + this.ParseSuppressWarning(parameter, "sw".Length, parser);
672 + return true;
673 + }
674 + else if (parameter.StartsWith("suppresswarning"))
675 + {
676 + this.ParseSuppressWarning(parameter, "suppresswarning".Length, parser);
677 + return true;
678 + }
679 + else if (parameter.StartsWith("wx"))
680 + {
681 + this.ParseWarningAsError(parameter, "wx".Length, parser);
682 + return true;
683 }
684
685 return false;
@@ -821,6 +827,42 @@ namespace WixToolset.Core.CommandLine
827
828 return true;
829 }
830 +
831 + private void ParseSuppressWarning(string parameter, int offset, ICommandLineParser parser)
832 + {
833 + var paramArg = parameter.Substring(offset);
834 + if (paramArg.Length == 0)
835 + {
836 + this.Messaging.SuppressAllWarnings = true;
837 + }
838 + else if (Int32.TryParse(paramArg, out var suppressWarning) && suppressWarning > 0)
839 + {
840 + this.Messaging.SuppressWarningMessage(suppressWarning);
841 + }
842 + else
843 + {
844 + this.Messaging.Write(ErrorMessages.IllegalSuppressWarningId(paramArg));
845 + parser.ErrorArgument = parameter;
846 + }
847 + }
848 +
849 + private void ParseWarningAsError(string parameter, int offset, ICommandLineParser parser)
850 + {
851 + var paramArg = parameter.Substring(offset);
852 + if (paramArg.Length == 0)
853 + {
854 + this.Messaging.WarningsAsError = true;
855 + }
856 + else if (Int32.TryParse(paramArg, out var elevateWarning) && elevateWarning > 0)
857 + {
858 + this.Messaging.SuppressWarningMessage(elevateWarning);
859 + }
860 + else
861 + {
862 + this.Messaging.Write(ErrorMessages.IllegalSuppressWarningId(paramArg));
863 + parser.ErrorArgument = parameter;
864 + }
865 + }
866 }
867 }
868 }
src/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs
+1
@@ -55,6 +55,7 @@ namespace WixToolsetTest.CoreIntegration
55 var result = WixRunner.Execute(new[]
56 {
57 "build",
58 + "-sw1008", // this is expected for this test
59 Path.Combine(folder, "Package.wxs"),
60 Path.Combine(folder, "PackageComponents.wxs"),
61 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs
+1
@@ -162,6 +162,7 @@ namespace WixToolsetTest.CoreIntegration
162 var result = WixRunner.Execute(new[]
163 {
164 "build",
165 + "-sw1079", // TODO: why does this test need to create a second cab which is empty?
166 Path.Combine(folder, "Package.wxs"),
167 Path.Combine(folder, "PackageComponents.wxs"),
168 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs
+1
@@ -357,6 +357,7 @@ namespace WixToolsetTest.CoreIntegration
357 var result = WixRunner.Execute(new[]
358 {
359 "build",
360 + "-sw1031", // this is expected for this test
361 Path.Combine(folder, "DefaultDir", "DefaultDir.wxs"),
362 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
363 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
src/test/WixToolsetTest.CoreIntegration/MsiTransactionFixture.cs
+2
@@ -26,6 +26,7 @@ namespace WixToolsetTest.CoreIntegration
26 var result = WixRunner.Execute(new[]
27 {
28 "build",
29 + "-sw1151", // this is expected for this test
30 Path.Combine(folder, "MsiTransaction", "X64AfterX86Bundle.wxs"),
31 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
32 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
@@ -55,6 +56,7 @@ namespace WixToolsetTest.CoreIntegration
56 var result = WixRunner.Execute(new[]
57 {
58 "build",
59 + "-sw1151", // this is expected for this test
60 Path.Combine(folder, "MsiTransaction", "X86AfterX64Bundle.wxs"),
61 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
62 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
src/test/WixToolsetTest.CoreIntegration/PayloadFixture.cs
+1 -1
@@ -61,7 +61,7 @@ namespace WixToolsetTest.CoreIntegration
61 var intermediateFolder = Path.Combine(baseFolder, "obj");
62 var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib");
63
64 - var result = WixRunner.Execute(new[]
64 + var result = WixRunner.Execute(warningsAsErrors: false, new[]
65 {
66 "build",
67 Path.Combine(folder, "CanonicalizeName.wxs"),
src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs
+1 -1
@@ -49,7 +49,7 @@ namespace WixToolsetTest.CoreIntegration
49 var baseFolder = fs.GetFolder();
50 var intermediateFolder = Path.Combine(baseFolder, "obj");
51
52 - var result = WixRunner.Execute(new[]
52 + var result = WixRunner.Execute(warningsAsErrors: false, new[]
53 {
54 "build",
55 Path.Combine(folder, "Package.wxs"),
src/test/WixToolsetTest.CoreIntegration/WarningFixture.cs new
+63
@@ -0,0 +1,63 @@
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 +namespace WixToolsetTest.CoreIntegration
4 +{
5 + using System.IO;
6 + using WixBuildTools.TestSupport;
7 + using WixToolset.Core.TestPackage;
8 + using WixToolset.Data;
9 + using Xunit;
10 +
11 + public class WarningFixture
12 + {
13 + [Fact]
14 + public void SuppressedWarningsWithWarningAsErrorsAreNotErrors()
15 + {
16 + var folder = TestData.Get(@"TestData\Payload");
17 +
18 + using (var fs = new DisposableFileSystem())
19 + {
20 + var baseFolder = fs.GetFolder();
21 + var intermediateFolder = Path.Combine(baseFolder, "obj");
22 + var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib");
23 +
24 + var result = WixRunner.Execute(warningsAsErrors: true, new[]
25 + {
26 + "build",
27 + "-sw1152",
28 + Path.Combine(folder, "CanonicalizeName.wxs"),
29 + "-intermediateFolder", intermediateFolder,
30 + "-o", wixlibPath,
31 + });
32 +
33 + result.AssertSuccess();
34 + }
35 + }
36 +
37 + [Fact]
38 + public void WarningsAsErrorsTreatsWarningsAsErrors()
39 + {
40 + var folder = TestData.Get(@"TestData\Payload");
41 +
42 + using (var fs = new DisposableFileSystem())
43 + {
44 + var baseFolder = fs.GetFolder();
45 + var intermediateFolder = Path.Combine(baseFolder, "obj");
46 + var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib");
47 +
48 + var result = WixRunner.Execute(warningsAsErrors: true, new[]
49 + {
50 + "build",
51 + Path.Combine(folder, "CanonicalizeName.wxs"),
52 + "-intermediateFolder", intermediateFolder,
53 + "-o", wixlibPath,
54 + });
55 +
56 + Assert.Equal((int)WarningMessages.Ids.PathCanonicalized, result.ExitCode);
57 +
58 + var message = Assert.Single(result.Messages);
59 + Assert.Equal(MessageLevel.Warning, message.Level); // TODO: is this right?
60 + }
61 + }
62 + }
63 +}