diff --git a/README.md b/README.md index 3a0ade6c..6a9953bc 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # WireMock.Net -A C# .NET version based on https://github.com/alexvictoor/WireMock which tries to mimic the functionality from http://WireMock.org +A C# .NET version based on https://github.com/alexvictoor/WireMock which mimics the functionality from http://WireMock.org [![Build status](https://ci.appveyor.com/api/projects/status/b3n6q3ygbww4lyls?svg=true)](https://ci.appveyor.com/project/StefH/wiremock-net) -[![Version](https://img.shields.io/nuget/v/WireMock.Net.svg)](https://www.nuget.org/packages/WireMock.Net) +[![NuGet Badge](https://buildstats.info/nuget/WireMock.Net)](https://www.nuget.org/packages/WireMock.Net) Based on class HttpListener from the .net framework, it is very lightweight and have no external dependencies. diff --git a/src/WireMock.Net/Http/Ports.cs b/src/WireMock.Net/Http/PortUtil.cs similarity index 96% rename from src/WireMock.Net/Http/Ports.cs rename to src/WireMock.Net/Http/PortUtil.cs index 4fa6d268..223d2535 100644 --- a/src/WireMock.Net/Http/Ports.cs +++ b/src/WireMock.Net/Http/PortUtil.cs @@ -6,7 +6,7 @@ namespace WireMock.Http /// /// The ports. /// - public static class Ports + public static class PortUtil { /// /// The find free TCP port. diff --git a/src/WireMock.Net/Http/TinyHttpServer.cs b/src/WireMock.Net/Http/TinyHttpServer.cs index c2502969..61acb0e8 100644 --- a/src/WireMock.Net/Http/TinyHttpServer.cs +++ b/src/WireMock.Net/Http/TinyHttpServer.cs @@ -1,7 +1,10 @@ using System; +using System.Collections.Generic; using System.Net; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; +using WireMock.Validation; namespace WireMock.Http { @@ -24,20 +27,43 @@ namespace WireMock.Http /// public bool IsStarted { get; private set; } + /// + /// Gets the url. + /// + /// + /// The urls. + /// + public List Urls { get; } = new List(); + + /// + /// Gets the ports. + /// + /// + /// The ports. + /// + public List Ports { get; } = new List(); + /// /// Initializes a new instance of the class. /// - /// The urls. + /// The uriPrefixes. /// The http handler. - public TinyHttpServer(string[] urls, Action httpHandler) + public TinyHttpServer([NotNull] Action httpHandler, [NotNull] params string[] uriPrefixes) { + Check.NotNull(httpHandler, nameof(httpHandler)); + Check.NotEmpty(uriPrefixes, nameof(uriPrefixes)); + _httpHandler = httpHandler; // Create a listener. _listener = new HttpListener(); - foreach (string urlPrefix in urls) + foreach (string uriPrefix in uriPrefixes) { - _listener.Prefixes.Add(urlPrefix); + var uri = new Uri(uriPrefix); + Urls.Add(uri); + Ports.Add(uri.Port); + + _listener.Prefixes.Add(uriPrefix); } } diff --git a/src/WireMock.Net/ResponseBuilders/IDelayResponseBuilder.cs b/src/WireMock.Net/ResponseBuilders/IDelayResponseBuilder.cs index eb94efc9..458d3dd7 100644 --- a/src/WireMock.Net/ResponseBuilders/IDelayResponseBuilder.cs +++ b/src/WireMock.Net/ResponseBuilders/IDelayResponseBuilder.cs @@ -1,5 +1,4 @@ using System; -using JetBrains.Annotations; namespace WireMock.ResponseBuilders { diff --git a/src/WireMock.Net/ResponseBuilders/IHeadersResponseBuilder.cs b/src/WireMock.Net/ResponseBuilders/IHeadersResponseBuilder.cs index 32300e1d..4a2b8054 100644 --- a/src/WireMock.Net/ResponseBuilders/IHeadersResponseBuilder.cs +++ b/src/WireMock.Net/ResponseBuilders/IHeadersResponseBuilder.cs @@ -1,5 +1,4 @@ -using System.Collections; -using System.Collections.Generic; +using System.Collections.Generic; using JetBrains.Annotations; namespace WireMock.ResponseBuilders diff --git a/src/WireMock.Net/Server/FluentMockServer.cs b/src/WireMock.Net/Server/FluentMockServer.cs index cb73f42e..2fe4b0db 100644 --- a/src/WireMock.Net/Server/FluentMockServer.cs +++ b/src/WireMock.Net/Server/FluentMockServer.cs @@ -32,6 +32,14 @@ namespace WireMock.Server private TimeSpan _requestProcessingDelay = TimeSpan.Zero; + /// + /// Gets the ports. + /// + /// + /// The ports. + /// + public List Ports { get; } + /// /// Gets the urls. /// @@ -77,7 +85,7 @@ namespace WireMock.Server Check.Condition(port, p => p >= 0, nameof(port)); if (port == 0) - port = Ports.FindFreeTcpPort(); + port = PortUtil.FindFreeTcpPort(); return new FluentMockServer(false, port, ssl); } @@ -107,7 +115,7 @@ namespace WireMock.Server Check.Condition(port, p => p >= 0, nameof(port)); if (port == 0) - port = Ports.FindFreeTcpPort(); + port = PortUtil.FindFreeTcpPort(); return new FluentMockServer(true, port, ssl); } @@ -133,7 +141,9 @@ namespace WireMock.Server { Urls = urls; - _httpServer = new TinyHttpServer(urls, HandleRequestAsync); + _httpServer = new TinyHttpServer(HandleRequestAsync, urls); + Ports = _httpServer.Ports; + _httpServer.Start(); if (startAdminInterface) @@ -142,7 +152,6 @@ namespace WireMock.Server } } - /// /// Stop this server. /// diff --git a/src/WireMock.Net/project.json b/src/WireMock.Net/project.json index 4de32033..65ba6292 100644 --- a/src/WireMock.Net/project.json +++ b/src/WireMock.Net/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0.0", + "version": "1.0.1.0", "title": "WireMock.Net", "description": "Lightweight Http Mocking Server for .Net, inspired by WireMock from the Java landscape.", "authors": [ "Alexandre Victoor", "Stef Heyenrath" ], @@ -15,7 +15,7 @@ "projectUrl": "https://github.com/StefH/WireMock.Net", "iconUrl": "https://raw.githubusercontent.com/StefH/WireMock.Net/master/WireMock.Net-Logo.png", "licenseUrl": "https://raw.githubusercontent.com/StefH/WireMock.Net/master/LICENSE", - "releaseNotes": "First version" + "releaseNotes": "Added Admin-Interface" }, "buildOptions": { diff --git a/test/WireMock.Net.Tests/FluentMockServerTests.cs b/test/WireMock.Net.Tests/FluentMockServerTests.cs index f98e16ef..f6b2e0b6 100644 --- a/test/WireMock.Net.Tests/FluentMockServerTests.cs +++ b/test/WireMock.Net.Tests/FluentMockServerTests.cs @@ -71,7 +71,7 @@ namespace WireMock.Net.Tests _server = FluentMockServer.Start(); // when - await new HttpClient().GetAsync("http://localhost:" + _server.Port + "/foo"); + await new HttpClient().GetAsync("http://localhost:" + _server.Ports[0] + "/foo"); // then Check.That(_server.LogEntries).HasSize(1); @@ -95,7 +95,7 @@ namespace WireMock.Net.Tests .WithBody(@"{ msg: ""Hello world!""}")); // when - var response = await new HttpClient().GetStringAsync("http://localhost:" + _server.Port + "/foo"); + var response = await new HttpClient().GetStringAsync("http://localhost:" + _server.Ports[0] + "/foo"); // then Check.That(response).IsEqualTo(@"{ msg: ""Hello world!""}"); @@ -110,7 +110,7 @@ namespace WireMock.Net.Tests _server.Given(Request.Create().WithPath("/foo").UsingGet()).RespondWith(Response.Create().WithBodyAsBase64("SGVsbG8gV29ybGQ/")); // when - var response = await new HttpClient().GetStringAsync("http://localhost:" + _server.Port + "/foo"); + var response = await new HttpClient().GetStringAsync("http://localhost:" + _server.Ports[0] + "/foo"); // then Check.That(response).IsEqualTo("Hello World?"); @@ -123,7 +123,7 @@ namespace WireMock.Net.Tests _server = FluentMockServer.Start(); // when - var response = await new HttpClient().GetAsync("http://localhost:" + _server.Port + "/foo"); + var response = await new HttpClient().GetAsync("http://localhost:" + _server.Ports[0] + "/foo"); // then Check.That(response.StatusCode).IsEqualTo(HttpStatusCode.NotFound); @@ -137,8 +137,8 @@ namespace WireMock.Net.Tests _server = FluentMockServer.Start(); // when - await new HttpClient().GetAsync("http://localhost:" + _server.Port + "/foo"); - await new HttpClient().GetAsync("http://localhost:" + _server.Port + "/bar"); + await new HttpClient().GetAsync("http://localhost:" + _server.Ports[0] + "/foo"); + await new HttpClient().GetAsync("http://localhost:" + _server.Ports[0] + "/bar"); // then var result = _server.SearchLogsFor(Request.Create().WithPath(new RegexMatcher("^/b.*"))).ToList(); @@ -146,7 +146,7 @@ namespace WireMock.Net.Tests var requestLogged = result.First(); Check.That(requestLogged.RequestMessage.Path).IsEqualTo("/bar"); - Check.That(requestLogged.RequestMessage.Url).IsEqualTo("http://localhost:" + _server.Port + "/bar"); + Check.That(requestLogged.RequestMessage.Url).IsEqualTo("http://localhost:" + _server.Ports[0] + "/bar"); } [Test] @@ -156,7 +156,7 @@ namespace WireMock.Net.Tests _server = FluentMockServer.Start(); // when - await new HttpClient().GetAsync("http://localhost:" + _server.Port + "/foo"); + await new HttpClient().GetAsync("http://localhost:" + _server.Ports[0] + "/foo"); _server.Reset(); // then @@ -180,7 +180,7 @@ namespace WireMock.Net.Tests _server.Reset(); // then - Check.ThatAsyncCode(() => new HttpClient().GetStringAsync("http://localhost:" + _server.Port + "/foo")) + Check.ThatAsyncCode(() => new HttpClient().GetStringAsync("http://localhost:" + _server.Ports[0] + "/foo")) .ThrowsAny(); } @@ -206,7 +206,7 @@ namespace WireMock.Net.Tests .WithBody("REDIRECT SUCCESSFUL")); // when - var response = await new HttpClient().GetStringAsync("http://localhost:" + _server.Port + "/foo"); + var response = await new HttpClient().GetStringAsync("http://localhost:" + _server.Ports[0] + "/foo"); // then Check.That(response).IsEqualTo("REDIRECT SUCCESSFUL"); @@ -228,7 +228,7 @@ namespace WireMock.Net.Tests // when var watch = new Stopwatch(); watch.Start(); - await new HttpClient().GetStringAsync("http://localhost:" + _server.Port + "/foo"); + await new HttpClient().GetStringAsync("http://localhost:" + _server.Ports[0] + "/foo"); watch.Stop(); // then @@ -248,7 +248,7 @@ namespace WireMock.Net.Tests // when var watch = new Stopwatch(); watch.Start(); - await new HttpClient().GetStringAsync("http://localhost:" + _server.Port + "/foo"); + await new HttpClient().GetStringAsync("http://localhost:" + _server.Ports[0] + "/foo"); watch.Stop(); // then diff --git a/test/WireMock.Net.Tests/Http/TinyHttpServerTests.cs b/test/WireMock.Net.Tests/Http/TinyHttpServerTests.cs index 84880b58..099dac0d 100644 --- a/test/WireMock.Net.Tests/Http/TinyHttpServerTests.cs +++ b/test/WireMock.Net.Tests/Http/TinyHttpServerTests.cs @@ -22,10 +22,10 @@ namespace WireMock.Net.Tests.Http public void Should_call_handler_on_request() { // given - var port = Ports.FindFreeTcpPort(); + var port = PortUtil.FindFreeTcpPort(); bool called = false; var urlPrefix = "http://localhost:" + port + "/"; - var server = new TinyHttpServer(urlPrefix, ctx => called = true); + var server = new TinyHttpServer(ctx => called = true, urlPrefix); server.Start(); // when diff --git a/test/WireMock.Net.Tests/HttpListenerRequestMapperTests.cs b/test/WireMock.Net.Tests/HttpListenerRequestMapperTests.cs index 6fb4923a..8b155a91 100644 --- a/test/WireMock.Net.Tests/HttpListenerRequestMapperTests.cs +++ b/test/WireMock.Net.Tests/HttpListenerRequestMapperTests.cs @@ -104,7 +104,7 @@ namespace WireMock.Net.Tests { private static volatile RequestMessage _lastRequestMessage; - private MapperServer(string urlPrefix, Action httpHandler) : base(urlPrefix, httpHandler) + private MapperServer(Action httpHandler, string urlPrefix) : base(httpHandler, urlPrefix) { } @@ -125,16 +125,16 @@ namespace WireMock.Net.Tests public new static MapperServer Start() { - var port = Ports.FindFreeTcpPort(); + int port = PortUtil.FindFreeTcpPort(); UrlPrefix = "http://localhost:" + port + "/"; var server = new MapperServer( - UrlPrefix, context => { LastRequestMessage = new HttpListenerRequestMapper().Map(context.Request); context.Response.Close(); - }); + }, UrlPrefix); ((TinyHttpServer)server).Start(); + return server; } diff --git a/test/WireMock.Net.Tests/HttpListenerResponseMapperTests.cs b/test/WireMock.Net.Tests/HttpListenerResponseMapperTests.cs index 8e72c3e3..cd0326c6 100644 --- a/test/WireMock.Net.Tests/HttpListenerResponseMapperTests.cs +++ b/test/WireMock.Net.Tests/HttpListenerResponseMapperTests.cs @@ -70,10 +70,7 @@ namespace WireMock.Net.Tests [TearDown] public void StopServer() { - if (_server != null) - { - _server.Stop(); - } + _server?.Stop(); } /// @@ -84,17 +81,16 @@ namespace WireMock.Net.Tests /// public HttpListenerResponse CreateHttpListenerResponse() { - var port = Ports.FindFreeTcpPort(); + var port = PortUtil.FindFreeTcpPort(); var urlPrefix = "http://localhost:" + port + "/"; var responseReady = new AutoResetEvent(false); HttpListenerResponse response = null; _server = new TinyHttpServer( - urlPrefix, context => { response = context.Response; responseReady.Set(); - }); + }, urlPrefix); _server.Start(); _responseMsgTask = new HttpClient().GetAsync(urlPrefix); responseReady.WaitOne();