Add additional logs on server and additional info in list mock operation

This commit is contained in:
Dominik Przybysz 2015-03-12 11:10:09 +01:00
parent bc3c3d1dc0
commit 332383ff15
6 changed files with 47 additions and 18 deletions

View file

@ -2,19 +2,27 @@ package pl.touk.mockserver.client
import groovy.transform.CompileStatic import groovy.transform.CompileStatic
import groovy.transform.EqualsAndHashCode import groovy.transform.EqualsAndHashCode
import groovy.transform.ToString
import groovy.transform.TypeChecked import groovy.transform.TypeChecked
@CompileStatic @CompileStatic
@TypeChecked @TypeChecked
@EqualsAndHashCode @EqualsAndHashCode
@ToString
class RegisteredMock { class RegisteredMock {
final String name final String name
final String path final String path
final int port 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.name = name
this.path = path this.path = path
this.port = port this.port = port
this.predicate = predicate
this.response = response
this.responseHeaders = responseHeaders
} }
} }

View file

@ -107,7 +107,7 @@ class RemoteMockServer {
CloseableHttpResponse response = client.execute(get) CloseableHttpResponse response = client.execute(get)
GPathResult xml = Util.extractXmlResponse(response) GPathResult xml = Util.extractXmlResponse(response)
if (xml.name() == 'mocks') { 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 [] return []
} }

View file

@ -576,7 +576,10 @@ class MockServerIntegrationTest extends Specification {
remoteMockServer.addMock(new AddMockRequestData( remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2', name: 'testRest2',
path: 'testEndpoint', path: 'testEndpoint',
port: 9998 port: 9998,
predicate: '''{ req -> req.xml.name() == 'request1'}''',
response: '''{ req -> '<response/>' }''',
responseHeaders: '{ _ -> [a: "b"] }'
)) ))
remoteMockServer.addMock(new AddMockRequestData( remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest4', name: 'testRest4',
@ -606,11 +609,11 @@ class MockServerIntegrationTest extends Specification {
remoteMockServer.removeMock('testRest5') remoteMockServer.removeMock('testRest5')
expect: expect:
remoteMockServer.listMocks() == [ remoteMockServer.listMocks() == [
new RegisteredMock('testRest', 'testEndpoint', 9999), new RegisteredMock('testRest', 'testEndpoint', 9999, '{ _ -> true }', '''{ _ -> '' }''', '{ _ -> [:] }'),
new RegisteredMock('testRest2', 'testEndpoint', 9998), new RegisteredMock('testRest2', 'testEndpoint', 9998, '''{ req -> req.xml.name() == 'request1'}''', '''{ req -> '<response/>' }''', '{ _ -> [a: "b"] }'),
new RegisteredMock('testRest3', 'testEndpoint2', 9999), new RegisteredMock('testRest3', 'testEndpoint2', 9999, '{ _ -> true }', '''{ _ -> '' }''', '{ _ -> [:] }'),
new RegisteredMock('testRest4', 'testEndpoint', 9999), new RegisteredMock('testRest4', 'testEndpoint', 9999, '{ _ -> true }', '''{ _ -> '' }''', '{ _ -> [:] }'),
new RegisteredMock('testRest6', 'testEndpoint2', 9999) new RegisteredMock('testRest6', 'testEndpoint2', 9999, '{ _ -> true }', '''{ _ -> '' }''', '{ _ -> [:] }')
] ]
} }

View file

@ -17,23 +17,28 @@ class ContextExecutor {
this.httpServerWraper = httpServerWraper this.httpServerWraper = httpServerWraper
this.path = '/' + initialMock.path this.path = '/' + initialMock.path
this.mocks = new CopyOnWriteArrayList<>([initialMock]) this.mocks = new CopyOnWriteArrayList<>([initialMock])
httpServerWraper.createContext(path, { httpServerWraper.createContext(path) {
HttpExchange ex -> HttpExchange ex ->
MockRequest request = new MockRequest(ex.requestBody.text, ex.requestHeaders, ex.requestURI) MockRequest request = new MockRequest(ex.requestBody.text, ex.requestHeaders, ex.requestURI)
log.info("Mock received input") log.info("Mock received input")
log.debug("Request: ${request.text}")
for (Mock mock : mocks) { for (Mock mock : mocks) {
try { try {
if (mock.match(ex.requestMethod, request)) { if (mock.match(ex.requestMethod, request)) {
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)
log.trace("Mock ${mock.name} response with body ${httpResponse.text}")
return return
} }
log.debug("Mock ${mock.name} does not match request")
} catch (Exception e) { } 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) Util.createResponse(ex, request.text, 404)
}) }
} }
String getPath() { String getPath() {

View file

@ -55,6 +55,9 @@ class HttpMockServer {
name mock.name name mock.name
path mock.path path mock.path
port mock.port port mock.port
predicate mock.predicateClosureText
response mock.responseClosureText
responseHeaders mock.responseHeadersClosureText
} }
} }
} }
@ -116,7 +119,7 @@ class HttpMockServer {
if (!(name in mockNames)) { if (!(name in mockNames)) {
throw new RuntimeException('mock not registered') throw new RuntimeException('mock not registered')
} }
log.info("Peeking mock $name") log.trace("Peeking mock $name")
List<MockEvent> mockEvents = childServers.collect { it.peekMock(name) }.flatten() List<MockEvent> mockEvents = childServers.collect { it.peekMock(name) }.flatten()
createResponse(ex, createMockPeekedResponse(mockEvents), 200) createResponse(ex, createMockPeekedResponse(mockEvents), 200)
} }

View file

@ -13,9 +13,12 @@ class Mock implements Comparable<Mock> {
final String name final String name
final String path final String path
final int port final int port
Closure predicate = { _ -> true } String predicateClosureText = '{ _ -> true }'
Closure response = { _ -> '' } String responseClosureText = '''{ _ -> '' }'''
Closure responseHeaders = { _ -> [:] } String responseHeadersClosureText = '{ _ -> [:] }'
Closure predicate = toClosure(predicateClosureText)
Closure response = toClosure(responseClosureText)
Closure responseHeaders =toClosure(responseHeadersClosureText)
boolean soap = false boolean soap = false
int statusCode = 200 int statusCode = 200
String method = 'POST' String method = 'POST'
@ -55,13 +58,19 @@ class Mock implements Comparable<Mock> {
void setPredicate(String predicate) { void setPredicate(String predicate) {
if (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) { void setResponse(String response) {
if (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<Mock> {
void setResponseHeaders(String responseHeaders) { void setResponseHeaders(String responseHeaders) {
if (responseHeaders) { if (responseHeaders) {
this.responseHeaders = Eval.me(responseHeaders) as Closure this.responseHeadersClosureText = responseHeaders
this.responseHeaders = toClosure(responseHeaders)
} }
} }