diff options
Diffstat (limited to 'src')
3 files changed, 109 insertions, 78 deletions
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/ValidationFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/ValidationFixture.cs index fd8f6f87..72397547 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/ValidationFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/ValidationFixture.cs | |||
| @@ -12,6 +12,15 @@ namespace WixToolsetTest.CoreIntegration | |||
| 12 | using WixToolset.Data.WindowsInstaller; | 12 | using WixToolset.Data.WindowsInstaller; |
| 13 | using Xunit; | 13 | using Xunit; |
| 14 | 14 | ||
| 15 | // When these tests are run repeatedly, they will expose an issue | ||
| 16 | // in the Windows Installer where ICE validations will occasionally | ||
| 17 | // fail to send all error/warning messages. The inconsistency | ||
| 18 | // obviously wreaks havoc on the tests. | ||
| 19 | // | ||
| 20 | // These tests are still interesting (and complex) enough to keep | ||
| 21 | // around for manual testing. Uncomment or define the following | ||
| 22 | // line to do so. | ||
| 23 | #if DISABLE_VALIDATION_TESTS_DUE_TO_WINDOWS_INSTALLER_INCONSISTENCIES | ||
| 15 | public class ValidationFixture | 24 | public class ValidationFixture |
| 16 | { | 25 | { |
| 17 | [Fact] | 26 | [Fact] |
| @@ -303,4 +312,5 @@ namespace WixToolsetTest.CoreIntegration | |||
| 303 | } | 312 | } |
| 304 | } | 313 | } |
| 305 | } | 314 | } |
| 315 | #endif | ||
| 306 | } | 316 | } |
diff --git a/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs b/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs index f0761762..0f7f8a88 100644 --- a/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs +++ b/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs | |||
| @@ -6,8 +6,6 @@ namespace WixToolsetTest.Sdk | |||
| 6 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
| 7 | using System.IO; | 7 | using System.IO; |
| 8 | using System.Linq; | 8 | using System.Linq; |
| 9 | using System.Runtime.CompilerServices; | ||
| 10 | using System.Threading; | ||
| 11 | using WixBuildTools.TestSupport; | 9 | using WixBuildTools.TestSupport; |
| 12 | using Xunit; | 10 | using Xunit; |
| 13 | 11 | ||
| @@ -326,82 +324,6 @@ namespace WixToolsetTest.Sdk | |||
| 326 | [InlineData(BuildSystem.DotNetCoreSdk)] | 324 | [InlineData(BuildSystem.DotNetCoreSdk)] |
| 327 | [InlineData(BuildSystem.MSBuild)] | 325 | [InlineData(BuildSystem.MSBuild)] |
| 328 | [InlineData(BuildSystem.MSBuild64)] | 326 | [InlineData(BuildSystem.MSBuild64)] |
| 329 | public void CannotBuildMsiPackageWithIceIssues(BuildSystem buildSystem) | ||
| 330 | { | ||
| 331 | var sourceFolder = TestData.Get(@"TestData\MsiPackageWithIceError\MsiPackage"); | ||
| 332 | |||
| 333 | var testLogsFolder = TestData.GetUnitTestLogsFolder(); | ||
| 334 | File.Delete(Path.Combine(testLogsFolder, buildSystem + ".binlog")); | ||
| 335 | File.Delete(Path.Combine(testLogsFolder, buildSystem + ".msi")); | ||
| 336 | |||
| 337 | using (var fs = new TestDataFolderFileSystem()) | ||
| 338 | { | ||
| 339 | fs.Initialize(sourceFolder); | ||
| 340 | var baseFolder = fs.BaseFolder; | ||
| 341 | var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj"); | ||
| 342 | |||
| 343 | var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, suppressValidation: false); | ||
| 344 | |||
| 345 | File.Copy(Path.ChangeExtension(projectPath, ".binlog"), Path.Combine(testLogsFolder, buildSystem + ".binlog")); | ||
| 346 | File.Copy(Path.Combine(baseFolder, "obj", "x86", "Release", "en-US", "MsiPackage.msi"), Path.Combine(testLogsFolder, buildSystem + ".msi")); | ||
| 347 | |||
| 348 | var iceIssues = result.Output.Where(line => line.Contains(": error") || line.Contains(": warning")) | ||
| 349 | .Select(line => line.Replace(baseFolder, "<baseFolder>") | ||
| 350 | .Replace("1>", String.Empty) // remove any multi-proc markers | ||
| 351 | .Replace("WIX204", "WIX0204") // normalize error number reporting because MSBuild is not consistent on zero padding | ||
| 352 | .Trim()) | ||
| 353 | .OrderBy(s => s, StringComparer.OrdinalIgnoreCase) | ||
| 354 | .ToArray(); | ||
| 355 | WixAssert.CompareLineByLine(new[] | ||
| 356 | { | ||
| 357 | @"<baseFolder>\Package.wxs(17): error WIX0204: ICE12: CustomAction: CausesICE12Error is of type: 35. Therefore it must come after CostFinalize @ 1000 in Seq Table: InstallExecuteSequence. CA Seq#: 49 [<baseFolder>\MsiPackage.wixproj]", | ||
| 358 | @"<baseFolder>\Package.wxs(17): error WIX0204: ICE12: CustomAction: CausesICE12Error is of type: 35. Therefore it must come after CostFinalize @ 1000 in Seq Table: InstallExecuteSequence. CA Seq#: 49 [<baseFolder>\MsiPackage.wixproj]", | ||
| 359 | @"<baseFolder>\Package.wxs(8): warning WIX1076: ICE46: Property 'Myproperty' referenced in column 'LaunchCondition'.'Condition' of row 'Myproperty' differs from a defined property by case only. [<baseFolder>\MsiPackage.wixproj]", | ||
| 360 | @"<baseFolder>\Package.wxs(8): warning WIX1076: ICE46: Property 'Myproperty' referenced in column 'LaunchCondition'.'Condition' of row 'Myproperty' differs from a defined property by case only. [<baseFolder>\MsiPackage.wixproj]", | ||
| 361 | }, iceIssues); | ||
| 362 | } | ||
| 363 | } | ||
| 364 | |||
| 365 | [Theory(Skip = "Flaky")] | ||
| 366 | [InlineData(BuildSystem.DotNetCoreSdk)] | ||
| 367 | [InlineData(BuildSystem.MSBuild)] | ||
| 368 | [InlineData(BuildSystem.MSBuild64)] | ||
| 369 | public void CannotBuildMsiPackageWithIceWarningsAsErrors(BuildSystem buildSystem) | ||
| 370 | { | ||
| 371 | var sourceFolder = TestData.Get(@"TestData\MsiPackageWithIceError\MsiPackage"); | ||
| 372 | |||
| 373 | using (var fs = new TestDataFolderFileSystem()) | ||
| 374 | { | ||
| 375 | fs.Initialize(sourceFolder); | ||
| 376 | var baseFolder = fs.BaseFolder; | ||
| 377 | var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj"); | ||
| 378 | |||
| 379 | var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, new[] | ||
| 380 | { | ||
| 381 | $"-p:TreatWarningsAsErrors=true", | ||
| 382 | MsbuildUtilities.GetQuotedPropertySwitch(buildSystem, "SuppressIces", "ICE12"), | ||
| 383 | }, suppressValidation: false); | ||
| 384 | Assert.Equal(1, result.ExitCode); | ||
| 385 | |||
| 386 | var iceIssues = result.Output.Where(line => (line.Contains(": error") || line.Contains(": warning"))) | ||
| 387 | .Select(line => line.Replace(baseFolder, "<baseFolder>") | ||
| 388 | .Replace("1>", String.Empty) // remove any multi-proc markers | ||
| 389 | .Replace("WIX204", "WIX0204") // normalize error number reporting because MSBuild is not consistent on zero padding | ||
| 390 | .Trim()) | ||
| 391 | .OrderBy(s => s, StringComparer.OrdinalIgnoreCase) | ||
| 392 | .ToArray(); | ||
| 393 | WixAssert.CompareLineByLine(new[] | ||
| 394 | { | ||
| 395 | @"<baseFolder>\Package.wxs(8): error WIX1076: ICE46: Property 'Myproperty' referenced in column 'LaunchCondition'.'Condition' of row 'Myproperty' differs from a defined property by case only. [<baseFolder>\MsiPackage.wixproj]", | ||
| 396 | @"<baseFolder>\Package.wxs(8): error WIX1076: ICE46: Property 'Myproperty' referenced in column 'LaunchCondition'.'Condition' of row 'Myproperty' differs from a defined property by case only. [<baseFolder>\MsiPackage.wixproj]", | ||
| 397 | }, iceIssues); | ||
| 398 | } | ||
| 399 | } | ||
| 400 | |||
| 401 | [Theory] | ||
| 402 | [InlineData(BuildSystem.DotNetCoreSdk)] | ||
| 403 | [InlineData(BuildSystem.MSBuild)] | ||
| 404 | [InlineData(BuildSystem.MSBuild64)] | ||
| 405 | public void CanBuildMsiPackageWithIceSuppressions(BuildSystem buildSystem) | 327 | public void CanBuildMsiPackageWithIceSuppressions(BuildSystem buildSystem) |
| 406 | { | 328 | { |
| 407 | var sourceFolder = TestData.Get(@"TestData\MsiPackageWithIceError\MsiPackage"); | 329 | var sourceFolder = TestData.Get(@"TestData\MsiPackageWithIceError\MsiPackage"); |
diff --git a/src/wix/test/WixToolsetTest.Sdk/MsbuildValidationFixture.cs b/src/wix/test/WixToolsetTest.Sdk/MsbuildValidationFixture.cs new file mode 100644 index 00000000..829ee9c1 --- /dev/null +++ b/src/wix/test/WixToolsetTest.Sdk/MsbuildValidationFixture.cs | |||
| @@ -0,0 +1,99 @@ | |||
| 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.Sdk | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using System.IO; | ||
| 7 | using System.Linq; | ||
| 8 | using WixBuildTools.TestSupport; | ||
| 9 | using Xunit; | ||
| 10 | |||
| 11 | // When these tests are run repeatedly, they will expose an issue | ||
| 12 | // in the Windows Installer where ICE validations will occasionally | ||
| 13 | // fail to send all error/warning messages. The inconsistency | ||
| 14 | // obviously wreaks havoc on the tests. | ||
| 15 | // | ||
| 16 | // These tests are still interesting (and complex) enough to keep | ||
| 17 | // around for manual testing. Uncomment or define the following | ||
| 18 | // line to do so. | ||
| 19 | #if DISABLE_VALIDATION_TESTS_DUE_TO_WINDOWS_INSTALLER_INCONSISTENCIES | ||
| 20 | public class MsbuildValidationFixture | ||
| 21 | { | ||
| 22 | [Theory] | ||
| 23 | [InlineData(BuildSystem.DotNetCoreSdk)] | ||
| 24 | [InlineData(BuildSystem.MSBuild)] | ||
| 25 | [InlineData(BuildSystem.MSBuild64)] | ||
| 26 | public void CannotBuildMsiPackageWithIceIssues(BuildSystem buildSystem) | ||
| 27 | { | ||
| 28 | var sourceFolder = TestData.Get(@"TestData\MsiPackageWithIceError\MsiPackage"); | ||
| 29 | |||
| 30 | var testLogsFolder = TestData.GetUnitTestLogsFolder(); | ||
| 31 | File.Delete(Path.Combine(testLogsFolder, buildSystem + ".binlog")); | ||
| 32 | File.Delete(Path.Combine(testLogsFolder, buildSystem + ".msi")); | ||
| 33 | |||
| 34 | using (var fs = new TestDataFolderFileSystem()) | ||
| 35 | { | ||
| 36 | fs.Initialize(sourceFolder); | ||
| 37 | var baseFolder = fs.BaseFolder; | ||
| 38 | var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj"); | ||
| 39 | |||
| 40 | var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, suppressValidation: false); | ||
| 41 | |||
| 42 | File.Copy(Path.ChangeExtension(projectPath, ".binlog"), Path.Combine(testLogsFolder, buildSystem + ".binlog")); | ||
| 43 | File.Copy(Path.Combine(baseFolder, "obj", "x86", "Release", "en-US", "MsiPackage.msi"), Path.Combine(testLogsFolder, buildSystem + ".msi")); | ||
| 44 | |||
| 45 | var iceIssues = result.Output.Where(line => line.Contains(": error") || line.Contains(": warning")) | ||
| 46 | .Select(line => line.Replace(baseFolder, "<baseFolder>") | ||
| 47 | .Replace("1>", String.Empty) // remove any multi-proc markers | ||
| 48 | .Replace("WIX204", "WIX0204") // normalize error number reporting because MSBuild is not consistent on zero padding | ||
| 49 | .Trim()) | ||
| 50 | .OrderBy(s => s, StringComparer.OrdinalIgnoreCase) | ||
| 51 | .ToArray(); | ||
| 52 | WixAssert.CompareLineByLine(new[] | ||
| 53 | { | ||
| 54 | @"<baseFolder>\Package.wxs(17): error WIX0204: ICE12: CustomAction: CausesICE12Error is of type: 35. Therefore it must come after CostFinalize @ 1000 in Seq Table: InstallExecuteSequence. CA Seq#: 49 [<baseFolder>\MsiPackage.wixproj]", | ||
| 55 | @"<baseFolder>\Package.wxs(17): error WIX0204: ICE12: CustomAction: CausesICE12Error is of type: 35. Therefore it must come after CostFinalize @ 1000 in Seq Table: InstallExecuteSequence. CA Seq#: 49 [<baseFolder>\MsiPackage.wixproj]", | ||
| 56 | @"<baseFolder>\Package.wxs(8): warning WIX1076: ICE46: Property 'Myproperty' referenced in column 'LaunchCondition'.'Condition' of row 'Myproperty' differs from a defined property by case only. [<baseFolder>\MsiPackage.wixproj]", | ||
| 57 | @"<baseFolder>\Package.wxs(8): warning WIX1076: ICE46: Property 'Myproperty' referenced in column 'LaunchCondition'.'Condition' of row 'Myproperty' differs from a defined property by case only. [<baseFolder>\MsiPackage.wixproj]", | ||
| 58 | }, iceIssues); | ||
| 59 | } | ||
| 60 | } | ||
| 61 | |||
| 62 | [Theory] | ||
| 63 | [InlineData(BuildSystem.DotNetCoreSdk)] | ||
| 64 | [InlineData(BuildSystem.MSBuild)] | ||
| 65 | [InlineData(BuildSystem.MSBuild64)] | ||
| 66 | public void CannotBuildMsiPackageWithIceWarningsAsErrors(BuildSystem buildSystem) | ||
| 67 | { | ||
| 68 | var sourceFolder = TestData.Get(@"TestData\MsiPackageWithIceError\MsiPackage"); | ||
| 69 | |||
| 70 | using (var fs = new TestDataFolderFileSystem()) | ||
| 71 | { | ||
| 72 | fs.Initialize(sourceFolder); | ||
| 73 | var baseFolder = fs.BaseFolder; | ||
| 74 | var projectPath = Path.Combine(baseFolder, "MsiPackage.wixproj"); | ||
| 75 | |||
| 76 | var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, new[] | ||
| 77 | { | ||
| 78 | $"-p:TreatWarningsAsErrors=true", | ||
| 79 | MsbuildUtilities.GetQuotedPropertySwitch(buildSystem, "SuppressIces", "ICE12"), | ||
| 80 | }, suppressValidation: false); | ||
| 81 | Assert.Equal(1, result.ExitCode); | ||
| 82 | |||
| 83 | var iceIssues = result.Output.Where(line => (line.Contains(": error") || line.Contains(": warning"))) | ||
| 84 | .Select(line => line.Replace(baseFolder, "<baseFolder>") | ||
| 85 | .Replace("1>", String.Empty) // remove any multi-proc markers | ||
| 86 | .Replace("WIX204", "WIX0204") // normalize error number reporting because MSBuild is not consistent on zero padding | ||
| 87 | .Trim()) | ||
| 88 | .OrderBy(s => s, StringComparer.OrdinalIgnoreCase) | ||
| 89 | .ToArray(); | ||
| 90 | WixAssert.CompareLineByLine(new[] | ||
| 91 | { | ||
| 92 | @"<baseFolder>\Package.wxs(8): error WIX1076: ICE46: Property 'Myproperty' referenced in column 'LaunchCondition'.'Condition' of row 'Myproperty' differs from a defined property by case only. [<baseFolder>\MsiPackage.wixproj]", | ||
| 93 | @"<baseFolder>\Package.wxs(8): error WIX1076: ICE46: Property 'Myproperty' referenced in column 'LaunchCondition'.'Condition' of row 'Myproperty' differs from a defined property by case only. [<baseFolder>\MsiPackage.wixproj]", | ||
| 94 | }, iceIssues); | ||
| 95 | } | ||
| 96 | } | ||
| 97 | } | ||
| 98 | #endif | ||
| 99 | } | ||
