This commit is contained in:
Stef Heyenrath
2021-03-18 14:29:13 +01:00
committed by GitHub
parent 3617e95db6
commit ddf2b49240
5 changed files with 133 additions and 66 deletions

View File

@@ -1,70 +1,79 @@
using System; using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading; using System.Threading;
using log4net; using log4net;
using log4net.Config; using log4net.Config;
using log4net.Repository; using log4net.Repository;
using WireMock.RequestBuilders; using WireMock.RequestBuilders;
using WireMock.ResponseBuilders; using WireMock.ResponseBuilders;
using WireMock.Server; using WireMock.Server;
using WireMock.Settings; using WireMock.Settings;
using WireMock.Util;
namespace WireMock.Net.StandAlone.NETCoreApp
{ namespace WireMock.Net.StandAlone.NETCoreApp
static class Program {
{ static class Program
private static readonly ILoggerRepository LogRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()); {
// private static readonly ILog Log = LogManager.GetLogger(typeof(Program)); private static readonly ILoggerRepository LogRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
// private static readonly ILog Log = LogManager.GetLogger(typeof(Program));
private static int sleepTime = 30000;
private static WireMockServer _server; private static int sleepTime = 30000;
private static WireMockServer _server;
static void Main(string[] args)
{ static void Main(string[] args)
XmlConfigurator.Configure(LogRepository, new FileInfo("log4net.config")); {
XmlConfigurator.Configure(LogRepository, new FileInfo("log4net.config"));
if (!WireMockServerSettingsParser.TryParseArguments(args, out var settings, new WireMockLog4NetLogger())) if (!WireMockServerSettingsParser.TryParseArguments(args, out var settings, new WireMockLog4NetLogger()))
{ {
return; return;
} }
settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'")));
_server = WireMockServer.Start(settings); _server = WireMockServer.Start(settings);
_server _server.Given(Request.Create().WithPath("/api/sap")
.Given(Request.Create() .UsingPost()
.UsingAnyMethod()) .WithBody((IBodyData xmlData) => {
.RespondWith(Response.Create() //xmlData is always null
.WithTransformer() return true;
.WithBody("{{Random Type=\"Integer\" Min=100 Max=999999}} {{DateTime.Now}} {{DateTime.Now \"yyyy-MMM\"}} {{String.Format (DateTime.Now) \"MMM-dd\"}}")); }))
.RespondWith(Response.Create().WithStatusCode(System.Net.HttpStatusCode.OK));
Console.WriteLine($"{DateTime.UtcNow} Press Ctrl+C to shut down");
_server
Console.CancelKeyPress += (s, e) => .Given(Request.Create()
{ .UsingAnyMethod())
Stop("CancelKeyPress"); .RespondWith(Response.Create()
}; .WithTransformer()
.WithBody("{{Random Type=\"Integer\" Min=100 Max=999999}} {{DateTime.Now}} {{DateTime.Now \"yyyy-MMM\"}} {{String.Format (DateTime.Now) \"MMM-dd\"}}"));
System.Runtime.Loader.AssemblyLoadContext.Default.Unloading += ctx =>
{ Console.WriteLine($"{DateTime.UtcNow} Press Ctrl+C to shut down");
Stop("AssemblyLoadContext.Default.Unloading");
}; Console.CancelKeyPress += (s, e) =>
{
while (true) Stop("CancelKeyPress");
{ };
Console.WriteLine($"{DateTime.UtcNow} WireMock.Net server running : {_server.IsStarted}");
Thread.Sleep(sleepTime); System.Runtime.Loader.AssemblyLoadContext.Default.Unloading += ctx =>
} {
} Stop("AssemblyLoadContext.Default.Unloading");
};
private static void Stop(string why)
{ while (true)
Console.WriteLine($"{DateTime.UtcNow} WireMock.Net server stopping because '{why}'"); {
_server.Stop(); Console.WriteLine($"{DateTime.UtcNow} WireMock.Net server running : {_server.IsStarted}");
Console.WriteLine($"{DateTime.UtcNow} WireMock.Net server stopped"); Thread.Sleep(sleepTime);
} }
} }
private static void Stop(string why)
{
Console.WriteLine($"{DateTime.UtcNow} WireMock.Net server stopping because '{why}'");
_server.Stop();
Console.WriteLine($"{DateTime.UtcNow} WireMock.Net server stopped");
}
}
} }

View File

@@ -2,6 +2,7 @@ using JetBrains.Annotations;
using System; using System;
using System.Linq; using System.Linq;
using WireMock.Types; using WireMock.Types;
using WireMock.Util;
using WireMock.Validation; using WireMock.Validation;
namespace WireMock.Matchers.Request namespace WireMock.Matchers.Request
@@ -26,6 +27,11 @@ namespace WireMock.Matchers.Request
/// </summary> /// </summary>
public Func<object, bool> JsonFunc { get; } public Func<object, bool> JsonFunc { get; }
/// <summary>
/// The body data function for BodyData
/// </summary>
public Func<IBodyData, bool> BodyDataFunc { get; }
/// <summary> /// <summary>
/// The matchers. /// The matchers.
/// </summary> /// </summary>
@@ -88,6 +94,16 @@ namespace WireMock.Matchers.Request
JsonFunc = func; JsonFunc = func;
} }
/// <summary>
/// Initializes a new instance of the <see cref="RequestMessageBodyMatcher"/> class.
/// </summary>
/// <param name="func">The function.</param>
public RequestMessageBodyMatcher([NotNull] Func<IBodyData, bool> func)
{
Check.NotNull(func, nameof(func));
BodyDataFunc = func;
}
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="RequestMessageBodyMatcher"/> class. /// Initializes a new instance of the <see cref="RequestMessageBodyMatcher"/> class.
/// </summary> /// </summary>
@@ -158,6 +174,11 @@ namespace WireMock.Matchers.Request
return MatchScores.ToScore(DataFunc(requestMessage?.BodyData?.BodyAsBytes)); return MatchScores.ToScore(DataFunc(requestMessage?.BodyData?.BodyAsBytes));
} }
if (BodyDataFunc != null)
{
return MatchScores.ToScore(BodyDataFunc(requestMessage?.BodyData));
}
return MatchScores.Mismatch; return MatchScores.Mismatch;
} }
} }

View File

@@ -2,7 +2,8 @@
using System; using System;
using WireMock.Matchers; using WireMock.Matchers;
using WireMock.Matchers.Request; using WireMock.Matchers.Request;
using WireMock.Util;
namespace WireMock.RequestBuilders namespace WireMock.RequestBuilders
{ {
/// <summary> /// <summary>
@@ -63,10 +64,17 @@ namespace WireMock.RequestBuilders
IRequestBuilder WithBody([NotNull] Func<byte[], bool> func); IRequestBuilder WithBody([NotNull] Func<byte[], bool> func);
/// <summary> /// <summary>
/// WithBody: func (object) /// WithBody: func (json object)
/// </summary> /// </summary>
/// <param name="func">The function.</param> /// <param name="func">The function.</param>
/// <returns>The <see cref="IRequestBuilder"/>.</returns> /// <returns>The <see cref="IRequestBuilder"/>.</returns>
IRequestBuilder WithBody([NotNull] Func<object, bool> func); IRequestBuilder WithBody([NotNull] Func<object, bool> func);
/// <summary>
/// WithBody: func (BodyData object)
/// </summary>
/// <param name="func">The function.</param>
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
IRequestBuilder WithBody([NotNull] Func<IBodyData, bool> func);
} }
} }

View File

@@ -3,6 +3,7 @@
using System; using System;
using WireMock.Matchers; using WireMock.Matchers;
using WireMock.Matchers.Request; using WireMock.Matchers.Request;
using WireMock.Util;
using WireMock.Validation; using WireMock.Validation;
namespace WireMock.RequestBuilders namespace WireMock.RequestBuilders
@@ -71,5 +72,14 @@ namespace WireMock.RequestBuilders
_requestMatchers.Add(new RequestMessageBodyMatcher(func)); _requestMatchers.Add(new RequestMessageBodyMatcher(func));
return this; return this;
} }
/// <inheritdoc cref="IBodyRequestBuilder.WithBody(Func{IBodyData, bool})"/>
public IRequestBuilder WithBody(Func<IBodyData, bool> func)
{
Check.NotNull(func, nameof(func));
_requestMatchers.Add(new RequestMessageBodyMatcher(func));
return this;
}
} }
} }

View File

@@ -54,6 +54,25 @@ namespace WireMock.Net.Tests
Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0);
} }
[Fact]
public void Request_WithBody_FuncBodyData()
{
// Assign
var requestBuilder = Request.Create().UsingAnyMethod().WithBody((IBodyData b) => b != null);
// Act
var body = new BodyData
{
BodyAsJson = 123,
DetectedBodyType = BodyType.Json
};
var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POST", ClientIp, body);
// Assert
var requestMatchResult = new RequestMatchResult();
Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0);
}
[Fact] [Fact]
public void Request_WithBody_FuncByteArray() public void Request_WithBody_FuncByteArray()
{ {