From 0bfa0d91b4d96ca5bcc99b63be639993a525356d Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 13 Dec 2014 21:49:24 +0100 Subject: [PATCH] Refactor response generation and xmls --- .../mockserver/server/ContextExecutor.groovy | 13 ++----- .../mockserver/server/HttpMockServer.groovy | 39 ++++++++++++------- .../pl/touk/mockserver/server/Mock.groovy | 7 +--- .../mockserver/server/MockResponse.groovy | 6 +-- .../pl/touk/mockserver/server/Util.groovy | 13 +++++++ .../pl/touk/mockserver/client/Util.groovy | 1 + .../server/MockServerIntegrationTest.groovy | 1 + .../mockserver/server/ServerMockPT.groovy | 6 +-- 8 files changed, 50 insertions(+), 36 deletions(-) create mode 100644 src/main/groovy/pl/touk/mockserver/server/Util.groovy diff --git a/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy b/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy index ff790a2..8531af6 100644 --- a/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -30,9 +30,7 @@ class ContextExecutor { e.printStackTrace() } } - ex.sendResponseHeaders(404, 0) - ex.responseBody << request.text - ex.responseBody.close() + Util.createResponse(ex, request.text, 404) }) } @@ -48,12 +46,7 @@ class ContextExecutor { response.headers.each { httpExchange.responseHeaders.add(it.key, it.value) } - String responseText = response.response - httpExchange.sendResponseHeaders(response.statusCode, responseText ? responseText.length() : -1) - if (responseText) { - httpExchange.responseBody << responseText - httpExchange.responseBody.close() - } + Util.createResponse(httpExchange, response.text, response.statusCode) } int removeMock(String name) { @@ -69,7 +62,7 @@ class ContextExecutor { mocks << mock } - List getMocks(){ + List getMocks() { return mocks } } diff --git a/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy b/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy index fd78d3f..c8da178 100644 --- a/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -3,10 +3,13 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.transform.PackageScope import groovy.util.slurpersupport.GPathResult +import groovy.xml.MarkupBuilder import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.CopyOnWriteArraySet +import static pl.touk.mockserver.server.Util.createResponse + @PackageScope class HttpMockServer { @@ -34,7 +37,6 @@ class HttpMockServer { } else { throw new RuntimeException('Unknown request') } - //TODO add get mock report } catch (Exception e) { createErrorResponse(ex, e) } @@ -42,10 +44,19 @@ class HttpMockServer { } void listMocks(HttpExchange ex) { - String response = '' + listMocks().join('') + '' - ex.sendResponseHeaders(200, 0) - ex.responseBody << response - ex.responseBody.close() + StringWriter sw = new StringWriter() + MarkupBuilder builder = new MarkupBuilder(sw) + builder.mocks { + listMocks().each { + Mock mock -> + builder.mock { + name mock.name + path mock.path + port mock.port + } + } + } + createResponse(ex, sw.toString(), 200) } Set listMocks() { @@ -61,9 +72,7 @@ class HttpMockServer { HttpServerWraper child = getOrCreateChildServer(mock.port) child.addMock(mock) mockNames << name - ex.sendResponseHeaders(200, 0) - ex.responseBody << '' - ex.responseBody.close() + createResponse(ex, '', 200) } private static Mock mockFromRequest(GPathResult request) { @@ -97,15 +106,17 @@ class HttpMockServer { println "Removing $name" int used = childServers.inject(0) { int res, HttpServerWraper server -> server.removeMock(name) + res } mockNames.remove(name) - ex.sendResponseHeaders(200, 0) - ex.responseBody << "$used" - ex.responseBody.close() + StringWriter sw = new StringWriter() + MarkupBuilder builder = new MarkupBuilder(sw) + builder.mockRemoved used + createResponse(ex, sw.toString(), 200) } private static void createErrorResponse(HttpExchange ex, Exception e) { - ex.sendResponseHeaders(400, 0) - ex.responseBody << """${e.message}""" - ex.responseBody.close() + StringWriter sw = new StringWriter() + MarkupBuilder builder = new MarkupBuilder(sw) + builder.exceptionOccured e.message + createResponse(ex, sw.toString(), 400) } void stop() { diff --git a/src/main/groovy/pl/touk/mockserver/server/Mock.groovy b/src/main/groovy/pl/touk/mockserver/server/Mock.groovy index c0ef222..9158560 100644 --- a/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -5,7 +5,7 @@ import groovy.transform.PackageScope @PackageScope @EqualsAndHashCode(excludes = ["counter"]) -class Mock implements Comparable{ +class Mock implements Comparable { final String name final String path final int port @@ -82,11 +82,6 @@ class Mock implements Comparable{ } } - @Override - public String toString() { - return """$port$path$name""" - } - @Override int compareTo(Mock o) { return name.compareTo(o.name) diff --git a/src/main/groovy/pl/touk/mockserver/server/MockResponse.groovy b/src/main/groovy/pl/touk/mockserver/server/MockResponse.groovy index e8e2825..913f9f3 100644 --- a/src/main/groovy/pl/touk/mockserver/server/MockResponse.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/MockResponse.groovy @@ -5,12 +5,12 @@ import groovy.transform.PackageScope @PackageScope class MockResponse { final int statusCode - final String response + final String text final Map headers - MockResponse(int statusCode, String response, Map headers) { + MockResponse(int statusCode, String text, Map headers) { this.statusCode = statusCode - this.response = response + this.text = text this.headers = headers } } diff --git a/src/main/groovy/pl/touk/mockserver/server/Util.groovy b/src/main/groovy/pl/touk/mockserver/server/Util.groovy new file mode 100644 index 0000000..53a0751 --- /dev/null +++ b/src/main/groovy/pl/touk/mockserver/server/Util.groovy @@ -0,0 +1,13 @@ +package pl.touk.mockserver.server + +import com.sun.net.httpserver.HttpExchange + +class Util { + static void createResponse(HttpExchange ex, String response, int statusCode) { + ex.sendResponseHeaders(statusCode, response ? response.length() : -1) + if (response) { + ex.responseBody << response + ex.responseBody.close() + } + } +} diff --git a/src/test/groovy/pl/touk/mockserver/client/Util.groovy b/src/test/groovy/pl/touk/mockserver/client/Util.groovy index 1194202..9aaf72f 100644 --- a/src/test/groovy/pl/touk/mockserver/client/Util.groovy +++ b/src/test/groovy/pl/touk/mockserver/client/Util.groovy @@ -13,6 +13,7 @@ import org.apache.http.util.EntityUtils class Util { static GPathResult extractXmlResponse(CloseableHttpResponse response) { HttpEntity entity = response.entity + GPathResult xml = new XmlSlurper().parseText(EntityUtils.toString(entity)) EntityUtils.consumeQuietly(entity) return xml diff --git a/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy b/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy index bf8070b..7feb10f 100644 --- a/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy +++ b/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy @@ -11,6 +11,7 @@ import pl.touk.mockserver.client.* import spock.lang.Shared import spock.lang.Specification import spock.lang.Unroll +import pl.touk.mockserver.client.Util class MockServerIntegrationTest extends Specification { diff --git a/src/test/groovy/pl/touk/mockserver/server/ServerMockPT.groovy b/src/test/groovy/pl/touk/mockserver/server/ServerMockPT.groovy index 8690672..36f6579 100644 --- a/src/test/groovy/pl/touk/mockserver/server/ServerMockPT.groovy +++ b/src/test/groovy/pl/touk/mockserver/server/ServerMockPT.groovy @@ -29,10 +29,10 @@ class ServerMockPT extends Specification { int port = 9000 + (current % 7) controlServerClient.addMock(new AddMockRequestData( name: "testRest$current", - path: "/testEndpoint$endpointNumber", + path: "testEndpoint$endpointNumber", port: port, - predicate: """{xml -> xml.name() == 'request$current'}""", - response: """{xml -> ""}""" + predicate: """{req -> req.xml.name() == 'request$current'}""", + response: """{req -> ""}""" )) HttpPost restPost = new HttpPost("http://localhost:$port/testEndpoint$endpointNumber") restPost.entity = new StringEntity("", ContentType.create("text/xml", "UTF-8"))