Add additional logs on server and additional info in list mock operation
This commit is contained in:
parent
bc3c3d1dc0
commit
332383ff15
6 changed files with 47 additions and 18 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 []
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 }', '''{ _ -> '' }''', '{ _ -> [:] }')
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue