diff --git a/PactNet.Tests/Core/MockProviderHostConfigTests.cs b/PactNet.Tests/Core/MockProviderHostConfigTests.cs index b6287008..d92b23dc 100644 --- a/PactNet.Tests/Core/MockProviderHostConfigTests.cs +++ b/PactNet.Tests/Core/MockProviderHostConfigTests.cs @@ -1,14 +1,15 @@ using PactNet.Core; using PactNet.Extensions; +using PactNet.Models; using Xunit; namespace PactNet.Tests.Core { public class MockProviderHostConfigTests { - private IPactCoreHostConfig GetSubject(int port = 2322, bool enableSsl = false, string consumerName = "My Test Consumer", string providerName = "My Test Provider", PactConfig pactConfig = null, string host = "") + private IPactCoreHostConfig GetSubject(int port = 2322, bool enableSsl = false, string consumerName = "My Test Consumer", string providerName = "My Test Provider", PactConfig pactConfig = null, IPAddress listeningIpAddress= IPAddress.Loopback) { - return new MockProviderHostConfig(port, enableSsl, consumerName, providerName, pactConfig ?? new PactConfig(), host); + return new MockProviderHostConfig(port, enableSsl, consumerName, providerName, pactConfig ?? new PactConfig(), listeningIpAddress); } [Fact] @@ -62,13 +63,13 @@ public void Ctor_WhenCalledWithHost_SetsTheCorrectArgs() var consumerName = "Cons"; var providerName = "The best one"; var enableSsl = true; - var host = "0.0.0.0"; + var listeningIpAddress = IPAddress.Any; - var config = GetSubject(port, enableSsl, consumerName, providerName, pactConfig, host); + var config = GetSubject(port, enableSsl, consumerName, providerName, pactConfig, listeningIpAddress); var expectedLogFilePath = BuildExpectedLogFilePath(pactConfig.LogDir, providerName); var expectedPactDir = BuildExpectedPactDir(pactConfig.PactDir); - var expectedArguments = BuildExpectedArguments(port, expectedLogFilePath, expectedPactDir, pactConfig.SpecificationVersion, consumerName, providerName, enableSsl, host); + var expectedArguments = BuildExpectedArguments(port, expectedLogFilePath, expectedPactDir, pactConfig.SpecificationVersion, consumerName, providerName, enableSsl, listeningIpAddress); Assert.Equal(expectedArguments, config.Arguments); } @@ -137,11 +138,11 @@ private string BuildExpectedArguments( string consumerName, string providerName, bool enableSsl = false, - string host = "") + IPAddress listeningIpAddress= IPAddress.Loopback) { var sslOption = enableSsl ? " --ssl" : ""; - var hostOption = !string.IsNullOrWhiteSpace(host) ? $" --host={host}" : ""; + var hostOption = listeningIpAddress == IPAddress.Any ? " --host=0.0.0.0" : ""; return $"-p {port} -l \"{logFilePath}\" --pact-dir \"{pactFileDir}\" --pact-specification-version \"{pactSpecificationVersion}\" --consumer \"{consumerName}\" --provider \"{providerName}\"{sslOption}{hostOption}"; } diff --git a/PactNet.Tests/IntegrationTests/FailureIntegrationTestsMyApiPact.cs b/PactNet.Tests/IntegrationTests/FailureIntegrationTestsMyApiPact.cs index 2bc5b300..80de1da0 100644 --- a/PactNet.Tests/IntegrationTests/FailureIntegrationTestsMyApiPact.cs +++ b/PactNet.Tests/IntegrationTests/FailureIntegrationTestsMyApiPact.cs @@ -16,9 +16,9 @@ public FailureIntegrationTestsMyApiPact() { var pactConfig = new PactConfig(); - PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => + PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, listeningIpAddress) => new MockProviderService( - baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig), + baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig, listeningIpAddress), port, enableSsl, baseUri => new AdminHttpClient(baseUri))) .ServiceConsumer("FailureIntegrationTests") diff --git a/PactNet.Tests/IntegrationTests/IntegrationTestsMyApiPact.cs b/PactNet.Tests/IntegrationTests/IntegrationTestsMyApiPact.cs index 7371b7d8..197c8003 100644 --- a/PactNet.Tests/IntegrationTests/IntegrationTestsMyApiPact.cs +++ b/PactNet.Tests/IntegrationTests/IntegrationTestsMyApiPact.cs @@ -16,9 +16,9 @@ public IntegrationTestsMyApiPact() { var pactConfig = new PactConfig(); - PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => + PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, listeningIpAddress) => new MockProviderService( - baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig), + baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig, listeningIpAddress), port, enableSsl, baseUri => new AdminHttpClient(baseUri))) .ServiceConsumer("IntegrationTests") diff --git a/PactNet.Tests/Mocks/MockHttpService/MockProviderServiceTests.cs b/PactNet.Tests/Mocks/MockHttpService/MockProviderServiceTests.cs index 116cf680..e8da23a4 100644 --- a/PactNet.Tests/Mocks/MockHttpService/MockProviderServiceTests.cs +++ b/PactNet.Tests/Mocks/MockHttpService/MockProviderServiceTests.cs @@ -19,12 +19,11 @@ public class MockProviderServiceTests private FakeHttpMessageHandler _fakeHttpMessageHandler; private int _mockHttpHostFactoryCallCount; - private IMockProviderService GetSubject(int port = 1234, bool enableSsl = false, string host = "") + private IMockProviderService GetSubject(int port = 1234, bool enableSsl = false) { _mockHttpHost = Substitute.For(); _fakeHttpMessageHandler = new FakeHttpMessageHandler(); _mockHttpHostFactoryCallCount = 0; - return new MockProviderService( baseUri => { @@ -33,8 +32,7 @@ private IMockProviderService GetSubject(int port = 1234, bool enableSsl = false, }, port, enableSsl, - baseUri => new AdminHttpClient(baseUri, _fakeHttpMessageHandler), - host); + baseUri => new AdminHttpClient(baseUri, _fakeHttpMessageHandler)); } [Fact] @@ -63,14 +61,6 @@ public void Ctor_WhenCalledWithEnableSslTrue_SetsBaseUriWithHttpsScheme() Assert.True(((MockProviderService)mockService).BaseUri.Scheme.Equals("HTTPS", StringComparison.OrdinalIgnoreCase), "BaseUri has a https scheme"); } - [Fact] - public void Ctor_WhenCalledWithHost_UsesTheHostInsteadOfLocalhost() - { - var mockService = GetSubject(host: "0.0.0.0"); - - Assert.True(((MockProviderService)mockService).BaseUri.Host.Equals("0.0.0.0"), "BaseUri has a 0.0.0.0 as a host"); - } - [Fact] public void Given_WithProviderState_SetsProviderState() { diff --git a/PactNet/Core/MockProviderHostConfig.cs b/PactNet/Core/MockProviderHostConfig.cs index cc6326b5..3533176e 100644 --- a/PactNet/Core/MockProviderHostConfig.cs +++ b/PactNet/Core/MockProviderHostConfig.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using PactNet.Extensions; using PactNet.Infrastructure.Outputters; +using PactNet.Models; namespace PactNet.Core { @@ -11,11 +12,11 @@ internal class MockProviderHostConfig : IPactCoreHostConfig public bool WaitForExit { get; } public IEnumerable Outputters { get; } - public MockProviderHostConfig(int port, bool enableSsl, string consumerName, string providerName, PactConfig config, string host = "") + public MockProviderHostConfig(int port, bool enableSsl, string consumerName, string providerName, PactConfig config, IPAddress listeningIpAddress = IPAddress.Loopback) { var logFile = $"{config.LogDir}{providerName.ToLowerSnakeCase()}_mock_service.log"; var sslOption = enableSsl ? " --ssl" : ""; - var hostOption = string.IsNullOrWhiteSpace(host) ? "" : $" --host={host}"; + var hostOption = listeningIpAddress == IPAddress.Loopback ? "" : $" --host=0.0.0.0"; Script = "pact-mock-service"; Arguments = $"-p {port} -l \"{FixPathForRuby(logFile)}\" --pact-dir \"{FixPathForRuby(config.PactDir)}\" --pact-specification-version \"{config.SpecificationVersion}\" --consumer \"{consumerName}\" --provider \"{providerName}\"{sslOption}{hostOption}"; diff --git a/PactNet/IPactBuilder.cs b/PactNet/IPactBuilder.cs index c8a6c3c9..d8a4bcd2 100644 --- a/PactNet/IPactBuilder.cs +++ b/PactNet/IPactBuilder.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; using PactNet.Mocks.MockHttpService; +using PactNet.Models; namespace PactNet { @@ -7,8 +8,8 @@ public interface IPactBuilder { IPactBuilder ServiceConsumer(string consumerName); IPactBuilder HasPactWith(string providerName); - IMockProviderService MockService(int port, bool enableSsl = false, string host = ""); - IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false, string host = ""); + IMockProviderService MockService(int port, bool enableSsl = false, IPAddress listeningIpAddress = IPAddress.Loopback); + IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false, IPAddress listeningIpAddress = IPAddress.Loopback); void Build(); } } \ No newline at end of file diff --git a/PactNet/Mocks/MockHttpService/Host/RubyHttpHost.cs b/PactNet/Mocks/MockHttpService/Host/RubyHttpHost.cs index 880e5800..03a1b565 100644 --- a/PactNet/Mocks/MockHttpService/Host/RubyHttpHost.cs +++ b/PactNet/Mocks/MockHttpService/Host/RubyHttpHost.cs @@ -2,6 +2,7 @@ using System.Threading; using PactNet.Core; using PactNet.Mocks.MockHttpService.Models; +using PactNet.Models; namespace PactNet.Mocks.MockHttpService.Host { @@ -18,14 +19,14 @@ internal RubyHttpHost( _adminHttpClient = adminHttpClient; } - public RubyHttpHost(Uri baseUri, string consumerName, string providerName, PactConfig config) : + public RubyHttpHost(Uri baseUri, string consumerName, string providerName, PactConfig config,IPAddress ipAddress = IPAddress.Loopback) : this(new PactCoreHost( new MockProviderHostConfig(baseUri.Port, baseUri.Scheme.Equals("HTTPS", StringComparison.OrdinalIgnoreCase), consumerName, providerName, config, - baseUri.Host)), + ipAddress)), new AdminHttpClient(baseUri)) { } diff --git a/PactNet/Mocks/MockHttpService/MockProviderService.cs b/PactNet/Mocks/MockHttpService/MockProviderService.cs index 6a51396d..e4de061d 100644 --- a/PactNet/Mocks/MockHttpService/MockProviderService.cs +++ b/PactNet/Mocks/MockHttpService/MockProviderService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using PactNet.Mocks.MockHttpService.Host; using PactNet.Mocks.MockHttpService.Models; +using PactNet.Models; using static System.String; namespace PactNet.Mocks.MockHttpService @@ -23,22 +24,20 @@ internal MockProviderService( Func hostFactory, int port, bool enableSsl, - Func adminHttpClientFactory, - string host = "") + Func adminHttpClientFactory) { _hostFactory = hostFactory; BaseUri = new Uri( - $"{(enableSsl ? "https" : "http")}://{(IsNullOrWhiteSpace(host) ? "localhost" : host)}:{port}"); + $"{(enableSsl ? "https" : "http")}://localhost:{port}"); _adminHttpClient = adminHttpClientFactory(BaseUri); } - public MockProviderService(int port, bool enableSsl, string consumerName, string providerName, PactConfig config, string host = "") + public MockProviderService(int port, bool enableSsl, string consumerName, string providerName, PactConfig config, IPAddress ipAddress = IPAddress.Loopback) : this( - baseUri => new RubyHttpHost(baseUri, consumerName, providerName, config), + baseUri => new RubyHttpHost(baseUri, consumerName, providerName, config, ipAddress), port, enableSsl, - baseUri => new AdminHttpClient(baseUri), - host) + baseUri => new AdminHttpClient(baseUri)) { } diff --git a/PactNet/Models/IPAddress.cs b/PactNet/Models/IPAddress.cs new file mode 100644 index 00000000..aa1af6f7 --- /dev/null +++ b/PactNet/Models/IPAddress.cs @@ -0,0 +1,8 @@ +namespace PactNet.Models +{ + public enum IPAddress + { + Any, + Loopback + } +} diff --git a/PactNet/PactBuilder.cs b/PactNet/PactBuilder.cs index d2bc967d..701e7783 100644 --- a/PactNet/PactBuilder.cs +++ b/PactNet/PactBuilder.cs @@ -11,11 +11,11 @@ public class PactBuilder : IPactBuilder { public string ConsumerName { get; private set; } public string ProviderName { get; private set; } - private readonly Func _mockProviderServiceFactory; + private readonly Func _mockProviderServiceFactory; private IMockProviderService _mockProviderService; - internal PactBuilder(Func mockProviderServiceFactory) + internal PactBuilder(Func mockProviderServiceFactory) { _mockProviderServiceFactory = mockProviderServiceFactory; } @@ -26,7 +26,7 @@ public PactBuilder() } public PactBuilder(PactConfig config) - : this((port, enableSsl, consumerName, providerName, host) => new MockProviderService(port, enableSsl, consumerName, providerName, config, host)) + : this((port, enableSsl, consumerName, providerName, listeningIpAddress) => new MockProviderService(port, enableSsl, consumerName, providerName, config, listeningIpAddress)) { } @@ -54,12 +54,12 @@ public IPactBuilder HasPactWith(string providerName) return this; } - public IMockProviderService MockService(int port, bool enableSsl = false, string host = "") + public IMockProviderService MockService(int port, bool enableSsl = false, IPAddress listeningIpAddress = IPAddress.Loopback) { - return MockService(port, jsonSerializerSettings: null, enableSsl: enableSsl, host: host); + return MockService(port, jsonSerializerSettings: null, enableSsl: enableSsl, listeningIpAddress: listeningIpAddress); } - public IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false, string host = "") + public IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false, IPAddress listeningIpAddress = IPAddress.Loopback) { if (String.IsNullOrEmpty(ConsumerName)) { @@ -81,7 +81,7 @@ public IMockProviderService MockService(int port, JsonSerializerSettings jsonSer JsonConfig.ApiSerializerSettings = jsonSerializerSettings; } - _mockProviderService = _mockProviderServiceFactory(port, enableSsl, ConsumerName, ProviderName, host); + _mockProviderService = _mockProviderServiceFactory(port, enableSsl, ConsumerName, ProviderName, listeningIpAddress); _mockProviderService.Start(); diff --git a/Samples/EventApi/Consumer.Tests/ConsumerEventApiPact.cs b/Samples/EventApi/Consumer.Tests/ConsumerEventApiPact.cs index 06451176..71c7f510 100644 --- a/Samples/EventApi/Consumer.Tests/ConsumerEventApiPact.cs +++ b/Samples/EventApi/Consumer.Tests/ConsumerEventApiPact.cs @@ -2,6 +2,7 @@ using System.IO; using PactNet; using PactNet.Mocks.MockHttpService; +using PactNet.Models; namespace Consumer.Tests { @@ -16,15 +17,15 @@ public class ConsumerEventApiPact : IDisposable public ConsumerEventApiPact() { PactBuilder = new PactBuilder(new PactConfig - { - SpecificationVersion = "2.0.0", - LogDir = $"..{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}logs{Path.DirectorySeparatorChar}", - PactDir = $"..{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}pacts{Path.DirectorySeparatorChar}" - }) + { + SpecificationVersion = "2.0.0", + LogDir = $"..{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}logs{Path.DirectorySeparatorChar}", + PactDir = $"..{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}pacts{Path.DirectorySeparatorChar}" + }) .ServiceConsumer("Event API Consumer") .HasPactWith("Event API"); - MockProviderService = PactBuilder.MockService(MockServerPort); + MockProviderService = PactBuilder.MockService(MockServerPort, false, IPAddress.Any); } public void Dispose()