Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
StefH committed Jan 27, 2025
1 parent b06c478 commit 69a3fbc
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 31 deletions.
14 changes: 7 additions & 7 deletions src/WireMock.Net.Testcontainers/WireMockContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public WireMockContainer(WireMockConfiguration configuration) : base(configurati
/// Gets the public Url.
/// </summary>
[PublicAPI]
public string[] GetPublicUrls() => GetPublicUris().Select(u => u.ToString()).ToArray();
public IDictionary<int, string> GetPublicUrls() => GetPublicUris().ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString());

/// <summary>
/// Create a RestEase Admin client which can be used to call the admin REST endpoint.
Expand Down Expand Up @@ -222,13 +222,13 @@ private async Task ReloadStaticMappingsAsync(string path, CancellationToken canc
await ReloadStaticMappingsAsync(cancellationToken);
}

private Uri GetPublicUri() => GetPublicUris().First();
private Uri GetPublicUri() => GetPublicUris()[ContainerPort];

private Uri[] GetPublicUris()
private IDictionary<int, Uri> GetPublicUris()
{
var dict = new Dictionary<int, Uri>
{
{ContainerPort, new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(ContainerPort)).Uri}
{ ContainerPort, new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(ContainerPort)).Uri }
};

foreach (var port in _configuration.ExposedPorts.Keys.Select(int.Parse).Where(p => p != ContainerPort).OrderBy(p => p))
Expand All @@ -238,12 +238,12 @@ private Uri[] GetPublicUris()

foreach (var url in _configuration.AdditionalUrls)
{
if (PortUtils.TryExtract(url, out _, out _, out var protocol, out _, out var port))
if (PortUtils.TryExtract(url, out _, out _, out _, out _, out var port))
{
dict[port] = new UriBuilder(protocol, Hostname, GetMappedPublicPort(port)).Uri;
dict[port] = new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(port)).Uri;
}
}

return dict.Values.ToArray();
return dict;
}
}
18 changes: 9 additions & 9 deletions src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public WireMockContainerBuilder WithNullLogger()
[PublicAPI]
public WireMockContainerBuilder WithReadStaticMappings()
{
return WithCommand("--ReadStaticMappings", true);
return WithCommand("--ReadStaticMappings true");
}

/// <summary>
Expand All @@ -112,7 +112,7 @@ public WireMockContainerBuilder WithWatchStaticMappings(bool includeSubDirectori
{
DockerResourceConfiguration.WithWatchStaticMappings(includeSubDirectories);
return
WithCommand("--WatchStaticMappings", true).
WithCommand("--WatchStaticMappings true").
WithCommand("--WatchStaticMappingsInSubdirectories", includeSubDirectories);
}

Expand Down Expand Up @@ -141,7 +141,7 @@ public WireMockContainerBuilder WithMappings(string path, bool includeSubDirecto
[PublicAPI]
public WireMockContainerBuilder WithHttp2()
{
return WithCommand("--UseHttp2", true);
return WithCommand("--UseHttp2 true");
}

/// <summary>
Expand All @@ -154,18 +154,13 @@ public WireMockContainerBuilder WithHttp2()
[PublicAPI]
public WireMockContainerBuilder AddUrl(string url)
{
if (!PortUtils.TryExtract(Guard.NotNullOrEmpty(url), out _, out var isGrpc, out _, out _, out var port))
if (!PortUtils.TryExtract(Guard.NotNullOrEmpty(url), out _, out _, out _, out _, out var port))
{
throw new ArgumentException("The URL is not valid.", nameof(url));
}

DockerResourceConfiguration.WithAdditionalUrl(url);

if (isGrpc)
{
WithHttp2();
}

return WithPortBinding(port, true);
}

Expand Down Expand Up @@ -212,6 +207,11 @@ public override WireMockContainer Build()
if (builder.DockerResourceConfiguration.AdditionalUrls.Any())
{
builder = builder.WithCommand($"--Urls http://*:80 {string.Join(" ", builder.DockerResourceConfiguration.AdditionalUrls)}");

if (builder.DockerResourceConfiguration.AdditionalUrls.Any(u => u.IndexOf("grpc", StringComparison.OrdinalIgnoreCase) >= 0))
{
// builder = builder.WithHttp2();
}
}

builder.Validate();
Expand Down
21 changes: 16 additions & 5 deletions test/WireMock.Net.Tests/Grpc/WireMockServerTests.Grpc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -699,19 +699,30 @@ public async Task WireMockServer_WithBodyAsProtoBuf_Enum_UsingPolicyGrpcGenerate
reply.Client.CorrelationId.Should().Be(correlationId);
}

[Fact]
public async Task WireMockServer_WithBodyAsProtoBuf_FromJson_UsingGrpcGeneratedClient()
{
var server = Given_When_ServerStarted_And_RunningOnHttpAndGrpc();
await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server, "protobuf-mapping-1.json");

var reply = await When_GrpcClient_Calls_SayHelloAsync(server.Urls[1]);

Then_ReplyMessage_Should_BeCorrect(reply);
}

[Fact]
public async Task WireMockServer_WithBodyAsProtoBuf_ServerProtoDefinitionFromJson_UsingGrpcGeneratedClient()
{
var server = Given_When_ServerStartedUsingHttp2();
var server = Given_When_ServerStarted_And_RunningOnHttpAndGrpc();
Given_ProtoDefinition_IsAddedOnServerLevel(server);
await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server);
await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server, "protobuf-mapping-3.json");

var reply = await When_GrpcClient_Calls_SayHelloAsync(server.Urls[1]);

Then_ReplyMessage_Should_BeCorrect(reply);
}

private static WireMockServer Given_When_ServerStartedUsingHttp2()
private static WireMockServer Given_When_ServerStarted_And_RunningOnHttpAndGrpc()
{
var ports = PortUtils.FindFreeTcpPorts(2);

Expand All @@ -728,9 +739,9 @@ private static void Given_ProtoDefinition_IsAddedOnServerLevel(WireMockServer se
server.AddProtoDefinition("my-greeter", ReadProtoFile("greet.proto"));
}

private static async Task Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(WireMockServer server)
private static async Task Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(WireMockServer server, string filename)
{
var mappingsJson = ReadMappingFile("protobuf-mapping-3.json");
var mappingsJson = ReadMappingFile(filename);

using var httpClient = server.CreateClient();

Expand Down
94 changes: 94 additions & 0 deletions test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// Copyright © WireMock.Net

#if NET6_0_OR_GREATER
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using FluentAssertions;
using Greet;
using Grpc.Net.Client;
using WireMock.Constants;
using WireMock.Net.Testcontainers;
using Xunit;

namespace WireMock.Net.Tests.Testcontainers;

public partial class TestcontainersTests
{
[Fact]
public async Task WireMockContainer_Build_TestGrpc_ProtoDefinitionFromJson_UsingGrpcGeneratedClient()
{
var wireMockContainer = await Given_WireMockContainerIsStartedForHttpAndGrpc();

await Given_ProtoBufMappingIsAddedViaAdminInterfaceAsync(wireMockContainer);

var adminClient = wireMockContainer.CreateWireMockAdminClient();

var mappingModels = await adminClient.GetMappingsAsync();
mappingModels.Should().NotBeNull().And.HaveCount(1);

try
{
var x = await When_GrpcClient_Calls_SayHelloAsync(wireMockContainer);
}
catch (Exception e)
{
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);

int tttt = 9;
throw;
}

var reply = await When_GrpcClient_Calls_SayHelloAsync(wireMockContainer);

Then_ReplyMessage_Should_BeCorrect(reply);

await wireMockContainer.StopAsync();
}

private static async Task<WireMockContainer> Given_WireMockContainerIsStartedForHttpAndGrpc()
{
var wireMockContainer = new WireMockContainerBuilder()
.WithAutoRemove(true)
.WithCleanUp(true)
.AddUrl("grpc://*:9090")
.Build();

await wireMockContainer.StartAsync();

return wireMockContainer;
}

private static async Task Given_ProtoBufMappingIsAddedViaAdminInterfaceAsync(WireMockContainer wireMockContainer)
{
var mappingsJson = ReadMappingFile("protobuf-mapping-1.json");

using var httpClient = wireMockContainer.CreateClient();

var result = await httpClient.PostAsync("/__admin/mappings", new StringContent(mappingsJson, Encoding.UTF8, WireMockConstants.ContentTypeJson));
result.EnsureSuccessStatusCode();
}

private static async Task<HelloReply> When_GrpcClient_Calls_SayHelloAsync(WireMockContainer wireMockContainer)
{
var address = wireMockContainer.GetPublicUrls()[9090];
var channel = GrpcChannel.ForAddress(address);

var client = new Greeter.GreeterClient(channel);

return await client.SayHelloAsync(new HelloRequest { Name = "stef" });
}

private static void Then_ReplyMessage_Should_BeCorrect(HelloReply reply)
{
reply.Message.Should().Be("hello stef POST");
}

private static string ReadMappingFile(string filename)
{
return File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "__admin", "mappings", filename));
}
}
#endif
18 changes: 9 additions & 9 deletions test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@

namespace WireMock.Net.Tests.Testcontainers;

public class TestcontainersTests
public partial class TestcontainersTests
{
[Fact]
public async Task WireMockContainer_Build_WithNoImage_TestGrpc1()
public async Task WireMockContainer_Build_TestGrpc1()
{
// Act
var adminUsername = $"username_{Guid.NewGuid()}";
Expand Down Expand Up @@ -66,7 +66,7 @@ public async Task WireMockContainer_Build_WithNoImage_TestGrpc1()
}

[Fact]
public async Task WireMockContainer_Build_WithNoImage_TestGrpc2()
public async Task WireMockContainer_Build_TestGrpc2()
{
// Act
var adminUsername = $"username_{Guid.NewGuid()}";
Expand Down Expand Up @@ -95,16 +95,16 @@ public async Task WireMockContainer_Build_WithNoImage_TestGrpc2()

var urls = wireMockContainer.GetPublicUrls();
urls.Should().HaveCount(4);
var urlHttp80 = urls[0];
var urlHttp80 = urls[80];
urlHttp80.Should().StartWith("http://");

var urlHttp8080 = urls[1];
var urlHttp8080 = urls[8080];
urlHttp8080.Should().StartWith("http://");

var urlGrpc9090 = urls[2];
var urlGrpc9090 = urls[9090];
urlGrpc9090.Should().StartWith("grpc://");

var urlGrpc9091 = urls[3];
var urlGrpc9091 = urls[9091];
urlGrpc9091.Should().StartWith("grpc://");

var adminClient = wireMockContainer.CreateWireMockAdminClient();
Expand All @@ -120,7 +120,7 @@ public async Task WireMockContainer_Build_WithNoImage_TestGrpc2()
}

[Fact]
public async Task WireMockContainer_Build_WithNoImage_And_StartAsync_and_StopAsync()
public async Task WireMockContainer_Build_And_StartAsync_and_StopAsync()
{
// Act
var adminUsername = $"username_{Guid.NewGuid()}";
Expand All @@ -136,7 +136,7 @@ public async Task WireMockContainer_Build_WithNoImage_And_StartAsync_and_StopAsy

// https://github.com/testcontainers/testcontainers-dotnet/issues/1322
[RunOnDockerPlatformFact("Linux")]
public async Task WireMockContainer_Build_WithNoImageAndNetwork_And_StartAsync_and_StopAsync()
public async Task WireMockContainer_Build_WithNetwork_And_StartAsync_and_StopAsync()
{
// Act
var dummyNetwork = new NetworkBuilder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
},
"Response": {
"BodyAsJson": {
"message": "hello {{request.BodyAsJson.name}}"
"message": "hello {{request.BodyAsJson.name}} {{request.method}}"
},
"UseTransformer": true,
"TransformerType": "Handlebars",
Expand Down

0 comments on commit 69a3fbc

Please sign in to comment.