From 332383ff152b263ea1e1bc394e365642552f3e8b Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Thu, 12 Mar 2015 11:10:09 +0100 Subject: [PATCH] Add additional logs on server and additional info in list mock operation --- .../mockserver/client/RegisteredMock.groovy | 10 ++++++++- .../mockserver/client/RemoteMockServer.groovy | 2 +- .../tests/MockServerIntegrationTest.groovy | 15 ++++++++----- .../mockserver/server/ContextExecutor.groovy | 11 +++++++--- .../mockserver/server/HttpMockServer.groovy | 5 ++++- .../pl/touk/mockserver/server/Mock.groovy | 22 ++++++++++++++----- 6 files changed, 47 insertions(+), 18 deletions(-) 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) } }