diff --git a/README.md b/README.md index 82e3f810f..54d40890c 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,13 @@ WireMock.Net can be used in several ways: You can use your favorite test framework and use WireMock within your tests, see [Wiki : UnitTesting](https://github.com/StefH/WireMock.Net/wiki/Using-WireMock-in-UnitTests). +### As a dotnet tool +It's simple to install WireMock.Net as (global) dotnet tool, see [Wiki : Standalone Process](https://github.com/StefH/WireMock.Net/wiki/WireMock-as-dotnet-tool). + ### As standalone process / console application This is quite straight forward to launch a mock server within a console application, see [Wiki : Standalone Process](https://github.com/StefH/WireMock.Net/wiki/WireMock-as-a-standalone-process). + ### As a Windows Service You can also run WireMock.Net as a Windows Service, follow this [WireMock-as-a-Windows-Service](https://github.com/WireMock-Net/WireMock.Net/wiki/WireMock-as-a-Windows-Service). diff --git a/WireMock.Net Solution.sln b/WireMock.Net Solution.sln index e295c7e7c..ea9086e57 100644 --- a/WireMock.Net Solution.sln +++ b/WireMock.Net Solution.sln @@ -71,7 +71,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.WebApplication EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.WebApplication.NETCore3", "examples\WireMock.Net.WebApplication.NETCore3\WireMock.Net.WebApplication.NETCore3.csproj", "{E1C56967-3DC7-46CB-A1DF-B13167A0D9D4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.Console.NETCoreApp3WithCertificate", "examples\WireMock.Net.Console.NETCoreApp3WithCertificate\WireMock.Net.Console.NETCoreApp3WithCertificate.csproj", "{925E421A-1B3F-4202-B48F-734743573A4B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.Console.NETCoreApp3WithCertificate", "examples\WireMock.Net.Console.NETCoreApp3WithCertificate\WireMock.Net.Console.NETCoreApp3WithCertificate.csproj", "{925E421A-1B3F-4202-B48F-734743573A4B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-WireMock", "src\dotnet-WireMock.Net\dotnet-WireMock.csproj", "{40BF24B5-12E6-4610-9489-138798632E28}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -179,6 +181,10 @@ Global {925E421A-1B3F-4202-B48F-734743573A4B}.Debug|Any CPU.Build.0 = Debug|Any CPU {925E421A-1B3F-4202-B48F-734743573A4B}.Release|Any CPU.ActiveCfg = Release|Any CPU {925E421A-1B3F-4202-B48F-734743573A4B}.Release|Any CPU.Build.0 = Release|Any CPU + {40BF24B5-12E6-4610-9489-138798632E28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {40BF24B5-12E6-4610-9489-138798632E28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40BF24B5-12E6-4610-9489-138798632E28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {40BF24B5-12E6-4610-9489-138798632E28}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -209,6 +215,7 @@ Global {6F38CB3A-6DA1-408A-AECD-E434523C2838} = {985E0ADB-D4B4-473A-AA40-567E279B7946} {E1C56967-3DC7-46CB-A1DF-B13167A0D9D4} = {985E0ADB-D4B4-473A-AA40-567E279B7946} {925E421A-1B3F-4202-B48F-734743573A4B} = {985E0ADB-D4B4-473A-AA40-567E279B7946} + {40BF24B5-12E6-4610-9489-138798632E28} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DC539027-9852-430C-B19F-FD035D018458} diff --git a/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs b/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs index 2af771983..5ccabe7ba 100644 --- a/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs +++ b/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs @@ -23,7 +23,11 @@ static void Main(string[] args) { XmlConfigurator.Configure(LogRepository, new FileInfo("log4net.config")); - var settings = WireMockServerSettingsParser.ParseArguments(args, new WireMockLog4NetLogger()); + if (WireMockServerSettingsParser.TryParseArguments(args, out var settings, new WireMockLog4NetLogger())) + { + return; + } + settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); _server = WireMockServer.Start(settings); diff --git a/examples/WireMock.Net.StandAlone.Net452/Program.cs b/examples/WireMock.Net.StandAlone.Net452/Program.cs index 83240774d..ff2acda3f 100644 --- a/examples/WireMock.Net.StandAlone.Net452/Program.cs +++ b/examples/WireMock.Net.StandAlone.Net452/Program.cs @@ -13,13 +13,15 @@ static void Main(params string[] args) { XmlConfigurator.Configure(new FileInfo("log4net.config")); - var settings = WireMockServerSettingsParser.ParseArguments(args); - settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); - - WireMockServer.Start(settings); - - Console.WriteLine("Press any key to stop the server"); - Console.ReadKey(); + if (WireMockServerSettingsParser.TryParseArguments(args, out var settings)) + { + settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); + + WireMockServer.Start(settings); + + Console.WriteLine("Press any key to stop the server"); + Console.ReadKey(); + } } } } \ No newline at end of file diff --git a/examples/WireMock.Net.StandAlone.Net461/Program.cs b/examples/WireMock.Net.StandAlone.Net461/Program.cs index 72787ce14..172aed7f0 100644 --- a/examples/WireMock.Net.StandAlone.Net461/Program.cs +++ b/examples/WireMock.Net.StandAlone.Net461/Program.cs @@ -9,13 +9,15 @@ static class Program { static void Main(string[] args) { - var settings = WireMockServerSettingsParser.ParseArguments(args); - settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); - - WireMockServer.Start(settings); - - Console.WriteLine("Press any key to stop the server"); - Console.ReadKey(); + if (WireMockServerSettingsParser.TryParseArguments(args, out var settings)) + { + settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); + + WireMockServer.Start(settings); + + Console.WriteLine("Press any key to stop the server"); + Console.ReadKey(); + } } } } \ No newline at end of file diff --git a/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj b/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj index f013e3595..1d9f0f78d 100644 --- a/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj +++ b/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj @@ -21,6 +21,7 @@ ../WireMock.Net/WireMock.Net.snk true + MIT diff --git a/src/WireMock.Net.FluentAssertions/WireMock.Net.FluentAssertions.csproj b/src/WireMock.Net.FluentAssertions/WireMock.Net.FluentAssertions.csproj index 96b5f09d5..08b9e4b2b 100644 --- a/src/WireMock.Net.FluentAssertions/WireMock.Net.FluentAssertions.csproj +++ b/src/WireMock.Net.FluentAssertions/WireMock.Net.FluentAssertions.csproj @@ -21,6 +21,7 @@ ../WireMock.Net/WireMock.Net.snk true + MIT diff --git a/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj b/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj index d1dd4c45a..e3d507baf 100644 --- a/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj +++ b/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj @@ -11,6 +11,7 @@ true ../WireMock.Net/WireMock.Net.snk true + MIT diff --git a/src/WireMock.Net.RestClient/WireMock.Net.RestClient.csproj b/src/WireMock.Net.RestClient/WireMock.Net.RestClient.csproj index 8c7740367..1d26a8167 100644 --- a/src/WireMock.Net.RestClient/WireMock.Net.RestClient.csproj +++ b/src/WireMock.Net.RestClient/WireMock.Net.RestClient.csproj @@ -21,6 +21,7 @@ ../WireMock.Net/WireMock.Net.snk true + MIT diff --git a/src/WireMock.Net.StandAlone/StandAloneApp.cs b/src/WireMock.Net.StandAlone/StandAloneApp.cs index 12f2a91a4..26cb4521d 100644 --- a/src/WireMock.Net.StandAlone/StandAloneApp.cs +++ b/src/WireMock.Net.StandAlone/StandAloneApp.cs @@ -1,5 +1,5 @@ -using JetBrains.Annotations; -using System.Linq; +using System.Linq; +using JetBrains.Annotations; using WireMock.Logging; using WireMock.Server; using WireMock.Settings; @@ -38,11 +38,37 @@ public static WireMockServer Start([NotNull] string[] args, [CanBeNull] IWireMoc { Check.NotNull(args, nameof(args)); - var settings = WireMockServerSettingsParser.ParseArguments(args, logger); + if (WireMockServerSettingsParser.TryParseArguments(args, out var settings, logger)) + { + settings.Logger?.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); + + return Start(settings); + } - settings.Logger?.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); + return null; + } + + /// + /// Try to start WireMock.Net standalone Server based on the commandline arguments. + /// + /// The commandline arguments + /// The logger + /// The WireMockServer + [PublicAPI] + public static bool TryStart([NotNull] string[] args, out WireMockServer server, [CanBeNull] IWireMockLogger logger = null) + { + Check.NotNull(args, nameof(args)); + + if (WireMockServerSettingsParser.TryParseArguments(args, out var settings, logger)) + { + settings.Logger?.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); + + server = Start(settings); + return true; + } - return Start(settings); + server = null; + return false; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Settings/SimpleCommandLineParser.cs b/src/WireMock.Net/Settings/SimpleCommandLineParser.cs index 063b2c46c..1e31a7de9 100644 --- a/src/WireMock.Net/Settings/SimpleCommandLineParser.cs +++ b/src/WireMock.Net/Settings/SimpleCommandLineParser.cs @@ -9,7 +9,7 @@ internal class SimpleCommandLineParser { private const string Sigil = "--"; - private IDictionary Arguments { get; } = new Dictionary(); + private IDictionary Arguments { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); public void Parse(string[] arguments) { @@ -70,6 +70,11 @@ public bool GetBoolValue(string name, bool defaultValue = false) }, defaultValue); } + public bool GetBoolSwitchValue(string name) + { + return Contains(name); + } + public int? GetIntValue(string name, int? defaultValue = null) { return GetValue(name, values => diff --git a/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs b/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs index ff00bac5b..b5ab5c39e 100644 --- a/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs +++ b/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs @@ -1,106 +1,114 @@ -using JetBrains.Annotations; -using WireMock.Logging; -using WireMock.Validation; - -namespace WireMock.Settings -{ - /// - /// A static helper class to parse commandline arguments into IWireMockServerSettings. - /// - public static class WireMockServerSettingsParser - { - /// - /// Parse commandline arguments into WireMockServerSettings. - /// - /// The commandline arguments - /// The logger (optional, can be null) - [PublicAPI] - public static IWireMockServerSettings ParseArguments([NotNull] string[] args, [CanBeNull] IWireMockLogger logger = null) - { - Check.HasNoNulls(args, nameof(args)); - - var parser = new SimpleCommandLineParser(); - parser.Parse(args); - - var settings = new WireMockServerSettings - { - StartAdminInterface = parser.GetBoolValue("StartAdminInterface", true), - ReadStaticMappings = parser.GetBoolValue("ReadStaticMappings"), - WatchStaticMappings = parser.GetBoolValue("WatchStaticMappings"), - AllowPartialMapping = parser.GetBoolValue("AllowPartialMapping"), - WatchStaticMappingsInSubdirectories = parser.GetBoolValue("WatchStaticMappingsInSubdirectories"), - AdminUsername = parser.GetStringValue("AdminUsername"), - AdminPassword = parser.GetStringValue("AdminPassword"), - MaxRequestLogCount = parser.GetIntValue("MaxRequestLogCount"), - RequestLogExpirationDuration = parser.GetIntValue("RequestLogExpirationDuration"), - AllowCSharpCodeMatcher = parser.GetBoolValue("AllowCSharpCodeMatcher"), - AllowBodyForAllHttpMethods = parser.GetBoolValue("AllowBodyForAllHttpMethods"), - AllowOnlyDefinedHttpStatusCodeInResponse = parser.GetBoolValue("AllowOnlyDefinedHttpStatusCodeInResponse"), - DisableJsonBodyParsing = parser.GetBoolValue("DisableJsonBodyParsing"), - HandleRequestsSynchronously = parser.GetBoolValue("HandleRequestsSynchronously"), - ThrowExceptionWhenMatcherFails = parser.GetBoolValue("ThrowExceptionWhenMatcherFails") - }; - - if (logger != null) - { - settings.Logger = logger; - } - - if (parser.GetStringValue("WireMockLogger") == "WireMockConsoleLogger") - { - settings.Logger = new WireMockConsoleLogger(); - } - - if (parser.Contains("Port")) - { - settings.Port = parser.GetIntValue("Port"); - } - else - { - settings.Urls = parser.GetValues("Urls", new[] { "http://*:9091/" }); - } - - string proxyUrl = parser.GetStringValue("ProxyURL") ?? parser.GetStringValue("ProxyUrl"); - if (!string.IsNullOrEmpty(proxyUrl)) - { - settings.ProxyAndRecordSettings = new ProxyAndRecordSettings - { - Url = proxyUrl, - SaveMapping = parser.GetBoolValue("SaveMapping"), - SaveMappingToFile = parser.GetBoolValue("SaveMappingToFile"), - SaveMappingForStatusCodePattern = parser.GetStringValue("SaveMappingForStatusCodePattern"), - ClientX509Certificate2ThumbprintOrSubjectName = parser.GetStringValue("ClientX509Certificate2ThumbprintOrSubjectName"), - ExcludedHeaders = parser.GetValues("ExcludedHeaders"), - ExcludedCookies = parser.GetValues("ExcludedCookies"), - AllowAutoRedirect = parser.GetBoolValue("AllowAutoRedirect") - }; - - string proxyAddress = parser.GetStringValue("WebProxyAddress"); - if (!string.IsNullOrEmpty(proxyAddress)) - { - settings.ProxyAndRecordSettings.WebProxySettings = new WebProxySettings - { - Address = proxyAddress, - UserName = parser.GetStringValue("WebProxyUserName"), - Password = parser.GetStringValue("WebProxyPassword") - }; - } - } - - var certificateSettings = new WireMockCertificateSettings - { - X509StoreName = parser.GetStringValue("X509StoreName"), - X509StoreLocation = parser.GetStringValue("X509StoreLocation"), - X509StoreThumbprintOrSubjectName = parser.GetStringValue("X509StoreThumbprintOrSubjectName"), - X509CertificateFilePath = parser.GetStringValue("X509CertificateFilePath"), - X509CertificatePassword = parser.GetStringValue("X509CertificatePassword") - }; - if (certificateSettings.IsDefined) - { - settings.CertificateSettings = certificateSettings; - } - - return settings; - } - } +using JetBrains.Annotations; +using WireMock.Logging; +using WireMock.Validation; + +namespace WireMock.Settings +{ + /// + /// A static helper class to parse commandline arguments into IWireMockServerSettings. + /// + public static class WireMockServerSettingsParser + { + /// + /// Parse commandline arguments into WireMockServerSettings. + /// + /// The commandline arguments + /// The logger (optional, can be null) + /// The parsed settings + [PublicAPI] + public static bool TryParseArguments([NotNull] string[] args, out IWireMockServerSettings settings, [CanBeNull] IWireMockLogger logger = null) + { + Check.HasNoNulls(args, nameof(args)); + + var parser = new SimpleCommandLineParser(); + parser.Parse(args); + + if (parser.GetBoolSwitchValue("help")) + { + logger.Info("See https://github.com/WireMock-Net/WireMock.Net/wiki/WireMock-commandline-parameters for details on all commandline options."); + settings = null; + return false; + } + + settings = new WireMockServerSettings + { + StartAdminInterface = parser.GetBoolValue("StartAdminInterface", true), + ReadStaticMappings = parser.GetBoolValue("ReadStaticMappings"), + WatchStaticMappings = parser.GetBoolValue("WatchStaticMappings"), + AllowPartialMapping = parser.GetBoolValue("AllowPartialMapping"), + WatchStaticMappingsInSubdirectories = parser.GetBoolValue("WatchStaticMappingsInSubdirectories"), + AdminUsername = parser.GetStringValue("AdminUsername"), + AdminPassword = parser.GetStringValue("AdminPassword"), + MaxRequestLogCount = parser.GetIntValue("MaxRequestLogCount"), + RequestLogExpirationDuration = parser.GetIntValue("RequestLogExpirationDuration"), + AllowCSharpCodeMatcher = parser.GetBoolValue("AllowCSharpCodeMatcher"), + AllowBodyForAllHttpMethods = parser.GetBoolValue("AllowBodyForAllHttpMethods"), + AllowOnlyDefinedHttpStatusCodeInResponse = parser.GetBoolValue("AllowOnlyDefinedHttpStatusCodeInResponse"), + DisableJsonBodyParsing = parser.GetBoolValue("DisableJsonBodyParsing"), + HandleRequestsSynchronously = parser.GetBoolValue("HandleRequestsSynchronously"), + ThrowExceptionWhenMatcherFails = parser.GetBoolValue("ThrowExceptionWhenMatcherFails") + }; + + if (logger != null) + { + settings.Logger = logger; + } + + if (parser.GetStringValue("WireMockLogger") == "WireMockConsoleLogger") + { + settings.Logger = new WireMockConsoleLogger(); + } + + if (parser.Contains("Port")) + { + settings.Port = parser.GetIntValue("Port"); + } + else + { + settings.Urls = parser.GetValues("Urls", new[] { "http://*:9091/" }); + } + + string proxyUrl = parser.GetStringValue("ProxyURL") ?? parser.GetStringValue("ProxyUrl"); + if (!string.IsNullOrEmpty(proxyUrl)) + { + settings.ProxyAndRecordSettings = new ProxyAndRecordSettings + { + Url = proxyUrl, + SaveMapping = parser.GetBoolValue("SaveMapping"), + SaveMappingToFile = parser.GetBoolValue("SaveMappingToFile"), + SaveMappingForStatusCodePattern = parser.GetStringValue("SaveMappingForStatusCodePattern"), + ClientX509Certificate2ThumbprintOrSubjectName = parser.GetStringValue("ClientX509Certificate2ThumbprintOrSubjectName"), + ExcludedHeaders = parser.GetValues("ExcludedHeaders"), + ExcludedCookies = parser.GetValues("ExcludedCookies"), + AllowAutoRedirect = parser.GetBoolValue("AllowAutoRedirect") + }; + + string proxyAddress = parser.GetStringValue("WebProxyAddress"); + if (!string.IsNullOrEmpty(proxyAddress)) + { + settings.ProxyAndRecordSettings.WebProxySettings = new WebProxySettings + { + Address = proxyAddress, + UserName = parser.GetStringValue("WebProxyUserName"), + Password = parser.GetStringValue("WebProxyPassword") + }; + } + } + + var certificateSettings = new WireMockCertificateSettings + { + X509StoreName = parser.GetStringValue("X509StoreName"), + X509StoreLocation = parser.GetStringValue("X509StoreLocation"), + X509StoreThumbprintOrSubjectName = parser.GetStringValue("X509StoreThumbprintOrSubjectName"), + X509CertificateFilePath = parser.GetStringValue("X509CertificateFilePath"), + X509CertificatePassword = parser.GetStringValue("X509CertificatePassword") + }; + if (certificateSettings.IsDefined) + { + settings.CertificateSettings = certificateSettings; + } + + return true; + } + } } \ No newline at end of file diff --git a/src/dotnet-WireMock.Net/Program.cs b/src/dotnet-WireMock.Net/Program.cs new file mode 100644 index 000000000..a4e742d54 --- /dev/null +++ b/src/dotnet-WireMock.Net/Program.cs @@ -0,0 +1,58 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using WireMock.Net.StandAlone; +using WireMock.Server; + +namespace WireMock +{ + public class Program + { + private static int SleepTime = 30000; + private static readonly ILogger Logger = LoggerFactory.Create(o => + { + o.SetMinimumLevel(LogLevel.Debug); + o.AddSimpleConsole(options => + { + options.IncludeScopes = true; + options.SingleLine = false; + options.TimestampFormat = "yyyy-MM-ddTHH:mm:ss "; + }); + }).CreateLogger(string.Empty); + + private static WireMockServer Server; + + static async Task Main(string[] args) + { + if (!StandAloneApp.TryStart(args, out Server, new WireMockLogger(Logger))) + { + return; + } + + Logger.LogInformation("Press Ctrl+C to shut down"); + + Console.CancelKeyPress += (s, e) => + { + Stop("CancelKeyPress"); + }; + + System.Runtime.Loader.AssemblyLoadContext.Default.Unloading += ctx => + { + Stop("AssemblyLoadContext.Default.Unloading"); + }; + + while (true) + { + Logger.LogInformation("WireMock.Net server running : {IsStarted}", Server.IsStarted); + await Task.Delay(SleepTime); + } + } + + private static void Stop(string why) + { + Logger.LogInformation("WireMock.Net server stopping because '{why}'", why); + Server.Stop(); + Logger.LogInformation("WireMock.Net server stopped"); + } + } +} \ No newline at end of file diff --git a/src/dotnet-WireMock.Net/Properties/launchSettings.json b/src/dotnet-WireMock.Net/Properties/launchSettings.json new file mode 100644 index 000000000..e2222cce5 --- /dev/null +++ b/src/dotnet-WireMock.Net/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "dotnet-WireMock.Net": { + "commandName": "Project", + "commandLineArgs": "" + } + } +} \ No newline at end of file diff --git a/src/dotnet-WireMock.Net/WireMockLogger.cs b/src/dotnet-WireMock.Net/WireMockLogger.cs new file mode 100644 index 000000000..b765a424c --- /dev/null +++ b/src/dotnet-WireMock.Net/WireMockLogger.cs @@ -0,0 +1,61 @@ +using System; +using System.Text.Json; +using Microsoft.Extensions.Logging; +using WireMock.Admin.Requests; +using WireMock.Logging; + +namespace WireMock +{ + public class WireMockLogger : IWireMockLogger + { + private readonly JsonSerializerOptions options = new JsonSerializerOptions + { + WriteIndented = true + }; + + private readonly ILogger _logger; + + public WireMockLogger(ILogger logger) + { + _logger = logger; + } + + /// + public void Debug(string formatString, params object[] args) + { + _logger.LogDebug(formatString, args); + } + + /// + public void Info(string formatString, params object[] args) + { + _logger.LogInformation(formatString, args); + } + + /// + public void Warn(string formatString, params object[] args) + { + _logger.LogWarning(formatString, args); + } + + /// + public void Error(string formatString, params object[] args) + { + _logger.LogError(formatString, args); + } + + /// + public void Error(string formatString, Exception exception) + { + _logger.LogError(formatString, exception); + } + + /// + public void DebugRequestResponse(LogEntryModel logEntryModel, bool isAdminRequest) + { + string message = JsonSerializer.Serialize(logEntryModel, options); + + _logger.LogDebug("Admin[{IsAdmin}] {Message}", isAdminRequest, message); + } + } +} \ No newline at end of file diff --git a/src/dotnet-WireMock.Net/dotnet-WireMock.csproj b/src/dotnet-WireMock.Net/dotnet-WireMock.csproj new file mode 100644 index 000000000..69b3e3fcb --- /dev/null +++ b/src/dotnet-WireMock.Net/dotnet-WireMock.csproj @@ -0,0 +1,27 @@ + + + + Exe + net5 + true + dotnet-wiremock + A dotnet commandline tool for WireMock.Net (A Lightweight Http Mocking Server for .NET) + tdd;mock;http;wiremock;test;server;unittest;dotnet;tool;dotnet-tool + MIT + Stef Heyenrath + + + + true + + + + + + + + + + + + \ No newline at end of file