Skip to content

Commit

Permalink
fix !
Browse files Browse the repository at this point in the history
  • Loading branch information
StefH committed Jan 28, 2025
1 parent 69a3fbc commit 77b217e
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 131 deletions.
29 changes: 19 additions & 10 deletions src/WireMock.Net.Testcontainers/WireMockContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public sealed class WireMockContainer : DockerContainer

private IWireMockAdminApi? _adminApi;
private EnhancedFileSystemWatcher? _enhancedFileSystemWatcher;
private IDictionary<int, Uri>? _publicUris;

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

/// <summary>
/// Gets the public Url.
/// Gets the public Urls as a dictionary with the internal port as the key.
/// </summary>
[PublicAPI]
public IDictionary<int, string> GetPublicUrls() => GetPublicUris().ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString());

/// <summary>
/// Gets the mapped public port for the given container port.
/// </summary>
[PublicAPI]
public string GetMappedPublicUrl(int containerPort)
{
return GetPublicUris()[containerPort].ToString();
}

/// <summary>
/// Create a RestEase Admin client which can be used to call the admin REST endpoint.
/// </summary>
Expand Down Expand Up @@ -226,24 +236,23 @@ private async Task ReloadStaticMappingsAsync(string path, CancellationToken canc

private IDictionary<int, Uri> GetPublicUris()
{
var dict = new Dictionary<int, Uri>
if (_publicUris != null)
{
{ 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))
{
dict[port] = new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(port)).Uri;
return _publicUris;
}

_publicUris = _configuration.ExposedPorts.Keys
.Select(int.Parse)
.ToDictionary(port => port, port => new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(port)).Uri);

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

return dict;
return _publicUris;
}
}
5 changes: 0 additions & 5 deletions src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -207,11 +207,6 @@ 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
116 changes: 104 additions & 12 deletions test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
#if NET6_0_OR_GREATER
using System;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using FluentAssertions;
using FluentAssertions.Execution;
using Greet;
using Grpc.Net.Client;
using WireMock.Constants;
Expand All @@ -18,28 +20,118 @@ namespace WireMock.Net.Tests.Testcontainers;
public partial class TestcontainersTests
{
[Fact]
public async Task WireMockContainer_Build_TestGrpc_ProtoDefinitionFromJson_UsingGrpcGeneratedClient()
public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls1()
{
var wireMockContainer = await Given_WireMockContainerIsStartedForHttpAndGrpc();
// Act
var adminUsername = $"username_{Guid.NewGuid()}";
var adminPassword = $"password_{Guid.NewGuid()}";
var wireMockContainer = new WireMockContainerBuilder()
.WithAutoRemove(true)
.WithCleanUp(true)
.WithAdminUserNameAndPassword(adminUsername, adminPassword)
.WithCommand("--UseHttp2")
.WithCommand("--Urls", "http://*:80 grpc://*:9090")
.WithPortBinding(9090, true)
.Build();

await Given_ProtoBufMappingIsAddedViaAdminInterfaceAsync(wireMockContainer);
try
{
await wireMockContainer.StartAsync().ConfigureAwait(false);

var adminClient = wireMockContainer.CreateWireMockAdminClient();
// Assert
using (new AssertionScope())
{
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
logs.Should().NotBeNull();

var mappingModels = await adminClient.GetMappingsAsync();
mappingModels.Should().NotBeNull().And.HaveCount(1);
var url = wireMockContainer.GetPublicUrl();
url.Should().NotBeNullOrWhiteSpace();

try
var urls = wireMockContainer.GetPublicUrls();
urls.Should().HaveCount(2);

var httpPort = wireMockContainer.GetMappedPublicPort(80);
httpPort.Should().BeGreaterThan(0);

var httpUrl = wireMockContainer.GetMappedPublicUrl(80);
httpUrl.Should().StartWith("http://");

var grpcPort = wireMockContainer.GetMappedPublicPort(9090);
grpcPort.Should().BeGreaterThan(0);

var grpcUrl = wireMockContainer.GetMappedPublicUrl(80);
grpcUrl.Should().StartWith("http://");

var adminClient = wireMockContainer.CreateWireMockAdminClient();

var settings = await adminClient.GetSettingsAsync();
settings.Should().NotBeNull();
}
}
finally
{
var x = await When_GrpcClient_Calls_SayHelloAsync(wireMockContainer);
await wireMockContainer.StopAsync();
}
catch (Exception e)
}

[Fact]
public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls2()
{
// Act
var adminUsername = $"username_{Guid.NewGuid()}";
var adminPassword = $"password_{Guid.NewGuid()}";
var wireMockContainer = new WireMockContainerBuilder()
.WithAutoRemove(true)
.WithCleanUp(true)
.WithAdminUserNameAndPassword(adminUsername, adminPassword)
.AddUrl("http://*:8080")
.AddUrl("grpc://*:9090")
.AddUrl("grpc://*:9091")
.Build();

try
{
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
await wireMockContainer.StartAsync().ConfigureAwait(false);

// Assert
using (new AssertionScope())
{
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
logs.Should().NotBeNull();

var url = wireMockContainer.GetPublicUrl();
url.Should().NotBeNullOrWhiteSpace();

var urls = wireMockContainer.GetPublicUrls();
urls.Should().HaveCount(4);

foreach (var internalPort in new[] { 80, 8080, 9090, 9091 })
{
var publicPort = wireMockContainer.GetMappedPublicPort(internalPort);
publicPort.Should().BeGreaterThan(0);

var publicUrl = wireMockContainer.GetMappedPublicUrl(internalPort);
publicUrl.Should().StartWith("http://");
}

int tttt = 9;
throw;
var adminClient = wireMockContainer.CreateWireMockAdminClient();

var settings = await adminClient.GetSettingsAsync();
settings.Should().NotBeNull();
}
}
finally
{
await wireMockContainer.StopAsync();
}
}

[Fact]
public async Task WireMockContainer_Build_Grpc_ProtoDefinitionFromJson_UsingGrpcGeneratedClient()
{
var wireMockContainer = await Given_WireMockContainerIsStartedForHttpAndGrpc();

await Given_ProtoBufMappingIsAddedViaAdminInterfaceAsync(wireMockContainer);

var reply = await When_GrpcClient_Calls_SayHelloAsync(wireMockContainer);

Expand Down
103 changes: 0 additions & 103 deletions test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,109 +16,6 @@ namespace WireMock.Net.Tests.Testcontainers;

public partial class TestcontainersTests
{
[Fact]
public async Task WireMockContainer_Build_TestGrpc1()
{
// Act
var adminUsername = $"username_{Guid.NewGuid()}";
var adminPassword = $"password_{Guid.NewGuid()}";
var wireMockContainer = new WireMockContainerBuilder()
.WithAutoRemove(true)
.WithCleanUp(true)
.WithAdminUserNameAndPassword(adminUsername, adminPassword)
.WithCommand("--UseHttp2")
.WithCommand("--Urls", "http://*:80 grpc://*:9090")
.WithPortBinding(9090, true)
.Build();

try
{
await wireMockContainer.StartAsync().ConfigureAwait(false);

// Assert
using (new AssertionScope())
{
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
logs.Should().NotBeNull();

var url = wireMockContainer.GetPublicUrl();
url.Should().NotBeNullOrWhiteSpace();

var urls = wireMockContainer.GetPublicUrls();
urls.Should().HaveCount(2);

var httpPort = wireMockContainer.GetMappedPublicPort(80);
httpPort.Should().BeGreaterThan(0);

var grpcPort = wireMockContainer.GetMappedPublicPort(9090);
grpcPort.Should().BeGreaterThan(0);

var adminClient = wireMockContainer.CreateWireMockAdminClient();

var settings = await adminClient.GetSettingsAsync();
settings.Should().NotBeNull();
}
}
finally
{
await wireMockContainer.StopAsync();
}
}

[Fact]
public async Task WireMockContainer_Build_TestGrpc2()
{
// Act
var adminUsername = $"username_{Guid.NewGuid()}";
var adminPassword = $"password_{Guid.NewGuid()}";
var wireMockContainer = new WireMockContainerBuilder()
.WithAutoRemove(true)
.WithCleanUp(true)
.WithAdminUserNameAndPassword(adminUsername, adminPassword)
.AddUrl("http://*:8080")
.AddUrl("grpc://*:9090")
.AddUrl("grpc://*:9091")
.Build();

try
{
await wireMockContainer.StartAsync().ConfigureAwait(false);

// Assert
using (new AssertionScope())
{
var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
logs.Should().NotBeNull();

var url = wireMockContainer.GetPublicUrl();
url.Should().NotBeNullOrWhiteSpace();

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

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

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

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

var adminClient = wireMockContainer.CreateWireMockAdminClient();

var settings = await adminClient.GetSettingsAsync();
settings.Should().NotBeNull();
}
}
finally
{
await wireMockContainer.StopAsync();
}
}

[Fact]
public async Task WireMockContainer_Build_And_StartAsync_and_StopAsync()
{
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}} {{request.method}}"
"message": "hello {{request.BodyAsJson.name}} {{request.method}}"
},
"UseTransformer": true,
"TransformerType": "Handlebars",
Expand Down

0 comments on commit 77b217e

Please sign in to comment.