diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RegisteredMock.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RegisteredMock.groovy
index d8a92d3..f755592 100644
--- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RegisteredMock.groovy
+++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RegisteredMock.groovy
@@ -2,19 +2,27 @@ package pl.touk.mockserver.client
import groovy.transform.CompileStatic
import groovy.transform.EqualsAndHashCode
+import groovy.transform.ToString
import groovy.transform.TypeChecked
@CompileStatic
@TypeChecked
@EqualsAndHashCode
+@ToString
class RegisteredMock {
final String name
final String path
final int port
+ final String predicate
+ final String response
+ final String responseHeaders
- RegisteredMock(String name, String path, int port) {
+ RegisteredMock(String name, String path, int port, String predicate, String response, String responseHeaders) {
this.name = name
this.path = path
this.port = port
+ this.predicate = predicate
+ this.response = response
+ this.responseHeaders = responseHeaders
}
}
diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy
index e06145e..f462d3f 100644
--- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy
+++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy
@@ -107,7 +107,7 @@ class RemoteMockServer {
CloseableHttpResponse response = client.execute(get)
GPathResult xml = Util.extractXmlResponse(response)
if (xml.name() == 'mocks') {
- return xml.mock.collect { new RegisteredMock(it.name.text(), it.path.text(), it.port.text() as int) }
+ return xml.mock.collect { new RegisteredMock(it.name.text(), it.path.text(), it.port.text() as int, it.predicate.text(), it.response.text(), it.responseHeaders.text()) }
}
return []
}
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 9640ef8..819e35d 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
@@ -576,7 +576,10 @@ class MockServerIntegrationTest extends Specification {
remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2',
path: 'testEndpoint',
- port: 9998
+ port: 9998,
+ predicate: '''{ req -> req.xml.name() == 'request1'}''',
+ response: '''{ req -> '' }''',
+ responseHeaders: '{ _ -> [a: "b"] }'
))
remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest4',
@@ -606,11 +609,11 @@ class MockServerIntegrationTest extends Specification {
remoteMockServer.removeMock('testRest5')
expect:
remoteMockServer.listMocks() == [
- new RegisteredMock('testRest', 'testEndpoint', 9999),
- new RegisteredMock('testRest2', 'testEndpoint', 9998),
- new RegisteredMock('testRest3', 'testEndpoint2', 9999),
- new RegisteredMock('testRest4', 'testEndpoint', 9999),
- new RegisteredMock('testRest6', 'testEndpoint2', 9999)
+ new RegisteredMock('testRest', 'testEndpoint', 9999, '{ _ -> true }', '''{ _ -> '' }''', '{ _ -> [:] }'),
+ new RegisteredMock('testRest2', 'testEndpoint', 9998, '''{ req -> req.xml.name() == 'request1'}''', '''{ req -> '' }''', '{ _ -> [a: "b"] }'),
+ new RegisteredMock('testRest3', 'testEndpoint2', 9999, '{ _ -> true }', '''{ _ -> '' }''', '{ _ -> [:] }'),
+ new RegisteredMock('testRest4', 'testEndpoint', 9999, '{ _ -> true }', '''{ _ -> '' }''', '{ _ -> [:] }'),
+ new RegisteredMock('testRest6', 'testEndpoint2', 9999, '{ _ -> true }', '''{ _ -> '' }''', '{ _ -> [:] }')
]
}
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 8c5b948..d5a8230 100644
--- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy
+++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy
@@ -17,23 +17,28 @@ class ContextExecutor {
this.httpServerWraper = httpServerWraper
this.path = '/' + initialMock.path
this.mocks = new CopyOnWriteArrayList<>([initialMock])
- httpServerWraper.createContext(path, {
+ httpServerWraper.createContext(path) {
HttpExchange ex ->
MockRequest request = new MockRequest(ex.requestBody.text, ex.requestHeaders, ex.requestURI)
log.info("Mock received input")
+ log.debug("Request: ${request.text}")
for (Mock mock : mocks) {
try {
if (mock.match(ex.requestMethod, request)) {
+ log.debug("Mock ${mock.name} match request ${request.text}")
MockResponse httpResponse = mock.apply(request)
fillExchange(ex, httpResponse)
+ log.trace("Mock ${mock.name} response with body ${httpResponse.text}")
return
}
+ log.debug("Mock ${mock.name} does not match request")
} catch (Exception e) {
- e.printStackTrace()
+ log.warn("An exception occured when matching or applying mock ${mock.name}", e)
}
}
+ log.warn("Any mock does not match request ${request.text}")
Util.createResponse(ex, request.text, 404)
- })
+ }
}
String getPath() {
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 04d72cf..ac1a4ff 100644
--- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy
+++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy
@@ -55,6 +55,9 @@ class HttpMockServer {
name mock.name
path mock.path
port mock.port
+ predicate mock.predicateClosureText
+ response mock.responseClosureText
+ responseHeaders mock.responseHeadersClosureText
}
}
}
@@ -116,7 +119,7 @@ class HttpMockServer {
if (!(name in mockNames)) {
throw new RuntimeException('mock not registered')
}
- log.info("Peeking mock $name")
+ log.trace("Peeking mock $name")
List mockEvents = childServers.collect { it.peekMock(name) }.flatten()
createResponse(ex, createMockPeekedResponse(mockEvents), 200)
}
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 5408c15..bf0e04d 100644
--- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy
+++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy
@@ -13,9 +13,12 @@ class Mock implements Comparable {
final String name
final String path
final int port
- Closure predicate = { _ -> true }
- Closure response = { _ -> '' }
- Closure responseHeaders = { _ -> [:] }
+ String predicateClosureText = '{ _ -> true }'
+ String responseClosureText = '''{ _ -> '' }'''
+ String responseHeadersClosureText = '{ _ -> [:] }'
+ Closure predicate = toClosure(predicateClosureText)
+ Closure response = toClosure(responseClosureText)
+ Closure responseHeaders =toClosure(responseHeadersClosureText)
boolean soap = false
int statusCode = 200
String method = 'POST'
@@ -55,13 +58,19 @@ class Mock implements Comparable {
void setPredicate(String predicate) {
if (predicate) {
- this.predicate = Eval.me(predicate) as Closure
+ this.predicateClosureText = predicate
+ this.predicate = toClosure(predicate)
}
}
+ private Closure toClosure(String predicate) {
+ return Eval.me(predicate) as Closure
+ }
+
void setResponse(String response) {
if (response) {
- this.response = Eval.me(response) as Closure
+ this.responseClosureText = response
+ this.response = toClosure(response)
}
}
@@ -85,7 +94,8 @@ class Mock implements Comparable {
void setResponseHeaders(String responseHeaders) {
if (responseHeaders) {
- this.responseHeaders = Eval.me(responseHeaders) as Closure
+ this.responseHeadersClosureText = responseHeaders
+ this.responseHeaders = toClosure(responseHeaders)
}
}