Some smal improvements

Change-Id: I3559572293359bf3fb1c4e4e6892e19d4373ba63
This commit is contained in:
Dominik Adam Przybysz 2015-08-30 00:52:24 +02:00
parent ed217704f4
commit 4e70d3b8bd
7 changed files with 45 additions and 33 deletions

View file

@ -2,6 +2,7 @@ package pl.touk.mockserver.api.response;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import pl.touk.mockserver.api.request.Method;
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElement;
@ -24,4 +25,13 @@ public class MockReport {
@XmlElement(required = true) @XmlElement(required = true)
private String responseHeaders; private String responseHeaders;
@XmlElement(required = true)
private boolean soap;
@XmlElement(required = true)
private Method method;
@XmlElement(required = true)
private int statusCode;
} }

View file

@ -611,7 +611,10 @@ class MockServerIntegrationTest extends Specification {
remoteMockServer.addMock(new AddMock( remoteMockServer.addMock(new AddMock(
name: 'testRest4', name: 'testRest4',
path: 'testEndpoint', path: 'testEndpoint',
port: 9999 port: 9999,
soap: true,
statusCode: 204,
method: Method.PUT
)) ))
remoteMockServer.addMock(new AddMock( remoteMockServer.addMock(new AddMock(
name: 'testRest3', name: 'testRest3',
@ -636,11 +639,11 @@ class MockServerIntegrationTest extends Specification {
remoteMockServer.removeMock('testRest5') remoteMockServer.removeMock('testRest5')
expect: expect:
remoteMockServer.listMocks() == [ remoteMockServer.listMocks() == [
new MockReport(name: 'testRest', path: 'testEndpoint', 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 -> '<response/>' }''', responseHeaders: '{ _ -> [a: "b"] }'), new MockReport(name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '<response/>' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST),
new MockReport(name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }'), 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: '{ _ -> [:] }'), 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: '{ _ -> [:] }') new MockReport(name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST)
] ]
} }

View file

@ -3,6 +3,7 @@ package pl.touk.mockserver.server
import com.sun.net.httpserver.HttpExchange import com.sun.net.httpserver.HttpExchange
import groovy.transform.PackageScope import groovy.transform.PackageScope
import groovy.util.logging.Slf4j import groovy.util.logging.Slf4j
import pl.touk.mockserver.api.request.Method
import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.CopyOnWriteArrayList
@ -24,7 +25,7 @@ class ContextExecutor {
log.debug("Request: ${request.text}") log.debug("Request: ${request.text}")
for (Mock mock : mocks) { for (Mock mock : mocks) {
try { try {
if (mock.match(ex.requestMethod, request)) { if (mock.match(Method.valueOf(ex.requestMethod), request)) {
log.debug("Mock ${mock.name} match request ${request.text}") log.debug("Mock ${mock.name} match request ${request.text}")
MockResponse httpResponse = mock.apply(request) MockResponse httpResponse = mock.apply(request)
fillExchange(ex, httpResponse) fillExchange(ex, httpResponse)

View file

@ -2,14 +2,11 @@ package pl.touk.mockserver.server
import com.sun.net.httpserver.HttpExchange import com.sun.net.httpserver.HttpExchange
import groovy.util.logging.Slf4j import groovy.util.logging.Slf4j
import pl.touk.mockserver.api.request.AddMock import pl.touk.mockserver.api.request.*
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.response.* import pl.touk.mockserver.api.response.*
import javax.xml.bind.JAXBContext import javax.xml.bind.JAXBContext
import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.CopyOnWriteArraySet import java.util.concurrent.CopyOnWriteArraySet
import static pl.touk.mockserver.server.Util.createResponse import static pl.touk.mockserver.server.Util.createResponse
@ -18,7 +15,7 @@ import static pl.touk.mockserver.server.Util.createResponse
class HttpMockServer { class HttpMockServer {
private final HttpServerWraper httpServerWraper private final HttpServerWraper httpServerWraper
private final List<HttpServerWraper> childServers = new CopyOnWriteArrayList<>() private final Map<Integer, HttpServerWraper> childServers = new ConcurrentHashMap<>()
private final Set<String> mockNames = new CopyOnWriteArraySet<>() private final Set<String> mockNames = new CopyOnWriteArraySet<>()
private static private static
@ -61,7 +58,10 @@ class HttpMockServer {
port: it.port, port: it.port,
predicate: it.predicateClosureText, predicate: it.predicateClosureText,
response: it.responseClosureText, 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<Mock> listMocks() { Set<Mock> listMocks() {
return childServers.collect { it.mocks }.flatten() as TreeSet<Mock> return childServers.values().collect { it.mocks }.flatten() as TreeSet<Mock>
} }
private void addMock(AddMock request, HttpExchange ex) { private void addMock(AddMock request, HttpExchange ex) {
@ -85,10 +85,7 @@ class HttpMockServer {
} }
private static Mock mockFromRequest(AddMock request) { private static Mock mockFromRequest(AddMock request) {
String name = request.name Mock mock = new Mock(request.name, request.path, request.port)
String mockPath = request.path
int mockPort = request.port
Mock mock = new Mock(name, mockPath, mockPort)
mock.predicate = request.predicate mock.predicate = request.predicate
mock.response = request.response mock.response = request.response
mock.soap = request.soap mock.soap = request.soap
@ -99,10 +96,10 @@ class HttpMockServer {
} }
private HttpServerWraper getOrCreateChildServer(int mockPort) { private HttpServerWraper getOrCreateChildServer(int mockPort) {
HttpServerWraper child = childServers.find { it.port == mockPort } HttpServerWraper child = childServers[mockPort]
if (!child) { if (!child) {
child = new HttpServerWraper(mockPort) child = new HttpServerWraper(mockPort)
childServers << child childServers.put(mockPort, child)
} }
return child return child
} }
@ -114,7 +111,7 @@ class HttpMockServer {
throw new RuntimeException('mock not registered') throw new RuntimeException('mock not registered')
} }
log.info("Removing mock $name") log.info("Removing mock $name")
List<MockEvent> mockEvents = skipReport ? [] : childServers.collect { List<MockEvent> mockEvents = skipReport ? [] : childServers.values().collect {
it.removeMock(name) it.removeMock(name)
}.flatten() as List<MockEvent> }.flatten() as List<MockEvent>
mockNames.remove(name) mockNames.remove(name)
@ -154,7 +151,7 @@ class HttpMockServer {
throw new RuntimeException('mock not registered') throw new RuntimeException('mock not registered')
} }
log.trace("Peeking mock $name") log.trace("Peeking mock $name")
List<MockEvent> mockEvents = childServers.collect { it.peekMock(name) }.flatten() as List<MockEvent> List<MockEvent> mockEvents = childServers.values().collect { it.peekMock(name) }.flatten() as List<MockEvent>
MockPeeked mockPeeked = new MockPeeked( MockPeeked mockPeeked = new MockPeeked(
mockEvents: createMockEventReports(mockEvents) mockEvents: createMockEventReports(mockEvents)
) )
@ -166,7 +163,7 @@ class HttpMockServer {
} }
void stop() { void stop() {
childServers.each { it.stop() } childServers.values().each { it.stop() }
httpServerWraper.stop() httpServerWraper.stop()
} }
} }

View file

@ -19,7 +19,7 @@ class HttpServerWraper {
this.port = port this.port = port
InetSocketAddress addr = new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), port) InetSocketAddress addr = new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), port)
httpServer = HttpServer.create(addr, 0) httpServer = HttpServer.create(addr, 0)
httpServer.executor = Executors.newCachedThreadPool() httpServer.executor = Executors.newWorkStealingPool()
log.info("Http server starting on port $port...") log.info("Http server starting on port $port...")
httpServer.start() httpServer.start()
log.info('Http server is started') log.info('Http server is started')
@ -45,14 +45,14 @@ class HttpServerWraper {
} }
List<MockEvent> removeMock(String name) { List<MockEvent> removeMock(String name) {
return executors.collect { it.removeMock(name) }.flatten() return executors.collect { it.removeMock(name) }.flatten() as List<MockEvent>
} }
List<MockEvent> peekMock(String name) { List<MockEvent> peekMock(String name) {
return executors.collect { it.peekMock(name) }.flatten() return executors.collect { it.peekMock(name) }.flatten() as List<MockEvent>
} }
List<Mock> getMocks() { List<Mock> getMocks() {
return executors.collect { it.mocks }.flatten() return executors.collect { it.mocks }.flatten() as List<Mock>
} }
} }

View file

@ -3,6 +3,7 @@ package pl.touk.mockserver.server
import groovy.transform.EqualsAndHashCode import groovy.transform.EqualsAndHashCode
import groovy.transform.PackageScope import groovy.transform.PackageScope
import groovy.util.logging.Slf4j import groovy.util.logging.Slf4j
import pl.touk.mockserver.api.request.Method
import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.CopyOnWriteArrayList
@ -21,7 +22,7 @@ class Mock implements Comparable<Mock> {
Closure responseHeaders = toClosure(responseHeadersClosureText) Closure responseHeaders = toClosure(responseHeadersClosureText)
boolean soap = false boolean soap = false
int statusCode = 200 int statusCode = 200
String method = 'POST' Method method = Method.POST
int counter = 0 int counter = 0
final List<MockEvent> history = new CopyOnWriteArrayList<>() final List<MockEvent> history = new CopyOnWriteArrayList<>()
@ -34,7 +35,7 @@ class Mock implements Comparable<Mock> {
this.port = port this.port = port
} }
boolean match(String method, MockRequest request) { boolean match(Method method, MockRequest request) {
return this.method == method && predicate(request) return this.method == method && predicate(request)
} }
@ -90,7 +91,7 @@ class Mock implements Comparable<Mock> {
} }
} }
void setMethod(String method) { void setMethod(Method method) {
if (method) { if (method) {
this.method = method this.method = method
} }

View file

@ -46,7 +46,7 @@ class MockRequest {
} }
private static GPathResult getSoapBodyContent(GPathResult xml) { private static GPathResult getSoapBodyContent(GPathResult xml) {
return xml.Body.'**'[1] return xml.Body.'**'[1] as GPathResult
} }
private static Object inputToJson(String text) { private static Object inputToJson(String text) {
@ -66,7 +66,7 @@ class MockRequest {
private static Map<String, String> headersToMap(Headers headers) { private static Map<String, String> headersToMap(Headers headers) {
return headers.collectEntries { return headers.collectEntries {
[it.key.toLowerCase(), it.value.join(',')] [it.key.toLowerCase(), it.value.join(',')]
} } as Map<String, String>
} }
} }