Skip to content

Commit 4dff69f

Browse files
add WarningsAsMessages, WarningsAsErrors, WarningsNotAsErrors and Tre… (#10942)
* add WarningsAsMessages, WarningsAsErrors, WarningsNotAsErrors and TreatWarningsAsErrors to the engine (e.g. variant without prefix). test those so that nothing breaks * Optional output in BuildProjectExpectFailure Optionally capture output in BuildProjectExpectFailure for better test diagnosability. * Capture output logging in new tests * working through the review. Some test improvements. Changewave used. Comments. * addressing review comments * final review round, minor test update --------- Co-authored-by: Rainer Sigwald <[email protected]>
1 parent dd52710 commit 4dff69f

File tree

5 files changed

+237
-41
lines changed

5 files changed

+237
-41
lines changed

documentation/wiki/ChangeWaves.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ A wave of features is set to "rotate out" (i.e. become standard functionality) t
2525

2626
### 17.14
2727
- [.SLNX support - use the new parser for .sln and .slnx](https://github.com/dotnet/msbuild/pull/10836)
28+
- [TreatWarningsAsErrors, WarningsAsMessages, WarningsAsErrors, WarningsNotAsErrors are now supported on the engine side of MSBuild](https://github.com/dotnet/msbuild/pull/10942)
2829

2930
### 17.12
3031
- [Log TaskParameterEvent for scalar parameters](https://github.com/dotnet/msbuild/pull/9908)

src/Build.UnitTests/WarningsAsMessagesAndErrors_Tests.cs

Lines changed: 188 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,19 @@ public void TreatAllWarningsAsErrors()
3535
ObjectModelHelpers.BuildProjectExpectSuccess(GetTestProject(treatAllWarningsAsErrors: false));
3636
}
3737

38+
[Fact]
39+
public void TreatAllWarningsAsErrorsNoPrefix()
40+
{
41+
MockLogger logger = ObjectModelHelpers.BuildProjectExpectFailure(GetTestProject(customProperties: new Dictionary<string, string>
42+
{
43+
{"TreatWarningsAsErrors", "true"},
44+
}));
45+
46+
VerifyBuildErrorEvent(logger);
47+
48+
ObjectModelHelpers.BuildProjectExpectSuccess(GetTestProject(treatAllWarningsAsErrors: false));
49+
}
50+
3851
/// <summary>
3952
/// https://github.com/dotnet/msbuild/issues/2667
4053
/// </summary>
@@ -91,22 +104,6 @@ public void TreatWarningsAsErrorsWhenSpecifiedIndirectly()
91104
VerifyBuildErrorEvent(logger);
92105
}
93106

94-
[Fact]
95-
public void TreatWarningsAsErrorsWhenSpecifiedThroughAdditiveProperty()
96-
{
97-
MockLogger logger = ObjectModelHelpers.BuildProjectExpectFailure(
98-
GetTestProject(
99-
customProperties: new List<KeyValuePair<string, string>>
100-
{
101-
new KeyValuePair<string, string>("MSBuildWarningsAsErrors", "123"),
102-
new KeyValuePair<string, string>("MSBuildWarningsAsErrors", $@"$(MSBuildWarningsAsErrors);
103-
{ExpectedEventCode.ToLowerInvariant()}"),
104-
new KeyValuePair<string, string>("MSBuildWarningsAsErrors", "$(MSBuildWarningsAsErrors);ABC")
105-
}));
106-
107-
VerifyBuildErrorEvent(logger);
108-
}
109-
110107
[Fact]
111108
public void NotTreatWarningsAsErrorsWhenCodeNotSpecified()
112109
{
@@ -177,22 +174,99 @@ public void TreatWarningsAsMessagesWhenSpecifiedIndirectly()
177174
VerifyBuildMessageEvent(logger);
178175
}
179176

177+
[Theory]
178+
[InlineData(true)]
179+
[InlineData(false)]
180+
public void TreatWarningsAsMessagesWhenSpecifiedThroughAdditiveProperty(bool usePrefix)
181+
{
182+
string prefix = usePrefix ? "MSBuild" : "";
183+
MockLogger logger = ObjectModelHelpers.BuildProjectExpectSuccess(
184+
GetTestProject(
185+
customProperties: new List<KeyValuePair<string, string>>
186+
{
187+
new KeyValuePair<string, string>($"{prefix}WarningsAsMessages", "123"),
188+
new KeyValuePair<string, string>($"{prefix}WarningsAsMessages", $@"$({prefix}WarningsAsMessages);
189+
{ExpectedEventCode.ToLowerInvariant()}"),
190+
new KeyValuePair<string, string>($"{prefix}WarningsAsMessages", $"$({prefix}WarningsAsMessages);ABC")
191+
}));
192+
193+
VerifyBuildMessageEvent(logger);
194+
}
195+
180196
[Fact]
181-
public void TreatWarningsAsMessagesWhenSpecifiedThroughAdditiveProperty()
197+
///
198+
/// This is for chaining the properties together via addition.
199+
/// Furthermore it is intended to check if the prefix and no prefix variant interacts properly with each other.
200+
///
201+
public void TreatWarningsAsMessagesWhenSpecifiedThroughAdditivePropertyCombination()
182202
{
183203
MockLogger logger = ObjectModelHelpers.BuildProjectExpectSuccess(
184204
GetTestProject(
185205
customProperties: new List<KeyValuePair<string, string>>
186206
{
187207
new KeyValuePair<string, string>("MSBuildWarningsAsMessages", "123"),
188-
new KeyValuePair<string, string>("MSBuildWarningsAsMessages", $@"$(MSBuildWarningsAsMessages);
208+
new KeyValuePair<string, string>("WarningsAsMessages", $@"$(MSBuildWarningsAsMessages);
189209
{ExpectedEventCode.ToLowerInvariant()}"),
190-
new KeyValuePair<string, string>("MSBuildWarningsAsMessages", "$(MSBuildWarningsAsMessages);ABC")
210+
new KeyValuePair<string, string>("MSBuildWarningsAsMessages", "$(WarningsAsMessages);ABC")
191211
}));
192212

193213
VerifyBuildMessageEvent(logger);
194214
}
195215

216+
[Fact]
217+
public void TreatWarningsNotAsErrorsWhenSpecifiedThroughAdditivePropertyCombination()
218+
{
219+
MockLogger logger = ObjectModelHelpers.BuildProjectExpectSuccess(
220+
GetTestProject(
221+
customProperties: new List<KeyValuePair<string, string>>
222+
{
223+
new KeyValuePair<string, string>("MSBuildWarningsNotAsErrors", "123"),
224+
new KeyValuePair<string, string>("WarningsNotAsErrors", $@"$(MSBuildWarningsNotAsErrors);
225+
{ExpectedEventCode.ToLowerInvariant()}"),
226+
new KeyValuePair<string, string>("MSBuildWarningsNotAsErrors", "$(WarningsNotAsErrors);ABC")
227+
}),
228+
_output);
229+
230+
VerifyBuildWarningEvent(logger);
231+
}
232+
233+
[Theory]
234+
[InlineData(true)]
235+
[InlineData(false)]
236+
public void TreatWarningsAsErrorsWhenSpecifiedThroughAdditiveProperty(bool MSBuildPrefix)
237+
{
238+
string prefix = MSBuildPrefix ? "MSBuild" : "";
239+
MockLogger logger = ObjectModelHelpers.BuildProjectExpectFailure(
240+
GetTestProject(
241+
customProperties: new List<KeyValuePair<string, string>>
242+
{
243+
new KeyValuePair<string, string>($@"{prefix}WarningsAsErrors", "123"),
244+
new KeyValuePair<string, string>($@"{prefix}WarningsAsErrors", $@"$({prefix}WarningsAsErrors);
245+
{ExpectedEventCode.ToLowerInvariant()}"),
246+
new KeyValuePair<string, string>($@"{prefix}WarningsAsErrors", $@"$({prefix}WarningsAsErrors);ABC")
247+
}),
248+
_output);
249+
250+
VerifyBuildErrorEvent(logger);
251+
}
252+
253+
[Fact]
254+
public void TreatWarningsAsErrorsWhenSpecifiedThroughAdditivePropertyCombination()
255+
{
256+
MockLogger logger = ObjectModelHelpers.BuildProjectExpectFailure(
257+
GetTestProject(
258+
customProperties: new List<KeyValuePair<string, string>>
259+
{
260+
new KeyValuePair<string, string>("WarningsAsErrors", "123"),
261+
new KeyValuePair<string, string>("MSBuildWarningsAsErrors", $@"$(WarningsAsErrors);
262+
{ExpectedEventCode.ToLowerInvariant()}"),
263+
new KeyValuePair<string, string>("WarningsAsErrors", "$(MSBuildWarningsAsErrors);ABC")
264+
}),
265+
_output);
266+
267+
VerifyBuildErrorEvent(logger);
268+
}
269+
196270
[Fact]
197271
public void NotTreatWarningsAsMessagesWhenCodeNotSpecified()
198272
{
@@ -202,7 +276,8 @@ public void NotTreatWarningsAsMessagesWhenCodeNotSpecified()
202276
{
203277
new KeyValuePair<string, string>("MSBuildWarningsAsMessages", "123"),
204278
new KeyValuePair<string, string>("MSBuildWarningsAsMessages", "$(MSBuildWarningsAsMessages);ABC")
205-
}));
279+
}),
280+
_output);
206281

207282
VerifyBuildWarningEvent(logger);
208283
}
@@ -273,27 +348,33 @@ private string GetTestProject(bool? treatAllWarningsAsErrors = null, string warn
273348
</Project>";
274349
}
275350

351+
276352
[Theory]
277353

278354
[InlineData("MSB1235", "MSB1234", "MSB1234", "MSB1234", false)] // Log MSB1234, treat as error via MSBuildWarningsAsErrors
279355
[InlineData("MSB1235", "", "MSB1234", "MSB1234", true)] // Log MSB1234, expect MSB1234 as error via MSBuildTreatWarningsAsErrors
280356
[InlineData("MSB1234", "MSB1234", "MSB1234", "MSB4181", true)]// Log MSB1234, MSBuildWarningsAsMessages takes priority
357+
[InlineData("MSB1235", "MSB1234", "MSB1234", "MSB1234", false, false)] // Log MSB1234, treat as error via BuildWarningsAsErrors
358+
[InlineData("MSB1235", "", "MSB1234", "MSB1234", true, false)] // Log MSB1234, expect MSB1234 as error via BuildTreatWarningsAsErrors
359+
[InlineData("MSB1234", "MSB1234", "MSB1234", "MSB4181", true, false)]// Log MSB1234, BuildWarningsAsMessages takes priority
281360
public void WarningsAsErrorsAndMessages_Tests(string WarningsAsMessages,
282361
string WarningsAsErrors,
283362
string WarningToLog,
284363
string LogShouldContain,
285-
bool allWarningsAreErrors = false)
364+
bool allWarningsAreErrors = false,
365+
bool useMSPrefix = true)
286366
{
287367
using (TestEnvironment env = TestEnvironment.Create(_output))
288368
{
369+
var prefix = useMSPrefix ? "MSBuild" : "";
289370
TransientTestProjectWithFiles proj = env.CreateTestProjectWithFiles($@"
290371
<Project>
291372
<UsingTask TaskName = ""ReturnFailureWithoutLoggingErrorTask"" AssemblyName=""Microsoft.Build.Engine.UnitTests""/>
292373
<UsingTask TaskName = ""CustomLogAndReturnTask"" AssemblyName=""Microsoft.Build.Engine.UnitTests""/>
293374
<PropertyGroup>
294-
<MSBuildTreatWarningsAsErrors>{allWarningsAreErrors}</MSBuildTreatWarningsAsErrors>
295-
<MSBuildWarningsAsMessages>{WarningsAsMessages}</MSBuildWarningsAsMessages>
296-
<MSBuildWarningsAsErrors>{WarningsAsErrors}</MSBuildWarningsAsErrors>
375+
<{prefix}TreatWarningsAsErrors>{allWarningsAreErrors}</{prefix}TreatWarningsAsErrors>
376+
<{prefix}WarningsAsMessages>{WarningsAsMessages}</{prefix}WarningsAsMessages>
377+
<{prefix}WarningsAsErrors>{WarningsAsErrors}</{prefix}WarningsAsErrors>
297378
</PropertyGroup>
298379
<Target Name='Build'>
299380
<CustomLogAndReturnTask Return=""true"" ReturnHasLoggedErrors=""true"" WarningCode=""{WarningToLog}""/>
@@ -310,6 +391,83 @@ public void WarningsAsErrorsAndMessages_Tests(string WarningsAsMessages,
310391
}
311392
}
312393

394+
[Theory]
395+
396+
[InlineData(true)]// Log MSB1234, BuildWarningsNotAsErrors takes priority
397+
[InlineData(false)]
398+
public void WarningsNotAsErrorsAndMessages_Tests(bool useMSPrefix)
399+
{
400+
string Warning = "MSB1235";
401+
using (TestEnvironment env = TestEnvironment.Create(_output))
402+
{
403+
string prefix = useMSPrefix ? "MSBuild" : "";
404+
TransientTestProjectWithFiles proj = env.CreateTestProjectWithFiles($@"
405+
<Project>
406+
<PropertyGroup>
407+
<{prefix}TreatWarningsAsErrors>true</{prefix}TreatWarningsAsErrors>
408+
<{prefix}WarningsNotAsErrors>{Warning}</{prefix}WarningsNotAsErrors>
409+
</PropertyGroup>
410+
<Target Name='Build'>
411+
<Warning Text=""some random text"" Code='{Warning}' />
412+
</Target>
413+
</Project>");
414+
415+
MockLogger logger = proj.BuildProjectExpectSuccess();
416+
417+
logger.WarningCount.ShouldBe(1);
418+
logger.ErrorCount.ShouldBe(0);
419+
420+
logger.AssertLogContains(Warning);
421+
}
422+
}
423+
424+
425+
426+
[Theory]
427+
[InlineData("TreatWarningsAsErrors", "true", false)] // All warnings are treated as errors
428+
[InlineData("WarningsAsErrors", "MSB1007", false)]
429+
[InlineData("WarningsAsMessages", "MSB1007", false)]
430+
[InlineData("WarningsNotAsErrors", "MSB1007", true)]
431+
[InlineData("WarningsNotAsErrors", "MSB1007", false)]
432+
public void WarningsChangeWaveTest(string property, string propertyData, bool treatWarningsAsErrors)
433+
{
434+
using (TestEnvironment env = TestEnvironment.Create(_output))
435+
{
436+
string warningCode = "MSB1007";
437+
string treatWarningsAsErrorsCodeProperty = treatWarningsAsErrors ? "<MSBuildTreatWarningsAsErrors>true</MSBuildTreatWarningsAsErrors>" : "";
438+
env.SetEnvironmentVariable("MSBUILDDISABLEFEATURESFROMVERSION", ChangeWaves.Wave17_14.ToString());
439+
TransientTestProjectWithFiles proj = env.CreateTestProjectWithFiles($@"
440+
<Project>
441+
<PropertyGroup>
442+
{treatWarningsAsErrorsCodeProperty}
443+
<{property}>{propertyData}</{property}>
444+
</PropertyGroup>
445+
<Target Name='Build'>
446+
<Warning Text=""some random text"" Code='{warningCode}' />
447+
</Target>
448+
</Project>");
449+
if (treatWarningsAsErrors)
450+
{
451+
// Since the "no prefix" variations can't do anything with the change wave disabled, this should always fail.
452+
MockLogger logger = proj.BuildProjectExpectFailure();
453+
logger.ErrorCount.ShouldBe(1);
454+
logger.AssertLogContains($"error {warningCode}");
455+
456+
logger.AssertLogContains(warningCode);
457+
}
458+
else
459+
{
460+
MockLogger logger = proj.BuildProjectExpectSuccess();
461+
462+
logger.WarningCount.ShouldBe(1);
463+
logger.AssertLogContains($"warning {warningCode}");
464+
logger.ErrorCount.ShouldBe(0);
465+
466+
logger.AssertLogContains(warningCode);
467+
}
468+
}
469+
}
470+
313471
/// <summary>
314472
/// Item1 and Item2 log warnings and continue, item 3 logs a warn-> error and prevents item 4 from running in the batched build.
315473
/// </summary>
@@ -371,17 +529,20 @@ public void TaskLogsWarningAsError_BatchedBuild()
371529
[Theory]
372530
[InlineData("MSB1234", false, 1, 1)]
373531
[InlineData("MSB0000", true, 0, 2)]
374-
public void TaskReturnsTrue_Tests(string warningsAsErrors, bool treatAllWarningsAsErrors, int warningCountShouldBe, int errorCountShouldBe)
532+
[InlineData("MSB1234", false, 1, 1, false)]
533+
[InlineData("MSB0000", true, 0, 2, false)]
534+
public void TaskReturnsTrue_Tests(string warningsAsErrors, bool treatAllWarningsAsErrors, int warningCountShouldBe, int errorCountShouldBe, bool useMSPrefix = true)
375535
{
536+
string prefix = useMSPrefix ? "MSBuild" : "";
376537
using (TestEnvironment env = TestEnvironment.Create(_output))
377538
{
378539
TransientTestProjectWithFiles proj = env.CreateTestProjectWithFiles($@"
379540
<Project>
380541
<UsingTask TaskName = ""ReturnFailureWithoutLoggingErrorTask"" AssemblyName=""Microsoft.Build.Engine.UnitTests""/>
381542
<UsingTask TaskName = ""CustomLogAndReturnTask"" AssemblyName=""Microsoft.Build.Engine.UnitTests""/>
382543
<PropertyGroup>
383-
<MSBuildTreatWarningsAsErrors>{treatAllWarningsAsErrors}</MSBuildTreatWarningsAsErrors>
384-
<MSBuildWarningsAsErrors>{warningsAsErrors}</MSBuildWarningsAsErrors>
544+
<{prefix}TreatWarningsAsErrors>{treatAllWarningsAsErrors}</{prefix}TreatWarningsAsErrors>
545+
<{prefix}WarningsAsErrors>{warningsAsErrors}</{prefix}WarningsAsErrors>
385546
</PropertyGroup>
386547
<Target Name='Build'>
387548
<CustomLogAndReturnTask Return=""true"" WarningCode=""MSB1234""/>

0 commit comments

Comments
 (0)