From 4e70d3b8bdb208405a3af88d4b9dc30c4e0513f6 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sun, 30 Aug 2015 00:52:24 +0200 Subject: [PATCH] Some smal improvements Change-Id: I3559572293359bf3fb1c4e4e6892e19d4373ba63 --- .../mockserver/api/response/MockReport.java | 10 ++++++ .../tests/MockServerIntegrationTest.groovy | 15 +++++---- .../mockserver/server/ContextExecutor.groovy | 3 +- .../mockserver/server/HttpMockServer.groovy | 31 +++++++++---------- .../mockserver/server/HttpServerWraper.groovy | 8 ++--- .../pl/touk/mockserver/server/Mock.groovy | 7 +++-- .../touk/mockserver/server/MockRequest.groovy | 4 +-- 7 files changed, 45 insertions(+), 33 deletions(-) diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java index 4ea7449..aa7bd8f 100644 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java @@ -2,6 +2,7 @@ package pl.touk.mockserver.api.response; import lombok.Data; import lombok.EqualsAndHashCode; +import pl.touk.mockserver.api.request.Method; import javax.xml.bind.annotation.XmlElement; @@ -24,4 +25,13 @@ public class MockReport { @XmlElement(required = true) private String responseHeaders; + + @XmlElement(required = true) + private boolean soap; + + @XmlElement(required = true) + private Method method; + + @XmlElement(required = true) + private int statusCode; } diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy index 1fba403..32c9623 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy @@ -611,7 +611,10 @@ class MockServerIntegrationTest extends Specification { remoteMockServer.addMock(new AddMock( name: 'testRest4', path: 'testEndpoint', - port: 9999 + port: 9999, + soap: true, + statusCode: 204, + method: Method.PUT )) remoteMockServer.addMock(new AddMock( name: 'testRest3', @@ -636,11 +639,11 @@ class MockServerIntegrationTest extends Specification { remoteMockServer.removeMock('testRest5') expect: remoteMockServer.listMocks() == [ - new MockReport(name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }'), - new MockReport(name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '' }''', responseHeaders: '{ _ -> [a: "b"] }'), - new MockReport(name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }'), - new MockReport(name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }'), - new MockReport(name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }') + new MockReport(name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST), + new MockReport(name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST), + new MockReport(name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST), + new MockReport(name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT), + new MockReport(name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST) ] } diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy index e5c9c98..545dfed 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -3,6 +3,7 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.transform.PackageScope import groovy.util.logging.Slf4j +import pl.touk.mockserver.api.request.Method import java.util.concurrent.CopyOnWriteArrayList @@ -24,7 +25,7 @@ class ContextExecutor { log.debug("Request: ${request.text}") for (Mock mock : mocks) { try { - if (mock.match(ex.requestMethod, request)) { + if (mock.match(Method.valueOf(ex.requestMethod), request)) { log.debug("Mock ${mock.name} match request ${request.text}") MockResponse httpResponse = mock.apply(request) fillExchange(ex, httpResponse) diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy index 322ec64..1b8fc9a 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -2,14 +2,11 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.util.logging.Slf4j -import pl.touk.mockserver.api.request.AddMock -import pl.touk.mockserver.api.request.MockServerRequest -import pl.touk.mockserver.api.request.PeekMock -import pl.touk.mockserver.api.request.RemoveMock +import pl.touk.mockserver.api.request.* import pl.touk.mockserver.api.response.* import javax.xml.bind.JAXBContext -import java.util.concurrent.CopyOnWriteArrayList +import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArraySet import static pl.touk.mockserver.server.Util.createResponse @@ -18,7 +15,7 @@ import static pl.touk.mockserver.server.Util.createResponse class HttpMockServer { private final HttpServerWraper httpServerWraper - private final List childServers = new CopyOnWriteArrayList<>() + private final Map childServers = new ConcurrentHashMap<>() private final Set mockNames = new CopyOnWriteArraySet<>() private static @@ -61,7 +58,10 @@ class HttpMockServer { port: it.port, predicate: it.predicateClosureText, response: it.responseClosureText, - responseHeaders: it.responseHeadersClosureText + responseHeaders: it.responseHeadersClosureText, + soap: it.soap, + method: it.method, + statusCode: it.statusCode as int ) } ) @@ -69,7 +69,7 @@ class HttpMockServer { } Set listMocks() { - return childServers.collect { it.mocks }.flatten() as TreeSet + return childServers.values().collect { it.mocks }.flatten() as TreeSet } private void addMock(AddMock request, HttpExchange ex) { @@ -85,10 +85,7 @@ class HttpMockServer { } private static Mock mockFromRequest(AddMock request) { - String name = request.name - String mockPath = request.path - int mockPort = request.port - Mock mock = new Mock(name, mockPath, mockPort) + Mock mock = new Mock(request.name, request.path, request.port) mock.predicate = request.predicate mock.response = request.response mock.soap = request.soap @@ -99,10 +96,10 @@ class HttpMockServer { } private HttpServerWraper getOrCreateChildServer(int mockPort) { - HttpServerWraper child = childServers.find { it.port == mockPort } + HttpServerWraper child = childServers[mockPort] if (!child) { child = new HttpServerWraper(mockPort) - childServers << child + childServers.put(mockPort, child) } return child } @@ -114,7 +111,7 @@ class HttpMockServer { throw new RuntimeException('mock not registered') } log.info("Removing mock $name") - List mockEvents = skipReport ? [] : childServers.collect { + List mockEvents = skipReport ? [] : childServers.values().collect { it.removeMock(name) }.flatten() as List mockNames.remove(name) @@ -154,7 +151,7 @@ class HttpMockServer { throw new RuntimeException('mock not registered') } log.trace("Peeking mock $name") - List mockEvents = childServers.collect { it.peekMock(name) }.flatten() as List + List mockEvents = childServers.values().collect { it.peekMock(name) }.flatten() as List MockPeeked mockPeeked = new MockPeeked( mockEvents: createMockEventReports(mockEvents) ) @@ -166,7 +163,7 @@ class HttpMockServer { } void stop() { - childServers.each { it.stop() } + childServers.values().each { it.stop() } httpServerWraper.stop() } } diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy index 43692f6..b13b7a2 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy @@ -19,7 +19,7 @@ class HttpServerWraper { this.port = port InetSocketAddress addr = new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), port) httpServer = HttpServer.create(addr, 0) - httpServer.executor = Executors.newCachedThreadPool() + httpServer.executor = Executors.newWorkStealingPool() log.info("Http server starting on port $port...") httpServer.start() log.info('Http server is started') @@ -45,14 +45,14 @@ class HttpServerWraper { } List removeMock(String name) { - return executors.collect { it.removeMock(name) }.flatten() + return executors.collect { it.removeMock(name) }.flatten() as List } List peekMock(String name) { - return executors.collect { it.peekMock(name) }.flatten() + return executors.collect { it.peekMock(name) }.flatten() as List } List getMocks() { - return executors.collect { it.mocks }.flatten() + return executors.collect { it.mocks }.flatten() as List } } diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy index 25f0168..5f3aa06 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -3,6 +3,7 @@ package pl.touk.mockserver.server import groovy.transform.EqualsAndHashCode import groovy.transform.PackageScope import groovy.util.logging.Slf4j +import pl.touk.mockserver.api.request.Method import java.util.concurrent.CopyOnWriteArrayList @@ -21,7 +22,7 @@ class Mock implements Comparable { Closure responseHeaders = toClosure(responseHeadersClosureText) boolean soap = false int statusCode = 200 - String method = 'POST' + Method method = Method.POST int counter = 0 final List history = new CopyOnWriteArrayList<>() @@ -34,7 +35,7 @@ class Mock implements Comparable { this.port = port } - boolean match(String method, MockRequest request) { + boolean match(Method method, MockRequest request) { return this.method == method && predicate(request) } @@ -90,7 +91,7 @@ class Mock implements Comparable { } } - void setMethod(String method) { + void setMethod(Method method) { if (method) { this.method = method } diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy index 5e6ddc8..c4ebe01 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy @@ -46,7 +46,7 @@ class MockRequest { } private static GPathResult getSoapBodyContent(GPathResult xml) { - return xml.Body.'**'[1] + return xml.Body.'**'[1] as GPathResult } private static Object inputToJson(String text) { @@ -66,7 +66,7 @@ class MockRequest { private static Map headersToMap(Headers headers) { return headers.collectEntries { [it.key.toLowerCase(), it.value.join(',')] - } + } as Map } }