diff --git a/src/Test/winswTests/Attributes/ElevatedFactAttribute.cs b/src/Test/winswTests/Attributes/ElevatedFactAttribute.cs new file mode 100644 index 0000000..e785dbd --- /dev/null +++ b/src/Test/winswTests/Attributes/ElevatedFactAttribute.cs @@ -0,0 +1,18 @@ +using System; +using winsw; +using Xunit; + +namespace winswTests +{ + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + internal sealed class ElevatedFactAttribute : FactAttribute + { + internal ElevatedFactAttribute() + { + if (!Program.IsProcessElevated()) + { + this.Skip = "Access is denied"; + } + } + } +} diff --git a/src/Test/winswTests/Configuration/ExamplesTest.cs b/src/Test/winswTests/Configuration/ExamplesTest.cs index fdc55aa..bf6d8b9 100644 --- a/src/Test/winswTests/Configuration/ExamplesTest.cs +++ b/src/Test/winswTests/Configuration/ExamplesTest.cs @@ -1,9 +1,9 @@ -using System.IO; -using System.Reflection; +using System; +using System.IO; using System.Xml; -using NUnit.Framework; using winsw; using winswTests.Util; +using Xunit; namespace winswTests.Configuration { @@ -11,38 +11,37 @@ namespace winswTests.Configuration /// Tests example configuration files. /// The test uses a relative path to example files, which is based on the current project structure. /// - [TestFixture] public class ExamplesTest { - [Test] + [Fact] public void AllOptionsConfigShouldDeclareDefaults() { ServiceDescriptor desc = Load("complete"); - Assert.That(desc.Id, Is.EqualTo("myapp")); - Assert.That(desc.Caption, Is.EqualTo("MyApp Service (powered by WinSW)")); - Assert.That(desc.Description, Is.EqualTo("This service is a service created from a sample configuration")); - Assert.That(desc.Executable, Is.EqualTo("%BASE%\\myExecutable.exe")); + Assert.Equal("myapp", desc.Id); + Assert.Equal("MyApp Service (powered by WinSW)", desc.Caption); + Assert.Equal("This service is a service created from a sample configuration", desc.Description); + Assert.Equal("%BASE%\\myExecutable.exe", desc.Executable); ServiceDescriptorAssert.AssertAllOptionalPropertiesAreDefault(desc); } - [Test] + [Fact] public void MinimalConfigShouldDeclareDefaults() { ServiceDescriptor desc = Load("minimal"); - Assert.That(desc.Id, Is.EqualTo("myapp")); - Assert.That(desc.Caption, Is.EqualTo("MyApp Service (powered by WinSW)")); - Assert.That(desc.Description, Is.EqualTo("This service is a service created from a minimal configuration")); - Assert.That(desc.Executable, Is.EqualTo("%BASE%\\myExecutable.exe")); + Assert.Equal("myapp", desc.Id); + Assert.Equal("MyApp Service (powered by WinSW)", desc.Caption); + Assert.Equal("This service is a service created from a minimal configuration", desc.Description); + Assert.Equal("%BASE%\\myExecutable.exe", desc.Executable); ServiceDescriptorAssert.AssertAllOptionalPropertiesAreDefault(desc); } private static ServiceDescriptor Load(string exampleName) { - string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + string directory = Environment.CurrentDirectory; while (true) { if (File.Exists(Path.Combine(directory, ".gitignore"))) @@ -51,11 +50,11 @@ namespace winswTests.Configuration } directory = Path.GetDirectoryName(directory); - Assert.That(directory, Is.Not.Null); + Assert.NotNull(directory); } string path = Path.Combine(directory, $@"samples\sample-{exampleName}.xml"); - Assert.That(path, Does.Exist); + Assert.True(File.Exists(path)); XmlDocument dom = new XmlDocument(); dom.Load(path); diff --git a/src/Test/winswTests/DownloadConfigTests.cs b/src/Test/winswTests/DownloadConfigTests.cs index 54637bd..797235c 100644 --- a/src/Test/winswTests/DownloadConfigTests.cs +++ b/src/Test/winswTests/DownloadConfigTests.cs @@ -1,17 +1,16 @@ using System.IO; -using NUnit.Framework; using winsw; using winswTests.Util; +using Xunit; namespace winswTests { - [TestFixture] public class DownloadConfigTests { private const string From = "https://www.nosuchhostexists.foo.myorg/foo.xml"; private const string To = "%BASE%\\foo.xml"; - [Test] + [Fact] public void Roundtrip_Defaults() { // Roundtrip data @@ -22,14 +21,14 @@ namespace winswTests var loaded = GetSingleEntry(sd); // Check default values - Assert.That(loaded.FailOnError, Is.False); - Assert.That(loaded.Auth, Is.EqualTo(Download.AuthType.none)); - Assert.That(loaded.Username, Is.Null); - Assert.That(loaded.Password, Is.Null); - Assert.That(loaded.UnsecureAuth, Is.False); + Assert.False(loaded.FailOnError); + Assert.Equal(Download.AuthType.none, loaded.Auth); + Assert.Null(loaded.Username); + Assert.Null(loaded.Password); + Assert.False(loaded.UnsecureAuth); } - [Test] + [Fact] public void Roundtrip_BasicAuth() { // Roundtrip data @@ -40,14 +39,14 @@ namespace winswTests var loaded = GetSingleEntry(sd); // Check default values - Assert.That(loaded.FailOnError, Is.True); - Assert.That(loaded.Auth, Is.EqualTo(Download.AuthType.basic)); - Assert.That(loaded.Username, Is.EqualTo("aUser")); - Assert.That(loaded.Password, Is.EqualTo("aPassword")); - Assert.That(loaded.UnsecureAuth, Is.True); + Assert.True(loaded.FailOnError); + Assert.Equal(Download.AuthType.basic, loaded.Auth); + Assert.Equal("aUser", loaded.Username); + Assert.Equal("aPassword", loaded.Password); + Assert.True(loaded.UnsecureAuth); } - [Test] + [Fact] public void Roundtrip_SSPI() { // Roundtrip data @@ -58,18 +57,18 @@ namespace winswTests var loaded = GetSingleEntry(sd); // Check default values - Assert.That(loaded.FailOnError, Is.False); - Assert.That(loaded.Auth, Is.EqualTo(Download.AuthType.sspi)); - Assert.That(loaded.Username, Is.Null); - Assert.That(loaded.Password, Is.Null); - Assert.That(loaded.UnsecureAuth, Is.False); + Assert.False(loaded.FailOnError); + Assert.Equal(Download.AuthType.sspi, loaded.Auth); + Assert.Null(loaded.Username); + Assert.Null(loaded.Password); + Assert.False(loaded.UnsecureAuth); } - [TestCase("http://")] - [TestCase("ftp://")] - [TestCase("file://")] - [TestCase("jar://")] - [TestCase("\\\\")] // UNC + [Theory] + [InlineData("http://")] + [InlineData("ftp://")] + [InlineData("file://")] + [InlineData("\\\\")] // UNC public void RejectBasicAuth_With_UnsecureProtocol(string protocolPrefix) { string unsecureFrom = protocolPrefix + "myServer.com:8080/file.txt"; @@ -77,14 +76,14 @@ namespace winswTests AssertInitializationFails(d, "Warning: you're sending your credentials in clear text to the server"); } - [Test] + [Fact] public void RejectBasicAuth_Without_Username() { var d = new Download(From, To, auth: Download.AuthType.basic, username: null, password: "aPassword"); AssertInitializationFails(d, "Basic Auth is enabled, but username is not specified"); } - [Test] + [Fact] public void RejectBasicAuth_Without_Password() { var d = new Download(From, To, auth: Download.AuthType.basic, username: "aUser", password: null); @@ -94,8 +93,9 @@ namespace winswTests /// /// Ensures that the fail-on-error field is being processed correctly. /// - [TestCase(true)] - [TestCase(false)] + [Theory] + [InlineData(true)] + [InlineData(false)] public void Download_FailOnError(bool failOnError) { Download d = new Download(From, To, failOnError); @@ -105,15 +105,15 @@ namespace winswTests .ToServiceDescriptor(true); var loaded = GetSingleEntry(sd); - Assert.That(loaded.From, Is.EqualTo(From)); - Assert.That(loaded.To, Is.EqualTo(To)); - Assert.That(loaded.FailOnError, Is.EqualTo(failOnError), "Unexpected FailOnError value"); + Assert.Equal(From, loaded.From); + Assert.Equal(To, loaded.To); + Assert.Equal(failOnError, loaded.FailOnError); } /// /// Ensures that the fail-on-error field is being processed correctly. /// - [Test] + [Fact] public void Download_FailOnError_Undefined() { var sd = ConfigXmlBuilder.create() @@ -121,23 +121,24 @@ namespace winswTests .ToServiceDescriptor(true); var loaded = GetSingleEntry(sd); - Assert.That(loaded.FailOnError, Is.False); + Assert.False(loaded.FailOnError); } - [TestCase("sspi")] - [TestCase("SSPI")] - [TestCase("SsPI")] - [TestCase("Sspi")] + [Theory] + [InlineData("sspi")] + [InlineData("SSPI")] + [InlineData("SsPI")] + [InlineData("Sspi")] public void AuthType_Is_CaseInsensitive(string authType) { var sd = ConfigXmlBuilder.create() .WithRawEntry("") .ToServiceDescriptor(true); var loaded = GetSingleEntry(sd); - Assert.That(loaded.Auth, Is.EqualTo(Download.AuthType.sspi)); + Assert.Equal(Download.AuthType.sspi, loaded.Auth); } - [Test] + [Fact] public void Should_Fail_On_Unsupported_AuthType() { // TODO: will need refactoring once all fields are being parsed on startup @@ -145,12 +146,14 @@ namespace winswTests .WithRawEntry("") .ToServiceDescriptor(true); - Assert.That(() => GetSingleEntry(sd), Throws.TypeOf().With.Message.StartsWith("Cannot parse Enum value from string 'digest'")); + var e = Assert.Throws(() => GetSingleEntry(sd)); + Assert.StartsWith("Cannot parse Enum value from string 'digest'", e.Message); } - [TestCase("http://", "127.0.0.1:80", "egarcia", "Passw0rd")] - [TestCase("https://", "myurl.com.co:2298", "MyUsername", "P@ssw:rd")] - [TestCase("http://", "192.168.0.8:3030")] + [Theory] + [InlineData("http://", "127.0.0.1:80", "egarcia", "Passw0rd")] + [InlineData("https://", "myurl.com.co:2298", "MyUsername", "P@ssw:rd")] + [InlineData("http://", "192.168.0.8:3030")] public void Proxy_Credentials(string protocol, string address, string username = null, string password = null) { CustomProxyInformation cpi; @@ -163,25 +166,24 @@ namespace winswTests cpi = new CustomProxyInformation(protocol + username + ":" + password + "@" + address + "/"); } - Assert.That(cpi.ServerAddress, Is.EqualTo(protocol + address + "/")); + Assert.Equal(protocol + address + "/", cpi.ServerAddress); if (string.IsNullOrEmpty(username)) { - Assert.IsNull(cpi.Credentials); + Assert.Null(cpi.Credentials); } else { - Assert.IsNotNull(cpi.Credentials); - Assert.That(cpi.Credentials.UserName, Is.EqualTo(username)); - Assert.That(cpi.Credentials.Password, Is.EqualTo(password)); + Assert.NotNull(cpi.Credentials); + Assert.Equal(username, cpi.Credentials.UserName); + Assert.Equal(password, cpi.Credentials.Password); } } private Download GetSingleEntry(ServiceDescriptor sd) { var downloads = sd.Downloads.ToArray(); - Assert.That(downloads.Length, Is.EqualTo(1), "Service Descriptor is expected to have only one entry"); - return downloads[0]; + return Assert.Single(downloads); } private void AssertInitializationFails(Download download, string expectedMessagePart = null) @@ -190,7 +192,8 @@ namespace winswTests .WithDownload(download) .ToServiceDescriptor(true); - Assert.That(() => GetSingleEntry(sd), Throws.TypeOf().With.Message.StartsWith(expectedMessagePart)); + var e = Assert.Throws(() => GetSingleEntry(sd)); + Assert.StartsWith(expectedMessagePart, e.Message); } } } diff --git a/src/Test/winswTests/DownloadTests.cs b/src/Test/winswTests/DownloadTests.cs index 5c0215a..f29abe2 100644 --- a/src/Test/winswTests/DownloadTests.cs +++ b/src/Test/winswTests/DownloadTests.cs @@ -4,23 +4,21 @@ using System.Net; using System.Net.Sockets; using System.Runtime.CompilerServices; using System.Threading.Tasks; -using NUnit.Framework; using winsw; using winswTests.Util; +using Xunit; namespace winswTests { - [TestFixture] - public class DownloadTests + public class DownloadTests : IDisposable { private readonly HttpListener globalListener = new HttpListener(); private readonly byte[] contents = { 0x57, 0x69, 0x6e, 0x53, 0x57 }; - private string globalPrefix; + private readonly string globalPrefix; - [OneTimeSetUp] - public void SetUp() + public DownloadTests() { TcpListener tcpListener = new TcpListener(IPAddress.Loopback, 0); tcpListener.Start(); @@ -34,8 +32,7 @@ namespace winswTests } } - [OneTimeTearDown] - public void TearDown() + public void Dispose() { this.globalListener.Stop(); this.globalListener.Close(); @@ -88,14 +85,14 @@ namespace winswTests } } - [Test] + [Fact] public async Task TestHttpAsync() { await this.TestClientServerAsync( async (source, dest) => { await new Download(source, dest).PerformAsync(); - Assert.That(File.ReadAllBytes(dest), Is.EqualTo(this.contents)); + Assert.Equal(this.contents, File.ReadAllBytes(dest)); }, context => { @@ -104,14 +101,14 @@ namespace winswTests }); } - [Test] + [Fact] public async Task TestHttp_NoAuthAsync() { await this.TestClientServerAsync( async (source, dest) => { await new Download(source, dest, false, Download.AuthType.none).PerformAsync(); - Assert.That(File.ReadAllBytes(dest), Is.EqualTo(this.contents)); + Assert.Equal(this.contents, File.ReadAllBytes(dest)); }, context => { @@ -126,7 +123,7 @@ namespace winswTests }); } - [Test] + [Fact] public async Task TestHttp_BasicAuthAsync() { const string username = nameof(username); @@ -136,7 +133,7 @@ namespace winswTests async (source, dest) => { await new Download(source, dest, false, Download.AuthType.basic, username, password, true).PerformAsync(); - Assert.That(File.ReadAllBytes(dest), Is.EqualTo(this.contents)); + Assert.Equal(this.contents, File.ReadAllBytes(dest)); }, context => { @@ -153,7 +150,7 @@ namespace winswTests AuthenticationSchemes.Basic); } - [Test] + [Fact] public async Task TestHttp_IfModifiedSince_ModifiedAsync() { DateTime lastModified = DateTime.Now.TrimToSeconds(); @@ -165,8 +162,8 @@ namespace winswTests File.WriteAllBytes(dest, this.contents); File.SetLastWriteTime(dest, prevModified); await new Download(source, dest).PerformAsync(); - Assert.That(File.GetLastWriteTime(dest), Is.EqualTo(lastModified)); - Assert.That(File.ReadAllBytes(dest), Is.Not.EqualTo(this.contents)); + Assert.Equal(lastModified, File.GetLastWriteTime(dest)); + Assert.NotEqual(this.contents, File.ReadAllBytes(dest)); }, context => { @@ -181,7 +178,7 @@ namespace winswTests }); } - [Test] + [Fact] public async Task TestHttp_IfModifiedSince_NotModifiedAsync() { DateTime lastModified = DateTime.Now.TrimToSeconds(); @@ -192,8 +189,8 @@ namespace winswTests File.WriteAllBytes(dest, this.contents); File.SetLastWriteTime(dest, lastModified); await new Download(source, dest).PerformAsync(); - Assert.That(File.GetLastWriteTime(dest), Is.EqualTo(lastModified)); - Assert.That(File.ReadAllBytes(dest), Is.EqualTo(this.contents)); + Assert.Equal(lastModified, File.GetLastWriteTime(dest)); + Assert.Equal(this.contents, File.ReadAllBytes(dest)); }, context => { @@ -208,16 +205,16 @@ namespace winswTests }); } - [Test] + [Fact] public async Task TestHttp_NotFound_ThrowsAsync() { await this.TestClientServerAsync( async (source, dest) => { - WebException exception = await AsyncAssert.ThrowsAsync( + WebException exception = await Assert.ThrowsAsync( async () => await new Download(source, dest).PerformAsync()); - Assert.That(exception.Status, Is.EqualTo(WebExceptionStatus.ProtocolError)); + Assert.Equal(WebExceptionStatus.ProtocolError, exception.Status); }, context => { diff --git a/src/Test/winswTests/Extensions/RunawayProcessKillerTest.cs b/src/Test/winswTests/Extensions/RunawayProcessKillerTest.cs index 003c78f..5d9ca0b 100644 --- a/src/Test/winswTests/Extensions/RunawayProcessKillerTest.cs +++ b/src/Test/winswTests/Extensions/RunawayProcessKillerTest.cs @@ -1,25 +1,22 @@ using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; -using NUnit.Framework; using winsw; using winsw.Extensions; using winsw.Plugins.RunawayProcessKiller; using winsw.Util; using winswTests.Util; +using Xunit; namespace winswTests.Extensions { - [TestFixture] - class RunawayProcessKillerExtensionTest : ExtensionTestBase + public class RunawayProcessKillerExtensionTest : ExtensionTestBase { - ServiceDescriptor _testServiceDescriptor; + readonly ServiceDescriptor _testServiceDescriptor; readonly string testExtension = GetExtensionClassNameWithAssembly(typeof(RunawayProcessKillerExtension)); - [SetUp] - public void SetUp() + public RunawayProcessKillerExtensionTest() { string seedXml = $@" @@ -39,21 +36,21 @@ $@" _testServiceDescriptor = ServiceDescriptor.FromXML(seedXml); } - [Test] + [Fact] public void LoadExtensions() { WinSWExtensionManager manager = new WinSWExtensionManager(_testServiceDescriptor); manager.LoadExtensions(); - Assert.AreEqual(1, manager.Extensions.Count, "One extension should be loaded"); + _ = Assert.Single(manager.Extensions); // Check the file is correct var extension = manager.Extensions["killRunawayProcess"] as RunawayProcessKillerExtension; - Assert.IsNotNull(extension, "RunawayProcessKillerExtension should be loaded"); - Assert.AreEqual("foo/bar/pid.txt", extension.Pidfile, "Loaded PID file path is not equal to the expected one"); - Assert.AreEqual(5000, extension.StopTimeout.TotalMilliseconds, "Loaded Stop Timeout is not equal to the expected one"); + Assert.NotNull(extension); + Assert.Equal("foo/bar/pid.txt", extension.Pidfile); + Assert.Equal(5000, extension.StopTimeout.TotalMilliseconds); } - [Test] + [Fact] public void StartStopExtension() { WinSWExtensionManager manager = new WinSWExtensionManager(_testServiceDescriptor); @@ -62,11 +59,8 @@ $@" manager.FireBeforeWrapperStopped(); } - [Test] - public void ShouldKillTheSpawnedProcess() + internal void ShouldKillTheSpawnedProcess() { - Assert.Ignore(); - var winswId = "myAppWithRunaway"; var extensionId = "runaway-process-killer"; var tmpDir = FilesystemTestHelper.CreateTmpDirectory(); @@ -91,17 +85,17 @@ $@" WinSWExtensionManager manager = new WinSWExtensionManager(sd); manager.LoadExtensions(); var extension = manager.Extensions[extensionId] as RunawayProcessKillerExtension; - Assert.IsNotNull(extension, "RunawayProcessKillerExtension should be loaded"); - Assert.AreEqual(pidfile, extension.Pidfile, "PidFile should have been retained during the config roundtrip"); + Assert.NotNull(extension); + Assert.Equal(pidfile, extension.Pidfile); // Inject PID File.WriteAllText(pidfile, proc.Id.ToString()); // Try to terminate - Assert.That(!proc.HasExited, "Process " + proc + " has exited before the RunawayProcessKiller extension invocation"); + Assert.False(proc.HasExited, "Process " + proc + " has exited before the RunawayProcessKiller extension invocation"); _ = proc.StandardOutput.Read(); extension.OnWrapperStarted(); - Assert.That(proc.HasExited, "Process " + proc + " should have been terminated by RunawayProcessKiller"); + Assert.True(proc.HasExited, "Process " + proc + " should have been terminated by RunawayProcessKiller"); } finally { diff --git a/src/Test/winswTests/Extensions/SharedDirectoryMapperConfigTest.cs b/src/Test/winswTests/Extensions/SharedDirectoryMapperConfigTest.cs index 7013d24..7b8cce0 100644 --- a/src/Test/winswTests/Extensions/SharedDirectoryMapperConfigTest.cs +++ b/src/Test/winswTests/Extensions/SharedDirectoryMapperConfigTest.cs @@ -1,19 +1,17 @@ -using NUnit.Framework; -using winsw; +using winsw; using winsw.Extensions; using winsw.Plugins.SharedDirectoryMapper; +using Xunit; namespace winswTests.Extensions { - [TestFixture] - class SharedDirectoryMapperConfigTest : ExtensionTestBase + public class SharedDirectoryMapperConfigTest : ExtensionTestBase { - ServiceDescriptor _testServiceDescriptor; + readonly ServiceDescriptor _testServiceDescriptor; readonly string testExtension = GetExtensionClassNameWithAssembly(typeof(SharedDirectoryMapper)); - [SetUp] - public void SetUp() + public SharedDirectoryMapperConfigTest() { string seedXml = $@" @@ -41,15 +39,15 @@ $@" _testServiceDescriptor = ServiceDescriptor.FromXML(seedXml); } - [Test] + [Fact] public void LoadExtensions() { WinSWExtensionManager manager = new WinSWExtensionManager(_testServiceDescriptor); manager.LoadExtensions(); - Assert.AreEqual(2, manager.Extensions.Count, "Two extensions should be loaded"); + Assert.Equal(2, manager.Extensions.Count); } - [Test] + [Fact] public void StartStopExtension() { WinSWExtensionManager manager = new WinSWExtensionManager(_testServiceDescriptor); diff --git a/src/Test/winswTests/Extensions/SharedDirectoryMapperTests.cs b/src/Test/winswTests/Extensions/SharedDirectoryMapperTests.cs index e4f1e7e..98d66b7 100644 --- a/src/Test/winswTests/Extensions/SharedDirectoryMapperTests.cs +++ b/src/Test/winswTests/Extensions/SharedDirectoryMapperTests.cs @@ -3,16 +3,15 @@ using System; using System.IO; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using NUnit.Framework; using winsw.Plugins.SharedDirectoryMapper; +using Xunit; namespace winswTests.Extensions { - // TODO: Throws.TypeOf() - [TestFixture] + // TODO: Assert.Throws public class SharedDirectoryMapperTests { - [Test] + [ElevatedFact] public void TestMap() { using TestData data = TestData.Create(); @@ -21,12 +20,12 @@ namespace winswTests.Extensions SharedDirectoryMapper mapper = new SharedDirectoryMapper(true, $@"\\{Environment.MachineName}\{data.name}", label); mapper.OnWrapperStarted(); - Assert.That($@"{label}\", Does.Exist); + Assert.True(Directory.Exists($@"{label}\")); mapper.BeforeWrapperStopped(); - Assert.That($@"{label}\", Does.Not.Exist); + Assert.False(Directory.Exists($@"{label}\")); } - [Test] + [ElevatedFact] public void TestDisableMapping() { using TestData data = TestData.Create(); @@ -35,11 +34,11 @@ namespace winswTests.Extensions SharedDirectoryMapper mapper = new SharedDirectoryMapper(enableMapping: false, $@"\\{Environment.MachineName}\{data.name}", label); mapper.OnWrapperStarted(); - Assert.That($@"{label}\", Does.Not.Exist); + Assert.False(Directory.Exists($@"{label}\")); mapper.BeforeWrapperStopped(); } - [Test] + [ElevatedFact] public void TestMap_PathEndsWithSlash_Throws() { using TestData data = TestData.Create(); @@ -47,12 +46,12 @@ namespace winswTests.Extensions const string label = "W:"; SharedDirectoryMapper mapper = new SharedDirectoryMapper(true, $@"\\{Environment.MachineName}\{data.name}\", label); - Assert.That(() => mapper.OnWrapperStarted(), Throws.Exception); - Assert.That($@"{label}\", Does.Not.Exist); - Assert.That(() => mapper.BeforeWrapperStopped(), Throws.Exception); + _ = Assert.ThrowsAny(() => mapper.OnWrapperStarted()); + Assert.False(Directory.Exists($@"{label}\")); + _ = Assert.ThrowsAny(() => mapper.BeforeWrapperStopped()); } - [Test] + [ElevatedFact] public void TestMap_LabelDoesNotEndWithColon_Throws() { using TestData data = TestData.Create(); @@ -60,9 +59,9 @@ namespace winswTests.Extensions const string label = "W"; SharedDirectoryMapper mapper = new SharedDirectoryMapper(true, $@"\\{Environment.MachineName}\{data.name}", label); - Assert.That(() => mapper.OnWrapperStarted(), Throws.Exception); - Assert.That($@"{label}\", Does.Not.Exist); - Assert.That(() => mapper.BeforeWrapperStopped(), Throws.Exception); + _ = Assert.ThrowsAny(() => mapper.OnWrapperStarted()); + Assert.False(Directory.Exists($@"{label}\")); + _ = Assert.ThrowsAny(() => mapper.BeforeWrapperStopped()); } private readonly ref struct TestData @@ -92,7 +91,7 @@ namespace winswTests.Extensions }; uint error = NativeMethods.NetShareAdd(null, 2, shareInfo, out _); - Assert.That(error, Is.Zero); + Assert.Equal(0u, error); return new TestData(name, path); } @@ -108,7 +107,7 @@ namespace winswTests.Extensions try { uint error = NativeMethods.NetShareDel(null, this.name); - Assert.That(error, Is.Zero); + Assert.Equal(0u, error); } finally { diff --git a/src/Test/winswTests/MainTest.cs b/src/Test/winswTests/MainTest.cs index 76fc3c8..c17599b 100644 --- a/src/Test/winswTests/MainTest.cs +++ b/src/Test/winswTests/MainTest.cs @@ -1,30 +1,27 @@ using System; using System.ServiceProcess; -using NUnit.Framework; using winsw; using winswTests.Util; +using Xunit; namespace winswTests { - [TestFixture] public class MainTest { - [Test] + [ElevatedFact] public void TestInstall() { - TestHelper.RequireProcessElevated(); - try { _ = CLITestHelper.CLITest(new[] { "install" }); using ServiceController controller = new ServiceController(CLITestHelper.Id); - Assert.That(controller.DisplayName, Is.EqualTo(CLITestHelper.Name)); - Assert.That(controller.CanStop, Is.False); - Assert.That(controller.CanShutdown, Is.False); - Assert.That(controller.CanPauseAndContinue, Is.False); - Assert.That(controller.Status, Is.EqualTo(ServiceControllerStatus.Stopped)); - Assert.That(controller.ServiceType, Is.EqualTo(ServiceType.Win32OwnProcess)); + Assert.Equal(CLITestHelper.Name, controller.DisplayName); + Assert.False(controller.CanStop); + Assert.False(controller.CanShutdown); + Assert.False(controller.CanPauseAndContinue); + Assert.Equal(ServiceControllerStatus.Stopped, controller.Status); + Assert.Equal(ServiceType.Win32OwnProcess, controller.ServiceType); } finally { @@ -32,47 +29,47 @@ namespace winswTests } } - [Test] + [Fact] public void PrintVersion() { string expectedVersion = WrapperService.Version.ToString(); string cliOut = CLITestHelper.CLITest(new[] { "version" }); - Assert.That(cliOut, Does.Contain(expectedVersion)); + Assert.Contains(expectedVersion, cliOut); } - [Test] + [Fact] public void PrintHelp() { string expectedVersion = WrapperService.Version.ToString(); string cliOut = CLITestHelper.CLITest(new[] { "help" }); - Assert.That(cliOut, Does.Contain(expectedVersion)); - Assert.That(cliOut, Does.Contain("start")); - Assert.That(cliOut, Does.Contain("help")); - Assert.That(cliOut, Does.Contain("version")); + Assert.Contains(expectedVersion, cliOut); + Assert.Contains("start", cliOut); + Assert.Contains("help", cliOut); + Assert.Contains("version", cliOut); // TODO: check all commands after the migration of ccommands to enum } - [Test] + [Fact] public void FailOnUnsupportedCommand() { const string commandName = "nonExistentCommand"; string expectedMessage = "Unknown command: " + commandName; CLITestResult result = CLITestHelper.CLIErrorTest(new[] { commandName }); - Assert.That(result.HasException, Is.True); - Assert.That(result.Out, Does.Contain(expectedMessage)); - Assert.That(result.Exception.Message, Does.Contain(expectedMessage)); + Assert.True(result.HasException); + Assert.Contains(expectedMessage, result.Out); + Assert.Contains(expectedMessage, result.Exception.Message); } /// /// https://github.com/kohsuke/winsw/issues/206 /// - [Test] + [Fact] public void ShouldNotPrintLogsForStatusCommand() { string cliOut = CLITestHelper.CLITest(new[] { "status" }); - Assert.That(cliOut, Is.EqualTo("NonExistent" + Environment.NewLine).IgnoreCase); + Assert.Equal("NonExistent" + Environment.NewLine, cliOut); } } } diff --git a/src/Test/winswTests/ServiceDescriptorTests.cs b/src/Test/winswTests/ServiceDescriptorTests.cs index 906adaa..22f7833 100644 --- a/src/Test/winswTests/ServiceDescriptorTests.cs +++ b/src/Test/winswTests/ServiceDescriptorTests.cs @@ -1,13 +1,12 @@ using System; using System.Diagnostics; using System.ServiceProcess; -using NUnit.Framework; using winsw; using winswTests.Util; +using Xunit; namespace winswTests { - [TestFixture] public class ServiceDescriptorTests { private ServiceDescriptor _extendedServiceDescriptor; @@ -18,8 +17,7 @@ namespace winswTests private const string Domain = "Domain"; private const string AllowServiceAccountLogonRight = "true"; - [SetUp] - public void SetUp() + public ServiceDescriptorTests() { string seedXml = $@" @@ -40,13 +38,13 @@ $@" _extendedServiceDescriptor = ServiceDescriptor.FromXML(seedXml); } - [Test] + [Fact] public void DefaultStartMode() { - Assert.That(_extendedServiceDescriptor.StartMode, Is.EqualTo(ServiceStartMode.Automatic)); + Assert.Equal(ServiceStartMode.Automatic, _extendedServiceDescriptor.StartMode); } - [Test] + [Fact] public void IncorrectStartMode() { string seedXml = @@ -68,10 +66,10 @@ $@" "; _extendedServiceDescriptor = ServiceDescriptor.FromXML(seedXml); - Assert.That(() => _extendedServiceDescriptor.StartMode, Throws.ArgumentException); + Assert.Throws(() => _extendedServiceDescriptor.StartMode); } - [Test] + [Fact] public void ChangedStartMode() { string seedXml = @@ -93,50 +91,50 @@ $@" "; _extendedServiceDescriptor = ServiceDescriptor.FromXML(seedXml); - Assert.That(_extendedServiceDescriptor.StartMode, Is.EqualTo(ServiceStartMode.Manual)); + Assert.Equal(ServiceStartMode.Manual, _extendedServiceDescriptor.StartMode); } - [Test] + [Fact] public void VerifyWorkingDirectory() { Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + _extendedServiceDescriptor.WorkingDirectory); - Assert.That(_extendedServiceDescriptor.WorkingDirectory, Is.EqualTo(ExpectedWorkingDirectory)); + Assert.Equal(ExpectedWorkingDirectory, _extendedServiceDescriptor.WorkingDirectory); } - [Test] + [Fact] public void VerifyServiceLogonRight() { - Assert.That(_extendedServiceDescriptor.AllowServiceAcountLogonRight, Is.True); + Assert.True(_extendedServiceDescriptor.AllowServiceAcountLogonRight); } - [Test] + [Fact] public void VerifyUsername() { Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + _extendedServiceDescriptor.WorkingDirectory); - Assert.That(_extendedServiceDescriptor.ServiceAccountUserName, Is.EqualTo(Domain + "\\" + Username)); + Assert.Equal(Domain + "\\" + Username, _extendedServiceDescriptor.ServiceAccountUserName); } - [Test] + [Fact] public void VerifyPassword() { Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + _extendedServiceDescriptor.WorkingDirectory); - Assert.That(_extendedServiceDescriptor.ServiceAccountPassword, Is.EqualTo(Password)); + Assert.Equal(Password, _extendedServiceDescriptor.ServiceAccountPassword); } - [Test] + [Fact] public void Priority() { var sd = ServiceDescriptor.FromXML("testnormal"); - Assert.That(sd.Priority, Is.EqualTo(ProcessPriorityClass.Normal)); + Assert.Equal(ProcessPriorityClass.Normal, sd.Priority); sd = ServiceDescriptor.FromXML("testidle"); - Assert.That(sd.Priority, Is.EqualTo(ProcessPriorityClass.Idle)); + Assert.Equal(ProcessPriorityClass.Idle, sd.Priority); sd = ServiceDescriptor.FromXML("test"); - Assert.That(sd.Priority, Is.EqualTo(ProcessPriorityClass.Normal)); + Assert.Equal(ProcessPriorityClass.Normal, sd.Priority); } - [Test] + [Fact] public void CanParseStopTimeout() { const string seedXml = "" @@ -144,10 +142,10 @@ $@" + ""; var serviceDescriptor = ServiceDescriptor.FromXML(seedXml); - Assert.That(serviceDescriptor.StopTimeout, Is.EqualTo(TimeSpan.FromSeconds(60))); + Assert.Equal(TimeSpan.FromSeconds(60), serviceDescriptor.StopTimeout); } - [Test] + [Fact] public void CanParseStopTimeoutFromMinutes() { const string seedXml = "" @@ -155,10 +153,10 @@ $@" + ""; var serviceDescriptor = ServiceDescriptor.FromXML(seedXml); - Assert.That(serviceDescriptor.StopTimeout, Is.EqualTo(TimeSpan.FromMinutes(10))); + Assert.Equal(TimeSpan.FromMinutes(10), serviceDescriptor.StopTimeout); } - [Test] + [Fact] public void CanParseLogname() { const string seedXml = "" @@ -166,10 +164,10 @@ $@" + ""; var serviceDescriptor = ServiceDescriptor.FromXML(seedXml); - Assert.That(serviceDescriptor.LogName, Is.EqualTo("MyTestApp")); + Assert.Equal("MyTestApp", serviceDescriptor.LogName); } - [Test] + [Fact] public void CanParseOutfileDisabled() { const string seedXml = "" @@ -177,10 +175,10 @@ $@" + ""; var serviceDescriptor = ServiceDescriptor.FromXML(seedXml); - Assert.That(serviceDescriptor.OutFileDisabled, Is.True); + Assert.True(serviceDescriptor.OutFileDisabled); } - [Test] + [Fact] public void CanParseErrfileDisabled() { const string seedXml = "" @@ -188,10 +186,10 @@ $@" + ""; var serviceDescriptor = ServiceDescriptor.FromXML(seedXml); - Assert.That(serviceDescriptor.ErrFileDisabled, Is.True); + Assert.True(serviceDescriptor.ErrFileDisabled); } - [Test] + [Fact] public void CanParseOutfilePattern() { const string seedXml = "" @@ -199,10 +197,10 @@ $@" + ""; var serviceDescriptor = ServiceDescriptor.FromXML(seedXml); - Assert.That(serviceDescriptor.OutFilePattern, Is.EqualTo(".out.test.log")); + Assert.Equal(".out.test.log", serviceDescriptor.OutFilePattern); } - [Test] + [Fact] public void CanParseErrfilePattern() { const string seedXml = "" @@ -210,10 +208,10 @@ $@" + ""; var serviceDescriptor = ServiceDescriptor.FromXML(seedXml); - Assert.That(serviceDescriptor.ErrFilePattern, Is.EqualTo(".err.test.log")); + Assert.Equal(".err.test.log", serviceDescriptor.ErrFilePattern); } - [Test] + [Fact] public void LogModeRollBySize() { const string seedXml = "" @@ -228,12 +226,12 @@ $@" serviceDescriptor.BaseName = "service"; var logHandler = serviceDescriptor.LogHandler as SizeBasedRollingLogAppender; - Assert.That(logHandler, Is.Not.Null); - Assert.That(logHandler.SizeTheshold, Is.EqualTo(112 * 1024)); - Assert.That(logHandler.FilesToKeep, Is.EqualTo(113)); + Assert.NotNull(logHandler); + Assert.Equal(112 * 1024, logHandler.SizeTheshold); + Assert.Equal(113, logHandler.FilesToKeep); } - [Test] + [Fact] public void LogModeRollByTime() { const string seedXml = "" @@ -248,12 +246,12 @@ $@" serviceDescriptor.BaseName = "service"; var logHandler = serviceDescriptor.LogHandler as TimeBasedRollingLogAppender; - Assert.That(logHandler, Is.Not.Null); - Assert.That(logHandler.Period, Is.EqualTo(7)); - Assert.That(logHandler.Pattern, Is.EqualTo("log pattern")); + Assert.NotNull(logHandler); + Assert.Equal(7, logHandler.Period); + Assert.Equal("log pattern", logHandler.Pattern); } - [Test] + [Fact] public void LogModeRollBySizeTime() { const string seedXml = "" @@ -269,13 +267,13 @@ $@" serviceDescriptor.BaseName = "service"; var logHandler = serviceDescriptor.LogHandler as RollingSizeTimeLogAppender; - Assert.That(logHandler, Is.Not.Null); - Assert.That(logHandler.SizeTheshold, Is.EqualTo(10240 * 1024)); - Assert.That(logHandler.FilePattern, Is.EqualTo("yyyy-MM-dd")); - Assert.That(logHandler.AutoRollAtTime, Is.EqualTo((TimeSpan?)new TimeSpan(0, 0, 0))); + Assert.NotNull(logHandler); + Assert.Equal(10240 * 1024, logHandler.SizeTheshold); + Assert.Equal("yyyy-MM-dd", logHandler.FilePattern); + Assert.Equal((TimeSpan?)new TimeSpan(0, 0, 0), logHandler.AutoRollAtTime); } - [Test] + [Fact] public void VerifyServiceLogonRightGraceful() { const string seedXml = "" @@ -287,10 +285,10 @@ $@" + "" + ""; var serviceDescriptor = ServiceDescriptor.FromXML(seedXml); - Assert.That(serviceDescriptor.AllowServiceAcountLogonRight, Is.False); + Assert.False(serviceDescriptor.AllowServiceAcountLogonRight); } - [Test] + [Fact] public void VerifyServiceLogonRightOmitted() { const string seedXml = "" @@ -301,89 +299,89 @@ $@" + "" + ""; var serviceDescriptor = ServiceDescriptor.FromXML(seedXml); - Assert.That(serviceDescriptor.AllowServiceAcountLogonRight, Is.False); + Assert.False(serviceDescriptor.AllowServiceAcountLogonRight); } - [Test] + [Fact] public void VerifyWaitHint_FullXML() { var sd = ConfigXmlBuilder.create() .WithTag("waithint", "20 min") .ToServiceDescriptor(true); - Assert.That(sd.WaitHint, Is.EqualTo(TimeSpan.FromMinutes(20))); + Assert.Equal(TimeSpan.FromMinutes(20), sd.WaitHint); } /// /// Test for https://github.com/kohsuke/winsw/issues/159 /// - [Test] + [Fact] public void VerifyWaitHint_XMLWithoutVersion() { var sd = ConfigXmlBuilder.create(printXMLVersion: false) .WithTag("waithint", "21 min") .ToServiceDescriptor(true); - Assert.That(sd.WaitHint, Is.EqualTo(TimeSpan.FromMinutes(21))); + Assert.Equal(TimeSpan.FromMinutes(21), sd.WaitHint); } - [Test] + [Fact] public void VerifyWaitHint_XMLWithoutComment() { var sd = ConfigXmlBuilder.create(xmlComment: null) .WithTag("waithint", "22 min") .ToServiceDescriptor(true); - Assert.That(sd.WaitHint, Is.EqualTo(TimeSpan.FromMinutes(22))); + Assert.Equal(TimeSpan.FromMinutes(22), sd.WaitHint); } - [Test] + [Fact] public void VerifyWaitHint_XMLWithoutVersionAndComment() { var sd = ConfigXmlBuilder.create(xmlComment: null, printXMLVersion: false) .WithTag("waithint", "23 min") .ToServiceDescriptor(true); - Assert.That(sd.WaitHint, Is.EqualTo(TimeSpan.FromMinutes(23))); + Assert.Equal(TimeSpan.FromMinutes(23), sd.WaitHint); } - [Test] + [Fact] public void VerifySleepTime() { var sd = ConfigXmlBuilder.create().WithTag("sleeptime", "3 hrs").ToServiceDescriptor(true); - Assert.That(sd.SleepTime, Is.EqualTo(TimeSpan.FromHours(3))); + Assert.Equal(TimeSpan.FromHours(3), sd.SleepTime); } - [Test] + [Fact] public void VerifyResetFailureAfter() { var sd = ConfigXmlBuilder.create().WithTag("resetfailure", "75 sec").ToServiceDescriptor(true); - Assert.That(sd.ResetFailureAfter, Is.EqualTo(TimeSpan.FromSeconds(75))); + Assert.Equal(TimeSpan.FromSeconds(75), sd.ResetFailureAfter); } - [Test] + [Fact] public void VerifyStopTimeout() { var sd = ConfigXmlBuilder.create().WithTag("stoptimeout", "35 secs").ToServiceDescriptor(true); - Assert.That(sd.StopTimeout, Is.EqualTo(TimeSpan.FromSeconds(35))); + Assert.Equal(TimeSpan.FromSeconds(35), sd.StopTimeout); } /// /// https://github.com/kohsuke/winsw/issues/178 /// - [Test] + [Fact] public void Arguments_LegacyParam() { var sd = ConfigXmlBuilder.create().WithTag("arguments", "arg").ToServiceDescriptor(true); - Assert.That(sd.Arguments, Is.EqualTo("arg")); + Assert.Equal("arg", sd.Arguments); } - [Test] + [Fact] public void Arguments_NewParam_Single() { var sd = ConfigXmlBuilder.create() .WithTag("argument", "--arg1=2") .ToServiceDescriptor(true); - Assert.That(sd.Arguments, Is.EqualTo(" --arg1=2")); + Assert.Equal(" --arg1=2", sd.Arguments); } - [Test] + [Fact] public void Arguments_NewParam_MultipleArgs() { var sd = ConfigXmlBuilder.create() @@ -391,13 +389,13 @@ $@" .WithTag("argument", "--arg2=123") .WithTag("argument", "--arg3=null") .ToServiceDescriptor(true); - Assert.That(sd.Arguments, Is.EqualTo(" --arg1=2 --arg2=123 --arg3=null")); + Assert.Equal(" --arg1=2 --arg2=123 --arg3=null", sd.Arguments); } /// /// Ensures that the new single-argument field has a higher priority. /// - [Test] + [Fact] public void Arguments_Bothparam_Priorities() { var sd = ConfigXmlBuilder.create() @@ -405,11 +403,12 @@ $@" .WithTag("argument", "--arg2=123") .WithTag("argument", "--arg3=null") .ToServiceDescriptor(true); - Assert.That(sd.Arguments, Is.EqualTo(" --arg2=123 --arg3=null")); + Assert.Equal(" --arg2=123 --arg3=null", sd.Arguments); } - [TestCase(true)] - [TestCase(false)] + [Theory] + [InlineData(true)] + [InlineData(false)] public void DelayedStart_RoundTrip(bool enabled) { var bldr = ConfigXmlBuilder.create(); @@ -419,7 +418,7 @@ $@" } var sd = bldr.ToServiceDescriptor(); - Assert.That(sd.DelayedAutoStart, Is.EqualTo(enabled)); + Assert.Equal(enabled, sd.DelayedAutoStart); } } } diff --git a/src/Test/winswTests/Util/AsyncAssert.cs b/src/Test/winswTests/Util/AsyncAssert.cs deleted file mode 100644 index 28da198..0000000 --- a/src/Test/winswTests/Util/AsyncAssert.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Threading.Tasks; -using NUnit.Framework; -using NUnit.Framework.Constraints; - -namespace winswTests.Util -{ - internal static class AsyncAssert - { - internal static async Task ThrowsAsync(AsyncTestDelegate code) - where TActual : Exception - { - Exception caught = null; - try - { - await code(); - } - catch (Exception e) - { - caught = e; - } - - Assert.That(caught, new ExceptionTypeConstraint(typeof(TActual))); - return (TActual)caught; - } - } -} diff --git a/src/Test/winswTests/Util/CLITestHelper.cs b/src/Test/winswTests/Util/CLITestHelper.cs index a338f7b..f6437ee 100644 --- a/src/Test/winswTests/Util/CLITestHelper.cs +++ b/src/Test/winswTests/Util/CLITestHelper.cs @@ -1,7 +1,7 @@ using System; using System.IO; -using NUnit.Framework; using winsw; +using Xunit; namespace winswTests.Util { @@ -54,7 +54,7 @@ $@" Console.SetError(tmpErr); } - Assert.That(swErr.GetStringBuilder().Length, Is.Zero); + Assert.Equal(0, swErr.GetStringBuilder().Length); Console.Write(swOut.ToString()); return swOut.ToString(); } diff --git a/src/Test/winswTests/Util/ProcessHelperTest.cs b/src/Test/winswTests/Util/ProcessHelperTest.cs deleted file mode 100644 index 53285a4..0000000 --- a/src/Test/winswTests/Util/ProcessHelperTest.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Diagnostics; -using System.IO; -using System.Linq; -using NUnit.Framework; -using winsw.Util; - -namespace winswTests.Util -{ - [TestFixture] - class ProcessHelperTest - { - [Test] - public void ShouldNotHangWhenWritingLargeStringToStdOut() - { - var tmpDir = FilesystemTestHelper.CreateTmpDirectory(); - string scriptFile = Path.Combine(tmpDir, "print_lots_to_stdout.bat"); - var lotsOfStdOut = string.Join(string.Empty, Enumerable.Range(1, 1000)); - File.WriteAllText(scriptFile, $"echo \"{lotsOfStdOut}\""); - - Process proc = new Process(); - var ps = proc.StartInfo; - ps.FileName = scriptFile; - - ProcessHelper.StartProcessAndCallbackForExit(proc); - var exited = proc.WaitForExit(5000); - if (!exited) - { - Assert.Fail("Process " + proc + " didn't exit after 5 seconds"); - } - } - } -} diff --git a/src/Test/winswTests/Util/ServiceDescriptorAssert.cs b/src/Test/winswTests/Util/ServiceDescriptorAssert.cs index 86e94a6..1228286 100644 --- a/src/Test/winswTests/Util/ServiceDescriptorAssert.cs +++ b/src/Test/winswTests/Util/ServiceDescriptorAssert.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; using System.Reflection; -using NUnit.Framework; using winsw; using winsw.Configuration; +using Xunit; namespace winswTests.Util { @@ -14,12 +14,12 @@ namespace winswTests.Util public static void AssertPropertyIsDefault(ServiceDescriptor desc, string property) { PropertyInfo actualProperty = typeof(ServiceDescriptor).GetProperty(property); - Assert.That(actualProperty, Is.Not.Null); + Assert.NotNull(actualProperty); PropertyInfo defaultProperty = typeof(DefaultWinSWSettings).GetProperty(property); - Assert.That(defaultProperty, Is.Not.Null); + Assert.NotNull(defaultProperty); - Assert.That(actualProperty.GetValue(desc, null), Is.EqualTo(defaultProperty.GetValue(ServiceDescriptor.Defaults, null))); + Assert.Equal(defaultProperty.GetValue(ServiceDescriptor.Defaults, null), actualProperty.GetValue(desc, null)); } public static void AssertPropertyIsDefault(ServiceDescriptor desc, List properties) diff --git a/src/Test/winswTests/Util/TestHelper.cs b/src/Test/winswTests/Util/TestHelper.cs deleted file mode 100644 index f1a806e..0000000 --- a/src/Test/winswTests/Util/TestHelper.cs +++ /dev/null @@ -1,16 +0,0 @@ -using NUnit.Framework; -using winsw; - -namespace winswTests.Util -{ - internal static class TestHelper - { - internal static void RequireProcessElevated() - { - if (!Program.IsProcessElevated()) - { - Assert.Ignore(); - } - } - } -} diff --git a/src/Test/winswTests/winswTests.csproj b/src/Test/winswTests/winswTests.csproj index dc14e60..d68ed10 100644 --- a/src/Test/winswTests/winswTests.csproj +++ b/src/Test/winswTests/winswTests.csproj @@ -13,8 +13,11 @@ all - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all +