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
+}