From 56f65c19e21e9f5bab3e615f54920bd2b867012f Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Fri, 19 Dec 2025 18:33:58 +0100 Subject: [PATCH 1/2] Upgrade RamlToOpenApiConverter and YamlDotNet (#1399) * Upgrade RamlToOpenApiConverter and YamlDotNet * fix --- .../Extensions/OpenApiSchemaExtensions.cs | 4 +--- .../Mappers/OpenApiPathsMapper.cs | 3 +-- .../Settings/IWireMockOpenApiParserExampleValues.cs | 2 +- .../WireMockOpenApiParserDynamicExampleValues.cs | 2 +- .../Settings/WireMockOpenApiParserExampleValues.cs | 3 +-- .../Utils/ExampleValueGenerator.cs | 3 +-- .../WireMock.Net.OpenApiParser.csproj | 12 ++++++------ .../WireMockOpenApiParser.cs | 2 +- test/WireMock.Net.Tests/WireMockServerTests.cs | 2 +- 9 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/WireMock.Net.OpenApiParser/Extensions/OpenApiSchemaExtensions.cs b/src/WireMock.Net.OpenApiParser/Extensions/OpenApiSchemaExtensions.cs index 51da19f3..dc17200c 100644 --- a/src/WireMock.Net.OpenApiParser/Extensions/OpenApiSchemaExtensions.cs +++ b/src/WireMock.Net.OpenApiParser/Extensions/OpenApiSchemaExtensions.cs @@ -5,9 +5,7 @@ using System.Linq; using System.Reflection; using System.Text.Json; using System.Text.Json.Nodes; -using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Models.Interfaces; +using Microsoft.OpenApi; using WireMock.Net.OpenApiParser.Types; namespace WireMock.Net.OpenApiParser.Extensions; diff --git a/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs b/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs index 2a8616f0..2c922363 100644 --- a/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs +++ b/src/WireMock.Net.OpenApiParser/Mappers/OpenApiPathsMapper.cs @@ -6,8 +6,7 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text.Json; using System.Text.Json.Nodes; -using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Models.Interfaces; +using Microsoft.OpenApi; using Newtonsoft.Json; using Stef.Validation; using WireMock.Admin.Mappings; diff --git a/src/WireMock.Net.OpenApiParser/Settings/IWireMockOpenApiParserExampleValues.cs b/src/WireMock.Net.OpenApiParser/Settings/IWireMockOpenApiParserExampleValues.cs index 5d335144..6c3b3953 100644 --- a/src/WireMock.Net.OpenApiParser/Settings/IWireMockOpenApiParserExampleValues.cs +++ b/src/WireMock.Net.OpenApiParser/Settings/IWireMockOpenApiParserExampleValues.cs @@ -1,7 +1,7 @@ // Copyright © WireMock.Net using System; -using Microsoft.OpenApi.Models.Interfaces; +using Microsoft.OpenApi; namespace WireMock.Net.OpenApiParser.Settings; diff --git a/src/WireMock.Net.OpenApiParser/Settings/WireMockOpenApiParserDynamicExampleValues.cs b/src/WireMock.Net.OpenApiParser/Settings/WireMockOpenApiParserDynamicExampleValues.cs index 194762c5..0f27bf31 100644 --- a/src/WireMock.Net.OpenApiParser/Settings/WireMockOpenApiParserDynamicExampleValues.cs +++ b/src/WireMock.Net.OpenApiParser/Settings/WireMockOpenApiParserDynamicExampleValues.cs @@ -1,7 +1,7 @@ // Copyright © WireMock.Net using System; -using Microsoft.OpenApi.Models.Interfaces; +using Microsoft.OpenApi; using RandomDataGenerator.FieldOptions; using RandomDataGenerator.Randomizers; diff --git a/src/WireMock.Net.OpenApiParser/Settings/WireMockOpenApiParserExampleValues.cs b/src/WireMock.Net.OpenApiParser/Settings/WireMockOpenApiParserExampleValues.cs index 3b3c6fea..5acec53a 100644 --- a/src/WireMock.Net.OpenApiParser/Settings/WireMockOpenApiParserExampleValues.cs +++ b/src/WireMock.Net.OpenApiParser/Settings/WireMockOpenApiParserExampleValues.cs @@ -1,8 +1,7 @@ // Copyright © WireMock.Net using System; -using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Models.Interfaces; +using Microsoft.OpenApi; namespace WireMock.Net.OpenApiParser.Settings; diff --git a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs index 153d4c67..2560873f 100644 --- a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs +++ b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs @@ -3,8 +3,7 @@ using System; using System.Linq; using System.Text.Json.Nodes; -using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Models.Interfaces; +using Microsoft.OpenApi; using Stef.Validation; using WireMock.Net.OpenApiParser.Extensions; using WireMock.Net.OpenApiParser.Settings; diff --git a/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj b/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj index fb454756..0d1cfad9 100644 --- a/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj +++ b/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj @@ -27,22 +27,22 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + - + - - + + - + diff --git a/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs b/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs index c4f16dcd..3ef51247 100644 --- a/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs +++ b/src/WireMock.Net.OpenApiParser/WireMockOpenApiParser.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.IO; using System.Text; using JetBrains.Annotations; -using Microsoft.OpenApi.Models; +using Microsoft.OpenApi; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.YamlReader; using RamlToOpenApiConverter; diff --git a/test/WireMock.Net.Tests/WireMockServerTests.cs b/test/WireMock.Net.Tests/WireMockServerTests.cs index acd4d44d..a79fe92e 100644 --- a/test/WireMock.Net.Tests/WireMockServerTests.cs +++ b/test/WireMock.Net.Tests/WireMockServerTests.cs @@ -235,7 +235,7 @@ public partial class WireMockServerTests } #if NET8_0_OR_GREATER - [IgnoreOnContinuousIntegrationFact] + [Fact(Skip = "Does not work on local and pipeline")] public async Task WireMockServer_WithUrl0000_Should_Listen_On_All_IPs_IPv6() { // Arrange From a5e75a7278f1b7c8682a9183f71af4fee1057d6a Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 20 Dec 2025 12:08:41 +0100 Subject: [PATCH 2/2] Fix Grpc tests (#1401) * Fix some Grpc tests * await Task.Delay(1000); * ports --- .../TestcontainersTests.Grpc.cs | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs b/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs index f27843ce..9bff12f3 100644 --- a/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs +++ b/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs @@ -3,6 +3,7 @@ #if NET6_0_OR_GREATER using System; using System.IO; +using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; @@ -12,6 +13,7 @@ using Greet; using Grpc.Net.Client; using WireMock.Constants; using WireMock.Net.Testcontainers; +using WireMock.Util; using Xunit; namespace WireMock.Net.Tests.Testcontainers; @@ -21,19 +23,22 @@ public partial class TestcontainersTests [Fact] public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls1() { - // Act + // Arrange var adminUsername = $"username_{Guid.NewGuid()}"; var adminPassword = $"password_{Guid.NewGuid()}"; + var port = PortUtils.FindFreeTcpPort(); + + // Act var wireMockContainer = new WireMockContainerBuilder() .WithAdminUserNameAndPassword(adminUsername, adminPassword) .WithCommand("--UseHttp2") - .WithCommand("--Urls", "http://*:80 grpc://*:9090") - .WithPortBinding(9090, true) + .WithCommand("--Urls", $"http://*:80 grpc://*:{port}") + .WithPortBinding(port, true) .Build(); - + try { - await wireMockContainer.StartAsync().ConfigureAwait(false); + await wireMockContainer.StartAsync(); // Assert using (new AssertionScope()) @@ -53,10 +58,10 @@ public partial class TestcontainersTests var httpUrl = wireMockContainer.GetMappedPublicUrl(80); httpUrl.Should().StartWith("http://"); - var grpcPort = wireMockContainer.GetMappedPublicPort(9090); + var grpcPort = wireMockContainer.GetMappedPublicPort(port); grpcPort.Should().BeGreaterThan(0); - var grpcUrl = wireMockContainer.GetMappedPublicUrl(9090); + var grpcUrl = wireMockContainer.GetMappedPublicUrl(port); grpcUrl.Should().StartWith("http://"); var adminClient = wireMockContainer.CreateWireMockAdminClient(); @@ -74,19 +79,22 @@ public partial class TestcontainersTests [Fact] public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls2() { - // Act + // Arrange var adminUsername = $"username_{Guid.NewGuid()}"; var adminPassword = $"password_{Guid.NewGuid()}"; + var ports = PortUtils.FindFreeTcpPorts(3); + + // Act var wireMockContainer = new WireMockContainerBuilder() .WithAdminUserNameAndPassword(adminUsername, adminPassword) - .AddUrl("http://*:8080") - .AddUrl("grpc://*:9090") - .AddUrl("grpc://*:9091") + .AddUrl($"http://*:{ports[0]}") + .AddUrl($"grpc://*:{ports[1]}") + .AddUrl($"grpc://*:{ports[2]}") .Build(); try { - await wireMockContainer.StartAsync().ConfigureAwait(false); + await wireMockContainer.StartAsync(); // Assert using (new AssertionScope()) @@ -100,7 +108,7 @@ public partial class TestcontainersTests var urls = wireMockContainer.GetPublicUrls(); urls.Should().HaveCount(4); - foreach (var internalPort in new[] { 80, 8080, 9090, 9091 }) + foreach (var internalPort in new[] { ports[0], ports[1], ports[2], 80 }) { var publicPort = wireMockContainer.GetMappedPublicPort(internalPort); publicPort.Should().BeGreaterThan(0); @@ -163,8 +171,9 @@ public partial class TestcontainersTests private static async Task Given_WireMockContainerIsStartedForHttpAndGrpcAsync() { + var port = PortUtils.FindFreeTcpPort(); var wireMockContainer = new WireMockContainerBuilder() - .AddUrl("grpc://*:9090") + .AddUrl($"grpc://*:{port}") .Build(); await wireMockContainer.StartAsync(); @@ -174,8 +183,9 @@ public partial class TestcontainersTests private static async Task Given_WireMockContainerWithProtoDefinitionAtServerLevelIsStartedForHttpAndGrpcAsync() { + var port = PortUtils.FindFreeTcpPort(); var wireMockContainer = new WireMockContainerBuilder() - .AddUrl("grpc://*:9090") + .AddUrl($"grpc://*:{port}") .AddProtoDefinition("my-greeter", ReadFile("greet.proto")) .Build(); @@ -186,8 +196,9 @@ public partial class TestcontainersTests private static async Task Given_WireMockContainerWithProtoDefinitionAtServerLevelWithWatchStaticMappingsIsStartedForHttpAndGrpcAsync() { + var port = PortUtils.FindFreeTcpPort(); var wireMockContainer = new WireMockContainerBuilder() - .AddUrl("grpc://*:9090") + .AddUrl($"grpc://*:{port}") .AddProtoDefinition("my-greeter", ReadFile("greet.proto")) .WithMappings(Path.Combine(Directory.GetCurrentDirectory(), "__admin", "mappings")) .Build(); @@ -206,12 +217,12 @@ public partial class TestcontainersTests var result = await httpClient.PostAsync("/__admin/mappings", new StringContent(mappingsJson, Encoding.UTF8, WireMockConstants.ContentTypeJson)); result.EnsureSuccessStatusCode(); - await Task.Delay(1000); + await Task.Delay(5000); } private static async Task When_GrpcClient_Calls_SayHelloAsync(WireMockContainer wireMockContainer) { - var address = wireMockContainer.GetPublicUrls()[9090]; + var address = wireMockContainer.GetPublicUrls().First(x => x.Key != 80).Value; var channel = GrpcChannel.ForAddress(address); var client = new Greeter.GreeterClient(channel);