Merge branch 'master' into mime-part-matcher

This commit is contained in:
Stef Heyenrath
2025-12-20 12:09:23 +01:00
10 changed files with 43 additions and 37 deletions

View File

@@ -5,9 +5,7 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Nodes; using System.Text.Json.Nodes;
using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.Interfaces;
using WireMock.Net.OpenApiParser.Types; using WireMock.Net.OpenApiParser.Types;
namespace WireMock.Net.OpenApiParser.Extensions; namespace WireMock.Net.OpenApiParser.Extensions;

View File

@@ -6,8 +6,7 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Nodes; using System.Text.Json.Nodes;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi;
using Microsoft.OpenApi.Models.Interfaces;
using Newtonsoft.Json; using Newtonsoft.Json;
using Stef.Validation; using Stef.Validation;
using WireMock.Admin.Mappings; using WireMock.Admin.Mappings;

View File

@@ -1,7 +1,7 @@
// Copyright © WireMock.Net // Copyright © WireMock.Net
using System; using System;
using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi;
namespace WireMock.Net.OpenApiParser.Settings; namespace WireMock.Net.OpenApiParser.Settings;

View File

@@ -1,7 +1,7 @@
// Copyright © WireMock.Net // Copyright © WireMock.Net
using System; using System;
using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi;
using RandomDataGenerator.FieldOptions; using RandomDataGenerator.FieldOptions;
using RandomDataGenerator.Randomizers; using RandomDataGenerator.Randomizers;

View File

@@ -1,8 +1,7 @@
// Copyright © WireMock.Net // Copyright © WireMock.Net
using System; using System;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi;
using Microsoft.OpenApi.Models.Interfaces;
namespace WireMock.Net.OpenApiParser.Settings; namespace WireMock.Net.OpenApiParser.Settings;

View File

@@ -3,8 +3,7 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Text.Json.Nodes; using System.Text.Json.Nodes;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi;
using Microsoft.OpenApi.Models.Interfaces;
using Stef.Validation; using Stef.Validation;
using WireMock.Net.OpenApiParser.Extensions; using WireMock.Net.OpenApiParser.Extensions;
using WireMock.Net.OpenApiParser.Settings; using WireMock.Net.OpenApiParser.Settings;

View File

@@ -27,22 +27,22 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="RamlToOpenApiConverter.SourceOnly" Version="0.8.0" /> <PackageReference Include="RamlToOpenApiConverter.SourceOnly" Version="0.11.0" />
<PackageReference Include="YamlDotNet" Version="8.1.0" /> <PackageReference Include="YamlDotNet" Version="16.3.0" />
<PackageReference Include="RandomDataGenerator.Net" Version="1.0.19" /> <PackageReference Include="RandomDataGenerator.Net" Version="1.0.19" />
<PackageReference Include="Stef.Validation" Version="0.1.1" /> <PackageReference Include="Stef.Validation" Version="0.1.1" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(Configuration)' == 'Debug'"> <ItemGroup Condition="'$(Configuration)' == 'Debug'">
<PackageReference Include="Microsoft.OpenApi.YamlReader" Version="2.0.0-preview.17" /> <PackageReference Include="Microsoft.OpenApi.YamlReader" Version="2.3.0" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(Configuration)' == 'Release'"> <ItemGroup Condition="'$(Configuration)' == 'Release'">
<PackageReference Include="ILRepack.Lib.MSBuild.Task" Version="2.0.40" PrivateAssets="All" /> <PackageReference Include="ILRepack.Lib.MSBuild.Task" Version="2.0.40" PrivateAssets="All" />
<PackageReference Include="Microsoft.OpenApi" Version="2.0.0-preview.17" PrivateAssets="All" /> <PackageReference Include="Microsoft.OpenApi" Version="2.3.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.OpenApi.YamlReader" Version="2.0.0-preview.17" PrivateAssets="All" /> <PackageReference Include="Microsoft.OpenApi.YamlReader" Version="2.3.0" PrivateAssets="All" />
<PackageReference Include="System.Text.Json" Version="8.0.5" /> <PackageReference Include="System.Text.Json" Version="8.0.5" />
<PackageReference Include="SharpYaml" Version="2.1.1" /> <PackageReference Include="SharpYaml" Version="2.1.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -5,7 +5,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text; using System.Text;
using JetBrains.Annotations; using JetBrains.Annotations;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi;
using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Reader;
using Microsoft.OpenApi.YamlReader; using Microsoft.OpenApi.YamlReader;
using RamlToOpenApiConverter; using RamlToOpenApiConverter;

View File

@@ -3,6 +3,7 @@
#if NET6_0_OR_GREATER #if NET6_0_OR_GREATER
using System; using System;
using System.IO; using System.IO;
using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -12,6 +13,7 @@ using Greet;
using Grpc.Net.Client; using Grpc.Net.Client;
using WireMock.Constants; using WireMock.Constants;
using WireMock.Net.Testcontainers; using WireMock.Net.Testcontainers;
using WireMock.Util;
using Xunit; using Xunit;
namespace WireMock.Net.Tests.Testcontainers; namespace WireMock.Net.Tests.Testcontainers;
@@ -21,19 +23,22 @@ public partial class TestcontainersTests
[Fact] [Fact]
public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls1() public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls1()
{ {
// Act // Arrange
var adminUsername = $"username_{Guid.NewGuid()}"; var adminUsername = $"username_{Guid.NewGuid()}";
var adminPassword = $"password_{Guid.NewGuid()}"; var adminPassword = $"password_{Guid.NewGuid()}";
var port = PortUtils.FindFreeTcpPort();
// Act
var wireMockContainer = new WireMockContainerBuilder() var wireMockContainer = new WireMockContainerBuilder()
.WithAdminUserNameAndPassword(adminUsername, adminPassword) .WithAdminUserNameAndPassword(adminUsername, adminPassword)
.WithCommand("--UseHttp2") .WithCommand("--UseHttp2")
.WithCommand("--Urls", "http://*:80 grpc://*:9090") .WithCommand("--Urls", $"http://*:80 grpc://*:{port}")
.WithPortBinding(9090, true) .WithPortBinding(port, true)
.Build(); .Build();
try try
{ {
await wireMockContainer.StartAsync().ConfigureAwait(false); await wireMockContainer.StartAsync();
// Assert // Assert
using (new AssertionScope()) using (new AssertionScope())
@@ -53,10 +58,10 @@ public partial class TestcontainersTests
var httpUrl = wireMockContainer.GetMappedPublicUrl(80); var httpUrl = wireMockContainer.GetMappedPublicUrl(80);
httpUrl.Should().StartWith("http://"); httpUrl.Should().StartWith("http://");
var grpcPort = wireMockContainer.GetMappedPublicPort(9090); var grpcPort = wireMockContainer.GetMappedPublicPort(port);
grpcPort.Should().BeGreaterThan(0); grpcPort.Should().BeGreaterThan(0);
var grpcUrl = wireMockContainer.GetMappedPublicUrl(9090); var grpcUrl = wireMockContainer.GetMappedPublicUrl(port);
grpcUrl.Should().StartWith("http://"); grpcUrl.Should().StartWith("http://");
var adminClient = wireMockContainer.CreateWireMockAdminClient(); var adminClient = wireMockContainer.CreateWireMockAdminClient();
@@ -74,19 +79,22 @@ public partial class TestcontainersTests
[Fact] [Fact]
public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls2() public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls2()
{ {
// Act // Arrange
var adminUsername = $"username_{Guid.NewGuid()}"; var adminUsername = $"username_{Guid.NewGuid()}";
var adminPassword = $"password_{Guid.NewGuid()}"; var adminPassword = $"password_{Guid.NewGuid()}";
var ports = PortUtils.FindFreeTcpPorts(3);
// Act
var wireMockContainer = new WireMockContainerBuilder() var wireMockContainer = new WireMockContainerBuilder()
.WithAdminUserNameAndPassword(adminUsername, adminPassword) .WithAdminUserNameAndPassword(adminUsername, adminPassword)
.AddUrl("http://*:8080") .AddUrl($"http://*:{ports[0]}")
.AddUrl("grpc://*:9090") .AddUrl($"grpc://*:{ports[1]}")
.AddUrl("grpc://*:9091") .AddUrl($"grpc://*:{ports[2]}")
.Build(); .Build();
try try
{ {
await wireMockContainer.StartAsync().ConfigureAwait(false); await wireMockContainer.StartAsync();
// Assert // Assert
using (new AssertionScope()) using (new AssertionScope())
@@ -100,7 +108,7 @@ public partial class TestcontainersTests
var urls = wireMockContainer.GetPublicUrls(); var urls = wireMockContainer.GetPublicUrls();
urls.Should().HaveCount(4); 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); var publicPort = wireMockContainer.GetMappedPublicPort(internalPort);
publicPort.Should().BeGreaterThan(0); publicPort.Should().BeGreaterThan(0);
@@ -163,8 +171,9 @@ public partial class TestcontainersTests
private static async Task<WireMockContainer> Given_WireMockContainerIsStartedForHttpAndGrpcAsync() private static async Task<WireMockContainer> Given_WireMockContainerIsStartedForHttpAndGrpcAsync()
{ {
var port = PortUtils.FindFreeTcpPort();
var wireMockContainer = new WireMockContainerBuilder() var wireMockContainer = new WireMockContainerBuilder()
.AddUrl("grpc://*:9090") .AddUrl($"grpc://*:{port}")
.Build(); .Build();
await wireMockContainer.StartAsync(); await wireMockContainer.StartAsync();
@@ -174,8 +183,9 @@ public partial class TestcontainersTests
private static async Task<WireMockContainer> Given_WireMockContainerWithProtoDefinitionAtServerLevelIsStartedForHttpAndGrpcAsync() private static async Task<WireMockContainer> Given_WireMockContainerWithProtoDefinitionAtServerLevelIsStartedForHttpAndGrpcAsync()
{ {
var port = PortUtils.FindFreeTcpPort();
var wireMockContainer = new WireMockContainerBuilder() var wireMockContainer = new WireMockContainerBuilder()
.AddUrl("grpc://*:9090") .AddUrl($"grpc://*:{port}")
.AddProtoDefinition("my-greeter", ReadFile("greet.proto")) .AddProtoDefinition("my-greeter", ReadFile("greet.proto"))
.Build(); .Build();
@@ -186,8 +196,9 @@ public partial class TestcontainersTests
private static async Task<WireMockContainer> Given_WireMockContainerWithProtoDefinitionAtServerLevelWithWatchStaticMappingsIsStartedForHttpAndGrpcAsync() private static async Task<WireMockContainer> Given_WireMockContainerWithProtoDefinitionAtServerLevelWithWatchStaticMappingsIsStartedForHttpAndGrpcAsync()
{ {
var port = PortUtils.FindFreeTcpPort();
var wireMockContainer = new WireMockContainerBuilder() var wireMockContainer = new WireMockContainerBuilder()
.AddUrl("grpc://*:9090") .AddUrl($"grpc://*:{port}")
.AddProtoDefinition("my-greeter", ReadFile("greet.proto")) .AddProtoDefinition("my-greeter", ReadFile("greet.proto"))
.WithMappings(Path.Combine(Directory.GetCurrentDirectory(), "__admin", "mappings")) .WithMappings(Path.Combine(Directory.GetCurrentDirectory(), "__admin", "mappings"))
.Build(); .Build();
@@ -206,12 +217,12 @@ public partial class TestcontainersTests
var result = await httpClient.PostAsync("/__admin/mappings", new StringContent(mappingsJson, Encoding.UTF8, WireMockConstants.ContentTypeJson)); var result = await httpClient.PostAsync("/__admin/mappings", new StringContent(mappingsJson, Encoding.UTF8, WireMockConstants.ContentTypeJson));
result.EnsureSuccessStatusCode(); result.EnsureSuccessStatusCode();
await Task.Delay(1000); await Task.Delay(5000);
} }
private static async Task<HelloReply> When_GrpcClient_Calls_SayHelloAsync(WireMockContainer wireMockContainer) private static async Task<HelloReply> 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 channel = GrpcChannel.ForAddress(address);
var client = new Greeter.GreeterClient(channel); var client = new Greeter.GreeterClient(channel);

View File

@@ -235,7 +235,7 @@ public partial class WireMockServerTests
} }
#if NET8_0_OR_GREATER #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() public async Task WireMockServer_WithUrl0000_Should_Listen_On_All_IPs_IPv6()
{ {
// Arrange // Arrange