From 8c76578ce852a04f7ebeb8631f67913daa3ab307 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Sun, 7 Jun 2020 07:58:59 -0700 Subject: Migrate integration tests from Tools repo --- .../ConverterIntegrationFixture.cs | 172 +++++++++++++++++++++ .../Mocks/MockCoreServiceProvider.cs | 51 ++++++ .../Mocks/MockMessaging.cs | 40 +++++ .../TestData/PermissionEx/v3.wxs | 27 ++++ .../TestData/PermissionEx/v4_expected.wxs | 27 ++++ .../Preprocessor/ConvertedPreprocessor.wxs | 62 ++++++++ .../TestData/Preprocessor/Preprocessor.wxs | 63 ++++++++ .../TestData/Preprocessor/wixcop.settings.xml | 9 ++ .../TestData/QtExec.bad/v3.wxs | 65 ++++++++ .../TestData/QtExec.bad/v4_expected.wxs | 64 ++++++++ .../TestData/QtExec/v3.wxs | 64 ++++++++ .../TestData/QtExec/v4_expected.wxs | 63 ++++++++ .../TestData/SingleFile/ConvertedSingleFile.wxs | 60 +++++++ .../TestData/SingleFile/SingleFile.wxs | 61 ++++++++ .../WixToolsetTest.Converters.csproj | 15 ++ 15 files changed, 843 insertions(+) create mode 100644 src/test/WixToolsetTest.Converters/ConverterIntegrationFixture.cs create mode 100644 src/test/WixToolsetTest.Converters/Mocks/MockCoreServiceProvider.cs create mode 100644 src/test/WixToolsetTest.Converters/Mocks/MockMessaging.cs create mode 100644 src/test/WixToolsetTest.Converters/TestData/PermissionEx/v3.wxs create mode 100644 src/test/WixToolsetTest.Converters/TestData/PermissionEx/v4_expected.wxs create mode 100644 src/test/WixToolsetTest.Converters/TestData/Preprocessor/ConvertedPreprocessor.wxs create mode 100644 src/test/WixToolsetTest.Converters/TestData/Preprocessor/Preprocessor.wxs create mode 100644 src/test/WixToolsetTest.Converters/TestData/Preprocessor/wixcop.settings.xml create mode 100644 src/test/WixToolsetTest.Converters/TestData/QtExec.bad/v3.wxs create mode 100644 src/test/WixToolsetTest.Converters/TestData/QtExec.bad/v4_expected.wxs create mode 100644 src/test/WixToolsetTest.Converters/TestData/QtExec/v3.wxs create mode 100644 src/test/WixToolsetTest.Converters/TestData/QtExec/v4_expected.wxs create mode 100644 src/test/WixToolsetTest.Converters/TestData/SingleFile/ConvertedSingleFile.wxs create mode 100644 src/test/WixToolsetTest.Converters/TestData/SingleFile/SingleFile.wxs (limited to 'src') diff --git a/src/test/WixToolsetTest.Converters/ConverterIntegrationFixture.cs b/src/test/WixToolsetTest.Converters/ConverterIntegrationFixture.cs new file mode 100644 index 00000000..6138fd2b --- /dev/null +++ b/src/test/WixToolsetTest.Converters/ConverterIntegrationFixture.cs @@ -0,0 +1,172 @@ +// 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.Converters +{ + using System; + using System.IO; + using System.Linq; + using WixBuildTools.TestSupport; + using WixToolset.Converters; + using WixToolset.Core; + using WixToolset.Core.TestPackage; + using WixToolsetTest.Converters.Mocks; + using Xunit; + + public class ConverterIntegrationFixture + { + [Fact] + public void CanConvertPermissionExFile() + { + const string beforeFileName = "v3.wxs"; + const string afterFileName = "v4_expected.wxs"; + var folder = TestData.Get(@"TestData\PermissionEx"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(true); + var targetFile = Path.Combine(baseFolder, beforeFileName); + File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName)); + + var messaging = new MockMessaging(); + var converter = new Wix3Converter(messaging, 4); + var errors = converter.ConvertFile(targetFile, true); + + Assert.Equal(8, errors); + + var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n"); + var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n"); + Assert.Equal(expected, actual); + + EnsureFixed(targetFile); + } + } + + [Fact] + public void CanConvertSingleFile() + { + const string beforeFileName = "SingleFile.wxs"; + const string afterFileName = "ConvertedSingleFile.wxs"; + var folder = TestData.Get(@"TestData\SingleFile"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(true); + var targetFile = Path.Combine(baseFolder, beforeFileName); + File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName)); + + var messaging = new MockMessaging(); + var converter = new Wix3Converter(messaging, 4); + var errors = converter.ConvertFile(targetFile, true); + + Assert.Equal(5, errors); + + var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n"); + var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n"); + Assert.Equal(expected, actual); + + EnsureFixed(targetFile); + } + } + + [Fact] + public void RetainsPreprocessorInstructions() + { + const string beforeFileName = "Preprocessor.wxs"; + const string afterFileName = "ConvertedPreprocessor.wxs"; + var folder = TestData.Get(@"TestData\Preprocessor"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(true); + var targetFile = Path.Combine(baseFolder, beforeFileName); + File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName)); + + var settingsFile = Path.Combine(folder, "wixcop.settings.xml"); + + var result = RunConversion(targetFile, settingsFile: settingsFile); + Assert.Equal(2, result.ExitCode); + + var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n"); + var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n"); + Assert.Equal(expected, actual); + + EnsureFixed(targetFile); + } + } + + [Fact] + public void CanConvertQtExec() + { + const string beforeFileName = "v3.wxs"; + const string afterFileName = "v4_expected.wxs"; + var folder = TestData.Get(@"TestData\QtExec"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(true); + var targetFile = Path.Combine(baseFolder, beforeFileName); + File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName)); + + var result = RunConversion(targetFile); + Assert.Equal(2, result.ExitCode); + + var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n"); + var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n"); + Assert.Equal(expected, actual); + + EnsureFixed(targetFile); + } + } + + [Fact] + public void DetectUnconvertableQtExecCmdTimeout() + { + const string beforeFileName = "v3.wxs"; + const string afterFileName = "v4_expected.wxs"; + var folder = TestData.Get(@"TestData\QtExec.bad"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(true); + var targetFile = Path.Combine(baseFolder, beforeFileName); + File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName)); + + var result = RunConversion(targetFile); + + Assert.Equal(2, result.ExitCode); + Assert.Single(result.Messages.Where(message => message.ToString().EndsWith("(QtExecCmdTimeoutAmbiguous)"))); + + var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n"); + var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n"); + Assert.Equal(expected, actual); + + // still fails because QtExecCmdTimeoutAmbiguous is unfixable + var result2 = RunConversion(targetFile); + Assert.Equal(2, result2.ExitCode); + } + } + + private static WixRunnerResult RunConversion(string targetFile, bool fixErrors = true, string settingsFile = null) + { + var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider().AddConverter(); + + var exitCode = WixRunner.Execute(new[] + { + "convert", + fixErrors ? "-f" : null, + String.IsNullOrEmpty(settingsFile) ? null : "-set1" + settingsFile, + targetFile + }, serviceProvider, out var messages); + + return new WixRunnerResult { ExitCode = exitCode, Messages = messages.ToArray() }; + } + + private static void EnsureFixed(string targetFile) + { + var messaging2 = new MockMessaging(); + var converter2 = new Wix3Converter(messaging2, 4); + var errors2 = converter2.ConvertFile(targetFile, true); + Assert.Equal(0, errors2); + } + } +} diff --git a/src/test/WixToolsetTest.Converters/Mocks/MockCoreServiceProvider.cs b/src/test/WixToolsetTest.Converters/Mocks/MockCoreServiceProvider.cs new file mode 100644 index 00000000..b6bb8a40 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/Mocks/MockCoreServiceProvider.cs @@ -0,0 +1,51 @@ +// 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.Converters.Mocks +{ + using System; + using System.Collections.Generic; + using WixToolset.Extensibility.Services; + + public class MockCoreServiceProvider : IWixToolsetCoreServiceProvider + { + public Dictionary, object>> CreationFunctions { get; } = new Dictionary, object>>(); + + public Dictionary Singletons { get; } = new Dictionary() + { + { typeof(IMessaging), new MockMessaging() } + }; + + public void AddService(Type serviceType, Func, object> creationFunction) => this.CreationFunctions.Add(serviceType, creationFunction); + + public void AddService(Func, T> creationFunction) where T : class => this.AddService(typeof(T), creationFunction); + + public T GetService() where T : class => this.TryGetService(typeof(T), out var obj) ? (T)obj : null; + + public object GetService(Type serviceType) => this.TryGetService(serviceType, out var service) ? service : null; + + public bool TryGetService(Type serviceType, out object service) + { + if (!this.Singletons.TryGetValue(serviceType, out service)) + { + if (this.CreationFunctions.TryGetValue(serviceType, out var creationFunction)) + { + service = creationFunction(this, this.Singletons); + } + } + + return service != null; + } + + public bool TryGetService(out T service) where T : class + { + service = null; + + if (this.TryGetService(typeof(T), out var obj)) + { + service = (T)obj; + } + + return service != null; + } + } +} \ No newline at end of file diff --git a/src/test/WixToolsetTest.Converters/Mocks/MockMessaging.cs b/src/test/WixToolsetTest.Converters/Mocks/MockMessaging.cs new file mode 100644 index 00000000..8f7d4100 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/Mocks/MockMessaging.cs @@ -0,0 +1,40 @@ +// 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.Converters.Mocks +{ + using System; + using System.Collections.Generic; + using System.Text; + using WixToolset.Data; + using WixToolset.Extensibility; + using WixToolset.Extensibility.Services; + + public class MockMessaging : IMessaging + { + public List Messages { get; } = new List(); + + public bool EncounteredError { get; private set; } + + public int LastErrorNumber { get; } + + public bool ShowVerboseMessages { get; set; } + + public bool SuppressAllWarnings { get; set; } + + public bool WarningsAsError { get; set; } + + public void ElevateWarningMessage(int warningNumber) => throw new NotImplementedException(); + + public void SetListener(IMessageListener listener) => throw new NotImplementedException(); + + public void SuppressWarningMessage(int warningNumber) => throw new NotImplementedException(); + + public void Write(Message message) + { + this.Messages.Add(message); + this.EncounteredError |= message.Level == MessageLevel.Error; + } + + public void Write(string message, bool verbose = false) => throw new NotImplementedException(); + } +} diff --git a/src/test/WixToolsetTest.Converters/TestData/PermissionEx/v3.wxs b/src/test/WixToolsetTest.Converters/TestData/PermissionEx/v3.wxs new file mode 100644 index 00000000..0e241544 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/TestData/PermissionEx/v3.wxs @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.Converters/TestData/PermissionEx/v4_expected.wxs b/src/test/WixToolsetTest.Converters/TestData/PermissionEx/v4_expected.wxs new file mode 100644 index 00000000..375b70d3 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/TestData/PermissionEx/v4_expected.wxs @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.Converters/TestData/Preprocessor/ConvertedPreprocessor.wxs b/src/test/WixToolsetTest.Converters/TestData/Preprocessor/ConvertedPreprocessor.wxs new file mode 100644 index 00000000..dcd43e35 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/TestData/Preprocessor/ConvertedPreprocessor.wxs @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.Converters/TestData/Preprocessor/Preprocessor.wxs b/src/test/WixToolsetTest.Converters/TestData/Preprocessor/Preprocessor.wxs new file mode 100644 index 00000000..2eb908c2 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/TestData/Preprocessor/Preprocessor.wxs @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.Converters/TestData/Preprocessor/wixcop.settings.xml b/src/test/WixToolsetTest.Converters/TestData/Preprocessor/wixcop.settings.xml new file mode 100644 index 00000000..9d3ad496 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/TestData/Preprocessor/wixcop.settings.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/test/WixToolsetTest.Converters/TestData/QtExec.bad/v3.wxs b/src/test/WixToolsetTest.Converters/TestData/QtExec.bad/v3.wxs new file mode 100644 index 00000000..b0630f65 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/TestData/QtExec.bad/v3.wxs @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.Converters/TestData/QtExec.bad/v4_expected.wxs b/src/test/WixToolsetTest.Converters/TestData/QtExec.bad/v4_expected.wxs new file mode 100644 index 00000000..b28c94e4 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/TestData/QtExec.bad/v4_expected.wxs @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.Converters/TestData/QtExec/v3.wxs b/src/test/WixToolsetTest.Converters/TestData/QtExec/v3.wxs new file mode 100644 index 00000000..8d81a758 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/TestData/QtExec/v3.wxs @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.Converters/TestData/QtExec/v4_expected.wxs b/src/test/WixToolsetTest.Converters/TestData/QtExec/v4_expected.wxs new file mode 100644 index 00000000..99cc2151 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/TestData/QtExec/v4_expected.wxs @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.Converters/TestData/SingleFile/ConvertedSingleFile.wxs b/src/test/WixToolsetTest.Converters/TestData/SingleFile/ConvertedSingleFile.wxs new file mode 100644 index 00000000..aacb68fa --- /dev/null +++ b/src/test/WixToolsetTest.Converters/TestData/SingleFile/ConvertedSingleFile.wxs @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.Converters/TestData/SingleFile/SingleFile.wxs b/src/test/WixToolsetTest.Converters/TestData/SingleFile/SingleFile.wxs new file mode 100644 index 00000000..310ae811 --- /dev/null +++ b/src/test/WixToolsetTest.Converters/TestData/SingleFile/SingleFile.wxs @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.Converters/WixToolsetTest.Converters.csproj b/src/test/WixToolsetTest.Converters/WixToolsetTest.Converters.csproj index 14546fd6..11ab5b3e 100644 --- a/src/test/WixToolsetTest.Converters/WixToolsetTest.Converters.csproj +++ b/src/test/WixToolsetTest.Converters/WixToolsetTest.Converters.csproj @@ -11,12 +11,27 @@ NU1701 + + + + + + + + + + + + + + + -- cgit v1.2.3-55-g6feb