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.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
}
}

View file

@ -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 []
}

View file

@ -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 -> '<response/>' }''',
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 -> '<response/>' }''', '{ _ -> [a: "b"] }'),
new RegisteredMock('testRest3', 'testEndpoint2', 9999, '{ _ -> true }', '''{ _ -> '' }''', '{ _ -> [:] }'),
new RegisteredMock('testRest4', 'testEndpoint', 9999, '{ _ -> true }', '''{ _ -> '' }''', '{ _ -> [:] }'),
new RegisteredMock('testRest6', 'testEndpoint2', 9999, '{ _ -> true }', '''{ _ -> '' }''', '{ _ -> [:] }')
]
}

View file

@ -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() {

View file

@ -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<MockEvent> mockEvents = childServers.collect { it.peekMock(name) }.flatten()
createResponse(ex, createMockPeekedResponse(mockEvents), 200)
}

View file

@ -13,9 +13,12 @@ class Mock implements Comparable<Mock> {
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<Mock> {
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<Mock> {
void setResponseHeaders(String responseHeaders) {
if (responseHeaders) {
this.responseHeaders = Eval.me(responseHeaders) as Closure
this.responseHeadersClosureText = responseHeaders
this.responseHeaders = toClosure(responseHeaders)
}
}