Skip to content

Commit 69a3fbc

Browse files
committed
wip
1 parent b06c478 commit 69a3fbc

File tree

6 files changed

+136
-31
lines changed

6 files changed

+136
-31
lines changed

src/WireMock.Net.Testcontainers/WireMockContainer.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public WireMockContainer(WireMockConfiguration configuration) : base(configurati
5454
/// Gets the public Url.
5555
/// </summary>
5656
[PublicAPI]
57-
public string[] GetPublicUrls() => GetPublicUris().Select(u => u.ToString()).ToArray();
57+
public IDictionary<int, string> GetPublicUrls() => GetPublicUris().ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString());
5858

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

225-
private Uri GetPublicUri() => GetPublicUris().First();
225+
private Uri GetPublicUri() => GetPublicUris()[ContainerPort];
226226

227-
private Uri[] GetPublicUris()
227+
private IDictionary<int, Uri> GetPublicUris()
228228
{
229229
var dict = new Dictionary<int, Uri>
230230
{
231-
{ContainerPort, new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(ContainerPort)).Uri}
231+
{ ContainerPort, new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(ContainerPort)).Uri }
232232
};
233233

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

239239
foreach (var url in _configuration.AdditionalUrls)
240240
{
241-
if (PortUtils.TryExtract(url, out _, out _, out var protocol, out _, out var port))
241+
if (PortUtils.TryExtract(url, out _, out _, out _, out _, out var port))
242242
{
243-
dict[port] = new UriBuilder(protocol, Hostname, GetMappedPublicPort(port)).Uri;
243+
dict[port] = new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(port)).Uri;
244244
}
245245
}
246246

247-
return dict.Values.ToArray();
247+
return dict;
248248
}
249249
}

src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs

+9-9
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public WireMockContainerBuilder WithNullLogger()
9999
[PublicAPI]
100100
public WireMockContainerBuilder WithReadStaticMappings()
101101
{
102-
return WithCommand("--ReadStaticMappings", true);
102+
return WithCommand("--ReadStaticMappings true");
103103
}
104104

105105
/// <summary>
@@ -112,7 +112,7 @@ public WireMockContainerBuilder WithWatchStaticMappings(bool includeSubDirectori
112112
{
113113
DockerResourceConfiguration.WithWatchStaticMappings(includeSubDirectories);
114114
return
115-
WithCommand("--WatchStaticMappings", true).
115+
WithCommand("--WatchStaticMappings true").
116116
WithCommand("--WatchStaticMappingsInSubdirectories", includeSubDirectories);
117117
}
118118

@@ -141,7 +141,7 @@ public WireMockContainerBuilder WithMappings(string path, bool includeSubDirecto
141141
[PublicAPI]
142142
public WireMockContainerBuilder WithHttp2()
143143
{
144-
return WithCommand("--UseHttp2", true);
144+
return WithCommand("--UseHttp2 true");
145145
}
146146

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

162162
DockerResourceConfiguration.WithAdditionalUrl(url);
163163

164-
if (isGrpc)
165-
{
166-
WithHttp2();
167-
}
168-
169164
return WithPortBinding(port, true);
170165
}
171166

@@ -212,6 +207,11 @@ public override WireMockContainer Build()
212207
if (builder.DockerResourceConfiguration.AdditionalUrls.Any())
213208
{
214209
builder = builder.WithCommand($"--Urls http://*:80 {string.Join(" ", builder.DockerResourceConfiguration.AdditionalUrls)}");
210+
211+
if (builder.DockerResourceConfiguration.AdditionalUrls.Any(u => u.IndexOf("grpc", StringComparison.OrdinalIgnoreCase) >= 0))
212+
{
213+
// builder = builder.WithHttp2();
214+
}
215215
}
216216

217217
builder.Validate();

test/WireMock.Net.Tests/Grpc/WireMockServerTests.Grpc.cs

+16-5
Original file line numberDiff line numberDiff line change
@@ -699,19 +699,30 @@ public async Task WireMockServer_WithBodyAsProtoBuf_Enum_UsingPolicyGrpcGenerate
699699
reply.Client.CorrelationId.Should().Be(correlationId);
700700
}
701701

702+
[Fact]
703+
public async Task WireMockServer_WithBodyAsProtoBuf_FromJson_UsingGrpcGeneratedClient()
704+
{
705+
var server = Given_When_ServerStarted_And_RunningOnHttpAndGrpc();
706+
await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server, "protobuf-mapping-1.json");
707+
708+
var reply = await When_GrpcClient_Calls_SayHelloAsync(server.Urls[1]);
709+
710+
Then_ReplyMessage_Should_BeCorrect(reply);
711+
}
712+
702713
[Fact]
703714
public async Task WireMockServer_WithBodyAsProtoBuf_ServerProtoDefinitionFromJson_UsingGrpcGeneratedClient()
704715
{
705-
var server = Given_When_ServerStartedUsingHttp2();
716+
var server = Given_When_ServerStarted_And_RunningOnHttpAndGrpc();
706717
Given_ProtoDefinition_IsAddedOnServerLevel(server);
707-
await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server);
718+
await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server, "protobuf-mapping-3.json");
708719

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

711722
Then_ReplyMessage_Should_BeCorrect(reply);
712723
}
713724

714-
private static WireMockServer Given_When_ServerStartedUsingHttp2()
725+
private static WireMockServer Given_When_ServerStarted_And_RunningOnHttpAndGrpc()
715726
{
716727
var ports = PortUtils.FindFreeTcpPorts(2);
717728

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

731-
private static async Task Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(WireMockServer server)
742+
private static async Task Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(WireMockServer server, string filename)
732743
{
733-
var mappingsJson = ReadMappingFile("protobuf-mapping-3.json");
744+
var mappingsJson = ReadMappingFile(filename);
734745

735746
using var httpClient = server.CreateClient();
736747

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Copyright © WireMock.Net
2+
3+
#if NET6_0_OR_GREATER
4+
using System;
5+
using System.IO;
6+
using System.Net.Http;
7+
using System.Text;
8+
using System.Threading.Tasks;
9+
using FluentAssertions;
10+
using Greet;
11+
using Grpc.Net.Client;
12+
using WireMock.Constants;
13+
using WireMock.Net.Testcontainers;
14+
using Xunit;
15+
16+
namespace WireMock.Net.Tests.Testcontainers;
17+
18+
public partial class TestcontainersTests
19+
{
20+
[Fact]
21+
public async Task WireMockContainer_Build_TestGrpc_ProtoDefinitionFromJson_UsingGrpcGeneratedClient()
22+
{
23+
var wireMockContainer = await Given_WireMockContainerIsStartedForHttpAndGrpc();
24+
25+
await Given_ProtoBufMappingIsAddedViaAdminInterfaceAsync(wireMockContainer);
26+
27+
var adminClient = wireMockContainer.CreateWireMockAdminClient();
28+
29+
var mappingModels = await adminClient.GetMappingsAsync();
30+
mappingModels.Should().NotBeNull().And.HaveCount(1);
31+
32+
try
33+
{
34+
var x = await When_GrpcClient_Calls_SayHelloAsync(wireMockContainer);
35+
}
36+
catch (Exception e)
37+
{
38+
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
39+
40+
int tttt = 9;
41+
throw;
42+
}
43+
44+
var reply = await When_GrpcClient_Calls_SayHelloAsync(wireMockContainer);
45+
46+
Then_ReplyMessage_Should_BeCorrect(reply);
47+
48+
await wireMockContainer.StopAsync();
49+
}
50+
51+
private static async Task<WireMockContainer> Given_WireMockContainerIsStartedForHttpAndGrpc()
52+
{
53+
var wireMockContainer = new WireMockContainerBuilder()
54+
.WithAutoRemove(true)
55+
.WithCleanUp(true)
56+
.AddUrl("grpc://*:9090")
57+
.Build();
58+
59+
await wireMockContainer.StartAsync();
60+
61+
return wireMockContainer;
62+
}
63+
64+
private static async Task Given_ProtoBufMappingIsAddedViaAdminInterfaceAsync(WireMockContainer wireMockContainer)
65+
{
66+
var mappingsJson = ReadMappingFile("protobuf-mapping-1.json");
67+
68+
using var httpClient = wireMockContainer.CreateClient();
69+
70+
var result = await httpClient.PostAsync("/__admin/mappings", new StringContent(mappingsJson, Encoding.UTF8, WireMockConstants.ContentTypeJson));
71+
result.EnsureSuccessStatusCode();
72+
}
73+
74+
private static async Task<HelloReply> When_GrpcClient_Calls_SayHelloAsync(WireMockContainer wireMockContainer)
75+
{
76+
var address = wireMockContainer.GetPublicUrls()[9090];
77+
var channel = GrpcChannel.ForAddress(address);
78+
79+
var client = new Greeter.GreeterClient(channel);
80+
81+
return await client.SayHelloAsync(new HelloRequest { Name = "stef" });
82+
}
83+
84+
private static void Then_ReplyMessage_Should_BeCorrect(HelloReply reply)
85+
{
86+
reply.Message.Should().Be("hello stef POST");
87+
}
88+
89+
private static string ReadMappingFile(string filename)
90+
{
91+
return File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "__admin", "mappings", filename));
92+
}
93+
}
94+
#endif

test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.cs

+9-9
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414

1515
namespace WireMock.Net.Tests.Testcontainers;
1616

17-
public class TestcontainersTests
17+
public partial class TestcontainersTests
1818
{
1919
[Fact]
20-
public async Task WireMockContainer_Build_WithNoImage_TestGrpc1()
20+
public async Task WireMockContainer_Build_TestGrpc1()
2121
{
2222
// Act
2323
var adminUsername = $"username_{Guid.NewGuid()}";
@@ -66,7 +66,7 @@ public async Task WireMockContainer_Build_WithNoImage_TestGrpc1()
6666
}
6767

6868
[Fact]
69-
public async Task WireMockContainer_Build_WithNoImage_TestGrpc2()
69+
public async Task WireMockContainer_Build_TestGrpc2()
7070
{
7171
// Act
7272
var adminUsername = $"username_{Guid.NewGuid()}";
@@ -95,16 +95,16 @@ public async Task WireMockContainer_Build_WithNoImage_TestGrpc2()
9595

9696
var urls = wireMockContainer.GetPublicUrls();
9797
urls.Should().HaveCount(4);
98-
var urlHttp80 = urls[0];
98+
var urlHttp80 = urls[80];
9999
urlHttp80.Should().StartWith("http://");
100100

101-
var urlHttp8080 = urls[1];
101+
var urlHttp8080 = urls[8080];
102102
urlHttp8080.Should().StartWith("http://");
103103

104-
var urlGrpc9090 = urls[2];
104+
var urlGrpc9090 = urls[9090];
105105
urlGrpc9090.Should().StartWith("grpc://");
106106

107-
var urlGrpc9091 = urls[3];
107+
var urlGrpc9091 = urls[9091];
108108
urlGrpc9091.Should().StartWith("grpc://");
109109

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

122122
[Fact]
123-
public async Task WireMockContainer_Build_WithNoImage_And_StartAsync_and_StopAsync()
123+
public async Task WireMockContainer_Build_And_StartAsync_and_StopAsync()
124124
{
125125
// Act
126126
var adminUsername = $"username_{Guid.NewGuid()}";
@@ -136,7 +136,7 @@ public async Task WireMockContainer_Build_WithNoImage_And_StartAsync_and_StopAsy
136136

137137
// https://github.com/testcontainers/testcontainers-dotnet/issues/1322
138138
[RunOnDockerPlatformFact("Linux")]
139-
public async Task WireMockContainer_Build_WithNoImageAndNetwork_And_StartAsync_and_StopAsync()
139+
public async Task WireMockContainer_Build_WithNetwork_And_StartAsync_and_StopAsync()
140140
{
141141
// Act
142142
var dummyNetwork = new NetworkBuilder()

test/WireMock.Net.Tests/__admin/mappings/protobuf-mapping-1.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
},
3333
"Response": {
3434
"BodyAsJson": {
35-
"message": "hello {{request.BodyAsJson.name}}"
35+
"message": "hello {{request.BodyAsJson.name}} {{request.method}}"
3636
},
3737
"UseTransformer": true,
3838
"TransformerType": "Handlebars",

0 commit comments

Comments
 (0)