Version 2.x (#1359)

* Version 2.x

* Setup .NET 9

* 12

* cleanup some #if for NETSTANDARD1_3

* cleanup + fix tests for net8

* openapi

* NO ConfigureAwait(false) + cleanup

* .

* #endif

* HashSet

* WireMock.Net.NUnit

* HttpContext

* Add WebSockets (#1423)

* Add WebSockets

* Add tests

* fix

* more tests

* Add tests

* ...

* remove IOwin

* -

* tests

* fluent

* ok

* match

* .

* byte[]

* x

* func

* func

* byte

* trans

* ...

* frameworks.........

* jmes

* xxx

* sc

* using var httpClient = new HttpClient();

* usings

* maxRetries

* up

* xunit v3

* ct

* ---

* ct

* ct2

* T Unit

* WireMock.Net.TUnitTests / 10

* t unit first

* --project

* no tunit

* t2

* --project

* --project

* ci -  --project

* publish ./test/wiremock-coverage.xml

* windows

* .

* log

* ...

* log

* goed

* BodyType

* .

* .

* --scenario

* ...

* pact

* ct

* .

* WireMock.Net.RestClient.AwesomeAssertions (#1427)

* WireMock.Net.RestClient.AwesomeAssertions

* ok

* atpath

* fix test

* sonar fixes

* ports

* proxy test

* FIX?

* ---

* await Task.Delay(100, _ct);

* ?

* --project

* Aspire: use IDistributedApplicationEventingSubscriber (#1428)

* broadcast

* ok

* more tsts

* .

* Collection

* up

* .

* 2

* remove nfluent

* <VersionPrefix>2.0.0-preview-02</VersionPrefix>

* ...

* .

* nuget icon

* .

* <PackageReference Include="JmesPath.Net" Version="1.1.0" />

* x

* 500

* .

* fix some warnings

* ws
This commit is contained in:
Stef Heyenrath
2026-03-11 17:02:47 +01:00
committed by GitHub
parent d6e19532bc
commit a292f28dda
521 changed files with 79740 additions and 5246 deletions

View File

@@ -1,43 +1,36 @@
// Copyright © WireMock.Net
#if PROTOBUF
using System;
using System.IO;
using System.Threading.Tasks;
using FluentAssertions;
using WireMock.Util;
using Xunit;
namespace WireMock.Net.Tests.Grpc;
public class ProtoBufUtilsTests
{
private static readonly IProtoBufUtils ProtoBufUtils = new ProtoBufUtils();
private static readonly ProtoBufUtils _sut = new();
[Fact]
public async Task GetProtoBufMessageWithHeader_MultipleProtoFiles()
{
// Arrange
var greet = await ReadProtoFileAsync("greet1.proto");
var request = await ReadProtoFileAsync("request.proto");
var greet = ReadProtoFile("greet1.proto");
var request = ReadProtoFile("request.proto");
// Act
var responseBytes = await ProtoBufUtils.GetProtoBufMessageWithHeaderAsync(
var responseBytes = await _sut.GetProtoBufMessageWithHeaderAsync(
[greet, request],
"greet.HelloRequest",
new
"greet.HelloRequest", new
{
name = "hello"
}
},
cancellationToken: TestContext.Current.CancellationToken
);
// Assert
Convert.ToBase64String(responseBytes).Should().Be("AAAAAAcKBWhlbGxv");
}
private static Task<string> ReadProtoFileAsync(string filename)
private static string ReadProtoFile(string filename)
{
return File.ReadAllTextAsync(Path.Combine(Directory.GetCurrentDirectory(), "Grpc", filename));
return File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "Grpc", filename));
}
}
#endif
}

View File

@@ -1,12 +1,6 @@
// Copyright © WireMock.Net
#if PROTOBUF
using System;
using System.IO;
using System.Threading.Tasks;
using FluentAssertions;
using WireMock.Util;
using Xunit;
namespace WireMock.Net.Tests.Grpc;
@@ -18,12 +12,13 @@ public class ProtoDefinitionHelperTests
public async Task FromDirectory_Greet_ShouldReturnModifiedProtoFiles()
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;
var directory = Path.Combine(Directory.GetCurrentDirectory(), "Grpc", "Test");
var expectedFilename = "SubFolder/request.proto";
var expectedComment = $"// {expectedFilename}";
// Act
var protoDefinitionData = await ProtoDefinitionDataHelper.FromDirectory(directory);
var protoDefinitionData = await ProtoDefinitionDataHelper.FromDirectory(directory, cancellationToken);
var protoDefinitions = protoDefinitionData.ToList("greet");
// Assert
@@ -39,7 +34,7 @@ public class ProtoDefinitionHelperTests
resolver.Exists("x").Should().BeFalse();
// Act + Assert
var text = await resolver.OpenText(expectedFilename).ReadToEndAsync();
var text = resolver.OpenText(expectedFilename).ReadToEnd();
text.Should().StartWith(expectedComment);
System.Action action = () => resolver.OpenText("x");
action.Should().Throw<FileNotFoundException>();
@@ -52,7 +47,7 @@ public class ProtoDefinitionHelperTests
var directory = Path.Combine(Directory.GetCurrentDirectory(), "Grpc", "ot");
// Act
var protoDefinitionData = await ProtoDefinitionDataHelper.FromDirectory(directory);
var protoDefinitionData = await ProtoDefinitionDataHelper.FromDirectory(directory, TestContext.Current.CancellationToken);
var protoDefinitions = protoDefinitionData.ToList("trace_service");
// Assert
@@ -65,11 +60,11 @@ public class ProtoDefinitionHelperTests
{
rejected_spans = 1,
error_message = "abc"
}
},
cancellationToken: TestContext.Current.CancellationToken
);
// Assert
Convert.ToBase64String(responseBytes).Should().Be("AAAAAAcIARIDYWJj");
}
}
#endif
}

View File

@@ -1,26 +1,19 @@
// Copyright © WireMock.Net
#if PROTOBUF
using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using FluentAssertions;
using ExampleIntegrationTest.Lookup;
using Google.Protobuf.WellKnownTypes;
using Greet;
using Grpc.Net.Client;
using ExampleIntegrationTest.Lookup;
using WireMock.Constants;
using WireMock.Matchers;
using WireMock.RequestBuilders;
using WireMock.ResponseBuilders;
using WireMock.Server;
using WireMock.Settings;
using WireMock.Util;
using Xunit;
// ReSharper disable once CheckNamespace
namespace WireMock.Net.Tests;
@@ -140,7 +133,7 @@ message Other {
protoBuf.Headers.ContentType = new MediaTypeHeaderValue("application/grpc-web");
var client = server.CreateClient();
var response = await client.PostAsync("/grpc/greet.Greeter/SayHello", protoBuf);
var response = await client.PostAsync("/grpc/greet.Greeter/SayHello", protoBuf, TestContext.Current.CancellationToken);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
@@ -152,6 +145,7 @@ message Other {
public async Task WireMockServer_WithBodyAsProtoBuf(string data)
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;
var bytes = Convert.FromBase64String(data);
var jsonMatcher = new JsonMatcher(new { name = "stef" });
@@ -178,11 +172,11 @@ message Other {
protoBuf.Headers.ContentType = new MediaTypeHeaderValue("application/grpc-web");
var client = server.CreateClient();
var response = await client.PostAsync("/grpc/greet.Greeter/SayHello", protoBuf);
var response = await client.PostAsync("/grpc/greet.Greeter/SayHello", protoBuf, cancellationToken);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
var responseBytes = await response.Content.ReadAsByteArrayAsync();
var responseBytes = await response.Content.ReadAsByteArrayAsync(cancellationToken);
Convert.ToBase64String(responseBytes).Should().Be("AAAAAAcKBWhlbGxv");
}
@@ -191,6 +185,7 @@ message Other {
public async Task WireMockServer_WithBodyAsProtoBuf_WithWellKnownTypes_Empty()
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;
using var server = WireMockServer.Start();
server
@@ -212,11 +207,11 @@ message Other {
protoBuf.Headers.ContentType = new MediaTypeHeaderValue("application/grpc-web");
var client = server.CreateClient();
var response = await client.PostAsync("/grpc/Greeter/SayNothing", protoBuf);
var response = await client.PostAsync("/grpc/Greeter/SayNothing", protoBuf, cancellationToken);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
var responseBytes = await response.Content.ReadAsByteArrayAsync();
var responseBytes = await response.Content.ReadAsByteArrayAsync(cancellationToken);
Convert.ToBase64String(responseBytes).Should().Be("AAAAAAA=");
}
@@ -225,6 +220,7 @@ message Other {
public async Task WireMockServer_WithBodyAsProtoBuf_WithWellKnownTypes_Timestamp()
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;
using var server = WireMockServer.Start();
server
@@ -254,11 +250,11 @@ message Other {
protoBuf.Headers.ContentType = new MediaTypeHeaderValue("application/grpc-web");
var client = server.CreateClient();
var response = await client.PostAsync("/grpc/Greeter/SayTimestamp", protoBuf);
var response = await client.PostAsync("/grpc/Greeter/SayTimestamp", protoBuf, cancellationToken);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
var responseBytes = await response.Content.ReadAsByteArrayAsync();
var responseBytes = await response.Content.ReadAsByteArrayAsync(cancellationToken);
Convert.ToBase64String(responseBytes).Should().Be("AAAAAAsKCQiL96C1BhCMYA==");
}
@@ -267,6 +263,7 @@ message Other {
public async Task WireMockServer_WithBodyAsProtoBuf_WithWellKnownTypes_Duration()
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;
using var server = WireMockServer.Start();
server
@@ -296,11 +293,11 @@ message Other {
protoBuf.Headers.ContentType = new MediaTypeHeaderValue("application/grpc-web");
var client = server.CreateClient();
var response = await client.PostAsync("/grpc/Greeter/SayDuration", protoBuf);
var response = await client.PostAsync("/grpc/Greeter/SayDuration", protoBuf, cancellationToken);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
var responseBytes = await response.Content.ReadAsByteArrayAsync();
var responseBytes = await response.Content.ReadAsByteArrayAsync(cancellationToken);
Convert.ToBase64String(responseBytes).Should().Be("AAAAAAsKCQiL96C1BhCMYA==");
}
@@ -309,6 +306,7 @@ message Other {
public async Task WireMockServer_WithBodyAsProtoBuf_ServerProtoDefinition_WithWellKnownTypes()
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;
var bytes = Convert.FromBase64String("CgRzdGVm");
using var server = WireMockServer.Start();
@@ -335,11 +333,11 @@ message Other {
protoBuf.Headers.ContentType = new MediaTypeHeaderValue("application/grpc-web");
var client = server.CreateClient();
var response = await client.PostAsync("/grpc/Greeter/SayNothing", protoBuf);
var response = await client.PostAsync("/grpc/Greeter/SayNothing", protoBuf, cancellationToken);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
var responseBytes = await response.Content.ReadAsByteArrayAsync();
var responseBytes = await response.Content.ReadAsByteArrayAsync(cancellationToken);
Convert.ToBase64String(responseBytes).Should().Be("AAAAAAA=");
}
@@ -348,6 +346,7 @@ message Other {
public async Task WireMockServer_WithBodyAsProtoBuf_MultipleFiles()
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;
var bytes = Convert.FromBase64String("CgRzdGVm");
var jsonMatcher = new JsonMatcher(new { name = "stef" });
@@ -376,11 +375,11 @@ message Other {
protoBuf.Headers.ContentType = new MediaTypeHeaderValue("application/grpc-web");
var client = server.CreateClient();
var response = await client.PostAsync("/grpc/greet.Greeter/SayOther", protoBuf);
var response = await client.PostAsync("/grpc/greet.Greeter/SayOther", protoBuf, cancellationToken);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
var responseBytes = await response.Content.ReadAsByteArrayAsync();
var responseBytes = await response.Content.ReadAsByteArrayAsync(cancellationToken);
Convert.ToBase64String(responseBytes).Should().Be("AAAAAAcKBWhlbGxv");
}
@@ -389,6 +388,7 @@ message Other {
public async Task WireMockServer_WithBodyAsProtoBuf_InlineProtoDefinition_UsingGrpcGeneratedClient()
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;
using var server = WireMockServer.Start(useHttp2: true);
var jsonMatcher = new JsonMatcher(new { name = "stef" });
@@ -415,7 +415,7 @@ message Other {
var channel = GrpcChannel.ForAddress(server.Url!);
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name = "stef" });
var reply = await client.SayHelloAsync(new HelloRequest { Name = "stef" }, cancellationToken: cancellationToken);
// Assert
reply.Message.Should().Be("hello stef POST");
@@ -425,6 +425,7 @@ message Other {
public async Task WireMockServer_WithBodyAsProtoBuf_MappingProtoDefinition_UsingGrpcGeneratedClient()
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;
using var server = WireMockServer.Start(useHttp2: true);
var jsonMatcher = new JsonMatcher(new { name = "stef" });
@@ -453,7 +454,7 @@ message Other {
var channel = GrpcChannel.ForAddress(server.Url!);
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name = "stef" });
var reply = await client.SayHelloAsync(new HelloRequest { Name = "stef" }, cancellationToken: cancellationToken);
// Assert
reply.Message.Should().Be("hello stef POST");
@@ -465,6 +466,7 @@ message Other {
// Arrange
var id = $"test-{Guid.NewGuid()}";
var cancellationToken = TestContext.Current.CancellationToken;
using var server = WireMockServer.Start(useHttp2: true);
var jsonMatcher = new JsonMatcher(new { name = "stef" });
@@ -491,7 +493,7 @@ message Other {
);
// Act
var reply = await When_GrpcClient_Calls_SayHelloAsync(server.Url!);
var reply = await When_GrpcClient_Calls_SayHelloAsync(server.Url!, cancellationToken);
// Assert
Then_ReplyMessage_Should_BeCorrect(reply);
@@ -501,7 +503,8 @@ message Other {
public async Task WireMockServer_WithBodyAsProtoBuf_WithWellKnownTypes_Empty_UsingGrpcGeneratedClient()
{
// Arrange
var definition = await File.ReadAllTextAsync("./Grpc/greet.proto");
var cancellationToken = TestContext.Current.CancellationToken;
var definition = File.ReadAllText("./Grpc/greet.proto");
using var server = WireMockServer.Start(useHttp2: true);
@@ -522,7 +525,7 @@ message Other {
var channel = GrpcChannel.ForAddress(server.Url!);
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayNothingAsync(new Empty());
var reply = await client.SayNothingAsync(new Empty(), cancellationToken: cancellationToken);
// Assert
reply.Should().Be(new Empty());
@@ -534,7 +537,8 @@ message Other {
// Arrange
const int seconds = 1722301323;
const int nanos = 12300;
var definition = await File.ReadAllTextAsync("./Grpc/greet.proto");
var cancellationToken = TestContext.Current.CancellationToken;
var definition = File.ReadAllText("./Grpc/greet.proto");
using var server = WireMockServer.Start(useHttp2: true);
@@ -563,7 +567,7 @@ message Other {
var channel = GrpcChannel.ForAddress(server.Url!);
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayTimestampAsync(new MyMessageTimestamp { Ts = Timestamp.FromDateTime(DateTime.UtcNow) });
var reply = await client.SayTimestampAsync(new MyMessageTimestamp { Ts = Timestamp.FromDateTime(DateTime.UtcNow) }, cancellationToken: cancellationToken);
// Assert
reply.Ts.Should().Be(new Timestamp { Seconds = seconds, Nanos = nanos });
@@ -575,7 +579,8 @@ message Other {
// Arrange
const int seconds = 1722301323;
const int nanos = 12300;
var definition = await File.ReadAllTextAsync("./Grpc/greet.proto");
var cancellationToken = TestContext.Current.CancellationToken;
var definition = File.ReadAllText("./Grpc/greet.proto");
using var server = WireMockServer.Start(useHttp2: true);
@@ -604,7 +609,7 @@ message Other {
var channel = GrpcChannel.ForAddress(server.Url!);
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayDurationAsync(new MyMessageDuration { Du = Duration.FromTimeSpan(TimeSpan.MinValue) });
var reply = await client.SayDurationAsync(new MyMessageDuration { Du = Duration.FromTimeSpan(TimeSpan.MinValue) }, cancellationToken: cancellationToken);
// Assert
reply.Du.Should().Be(new Duration { Seconds = seconds, Nanos = nanos });
@@ -614,7 +619,8 @@ message Other {
public async Task WireMockServer_WithBodyAsProtoBuf_Enum_UsingGrpcGeneratedClient()
{
// Arrange
var definition = await File.ReadAllTextAsync("./Grpc/greet.proto");
var cancellationToken = TestContext.Current.CancellationToken;
var definition = File.ReadAllText("./Grpc/greet.proto");
using var server = WireMockServer.Start(useHttp2: true);
@@ -640,7 +646,7 @@ message Other {
var channel = GrpcChannel.ForAddress(server.Url!);
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest());
var reply = await client.SayHelloAsync(new HelloRequest(), cancellationToken: cancellationToken);
// Assert
reply.Message.Should().Be("hello");
@@ -651,11 +657,12 @@ message Other {
public async Task WireMockServer_WithBodyAsProtoBuf_Enum_UsingPolicyGrpcGeneratedClient()
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;
const int seconds = 1722301323;
const int nanos = 12300;
const string version = "test";
const string correlationId = "correlation";
var definition = await File.ReadAllTextAsync("./Grpc/policy.proto");
var definition = File.ReadAllText("./Grpc/policy.proto");
using var server = WireMockServer.Start(useHttp2: true);
@@ -690,7 +697,7 @@ message Other {
var channel = GrpcChannel.ForAddress(server.Url!);
var client = new PolicyService.PolicyServiceClient(channel);
var reply = await client.GetVersionAsync(new GetVersionRequest());
var reply = await client.GetVersionAsync(new GetVersionRequest(), cancellationToken: cancellationToken);
// Assert
reply.Version.Should().Be(version);
@@ -702,10 +709,11 @@ message Other {
[Fact]
public async Task WireMockServer_WithBodyAsProtoBuf_FromJson_UsingGrpcGeneratedClient()
{
var cancellationToken = TestContext.Current.CancellationToken;
var server = Given_When_ServerStarted_And_RunningOnHttpAndGrpc();
await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server, "protobuf-mapping-1.json");
await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server, "protobuf-mapping-1.json", cancellationToken);
var reply = await When_GrpcClient_Calls_SayHelloAsync(server.Urls[1]);
var reply = await When_GrpcClient_Calls_SayHelloAsync(server.Urls[1], cancellationToken);
Then_ReplyMessage_Should_BeCorrect(reply);
}
@@ -713,22 +721,21 @@ message Other {
[Fact]
public async Task WireMockServer_WithBodyAsProtoBuf_ServerProtoDefinitionFromJson_UsingGrpcGeneratedClient()
{
var cancellationToken = TestContext.Current.CancellationToken;
var server = Given_When_ServerStarted_And_RunningOnHttpAndGrpc();
Given_ProtoDefinition_IsAddedOnServerLevel(server);
await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server, "protobuf-mapping-3.json");
await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server, "protobuf-mapping-3.json", cancellationToken);
var reply = await When_GrpcClient_Calls_SayHelloAsync(server.Urls[1]);
var reply = await When_GrpcClient_Calls_SayHelloAsync(server.Urls[1], cancellationToken);
Then_ReplyMessage_Should_BeCorrect(reply);
}
private static WireMockServer Given_When_ServerStarted_And_RunningOnHttpAndGrpc()
{
var ports = PortUtils.FindFreeTcpPorts(2);
var settings = new WireMockServerSettings
{
Urls = [$"http://*:{ports[0]}/", $"grpc://*:{ports[1]}/"],
Urls = [$"http://*:0", $"grpc://*:0/"],
StartAdminInterface = true
};
return WireMockServer.Start(settings);
@@ -739,23 +746,23 @@ message Other {
server.AddProtoDefinition("my-greeter", ReadProtoFile("greet.proto"));
}
private static async Task Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(WireMockServer server, string filename)
private static async Task Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(WireMockServer server, string filename, CancellationToken cancellationToken)
{
var mappingsJson = ReadMappingFile(filename);
using var httpClient = server.CreateClient();
var result = await httpClient.PostAsync("/__admin/mappings", new StringContent(mappingsJson, Encoding.UTF8, WireMockConstants.ContentTypeJson));
var result = await httpClient.PostAsync("/__admin/mappings", new StringContent(mappingsJson, Encoding.UTF8, WireMockConstants.ContentTypeJson), cancellationToken);
result.EnsureSuccessStatusCode();
}
private static async Task<HelloReply> When_GrpcClient_Calls_SayHelloAsync(string address)
private static async Task<HelloReply> When_GrpcClient_Calls_SayHelloAsync(string address, CancellationToken cancellationToken)
{
var channel = GrpcChannel.ForAddress(address);
var client = new Greeter.GreeterClient(channel);
return await client.SayHelloAsync(new HelloRequest { Name = "stef" });
return await client.SayHelloAsync(new HelloRequest { Name = "stef" }, cancellationToken: cancellationToken);
}
private static void Then_ReplyMessage_Should_BeCorrect(HelloReply reply)
@@ -772,5 +779,4 @@ message Other {
{
return File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "Grpc", filename));
}
}
#endif
}