Skip to content

Commit 77b217e

Browse files
committed
fix !
1 parent 69a3fbc commit 77b217e

File tree

5 files changed

+124
-131
lines changed

5 files changed

+124
-131
lines changed

src/WireMock.Net.Testcontainers/WireMockContainer.cs

+19-10
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public sealed class WireMockContainer : DockerContainer
3232

3333
private IWireMockAdminApi? _adminApi;
3434
private EnhancedFileSystemWatcher? _enhancedFileSystemWatcher;
35+
private IDictionary<int, Uri>? _publicUris;
3536

3637
/// <summary>
3738
/// Initializes a new instance of the <see cref="WireMockContainer" /> class.
@@ -51,11 +52,20 @@ public WireMockContainer(WireMockConfiguration configuration) : base(configurati
5152
public string GetPublicUrl() => GetPublicUri().ToString();
5253

5354
/// <summary>
54-
/// Gets the public Url.
55+
/// Gets the public Urls as a dictionary with the internal port as the key.
5556
/// </summary>
5657
[PublicAPI]
5758
public IDictionary<int, string> GetPublicUrls() => GetPublicUris().ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString());
5859

60+
/// <summary>
61+
/// Gets the mapped public port for the given container port.
62+
/// </summary>
63+
[PublicAPI]
64+
public string GetMappedPublicUrl(int containerPort)
65+
{
66+
return GetPublicUris()[containerPort].ToString();
67+
}
68+
5969
/// <summary>
6070
/// Create a RestEase Admin client which can be used to call the admin REST endpoint.
6171
/// </summary>
@@ -226,24 +236,23 @@ private async Task ReloadStaticMappingsAsync(string path, CancellationToken canc
226236

227237
private IDictionary<int, Uri> GetPublicUris()
228238
{
229-
var dict = new Dictionary<int, Uri>
239+
if (_publicUris != null)
230240
{
231-
{ ContainerPort, new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(ContainerPort)).Uri }
232-
};
233-
234-
foreach (var port in _configuration.ExposedPorts.Keys.Select(int.Parse).Where(p => p != ContainerPort).OrderBy(p => p))
235-
{
236-
dict[port] = new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(port)).Uri;
241+
return _publicUris;
237242
}
238243

244+
_publicUris = _configuration.ExposedPorts.Keys
245+
.Select(int.Parse)
246+
.ToDictionary(port => port, port => new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(port)).Uri);
247+
239248
foreach (var url in _configuration.AdditionalUrls)
240249
{
241250
if (PortUtils.TryExtract(url, out _, out _, out _, out _, out var port))
242251
{
243-
dict[port] = new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(port)).Uri;
252+
_publicUris[port] = new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(port)).Uri;
244253
}
245254
}
246255

247-
return dict;
256+
return _publicUris;
248257
}
249258
}

src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs

-5
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,6 @@ public override WireMockContainer Build()
207207
if (builder.DockerResourceConfiguration.AdditionalUrls.Any())
208208
{
209209
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-
}
215210
}
216211

217212
builder.Validate();

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

+104-12
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
#if NET6_0_OR_GREATER
44
using System;
55
using System.IO;
6+
using System.Linq;
67
using System.Net.Http;
78
using System.Text;
89
using System.Threading.Tasks;
910
using FluentAssertions;
11+
using FluentAssertions.Execution;
1012
using Greet;
1113
using Grpc.Net.Client;
1214
using WireMock.Constants;
@@ -18,28 +20,118 @@ namespace WireMock.Net.Tests.Testcontainers;
1820
public partial class TestcontainersTests
1921
{
2022
[Fact]
21-
public async Task WireMockContainer_Build_TestGrpc_ProtoDefinitionFromJson_UsingGrpcGeneratedClient()
23+
public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls1()
2224
{
23-
var wireMockContainer = await Given_WireMockContainerIsStartedForHttpAndGrpc();
25+
// Act
26+
var adminUsername = $"username_{Guid.NewGuid()}";
27+
var adminPassword = $"password_{Guid.NewGuid()}";
28+
var wireMockContainer = new WireMockContainerBuilder()
29+
.WithAutoRemove(true)
30+
.WithCleanUp(true)
31+
.WithAdminUserNameAndPassword(adminUsername, adminPassword)
32+
.WithCommand("--UseHttp2")
33+
.WithCommand("--Urls", "http://*:80 grpc://*:9090")
34+
.WithPortBinding(9090, true)
35+
.Build();
2436

25-
await Given_ProtoBufMappingIsAddedViaAdminInterfaceAsync(wireMockContainer);
37+
try
38+
{
39+
await wireMockContainer.StartAsync().ConfigureAwait(false);
2640

27-
var adminClient = wireMockContainer.CreateWireMockAdminClient();
41+
// Assert
42+
using (new AssertionScope())
43+
{
44+
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
45+
logs.Should().NotBeNull();
2846

29-
var mappingModels = await adminClient.GetMappingsAsync();
30-
mappingModels.Should().NotBeNull().And.HaveCount(1);
47+
var url = wireMockContainer.GetPublicUrl();
48+
url.Should().NotBeNullOrWhiteSpace();
3149

32-
try
50+
var urls = wireMockContainer.GetPublicUrls();
51+
urls.Should().HaveCount(2);
52+
53+
var httpPort = wireMockContainer.GetMappedPublicPort(80);
54+
httpPort.Should().BeGreaterThan(0);
55+
56+
var httpUrl = wireMockContainer.GetMappedPublicUrl(80);
57+
httpUrl.Should().StartWith("http://");
58+
59+
var grpcPort = wireMockContainer.GetMappedPublicPort(9090);
60+
grpcPort.Should().BeGreaterThan(0);
61+
62+
var grpcUrl = wireMockContainer.GetMappedPublicUrl(80);
63+
grpcUrl.Should().StartWith("http://");
64+
65+
var adminClient = wireMockContainer.CreateWireMockAdminClient();
66+
67+
var settings = await adminClient.GetSettingsAsync();
68+
settings.Should().NotBeNull();
69+
}
70+
}
71+
finally
3372
{
34-
var x = await When_GrpcClient_Calls_SayHelloAsync(wireMockContainer);
73+
await wireMockContainer.StopAsync();
3574
}
36-
catch (Exception e)
75+
}
76+
77+
[Fact]
78+
public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls2()
79+
{
80+
// Act
81+
var adminUsername = $"username_{Guid.NewGuid()}";
82+
var adminPassword = $"password_{Guid.NewGuid()}";
83+
var wireMockContainer = new WireMockContainerBuilder()
84+
.WithAutoRemove(true)
85+
.WithCleanUp(true)
86+
.WithAdminUserNameAndPassword(adminUsername, adminPassword)
87+
.AddUrl("http://*:8080")
88+
.AddUrl("grpc://*:9090")
89+
.AddUrl("grpc://*:9091")
90+
.Build();
91+
92+
try
3793
{
38-
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
94+
await wireMockContainer.StartAsync().ConfigureAwait(false);
95+
96+
// Assert
97+
using (new AssertionScope())
98+
{
99+
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
100+
logs.Should().NotBeNull();
101+
102+
var url = wireMockContainer.GetPublicUrl();
103+
url.Should().NotBeNullOrWhiteSpace();
104+
105+
var urls = wireMockContainer.GetPublicUrls();
106+
urls.Should().HaveCount(4);
107+
108+
foreach (var internalPort in new[] { 80, 8080, 9090, 9091 })
109+
{
110+
var publicPort = wireMockContainer.GetMappedPublicPort(internalPort);
111+
publicPort.Should().BeGreaterThan(0);
112+
113+
var publicUrl = wireMockContainer.GetMappedPublicUrl(internalPort);
114+
publicUrl.Should().StartWith("http://");
115+
}
39116

40-
int tttt = 9;
41-
throw;
117+
var adminClient = wireMockContainer.CreateWireMockAdminClient();
118+
119+
var settings = await adminClient.GetSettingsAsync();
120+
settings.Should().NotBeNull();
121+
}
122+
}
123+
finally
124+
{
125+
await wireMockContainer.StopAsync();
42126
}
127+
}
128+
129+
[Fact]
130+
public async Task WireMockContainer_Build_Grpc_ProtoDefinitionFromJson_UsingGrpcGeneratedClient()
131+
{
132+
var wireMockContainer = await Given_WireMockContainerIsStartedForHttpAndGrpc();
133+
134+
await Given_ProtoBufMappingIsAddedViaAdminInterfaceAsync(wireMockContainer);
43135

44136
var reply = await When_GrpcClient_Calls_SayHelloAsync(wireMockContainer);
45137

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

-103
Original file line numberDiff line numberDiff line change
@@ -16,109 +16,6 @@ namespace WireMock.Net.Tests.Testcontainers;
1616

1717
public partial class TestcontainersTests
1818
{
19-
[Fact]
20-
public async Task WireMockContainer_Build_TestGrpc1()
21-
{
22-
// Act
23-
var adminUsername = $"username_{Guid.NewGuid()}";
24-
var adminPassword = $"password_{Guid.NewGuid()}";
25-
var wireMockContainer = new WireMockContainerBuilder()
26-
.WithAutoRemove(true)
27-
.WithCleanUp(true)
28-
.WithAdminUserNameAndPassword(adminUsername, adminPassword)
29-
.WithCommand("--UseHttp2")
30-
.WithCommand("--Urls", "http://*:80 grpc://*:9090")
31-
.WithPortBinding(9090, true)
32-
.Build();
33-
34-
try
35-
{
36-
await wireMockContainer.StartAsync().ConfigureAwait(false);
37-
38-
// Assert
39-
using (new AssertionScope())
40-
{
41-
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
42-
logs.Should().NotBeNull();
43-
44-
var url = wireMockContainer.GetPublicUrl();
45-
url.Should().NotBeNullOrWhiteSpace();
46-
47-
var urls = wireMockContainer.GetPublicUrls();
48-
urls.Should().HaveCount(2);
49-
50-
var httpPort = wireMockContainer.GetMappedPublicPort(80);
51-
httpPort.Should().BeGreaterThan(0);
52-
53-
var grpcPort = wireMockContainer.GetMappedPublicPort(9090);
54-
grpcPort.Should().BeGreaterThan(0);
55-
56-
var adminClient = wireMockContainer.CreateWireMockAdminClient();
57-
58-
var settings = await adminClient.GetSettingsAsync();
59-
settings.Should().NotBeNull();
60-
}
61-
}
62-
finally
63-
{
64-
await wireMockContainer.StopAsync();
65-
}
66-
}
67-
68-
[Fact]
69-
public async Task WireMockContainer_Build_TestGrpc2()
70-
{
71-
// Act
72-
var adminUsername = $"username_{Guid.NewGuid()}";
73-
var adminPassword = $"password_{Guid.NewGuid()}";
74-
var wireMockContainer = new WireMockContainerBuilder()
75-
.WithAutoRemove(true)
76-
.WithCleanUp(true)
77-
.WithAdminUserNameAndPassword(adminUsername, adminPassword)
78-
.AddUrl("http://*:8080")
79-
.AddUrl("grpc://*:9090")
80-
.AddUrl("grpc://*:9091")
81-
.Build();
82-
83-
try
84-
{
85-
await wireMockContainer.StartAsync().ConfigureAwait(false);
86-
87-
// Assert
88-
using (new AssertionScope())
89-
{
90-
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
91-
logs.Should().NotBeNull();
92-
93-
var url = wireMockContainer.GetPublicUrl();
94-
url.Should().NotBeNullOrWhiteSpace();
95-
96-
var urls = wireMockContainer.GetPublicUrls();
97-
urls.Should().HaveCount(4);
98-
var urlHttp80 = urls[80];
99-
urlHttp80.Should().StartWith("http://");
100-
101-
var urlHttp8080 = urls[8080];
102-
urlHttp8080.Should().StartWith("http://");
103-
104-
var urlGrpc9090 = urls[9090];
105-
urlGrpc9090.Should().StartWith("grpc://");
106-
107-
var urlGrpc9091 = urls[9091];
108-
urlGrpc9091.Should().StartWith("grpc://");
109-
110-
var adminClient = wireMockContainer.CreateWireMockAdminClient();
111-
112-
var settings = await adminClient.GetSettingsAsync();
113-
settings.Should().NotBeNull();
114-
}
115-
}
116-
finally
117-
{
118-
await wireMockContainer.StopAsync();
119-
}
120-
}
121-
12219
[Fact]
12320
public async Task WireMockContainer_Build_And_StartAsync_and_StopAsync()
12421
{

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}} {{request.method}}"
35+
"message": "hello {{request.BodyAsJson.name}} {{request.method}}"
3636
},
3737
"UseTransformer": true,
3838
"TransformerType": "Handlebars",

0 commit comments

Comments
 (0)