Skip to content

Commit

Permalink
Merge pull request #125 from waelemara/master
Browse files Browse the repository at this point in the history
Add host parameter to RubyHttpHost so it can be passed down to pact-mock-service
  • Loading branch information
neilcampbell authored Nov 11, 2017
2 parents e883aab + cdf7b5e commit b4c4168
Show file tree
Hide file tree
Showing 11 changed files with 51 additions and 49 deletions.
15 changes: 8 additions & 7 deletions PactNet.Tests/Core/MockProviderHostConfigTests.cs
Original file line number Diff line number Diff line change
@@ -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]
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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}";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
4 changes: 2 additions & 2 deletions PactNet.Tests/IntegrationTests/IntegrationTestsMyApiPact.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
14 changes: 2 additions & 12 deletions PactNet.Tests/Mocks/MockHttpService/MockProviderServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<IHttpHost>();
_fakeHttpMessageHandler = new FakeHttpMessageHandler();
_mockHttpHostFactoryCallCount = 0;

return new MockProviderService(
baseUri =>
{
Expand All @@ -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]
Expand Down Expand Up @@ -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()
{
Expand Down
5 changes: 3 additions & 2 deletions PactNet/Core/MockProviderHostConfig.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using PactNet.Extensions;
using PactNet.Infrastructure.Outputters;
using PactNet.Models;

namespace PactNet.Core
{
Expand All @@ -11,11 +12,11 @@ internal class MockProviderHostConfig : IPactCoreHostConfig
public bool WaitForExit { get; }
public IEnumerable<IOutput> 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}";
Expand Down
5 changes: 3 additions & 2 deletions PactNet/IPactBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
using Newtonsoft.Json;
using PactNet.Mocks.MockHttpService;
using PactNet.Models;

namespace PactNet
{
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();
}
}
5 changes: 3 additions & 2 deletions PactNet/Mocks/MockHttpService/Host/RubyHttpHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Threading;
using PactNet.Core;
using PactNet.Mocks.MockHttpService.Models;
using PactNet.Models;

namespace PactNet.Mocks.MockHttpService.Host
{
Expand All @@ -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<MockProviderHostConfig>(
new MockProviderHostConfig(baseUri.Port,
baseUri.Scheme.Equals("HTTPS", StringComparison.OrdinalIgnoreCase),
consumerName,
providerName,
config,
baseUri.Host)),
ipAddress)),
new AdminHttpClient(baseUri))
{
}
Expand Down
13 changes: 6 additions & 7 deletions PactNet/Mocks/MockHttpService/MockProviderService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -23,22 +24,20 @@ internal MockProviderService(
Func<Uri, IHttpHost> hostFactory,
int port,
bool enableSsl,
Func<Uri, AdminHttpClient> adminHttpClientFactory,
string host = "")
Func<Uri, AdminHttpClient> 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))
{
}

Expand Down
8 changes: 8 additions & 0 deletions PactNet/Models/IPAddress.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace PactNet.Models
{
public enum IPAddress
{
Any,
Loopback
}
}
14 changes: 7 additions & 7 deletions PactNet/PactBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ public class PactBuilder : IPactBuilder
{
public string ConsumerName { get; private set; }
public string ProviderName { get; private set; }
private readonly Func<int, bool, string, string, string, IMockProviderService> _mockProviderServiceFactory;
private readonly Func<int, bool, string, string, IPAddress, IMockProviderService> _mockProviderServiceFactory;

private IMockProviderService _mockProviderService;

internal PactBuilder(Func<int, bool, string, string, string, IMockProviderService> mockProviderServiceFactory)
internal PactBuilder(Func<int, bool, string, string, IPAddress, IMockProviderService> mockProviderServiceFactory)
{
_mockProviderServiceFactory = mockProviderServiceFactory;
}
Expand All @@ -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))
{
}

Expand Down Expand Up @@ -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))
{
Expand All @@ -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();

Expand Down
13 changes: 7 additions & 6 deletions Samples/EventApi/Consumer.Tests/ConsumerEventApiPact.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.IO;
using PactNet;
using PactNet.Mocks.MockHttpService;
using PactNet.Models;

namespace Consumer.Tests
{
Expand All @@ -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()
Expand Down

0 comments on commit b4c4168

Please sign in to comment.