From 77b217e14d3f1e0e4a3d28383b4951c83b901f83 Mon Sep 17 00:00:00 2001 From: Stef Date: Tue, 28 Jan 2025 07:06:07 +0100 Subject: [PATCH] fix ! --- .../WireMockContainer.cs | 29 +++-- .../WireMockContainerBuilder.cs | 5 - .../TestcontainersTests.Grpc.cs | 116 ++++++++++++++++-- .../Testcontainers/TestcontainersTests.cs | 103 ---------------- .../__admin/mappings/protobuf-mapping-1.json | 2 +- 5 files changed, 124 insertions(+), 131 deletions(-) diff --git a/src/WireMock.Net.Testcontainers/WireMockContainer.cs b/src/WireMock.Net.Testcontainers/WireMockContainer.cs index 7e05a85d..b03a10bb 100644 --- a/src/WireMock.Net.Testcontainers/WireMockContainer.cs +++ b/src/WireMock.Net.Testcontainers/WireMockContainer.cs @@ -32,6 +32,7 @@ public sealed class WireMockContainer : DockerContainer private IWireMockAdminApi? _adminApi; private EnhancedFileSystemWatcher? _enhancedFileSystemWatcher; + private IDictionary? _publicUris; /// /// Initializes a new instance of the class. @@ -51,11 +52,20 @@ public WireMockContainer(WireMockConfiguration configuration) : base(configurati public string GetPublicUrl() => GetPublicUri().ToString(); /// - /// Gets the public Url. + /// Gets the public Urls as a dictionary with the internal port as the key. /// [PublicAPI] public IDictionary GetPublicUrls() => GetPublicUris().ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString()); + /// + /// Gets the mapped public port for the given container port. + /// + [PublicAPI] + public string GetMappedPublicUrl(int containerPort) + { + return GetPublicUris()[containerPort].ToString(); + } + /// /// Create a RestEase Admin client which can be used to call the admin REST endpoint. /// @@ -226,24 +236,23 @@ private async Task ReloadStaticMappingsAsync(string path, CancellationToken canc private IDictionary GetPublicUris() { - var dict = new Dictionary + 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; } } \ No newline at end of file diff --git a/src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs b/src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs index d98c4d06..ea2e9074 100644 --- a/src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs +++ b/src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs @@ -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(); diff --git a/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs b/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs index 782a4b9d..365ccc58 100644 --- a/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs +++ b/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs @@ -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; @@ -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); diff --git a/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.cs b/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.cs index 66ffae42..2a219dc9 100644 --- a/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.cs +++ b/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.cs @@ -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() { diff --git a/test/WireMock.Net.Tests/__admin/mappings/protobuf-mapping-1.json b/test/WireMock.Net.Tests/__admin/mappings/protobuf-mapping-1.json index 4eec4eb2..8b3dcf93 100644 --- a/test/WireMock.Net.Tests/__admin/mappings/protobuf-mapping-1.json +++ b/test/WireMock.Net.Tests/__admin/mappings/protobuf-mapping-1.json @@ -32,7 +32,7 @@ }, "Response": { "BodyAsJson": { - "message": "hello {{request.BodyAsJson.name}} {{request.method}}" + "message": "hello {{request.BodyAsJson.name}} {{request.method}}" }, "UseTransformer": true, "TransformerType": "Handlebars",