Fix listen on AnyIP for url 0.0.0.0 (#1165)

* fix listen to AnyIP if url is 0.0.0.0

* Add Test for listenin on AnyIP for url 0.0.0.0

* add missing using, use var, indent, remove empty line

* remove assert for ipv4/v6 address list

* test only if NET6_0_OR_GREATER

* use same code style

* add missing +

* Asser. to Assert

* split single test into one for IPv4 and one for IPv6

* Create IgnoreOnContinuousIntegrationFact.cs

* Ignore tests if CI/CD

* change to file - scoped namespace and add GITHUB_ACTIONS

* use PortUtils.FindFreeTcpPort()

* add and use GetIPAddressesByFamily

* add using System.Net.Sockets

* use #if for both unit tests and include new helper method inside
This commit is contained in:
cocoon
2024-09-07 09:31:19 +02:00
committed by GitHub
parent b99a80e782
commit 60931f6273
3 changed files with 102 additions and 6 deletions

View File

@@ -0,0 +1,22 @@
// Copyright © WireMock.Net
using System;
using Xunit;
namespace WireMock.Net.Tests.Facts;
public sealed class IgnoreOnContinuousIntegrationFact : FactAttribute
{
private static readonly string _skipReason = "Ignore when run via CI/CD";
private static readonly bool _isContinuousIntegrationAzure = bool.TryParse(Environment.GetEnvironmentVariable("TF_BUILD"), out var isTF) && isTF;
private static readonly bool _isContinuousIntegrationGithub = bool.TryParse(Environment.GetEnvironmentVariable("GITHUB_ACTIONS"), out var isGH) && isGH;
private static bool IsContinuousIntegration() => _isContinuousIntegrationAzure || _isContinuousIntegrationGithub;
public IgnoreOnContinuousIntegrationFact()
{
if (IsContinuousIntegration())
{
Skip = _skipReason;
}
}
}

View File

@@ -8,6 +8,8 @@ using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using FluentAssertions;
@@ -16,6 +18,7 @@ using NFluent;
using WireMock.Admin.Mappings;
using WireMock.Http;
using WireMock.Matchers;
using WireMock.Net.Tests.Facts;
using WireMock.Net.Tests.Serialization;
using WireMock.Net.Xunit;
using WireMock.RequestBuilders;
@@ -37,7 +40,7 @@ public partial class WireMockServerTests
{
_testOutputHelper = testOutputHelper;
}
[Fact]
public void WireMockServer_Start()
{
@@ -196,6 +199,70 @@ public partial class WireMockServerTests
}
#endif
#if NET6_0_OR_GREATER
private static string[] GetIPAddressesByFamily(AddressFamily addressFamily)
{
return NetworkInterface.GetAllNetworkInterfaces()
.Where(ni => ni.OperationalStatus == OperationalStatus.Up)
.SelectMany(ni => ni.GetIPProperties().UnicastAddresses)
.Where(addr => addr.Address.AddressFamily == addressFamily)
.Select(addr => addr.Address.ToString())
.ToArray();
}
[IgnoreOnContinuousIntegrationFact]
public async Task WireMockServer_WithUrl0000_Should_Listen_On_All_IPs_IPv4()
{
// Arrange
var port = PortUtils.FindFreeTcpPort();
var IPv4 = GetIPAddressesByFamily(System.Net.Sockets.AddressFamily.InterNetwork);
var settings = new WireMockServerSettings
{
Urls = new string[] { "http://0.0.0.0:" + port },
};
var server = WireMockServer.Start(settings);
server.Given(Request.Create().WithPath("/*")).RespondWith(Response.Create().WithBody("x"));
foreach (var addr in IPv4)
{
// Act
var response = await new HttpClient().GetStringAsync("http://" + addr + ":" + server.Ports[0] + "/foo").ConfigureAwait(false);
// Assert
response.Should().Be("x");
}
server.Stop();
}
[IgnoreOnContinuousIntegrationFact]
public async Task WireMockServer_WithUrl0000_Should_Listen_On_All_IPs_IPv6()
{
// Arrange
var port = PortUtils.FindFreeTcpPort();
var IPv6 = GetIPAddressesByFamily(System.Net.Sockets.AddressFamily.InterNetworkV6);
var settings = new WireMockServerSettings
{
Urls = new string[] { "http://0.0.0.0:" + port },
};
var server = WireMockServer.Start(settings);
server.Given(Request.Create().WithPath("/*")).RespondWith(Response.Create().WithBody("x"));
foreach (var addr in IPv6)
{
// Act
var response = await new HttpClient().GetStringAsync("http://[" + addr + "]:" + server.Ports[0] + "/foo").ConfigureAwait(false);
// Assert
response.Should().Be("x");
}
server.Stop();
}
#endif
[Fact]
public async Task WireMockServer_Should_respond_a_redirect_without_body()
{
@@ -248,7 +315,7 @@ public partial class WireMockServerTests
// Act
var response = await new HttpClient().GetStringAsync("http://localhost:" + server.Ports[0] + "/foo").ConfigureAwait(false);
// Asser.
// Assert
response.Should().Be("x");
server.Stop();
@@ -274,7 +341,7 @@ public partial class WireMockServerTests
await new HttpClient().GetStringAsync("http://localhost:" + server.Ports[0] + "/foo").ConfigureAwait(false);
watch.Stop();
// Asser.
// Assert
watch.ElapsedMilliseconds.Should().BeGreaterOrEqualTo(0);
server.Stop();
@@ -662,4 +729,4 @@ public partial class WireMockServerTests
server.Stop();
}
#endif
}
}