From 7b92da8d48cdd161aa8092a82ccf7edff8431cd8 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 21 Jan 2015 14:55:26 +0100 Subject: [PATCH 001/116] [maven-release-plugin] prepare for next development iteration --- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index fee8eb7..70c2bb1 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.1.1 + 1.0.2-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 1290520..be88656 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.1.1 + 1.0.2-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 347659b..8180805 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.1.1 + 1.0.2-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index f157c2b..d729c10 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.0.1.1 + 1.0.2-SNAPSHOT mockserver-client mockserver From c12eeb7a07f78626613fde41c87213e0309ab64a Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sun, 1 Feb 2015 20:34:44 +0100 Subject: [PATCH 002/116] Extract Method enum to separate file Change-Id: Ibb35bb26ca94689fc400cd510565c86e3d61087c --- README.md | 2 +- .../mockserver/client/AddMockRequestData.groovy | 12 +----------- .../groovy/pl/touk/mockserver/client/Method.groovy | 12 ++++++++++++ .../tests/MockServerIntegrationTest.groovy | 14 +++++++------- 4 files changed, 21 insertions(+), 19 deletions(-) create mode 100644 mockserver-client/src/main/groovy/pl/touk/mockserver/client/Method.groovy diff --git a/README.md b/README.md index 550d434..cb873b3 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ or via sending POST request to localhost:/serverControl ... ... ... - ,,, + ... ``` diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy index 4e3dfbe..6da9a6e 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy @@ -28,15 +28,5 @@ class AddMockRequestData { void setResponseHeaders(String responseHeaders) { this.responseHeaders = StringEscapeUtils.escapeXml11(responseHeaders) } - - enum Method { - POST, - GET, - DELETE, - PUT, - TRACE, - HEAD, - OPTIONS, - PATCH - } } + diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Method.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Method.groovy new file mode 100644 index 0000000..82aefea --- /dev/null +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Method.groovy @@ -0,0 +1,12 @@ +package pl.touk.mockserver.client + +enum Method { + POST, + GET, + DELETE, + PUT, + TRACE, + HEAD, + OPTIONS, + PATCH +} 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 aaf0e8a..9640ef8 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 @@ -298,7 +298,7 @@ class MockServerIntegrationTest extends Specification { path: 'testEndpoint', port: 9999, response: '''{_ -> ""}''', - method: AddMockRequestData.Method.GET + method: Method.GET )) HttpGet restGet = new HttpGet('http://localhost:9999/testEndpoint') when: @@ -321,7 +321,7 @@ class MockServerIntegrationTest extends Specification { path: 'testEndpoint', port: 9999, response: '''{_ -> ""}''', - method: AddMockRequestData.Method.TRACE + method: Method.TRACE )) HttpTrace restTrace = new HttpTrace('http://localhost:9999/testEndpoint') when: @@ -343,7 +343,7 @@ class MockServerIntegrationTest extends Specification { name: 'testRest2', path: 'testEndpoint', port: 9999, - method: AddMockRequestData.Method.HEAD + method: Method.HEAD )) HttpHead restHead = new HttpHead('http://localhost:9999/testEndpoint') when: @@ -365,7 +365,7 @@ class MockServerIntegrationTest extends Specification { name: 'testRest2', path: 'testEndpoint', port: 9999, - method: AddMockRequestData.Method.OPTIONS + method: Method.OPTIONS )) HttpOptions restOptions = new HttpOptions('http://localhost:9999/testEndpoint') when: @@ -389,7 +389,7 @@ class MockServerIntegrationTest extends Specification { port: 9999, predicate: '''{req -> req.xml.name() == 'request1'}''', response: '''{_ -> ""}''', - method: AddMockRequestData.Method.PUT + method: Method.PUT )) HttpPut request = new HttpPut('http://localhost:9999/test1') request.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) @@ -413,7 +413,7 @@ class MockServerIntegrationTest extends Specification { path: 'test1', port: 9999, response: '''{_ -> ""}''', - method: AddMockRequestData.Method.DELETE + method: Method.DELETE )) HttpDelete request = new HttpDelete('http://localhost:9999/test1') when: @@ -437,7 +437,7 @@ class MockServerIntegrationTest extends Specification { port: 9999, predicate: '''{req -> req.xml.name() == 'request1'}''', response: '''{_ -> ""}''', - method: AddMockRequestData.Method.PATCH + method: Method.PATCH )) HttpPatch request = new HttpPatch('http://localhost:9999/test1') request.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) From e13b331a1e0b09145a0bd9c15c304f9d7d67442b Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sun, 1 Feb 2015 22:03:56 +0100 Subject: [PATCH 003/116] Add description of request object in closures Change-Id: I045d91431b37ded10b37cfc017d0be1dfddfe0da --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index cb873b3..daa1f09 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,17 @@ or via sending POST request to localhost:/serverControl * method - POST|PUT|DELETE|GET|TRACE|OPTION|HEAD, expected http method of request, default POST * responseHeaders - groovyClosure as string which must evaluate to Map which will be added to response headers, default { _ -> [:] } +In closures input parameter (called req) contains properties: + + +* text - request body as java.util.String +* headers - java.util.Map with request headers +* query - java.util.Map with query parameters +* xml - groovy.util.slurpersupport.GPathResult created from request body (if request body is valid xml) +* soap - groovy.util.slurpersupport.GPathResult created from request body without Envelope and Body elements (if request body is valid soap xml) +* json - java.lang.Object created from request body (if request body is valid json) +* path - java.util.List with not empty parts of request path + Response if success: ``` From 7768d98fe6b841a5fddef2a3b3fc584c35e58d2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20P=C4=99ksa?= Date: Wed, 4 Mar 2015 10:25:30 +0100 Subject: [PATCH 004/116] Bump spock and groovy versions Change-Id: I185f6091531c4d3f913fd4387632fae40c918e20 --- pom.xml | 72 +++++++++++---------------------------------------------- 1 file changed, 13 insertions(+), 59 deletions(-) diff --git a/pom.xml b/pom.xml index d729c10..d39d515 100644 --- a/pom.xml +++ b/pom.xml @@ -16,11 +16,9 @@ UTF-8 UTF-8 3.1 - 2.8.0-01 - 2.1.8-01 - 2.3.3 + 2.4.1 4.3.5 - 1.0-groovy-2.0-SNAPSHOT + 1.0-groovy-2.4 3.3.2 1.7.7 1.0.13 @@ -71,64 +69,20 @@ - maven-compiler-plugin - ${maven-compiler-plugin.version} - - groovy-eclipse-compiler - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy-eclipse-compiler.version} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy-eclipse-batch.version} - - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy-eclipse-compiler.version} - true + org.codehaus.gmavenplus + gmavenplus-plugin + + + + compile + testCompile + + + - - - sonatype-snapshots - https://oss.sonatype.org/content/repositories/snapshots/ - - - - central.releases - TouK Virtual Repository - http://nexus.touk.pl/nexus/content/groups/public/ - - true - - - false - - - - - central.snapshots - TouK Virtual Repository - http://nexus.touk.pl/nexus/content/groups/public-snapshots - - false - - - true - - - - touk.nexus.release @@ -142,4 +96,4 @@ - \ No newline at end of file + From 06d59c233212d1f148f891c5d66eeff9c408bae8 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 4 Mar 2015 10:31:49 +0100 Subject: [PATCH 005/116] Add gmavenplus plugin version --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index d39d515..58d1d50 100644 --- a/pom.xml +++ b/pom.xml @@ -71,6 +71,7 @@ org.codehaus.gmavenplus gmavenplus-plugin + 1.4 From 5f83edc2557be7c330d57386f29e9ab29d411615 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 4 Mar 2015 10:32:26 +0100 Subject: [PATCH 006/116] [maven-release-plugin] prepare release http-mock-server-1.0.2 --- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 70c2bb1..78d1a5d 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.2-SNAPSHOT + 1.0.2 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index be88656..2d4472d 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.2-SNAPSHOT + 1.0.2 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 8180805..037224a 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.2-SNAPSHOT + 1.0.2 4.0.0 diff --git a/pom.xml b/pom.xml index 58d1d50..809da31 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.0.2-SNAPSHOT + 1.0.2 mockserver-client mockserver From bc3c3d1dc0153c5d2495514b6dd6ce06e7981347 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 4 Mar 2015 10:32:27 +0100 Subject: [PATCH 007/116] [maven-release-plugin] prepare for next development iteration --- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 78d1a5d..9ca8edb 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.2 + 1.0.3-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 2d4472d..1eb4ac6 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.2 + 1.0.3-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 037224a..0cbace1 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.2 + 1.0.3-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 809da31..1808829 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.0.2 + 1.0.3-SNAPSHOT mockserver-client mockserver From 332383ff152b263ea1e1bc394e365642552f3e8b Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Thu, 12 Mar 2015 11:10:09 +0100 Subject: [PATCH 008/116] 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) } } From c5ea379aae8027eab6f09405dd51a4f9c1e4aab7 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Thu, 12 Mar 2015 11:10:43 +0100 Subject: [PATCH 009/116] [maven-release-plugin] prepare release http-mock-server-1.0.3 --- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 9ca8edb..d382de1 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.3-SNAPSHOT + 1.0.3 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 1eb4ac6..31274e4 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.3-SNAPSHOT + 1.0.3 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 0cbace1..201d0a9 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.3-SNAPSHOT + 1.0.3 4.0.0 diff --git a/pom.xml b/pom.xml index 1808829..58e2ee0 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.0.3-SNAPSHOT + 1.0.3 mockserver-client mockserver From f6f2cc5f5d085c1e21726c1f4605ad87f7768a27 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Thu, 12 Mar 2015 11:10:44 +0100 Subject: [PATCH 010/116] [maven-release-plugin] prepare for next development iteration --- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index d382de1..6cc29d3 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.3 + 1.0.4-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 31274e4..5952dc6 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.3 + 1.0.4-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 201d0a9..c6f9068 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.3 + 1.0.4-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 58e2ee0..c3c2b87 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.0.3 + 1.0.4-SNAPSHOT mockserver-client mockserver From b3c4ae2fabdee20e7beb4bbef556275b8e3140a7 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Fri, 20 Mar 2015 18:10:49 +0100 Subject: [PATCH 011/116] Add default goals Change-Id: I07041d14d295aa787cfaa04d6209244bd9a86062 --- mockserver-client/pom.xml | 5 ++++- mockserver-tests/pom.xml | 6 +++++- mockserver/pom.xml | 3 ++- pom.xml | 1 + 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 6cc29d3..64d015b 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -9,6 +9,9 @@ mockserver-client + + clean install + org.codehaus.groovy @@ -23,4 +26,4 @@ commons-lang3 - \ No newline at end of file + diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 5952dc6..f2b962a 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -9,6 +9,10 @@ mockserver-tests + + clean install + + org.codehaus.groovy @@ -42,4 +46,4 @@ - \ No newline at end of file + diff --git a/mockserver/pom.xml b/mockserver/pom.xml index c6f9068..009acd1 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -29,6 +29,7 @@ + clean package assembly:single install maven-assembly-plugin @@ -45,4 +46,4 @@ - \ No newline at end of file + diff --git a/pom.xml b/pom.xml index c3c2b87..7069e54 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,7 @@ + clean install org.codehaus.gmavenplus From 3763628379e655bfe22c4f61e4a1f168f47d1e72 Mon Sep 17 00:00:00 2001 From: Piotr Jagielski Date: Tue, 31 Mar 2015 20:49:47 +0200 Subject: [PATCH 012/116] Update README.md --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index daa1f09..21370df 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ java -jar mockserver--jar-with-dependencies.jar [PORT] ## Create mock on server via client -``` +```java RemoteMockServer remoteMockServer = new RemoteMockServer('localhost', ) remoteMockServer.addMock(new AddMockRequestData( name: '...', @@ -32,7 +32,7 @@ remoteMockServer.addMock(new AddMockRequestData( or via sending POST request to localhost:/serverControl -``` +```xml ... ... @@ -69,26 +69,26 @@ In closures input parameter (called req) contains properties: Response if success: -``` +```xml ``` Response with error message if failure: -``` +```xml ... ``` ## Mock could be peeked to get get report of its invocations. Via client: -``` +```java List mockEvents = remoteMockServer.peekMock('...') ``` Via sending POST request to localhost:/serverControl -``` +```xml ... @@ -96,7 +96,7 @@ Via sending POST request to localhost:/serverControl Response if success: -``` +```xml @@ -129,20 +129,20 @@ Response if success: Response with error message if failure: -``` +```xml ... ``` ## When mock was used it could be unregistered by name. It also returns report of mock invocations. Via client: -``` +```java List mockEvents = remoteMockServer.removeMock('...') ``` Via sending POST request to localhost:/serverControl -``` +```xml ... @@ -150,7 +150,7 @@ Via sending POST request to localhost:/serverControl Response if success: -``` +```xml @@ -183,7 +183,7 @@ Response if success: Response with error message if failure: -``` +```xml ... ``` @@ -191,7 +191,7 @@ Response with error message if failure: ## List of current registered mocks could be retrieved: Via client: -``` +```java List mocks = remoteMockServer.listMocks() ``` @@ -199,7 +199,7 @@ or via sending GET request to localhost:/serverControl Response: -``` +```xml ... From ee42225e9c9e465bc102b8473c51b97516d98990 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 16 May 2015 14:22:41 +0200 Subject: [PATCH 013/116] Compile mock closures with mockserver classloader Change-Id: Ic57efa8017650f308c1862dce418b629262a3ef7 --- .../src/main/groovy/pl/touk/mockserver/server/Mock.groovy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 bf0e04d..61a8132 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -64,7 +64,8 @@ class Mock implements Comparable { } private Closure toClosure(String predicate) { - return Eval.me(predicate) as Closure + GroovyShell sh = new GroovyShell(this.class.classLoader); + return sh.evaluate(predicate) as Closure } void setResponse(String response) { From 4c6aa064a8f5f3fe293778ad2fa78a770b084141 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Sat, 16 May 2015 14:48:15 +0200 Subject: [PATCH 014/116] [maven-release-plugin] prepare release http-mock-server-1.0.4 --- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 64d015b..1c7c720 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.4-SNAPSHOT + 1.0.4 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index f2b962a..261b216 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.4-SNAPSHOT + 1.0.4 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 009acd1..1fe4eff 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.4-SNAPSHOT + 1.0.4 4.0.0 diff --git a/pom.xml b/pom.xml index 7069e54..fb3eb7a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.0.4-SNAPSHOT + 1.0.4 mockserver-client mockserver From d0690d019e752d803cc9f29a3f630dc07d5db668 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Sat, 16 May 2015 14:48:15 +0200 Subject: [PATCH 015/116] [maven-release-plugin] prepare for next development iteration --- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 1c7c720..db50169 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.4 + 1.0.5-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 261b216..c99888a 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.4 + 1.0.5-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 1fe4eff..4900bfc 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.4 + 1.0.5-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index fb3eb7a..ae0235e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.0.4 + 1.0.5-SNAPSHOT mockserver-client mockserver From 272ab4e9b986896cb3bf24f82a22cd0c0c425727 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Fri, 29 May 2015 23:08:41 +0200 Subject: [PATCH 016/116] Add travis support Change-Id: Icb6c6d5f59dcc3dda506e7923b5d0e33d13537f8 --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..0bb8603 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: groovy + +jdk: + - oraclejdk7 + - oraclejdk8 From dbfb3727afb3b3a34fe35009f70dff5b4d2f6e6b Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Fri, 29 May 2015 23:26:21 +0200 Subject: [PATCH 017/116] Add badge from travis CI Change-Id: Ide6c240d91c19c63e82ccb6706235d89c803aa95 --- .travis.yml | 1 + README.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0bb8603..ad81e63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,3 +3,4 @@ language: groovy jdk: - oraclejdk7 - oraclejdk8 + diff --git a/README.md b/README.md index 21370df..e2ce7c8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Build Status](https://img.shields.io/travis/TouK/http-mock-server/master.svg?style=flat)](https://travis-ci.org/TouK/http-mock-server) + # HTTP MOCK SERVER ## Create server jar (in mockserver directory) From 57a6e06ac0a56e56b33a36a78abcd4bdfe262acc Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 17 Jun 2015 11:36:41 +0200 Subject: [PATCH 018/116] Let mock server write response in UTF-8 --- .../pl/touk/mockserver/client/Util.groovy | 4 +- .../tests/MockServerIntegrationTest.groovy | 42 ++++++++++++++++++- .../pl/touk/mockserver/server/Util.groovy | 5 ++- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy index 1194202..8cffc3b 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy @@ -13,7 +13,7 @@ import org.apache.http.util.EntityUtils class Util { static GPathResult extractXmlResponse(CloseableHttpResponse response) { HttpEntity entity = response.entity - GPathResult xml = new XmlSlurper().parseText(EntityUtils.toString(entity)) + GPathResult xml = new XmlSlurper().parseText(EntityUtils.toString(entity, 'UTF-8')) EntityUtils.consumeQuietly(entity) return xml } @@ -27,7 +27,7 @@ class Util { static Object extractJsonResponse(CloseableHttpResponse response) { HttpEntity entity = response.entity - Object json = new JsonSlurper().parseText(EntityUtils.toString(entity)) + Object json = new JsonSlurper().parseText(EntityUtils.toString(entity, 'UTF-8')) EntityUtils.consumeQuietly(entity) return json } 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 819e35d..435d43d 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 @@ -1,13 +1,29 @@ package pl.touk.mockserver.tests import groovy.util.slurpersupport.GPathResult -import org.apache.http.client.methods.* +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.client.methods.HttpDelete +import org.apache.http.client.methods.HttpGet +import org.apache.http.client.methods.HttpHead +import org.apache.http.client.methods.HttpOptions +import org.apache.http.client.methods.HttpPatch +import org.apache.http.client.methods.HttpPost +import org.apache.http.client.methods.HttpPut +import org.apache.http.client.methods.HttpTrace import org.apache.http.entity.ContentType import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients import org.apache.http.util.EntityUtils -import pl.touk.mockserver.client.* +import pl.touk.mockserver.client.AddMockRequestData +import pl.touk.mockserver.client.InvalidMockDefinition +import pl.touk.mockserver.client.Method +import pl.touk.mockserver.client.MockAlreadyExists +import pl.touk.mockserver.client.MockDoesNotExist +import pl.touk.mockserver.client.MockEvent +import pl.touk.mockserver.client.RegisteredMock +import pl.touk.mockserver.client.RemoteMockServer +import pl.touk.mockserver.client.Util import pl.touk.mockserver.server.HttpMockServer import spock.lang.Shared import spock.lang.Specification @@ -52,6 +68,28 @@ class MockServerIntegrationTest extends Specification { remoteMockServer.removeMock('testRest')?.size() == 1 } + def "should add working rest mock on endpoint with utf"() { + expect: + remoteMockServer.addMock(new AddMockRequestData( + name: 'testRestUtf', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request' && req.xml.@test == 'łżźćąś'}''', + response: '''{req -> ""}''', + soap: false + )) + when: + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then: + GPathResult restPostResponse = Util.extractXmlResponse(response) + restPostResponse.name() == 'goodResponseRest-request' + restPostResponse.@ans == 'łżźćąś' + expect: + remoteMockServer.removeMock('testRestUtf')?.size() == 1 + } + def "should add soap mock on endpoint"() { expect: remoteMockServer.addMock(new AddMockRequestData( diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/Util.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/Util.groovy index 53a0751..93ab7a5 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Util.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Util.groovy @@ -4,9 +4,10 @@ import com.sun.net.httpserver.HttpExchange class Util { static void createResponse(HttpExchange ex, String response, int statusCode) { - ex.sendResponseHeaders(statusCode, response ? response.length() : -1) + byte[] responseBytes = response ? response.getBytes('UTF-8') : new byte[0] + ex.sendResponseHeaders(statusCode, responseBytes.length ?: -1) if (response) { - ex.responseBody << response + ex.responseBody << responseBytes ex.responseBody.close() } } From dcead4348eb80ccc4b819d35dd508dfab8e4f123 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 17 Jun 2015 11:38:53 +0200 Subject: [PATCH 019/116] [maven-release-plugin] prepare release http-mock-server-1.0.5 --- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index db50169..f62032d 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.5-SNAPSHOT + 1.0.5 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index c99888a..2244ef0 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.5-SNAPSHOT + 1.0.5 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 4900bfc..e952e1e 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.5-SNAPSHOT + 1.0.5 4.0.0 diff --git a/pom.xml b/pom.xml index ae0235e..368194e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.0.5-SNAPSHOT + 1.0.5 mockserver-client mockserver From dbdefeb614e1c718f304ab2a5a264097f21506e7 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 17 Jun 2015 11:38:53 +0200 Subject: [PATCH 020/116] [maven-release-plugin] prepare for next development iteration --- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index f62032d..04a1050 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.5 + 1.0.6-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 2244ef0..2378e4b 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.5 + 1.0.6-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index e952e1e..5a67057 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.5 + 1.0.6-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 368194e..4698f3b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.0.5 + 1.0.6-SNAPSHOT mockserver-client mockserver From 5460cd4e91763fab599e1b19d3290f293b015587 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Thu, 20 Aug 2015 20:48:13 +0200 Subject: [PATCH 021/116] Add optional getting of mock report when deleting mock Change-Id: I954e484387d3660fdfebad57fc419697b1a0fedd --- .../mockserver/client/RemoteMockServer.groovy | 17 ++++--- .../client/RemoveMockRequestData.groovy | 1 + .../tests/MockServerIntegrationTest.groovy | 48 ++++++++++++------- .../mockserver/server/HttpMockServer.groovy | 4 +- 4 files changed, 45 insertions(+), 25 deletions(-) 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 f462d3f..6afce3d 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 @@ -31,9 +31,9 @@ class RemoteMockServer { } } - List removeMock(String name) { + List removeMock(String name, boolean skipReport = false) { HttpPost removeMockPost = new HttpPost(address) - removeMockPost.entity = buildRemoveMockRequest(new RemoveMockRequestData(name: name)) + removeMockPost.entity = buildRemoveMockRequest(new RemoveMockRequestData(name: name, skipReport: skipReport)) CloseableHttpResponse response = client.execute(removeMockPost) GPathResult responseXml = Util.extractXmlResponse(response) if (responseXml.name() == 'mockRemoved') { @@ -58,14 +58,16 @@ class RemoteMockServer { } private static MockResponse mockResponseFromXml(GPathResult xml) { - return new MockResponse(xml.statusCode.text() as int, xml.text.text(), xml.headers.param.collectEntries { [(it.@name.text()):it.text()] }) + return new MockResponse(xml.statusCode.text() as int, xml.text.text(), xml.headers.param.collectEntries { + [(it.@name.text()): it.text()] + }) } private static MockRequest mockRequestFromXml(GPathResult xml) { return new MockRequest( xml.text.text(), - xml.headers.param.collectEntries { [(it.@name.text()):it.text()] }, - xml.query.param.collectEntries { [(it.@name.text()):it.text()] }, + xml.headers.param.collectEntries { [(it.@name.text()): it.text()] }, + xml.query.param.collectEntries { [(it.@name.text()): it.text()] }, xml.path.elem*.text() ) } @@ -74,6 +76,7 @@ class RemoteMockServer { return new StringEntity("""\ ${data.name} + ${data.skipReport} """, ContentType.create("text/xml", "UTF-8")) } @@ -107,7 +110,9 @@ 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, it.predicate.text(), it.response.text(), it.responseHeaders.text()) } + 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-client/src/main/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy index e2c15c9..1d37545 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy @@ -7,4 +7,5 @@ import groovy.transform.TypeChecked @TypeChecked class RemoveMockRequestData { String name + boolean skipReport = false } 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 435d43d..077a893 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 @@ -1,29 +1,13 @@ package pl.touk.mockserver.tests import groovy.util.slurpersupport.GPathResult -import org.apache.http.client.methods.CloseableHttpResponse -import org.apache.http.client.methods.HttpDelete -import org.apache.http.client.methods.HttpGet -import org.apache.http.client.methods.HttpHead -import org.apache.http.client.methods.HttpOptions -import org.apache.http.client.methods.HttpPatch -import org.apache.http.client.methods.HttpPost -import org.apache.http.client.methods.HttpPut -import org.apache.http.client.methods.HttpTrace +import org.apache.http.client.methods.* import org.apache.http.entity.ContentType import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients import org.apache.http.util.EntityUtils -import pl.touk.mockserver.client.AddMockRequestData -import pl.touk.mockserver.client.InvalidMockDefinition -import pl.touk.mockserver.client.Method -import pl.touk.mockserver.client.MockAlreadyExists -import pl.touk.mockserver.client.MockDoesNotExist -import pl.touk.mockserver.client.MockEvent -import pl.touk.mockserver.client.RegisteredMock -import pl.touk.mockserver.client.RemoteMockServer -import pl.touk.mockserver.client.Util +import pl.touk.mockserver.client.* import pl.touk.mockserver.server.HttpMockServer import spock.lang.Shared import spock.lang.Specification @@ -827,4 +811,32 @@ class MockServerIntegrationTest extends Specification { mockEvents2[0].response.text == '' mockEvents2[0].response.statusCode == 202 } + + @Unroll + def "should return mock report with #mockEvents events when deleting mock with flag skip mock = #skipReport"() { + expect: + remoteMockServer.addMock(new AddMockRequestData( + name: 'testRest', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name()[0..6] == 'request' }''', + response: '''{req -> ""}''', + statusCode: 201, + responseHeaders: '''{req -> ['aaa':'14']}''', + soap: false + )) + when: + HttpPost post1 = new HttpPost('http://localhost:9999/testEndpoint') + post1.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response1 = client.execute(post1) + then: + GPathResult restPostResponse1 = Util.extractXmlResponse(response1) + restPostResponse1.name() == 'goodResponseRest-request' + expect: + remoteMockServer.removeMock('testRest', skipReport).size() == mockEvents + where: + skipReport | mockEvents + false | 1 + true | 0 + } } 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 ac1a4ff..fc24a49 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -105,11 +105,13 @@ class HttpMockServer { private void removeMock(GPathResult request, HttpExchange ex) { String name = request.name + boolean skipReport = Boolean.parseBoolean(request.skipReport?.toString() ?: 'false') + println "!!!!!!!!! $skipReport" if (!(name in mockNames)) { throw new RuntimeException('mock not registered') } log.info("Removing mock $name") - List mockEvents = childServers.collect { it.removeMock(name) }.flatten() + List mockEvents = skipReport ? [] : childServers.collect { it.removeMock(name) }.flatten() mockNames.remove(name) createResponse(ex, createMockRemovedResponse(mockEvents), 200) } From c9ef533fb3318a1e5540eccbfda16f1edb7c5805 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Fri, 21 Aug 2015 08:10:25 +0200 Subject: [PATCH 022/116] Delete unnecessary println --- .../main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy | 1 - 1 file changed, 1 deletion(-) 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 fc24a49..eae893d 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -106,7 +106,6 @@ class HttpMockServer { private void removeMock(GPathResult request, HttpExchange ex) { String name = request.name boolean skipReport = Boolean.parseBoolean(request.skipReport?.toString() ?: 'false') - println "!!!!!!!!! $skipReport" if (!(name in mockNames)) { throw new RuntimeException('mock not registered') } From ca6345bef173b87a1cc3c5c464c324d177768c74 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Fri, 21 Aug 2015 08:11:06 +0200 Subject: [PATCH 023/116] [maven-release-plugin] prepare release http-mock-server-1.1.0 --- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 04a1050..b5a1ba6 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.6-SNAPSHOT + 1.1.0 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 2378e4b..97e00da 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.6-SNAPSHOT + 1.1.0 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 5a67057..db754f2 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.0.6-SNAPSHOT + 1.1.0 4.0.0 diff --git a/pom.xml b/pom.xml index 4698f3b..48ad9ac 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.0.6-SNAPSHOT + 1.1.0 mockserver-client mockserver From b105b788159839a47cefe69a2b786c166048a986 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Fri, 21 Aug 2015 08:11:06 +0200 Subject: [PATCH 024/116] [maven-release-plugin] prepare for next development iteration --- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index b5a1ba6..dc604e9 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.1.0 + 1.1.1-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 97e00da..fa4cc9b 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.1.0 + 1.1.1-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index db754f2..b6ddbb7 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.1.0 + 1.1.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 48ad9ac..7bb19e5 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.1.0 + 1.1.1-SNAPSHOT mockserver-client mockserver From f03618873e3968bdbd860721c8302ff9f4076e3a Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Fri, 21 Aug 2015 16:40:32 +0200 Subject: [PATCH 025/116] Fix Readme Change-Id: I719fd8f68b5f3435ff2a68ae6060cecaea09d51c --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e2ce7c8..96c7c4c 100644 --- a/README.md +++ b/README.md @@ -147,10 +147,11 @@ Via sending POST request to localhost:/serverControl ```xml ... + ... ``` -Response if success: +Response if success (and skipReport not given or equal false): ```xml @@ -183,6 +184,13 @@ Response if success: ``` +If skipReport is set to true then response will be: + +```xml + +``` + + Response with error message if failure: ```xml From 5545b67ebd681864ce2f8d4d4a48d59ada939383 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 19 Sep 2015 20:14:09 +0200 Subject: [PATCH 026/116] Do not allow for System exit Change-Id: I268b12dfab2e6021ad057a4dc9716a01efbe375d --- .../tests/MockServerIntegrationTest.groovy | 27 +++++++++++++++++++ .../pl/touk/mockserver/server/Mock.groovy | 5 +++- 2 files changed, 31 insertions(+), 1 deletion(-) 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 077a893..7790522 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 @@ -839,4 +839,31 @@ class MockServerIntegrationTest extends Specification { false | 1 true | 0 } + + @Unroll + def "should reject mock when it has System.exit in closure"() { + when: + remoteMockServer.addMock(new AddMockRequestData( + name: 'testRest', + path: 'testEndpoint', + port: 9999, + predicate: predicate, + response: '''{req -> ""}''', + soap: false + )) + then: + thrown(InvalidMockDefinition) + expect: + remoteMockServer.listMocks() == [] + where: + predicate << [ + '''{req -> System.exit(-1); req.xml.name() == 'request'}''', + '''{req -> System .exit(-1); req.xml.name() == 'request'}''', + '''{req -> System + + .exit(-1); req.xml.name() == 'request'}''', + '''{req -> System. exit(-1); req.xml.name() == 'request'}''', + '''{req -> System.exit (-1); req.xml.name() == 'request'}''' + ] + } } 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 61a8132..25f0168 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -18,7 +18,7 @@ class Mock implements Comparable { String responseHeadersClosureText = '{ _ -> [:] }' Closure predicate = toClosure(predicateClosureText) Closure response = toClosure(responseClosureText) - Closure responseHeaders =toClosure(responseHeadersClosureText) + Closure responseHeaders = toClosure(responseHeadersClosureText) boolean soap = false int statusCode = 200 String method = 'POST' @@ -64,6 +64,9 @@ class Mock implements Comparable { } private Closure toClosure(String predicate) { + if (predicate ==~ /(?m).*System\s*\.\s*exit\s*\(.*/) { + throw new RuntimeException('System.exit is forbidden') + } GroovyShell sh = new GroovyShell(this.class.classLoader); return sh.evaluate(predicate) as Closure } From 82434f46a354171c54754dd69cc16913ef0d8c39 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 29 Aug 2015 14:53:54 +0200 Subject: [PATCH 027/116] Make api with jaxb Change-Id: Ic0ac5ce212fac17583699868709b67a701231755 --- mockserver-api/pom.xml | 20 +++ .../touk/mockserver/api/request/AddMock.java | 33 ++++ .../touk/mockserver/api/request/Method.java | 15 ++ .../api/request/MockServerRequest.java | 4 + .../touk/mockserver/api/request/PeekMock.java | 15 ++ .../mockserver/api/request/RemoveMock.java | 17 ++ .../mockserver/api/request/package-info.java | 4 + .../api/response/ExceptionOccured.java | 13 ++ .../mockserver/api/response/MockAdded.java | 12 ++ .../api/response/MockEventReport.java | 14 ++ .../mockserver/api/response/MockListing.java | 16 ++ .../mockserver/api/response/MockPeeked.java | 16 ++ .../mockserver/api/response/MockRemoved.java | 16 ++ .../mockserver/api/response/MockReport.java | 27 +++ .../api/response/MockRequestReport.java | 24 +++ .../api/response/MockResponseReport.java | 19 ++ .../api/response/MockServerResponse.java | 4 + .../mockserver/api/response/Parameter.java | 15 ++ .../mockserver/api/response/package-info.java | 4 + .../pl/touk/mockserver/api/request/jaxb.index | 4 + .../touk/mockserver/api/response/jaxb.index | 11 ++ mockserver-client/pom.xml | 4 + .../client/AddMockRequestData.groovy | 32 ---- .../pl/touk/mockserver/client/Method.groovy | 12 -- .../touk/mockserver/client/MockEvent.groovy | 18 -- .../touk/mockserver/client/MockRequest.groovy | 22 --- .../mockserver/client/MockResponse.groovy | 20 --- .../client/PeekMockRequestData.groovy | 10 -- .../mockserver/client/RegisteredMock.groovy | 28 --- .../mockserver/client/RemoteMockServer.groovy | 111 ++++-------- .../client/RemoveMockRequestData.groovy | 11 -- .../pl/touk/mockserver/client/Util.groovy | 37 +++- .../tests/MockServerIntegrationTest.groovy | 165 +++++++++--------- .../touk/mockserver/tests/ServerMockPT.groovy | 31 ++-- mockserver/pom.xml | 4 + .../mockserver/server/HttpMockServer.groovy | 161 ++++++++--------- .../pl/touk/mockserver/server/Util.groovy | 24 ++- pom.xml | 12 ++ 38 files changed, 583 insertions(+), 422 deletions(-) create mode 100644 mockserver-api/pom.xml create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java create mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java create mode 100644 mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index create mode 100644 mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index delete mode 100644 mockserver-client/src/main/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy delete mode 100644 mockserver-client/src/main/groovy/pl/touk/mockserver/client/Method.groovy delete mode 100644 mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockEvent.groovy delete mode 100644 mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockRequest.groovy delete mode 100644 mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockResponse.groovy delete mode 100644 mockserver-client/src/main/groovy/pl/touk/mockserver/client/PeekMockRequestData.groovy delete mode 100644 mockserver-client/src/main/groovy/pl/touk/mockserver/client/RegisteredMock.groovy delete mode 100644 mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml new file mode 100644 index 0000000..a7c59b9 --- /dev/null +++ b/mockserver-api/pom.xml @@ -0,0 +1,20 @@ + + + + http-mock-server + pl.touk.mockserver + 1.1.1-SNAPSHOT + + 4.0.0 + + mockserver-api + + + + org.projectlombok + lombok + + + \ No newline at end of file diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java new file mode 100644 index 0000000..80ad580 --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java @@ -0,0 +1,33 @@ +package pl.touk.mockserver.api.request; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +@Data +@EqualsAndHashCode(callSuper = false) +public class AddMock extends MockServerRequest { + @XmlElement(required = true) + private String name; + + @XmlElement(required = true) + private String path; + + @XmlElement(required = true) + private int port; + + private String predicate; + + private String response; + + private Boolean soap; + + private Integer statusCode; + + private Method method; + + private String responseHeaders; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java new file mode 100644 index 0000000..9e471a1 --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java @@ -0,0 +1,15 @@ +package pl.touk.mockserver.api.request; + +import javax.xml.bind.annotation.XmlEnum; + +@XmlEnum +public enum Method { + POST, + GET, + DELETE, + PUT, + TRACE, + HEAD, + OPTIONS, + PATCH; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java new file mode 100644 index 0000000..91c1ba9 --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java @@ -0,0 +1,4 @@ +package pl.touk.mockserver.api.request; + +public abstract class MockServerRequest { +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java new file mode 100644 index 0000000..d4f14ca --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java @@ -0,0 +1,15 @@ +package pl.touk.mockserver.api.request; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +@Data +@EqualsAndHashCode(callSuper = false) +public class PeekMock extends MockServerRequest{ + @XmlElement(required = true) + private String name; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java new file mode 100644 index 0000000..49c8b0b --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java @@ -0,0 +1,17 @@ +package pl.touk.mockserver.api.request; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +@Data +@EqualsAndHashCode(callSuper = false) +public class RemoveMock extends MockServerRequest { + @XmlElement(required = true) + private String name; + + private Boolean skipReport; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java new file mode 100644 index 0000000..6ccf1df --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java @@ -0,0 +1,4 @@ +@XmlAccessorType(XmlAccessType.FIELD) package pl.touk.mockserver.api.request; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; \ No newline at end of file diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java new file mode 100644 index 0000000..a10382b --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java @@ -0,0 +1,13 @@ +package pl.touk.mockserver.api.response; + +import lombok.Data; + +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlValue; + +@XmlRootElement +@Data +public class ExceptionOccured { + @XmlValue + private String message; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java new file mode 100644 index 0000000..8dc13a9 --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java @@ -0,0 +1,12 @@ +package pl.touk.mockserver.api.response; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +@Data +@EqualsAndHashCode(callSuper = false) +public class MockAdded extends MockServerResponse { +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java new file mode 100644 index 0000000..faa2497 --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java @@ -0,0 +1,14 @@ +package pl.touk.mockserver.api.response; + +import lombok.Data; + +import javax.xml.bind.annotation.XmlElement; + +@Data +public class MockEventReport { + @XmlElement(required = true) + private MockRequestReport request; + + @XmlElement(required = true) + private MockResponseReport response; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java new file mode 100644 index 0000000..77f5e24 --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java @@ -0,0 +1,16 @@ +package pl.touk.mockserver.api.response; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +@XmlRootElement(name = "mocks") +@Data +@EqualsAndHashCode(callSuper = false) +public class MockListing extends MockServerResponse { + @XmlElement(name = "mock") + private List mocks; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java new file mode 100644 index 0000000..a23daae --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java @@ -0,0 +1,16 @@ +package pl.touk.mockserver.api.response; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +@XmlRootElement +@Data +@EqualsAndHashCode(callSuper = false) +public class MockPeeked extends MockServerResponse { + @XmlElement(name = "mockEvent") + private List mockEvents; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java new file mode 100644 index 0000000..008d318 --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java @@ -0,0 +1,16 @@ +package pl.touk.mockserver.api.response; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +@XmlRootElement +@Data +@EqualsAndHashCode(callSuper = false) +public class MockRemoved extends MockServerResponse { + @XmlElement(name = "mockEvent") + private List mockEvents; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java new file mode 100644 index 0000000..4ea7449 --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java @@ -0,0 +1,27 @@ +package pl.touk.mockserver.api.response; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.xml.bind.annotation.XmlElement; + +@Data +public class MockReport { + @XmlElement(required = true) + private String name; + + @XmlElement(required = true) + private String path; + + @XmlElement(required = true) + private int port; + + @XmlElement(required = true) + private String predicate; + + @XmlElement(required = true) + private String response; + + @XmlElement(required = true) + private String responseHeaders; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java new file mode 100644 index 0000000..194b27d --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java @@ -0,0 +1,24 @@ +package pl.touk.mockserver.api.response; + +import lombok.Data; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.List; + +@Data +public class MockRequestReport { + private String text; + + @XmlElementWrapper(name = "headers") + @XmlElement(name = "param") + private List headers; + + @XmlElementWrapper(name = "query") + @XmlElement(name = "param") + private List queryParams; + + @XmlElementWrapper(name = "path") + @XmlElement(name = "elem") + private List paths; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java new file mode 100644 index 0000000..56ac5d5 --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java @@ -0,0 +1,19 @@ +package pl.touk.mockserver.api.response; + +import lombok.Data; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.List; + +@Data +public class MockResponseReport { + @XmlElement(required = true) + private int statusCode; + + private String text; + + @XmlElementWrapper(name = "headers") + @XmlElement(name = "param") + private List headers; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java new file mode 100644 index 0000000..bf7e0ae --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java @@ -0,0 +1,4 @@ +package pl.touk.mockserver.api.response; + +public abstract class MockServerResponse { +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java new file mode 100644 index 0000000..6a9c0c3 --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java @@ -0,0 +1,15 @@ +package pl.touk.mockserver.api.response; + +import lombok.Data; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlValue; + +@Data +public class Parameter { + @XmlAttribute(required = true) + private String name; + + @XmlValue + private String value; +} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java new file mode 100644 index 0000000..d317cb9 --- /dev/null +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java @@ -0,0 +1,4 @@ +@XmlAccessorType(XmlAccessType.FIELD) package pl.touk.mockserver.api.response; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; \ No newline at end of file diff --git a/mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index b/mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index new file mode 100644 index 0000000..233becc --- /dev/null +++ b/mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index @@ -0,0 +1,4 @@ +AddMock +Method +PeekMock +RemoveMock \ No newline at end of file diff --git a/mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index b/mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index new file mode 100644 index 0000000..86bdb57 --- /dev/null +++ b/mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index @@ -0,0 +1,11 @@ +ExceptionOccured +MockAdded +MockEventReport +MockListing +MockPeeked +MockRemoved +MockReport +MockRequestReport +MockResponseReport +MockServerResponse +Parameter \ No newline at end of file diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index dc604e9..5041602 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -25,5 +25,9 @@ org.apache.commons commons-lang3 + + pl.touk.mockserver + mockserver-api + diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy deleted file mode 100644 index 6da9a6e..0000000 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy +++ /dev/null @@ -1,32 +0,0 @@ -package pl.touk.mockserver.client - -import groovy.transform.CompileStatic -import groovy.transform.TypeChecked -import org.apache.commons.lang3.StringEscapeUtils - -@CompileStatic -@TypeChecked -class AddMockRequestData { - String name - String path - Integer port - String predicate - String response - Boolean soap - Integer statusCode - Method method - String responseHeaders - - void setPredicate(String predicate) { - this.predicate = StringEscapeUtils.escapeXml11(predicate) - } - - void setResponse(String response) { - this.response = StringEscapeUtils.escapeXml11(response) - } - - void setResponseHeaders(String responseHeaders) { - this.responseHeaders = StringEscapeUtils.escapeXml11(responseHeaders) - } -} - diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Method.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Method.groovy deleted file mode 100644 index 82aefea..0000000 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Method.groovy +++ /dev/null @@ -1,12 +0,0 @@ -package pl.touk.mockserver.client - -enum Method { - POST, - GET, - DELETE, - PUT, - TRACE, - HEAD, - OPTIONS, - PATCH -} diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockEvent.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockEvent.groovy deleted file mode 100644 index 8c61ab3..0000000 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockEvent.groovy +++ /dev/null @@ -1,18 +0,0 @@ -package pl.touk.mockserver.client - -import groovy.transform.CompileStatic -import groovy.transform.EqualsAndHashCode -import groovy.transform.TypeChecked - -@EqualsAndHashCode -@CompileStatic -@TypeChecked -class MockEvent { - final MockRequest request - final MockResponse response - - MockEvent(MockRequest request, MockResponse response) { - this.request = request - this.response = response - } -} diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockRequest.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockRequest.groovy deleted file mode 100644 index c73c11d..0000000 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockRequest.groovy +++ /dev/null @@ -1,22 +0,0 @@ -package pl.touk.mockserver.client - -import groovy.transform.CompileStatic -import groovy.transform.EqualsAndHashCode -import groovy.transform.TypeChecked - -@CompileStatic -@TypeChecked -@EqualsAndHashCode -class MockRequest { - final String text - final Map headers - final Map query - final List path - - MockRequest(String text, Map headers, Map query, List path) { - this.text = text - this.headers = headers - this.query = query - this.path = path - } -} diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockResponse.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockResponse.groovy deleted file mode 100644 index 07212fb..0000000 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockResponse.groovy +++ /dev/null @@ -1,20 +0,0 @@ -package pl.touk.mockserver.client - -import groovy.transform.CompileStatic -import groovy.transform.EqualsAndHashCode -import groovy.transform.TypeChecked - -@CompileStatic -@TypeChecked -@EqualsAndHashCode -class MockResponse { - final int statusCode - final String text - final Map headers - - MockResponse(int statusCode, String text, Map headers) { - this.statusCode = statusCode - this.text = text - this.headers = headers - } -} diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/PeekMockRequestData.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/PeekMockRequestData.groovy deleted file mode 100644 index 3d0e546..0000000 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/PeekMockRequestData.groovy +++ /dev/null @@ -1,10 +0,0 @@ -package pl.touk.mockserver.client - -import groovy.transform.CompileStatic -import groovy.transform.TypeChecked - -@CompileStatic -@TypeChecked -class PeekMockRequestData { - String name -} 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 deleted file mode 100644 index f755592..0000000 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RegisteredMock.groovy +++ /dev/null @@ -1,28 +0,0 @@ -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, 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 6afce3d..14664e0 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 @@ -1,6 +1,5 @@ package pl.touk.mockserver.client -import groovy.util.slurpersupport.GPathResult import org.apache.http.client.methods.CloseableHttpResponse import org.apache.http.client.methods.HttpGet import org.apache.http.client.methods.HttpPost @@ -8,112 +7,70 @@ import org.apache.http.entity.ContentType import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients +import pl.touk.mockserver.api.request.AddMock +import pl.touk.mockserver.api.request.MockServerRequest +import pl.touk.mockserver.api.request.PeekMock +import pl.touk.mockserver.api.request.RemoveMock +import pl.touk.mockserver.api.response.* + +import javax.xml.bind.JAXBContext class RemoteMockServer { private final String address private final CloseableHttpClient client = HttpClients.createDefault() + private static final JAXBContext requestContext = JAXBContext.newInstance(AddMock.package.name, AddMock.classLoader) + private static + final JAXBContext responseContext = JAXBContext.newInstance(MockAdded.package.name, MockAdded.classLoader) RemoteMockServer(String host, int port) { address = "http://$host:$port/serverControl" } - void addMock(AddMockRequestData addMockRequestData) { + void addMock(AddMock addMockData) { HttpPost addMockPost = new HttpPost(address) - addMockPost.entity = buildAddMockRequest(addMockRequestData) + addMockPost.entity = buildAddMockRequest(addMockData) CloseableHttpResponse response = client.execute(addMockPost) - GPathResult responseXml = Util.extractXmlResponse(response) - if (responseXml.name() != 'mockAdded') { - if (responseXml.text() == 'mock already registered') { - throw new MockAlreadyExists() - - } - throw new InvalidMockDefinition(responseXml.text()) - } + Util.extractResponse(response) } - List removeMock(String name, boolean skipReport = false) { + List removeMock(String name, boolean skipReport = false) { HttpPost removeMockPost = new HttpPost(address) - removeMockPost.entity = buildRemoveMockRequest(new RemoveMockRequestData(name: name, skipReport: skipReport)) + removeMockPost.entity = buildRemoveMockRequest(new RemoveMock(name: name, skipReport: skipReport)) CloseableHttpResponse response = client.execute(removeMockPost) - GPathResult responseXml = Util.extractXmlResponse(response) - if (responseXml.name() == 'mockRemoved') { - return responseXml.'mockEvent'.collect { - new MockEvent(mockRequestFromXml(it.request), mockResponseFromXml(it.response)) - } - } - throw new MockDoesNotExist() + MockRemoved mockRemoved = Util.extractResponse(response) as MockRemoved + return mockRemoved.mockEvents ?: [] } - List peekMock(String name) { + List peekMock(String name) { HttpPost removeMockPost = new HttpPost(address) - removeMockPost.entity = buildPeekMockRequest(new PeekMockRequestData(name: name)) + removeMockPost.entity = buildPeekMockRequest(new PeekMock(name: name)) CloseableHttpResponse response = client.execute(removeMockPost) - GPathResult responseXml = Util.extractXmlResponse(response) - if (responseXml.name() == 'mockPeeked') { - return responseXml.'mockEvent'.collect { - new MockEvent(mockRequestFromXml(it.request), mockResponseFromXml(it.response)) - } - } - throw new MockDoesNotExist() + MockPeeked mockPeeked = Util.extractResponse(response) as MockPeeked + return mockPeeked.mockEvents ?: [] } - private static MockResponse mockResponseFromXml(GPathResult xml) { - return new MockResponse(xml.statusCode.text() as int, xml.text.text(), xml.headers.param.collectEntries { - [(it.@name.text()): it.text()] - }) + private static StringEntity buildRemoveMockRequest(RemoveMock data) { + return new StringEntity(marshallRequest(data), ContentType.create("text/xml", "UTF-8")) } - private static MockRequest mockRequestFromXml(GPathResult xml) { - return new MockRequest( - xml.text.text(), - xml.headers.param.collectEntries { [(it.@name.text()): it.text()] }, - xml.query.param.collectEntries { [(it.@name.text()): it.text()] }, - xml.path.elem*.text() - ) + private static String marshallRequest(MockServerRequest data) { + StringWriter sw = new StringWriter() + requestContext.createMarshaller().marshal(data, sw) + return sw.toString() } - private static StringEntity buildRemoveMockRequest(RemoveMockRequestData data) { - return new StringEntity("""\ - - ${data.name} - ${data.skipReport} - - """, ContentType.create("text/xml", "UTF-8")) + private static StringEntity buildPeekMockRequest(PeekMock peekMock) { + return new StringEntity(marshallRequest(peekMock), ContentType.create("text/xml", "UTF-8")) } - private static StringEntity buildPeekMockRequest(PeekMockRequestData data) { - return new StringEntity("""\ - - ${data.name} - - """, ContentType.create("text/xml", "UTF-8")) + private static StringEntity buildAddMockRequest(AddMock data) { + return new StringEntity(marshallRequest(data), ContentType.create("text/xml", "UTF-8")) } - private static StringEntity buildAddMockRequest(AddMockRequestData data) { - return new StringEntity("""\ - - ${data.name} - ${data.path} - ${data.port} - ${data.predicate ? "${data.predicate}" : ''} - ${data.response ? "${data.response}" : ''} - ${data.soap != null ? "${data.soap}" : ''} - ${data.statusCode ? "${data.statusCode}" : ''} - ${data.method ? "${data.method}" : ''} - ${data.responseHeaders ? "${data.responseHeaders}" : ''} - - """, ContentType.create("text/xml", "UTF-8")) - } - - List listMocks() { + List listMocks() { HttpGet get = new HttpGet(address) 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, it.predicate.text(), it.response.text(), it.responseHeaders.text()) - } - } - return [] + MockListing mockListing = Util.extractResponse(response) as MockListing + return mockListing.mocks } } diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy deleted file mode 100644 index 1d37545..0000000 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy +++ /dev/null @@ -1,11 +0,0 @@ -package pl.touk.mockserver.client - -import groovy.transform.CompileStatic -import groovy.transform.TypeChecked - -@CompileStatic -@TypeChecked -class RemoveMockRequestData { - String name - boolean skipReport = false -} diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy index 8cffc3b..446ebf0 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy @@ -7,15 +7,42 @@ import groovy.util.slurpersupport.GPathResult import org.apache.http.HttpEntity import org.apache.http.client.methods.CloseableHttpResponse import org.apache.http.util.EntityUtils +import pl.touk.mockserver.api.response.ExceptionOccured +import pl.touk.mockserver.api.response.MockAdded +import pl.touk.mockserver.api.response.MockServerResponse + +import javax.xml.bind.JAXBContext @CompileStatic @TypeChecked class Util { + private static + final JAXBContext responseContext = JAXBContext.newInstance(MockAdded.package.name, MockAdded.classLoader) + static GPathResult extractXmlResponse(CloseableHttpResponse response) { + return new XmlSlurper().parseText(extractStringResponse(response)) + } + static String extractStringResponse(CloseableHttpResponse response) { HttpEntity entity = response.entity - GPathResult xml = new XmlSlurper().parseText(EntityUtils.toString(entity, 'UTF-8')) + String responseString = EntityUtils.toString(entity, 'UTF-8') EntityUtils.consumeQuietly(entity) - return xml + return responseString + } + + static MockServerResponse extractResponse(CloseableHttpResponse response) { + String responseString = extractStringResponse(response) + if (response.statusLine.statusCode == 200) { + return responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as MockServerResponse + } + ExceptionOccured exceptionOccured = responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as ExceptionOccured + String message = exceptionOccured.message + if (message == 'mock already registered') { + throw new MockAlreadyExists() + } + if (message == 'mock not registered') { + throw new MockDoesNotExist() + } + throw new InvalidMockDefinition(message) } static String soap(String request) { @@ -26,13 +53,11 @@ class Util { } static Object extractJsonResponse(CloseableHttpResponse response) { - HttpEntity entity = response.entity - Object json = new JsonSlurper().parseText(EntityUtils.toString(entity, 'UTF-8')) - EntityUtils.consumeQuietly(entity) - return json + return new JsonSlurper().parseText(extractStringResponse(response)) } static void consumeResponse(CloseableHttpResponse response) { EntityUtils.consumeQuietly(response.entity) } + } 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 7790522..1fba403 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 @@ -7,6 +7,11 @@ import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients import org.apache.http.util.EntityUtils +import pl.touk.mockserver.api.request.AddMock +import pl.touk.mockserver.api.request.Method +import pl.touk.mockserver.api.response.MockEventReport +import pl.touk.mockserver.api.response.MockReport +import pl.touk.mockserver.api.response.Parameter import pl.touk.mockserver.client.* import pl.touk.mockserver.server.HttpMockServer import spock.lang.Shared @@ -33,7 +38,7 @@ class MockServerIntegrationTest extends Specification { def "should add working rest mock on endpoint"() { expect: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -54,7 +59,7 @@ class MockServerIntegrationTest extends Specification { def "should add working rest mock on endpoint with utf"() { expect: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRestUtf', path: 'testEndpoint', port: 9999, @@ -76,7 +81,7 @@ class MockServerIntegrationTest extends Specification { def "should add soap mock on endpoint"() { expect: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -102,7 +107,7 @@ class MockServerIntegrationTest extends Specification { then: thrown(MockDoesNotExist) expect: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -120,7 +125,7 @@ class MockServerIntegrationTest extends Specification { def "should not add mock with existing name"() { expect: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -129,7 +134,7 @@ class MockServerIntegrationTest extends Specification { soap: true )) when: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testSoap', path: 'testEndpoint2', port: 9998, @@ -143,7 +148,7 @@ class MockServerIntegrationTest extends Specification { def "should not add mock with empty name"() { when: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: '', path: 'testEndpoint2', port: 9998, @@ -157,7 +162,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock after deleting old mock with the same name"() { expect: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -168,7 +173,7 @@ class MockServerIntegrationTest extends Specification { and: remoteMockServer.removeMock('testSoap') == [] and: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -180,14 +185,14 @@ class MockServerIntegrationTest extends Specification { def "should add simultaneously working post and rest mocks with the same predicate and endpoint nad port"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '''{req -> req.xml.name() == 'request'}''', response: '''{req -> ""}''' )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -215,14 +220,14 @@ class MockServerIntegrationTest extends Specification { @Unroll def "should dispatch rest mocks when second on #name"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest1', path: 'test1', port: 9999, predicate: '''{req -> req.xml.name() == 'request1'}''', response: '''{req -> ""}''' )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest2', path: secondPath, port: secondPort, @@ -254,7 +259,7 @@ class MockServerIntegrationTest extends Specification { @Unroll def "should dispatch rest mock with response code"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest1', path: 'test1', port: 9999, @@ -276,7 +281,7 @@ class MockServerIntegrationTest extends Specification { def "should return response code 404 and error body the same as request body when mocks does not apply"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest1', path: 'test1', port: 9999, @@ -295,7 +300,7 @@ class MockServerIntegrationTest extends Specification { def "should inform that there was problem during adding mock - invalid port"() { when: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testSoap', path: 'testEndpoint2', port: -1, @@ -309,13 +314,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with get method"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, response: '''{_ -> ""}''' )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest2', path: 'testEndpoint', port: 9999, @@ -332,13 +337,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with trace method"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, response: '''{_ -> ""}''' )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest2', path: 'testEndpoint', port: 9999, @@ -355,13 +360,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with head method"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, response: '''{_ -> ""}''' )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest2', path: 'testEndpoint', port: 9999, @@ -377,13 +382,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with options method"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, response: '''{_ -> ""}''' )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest2', path: 'testEndpoint', port: 9999, @@ -399,13 +404,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with put method"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'test1', port: 9999, response: '''{_ -> ""}''' )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest2', path: 'test1', port: 9999, @@ -424,13 +429,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with delete method"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'test1', port: 9999, response: '''{_ -> ""}''' )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest2', path: 'test1', port: 9999, @@ -447,13 +452,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with patch method"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'test1', port: 9999, response: '''{_ -> ""}''' )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest2', path: 'test1', port: 9999, @@ -472,7 +477,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock that return headers"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -492,7 +497,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock that accepts only when certain request headers exists"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -521,7 +526,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock that accepts only when certain query params exists"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -545,7 +550,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock that accepts only when request has specific body"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -570,7 +575,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock which response json to json"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -595,7 +600,7 @@ class MockServerIntegrationTest extends Specification { def "should get list mocks"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest2', path: 'testEndpoint', port: 9998, @@ -603,27 +608,27 @@ class MockServerIntegrationTest extends Specification { response: '''{ req -> '' }''', responseHeaders: '{ _ -> [a: "b"] }' )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest4', path: 'testEndpoint', port: 9999 )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest3', path: 'testEndpoint2', port: 9999 )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest5', path: 'testEndpoint', port: 9999 )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest6', path: 'testEndpoint2', port: 9999 )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999 @@ -631,17 +636,17 @@ class MockServerIntegrationTest extends Specification { remoteMockServer.removeMock('testRest5') expect: remoteMockServer.listMocks() == [ - 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 }', '''{ _ -> '' }''', '{ _ -> [:] }') + new MockReport(name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }'), + new MockReport(name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '' }''', responseHeaders: '{ _ -> [a: "b"] }'), + new MockReport(name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }'), + new MockReport(name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }'), + new MockReport(name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }') ] } def "should add mock accepts path certain path params"() { given: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -664,7 +669,7 @@ class MockServerIntegrationTest extends Specification { def "should get mock report when deleting mock"() { expect: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -674,7 +679,7 @@ class MockServerIntegrationTest extends Specification { responseHeaders: '''{req -> ['aaa':'14']}''', soap: false )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest2', path: 'testEndpoint', port: 9999, @@ -706,40 +711,40 @@ class MockServerIntegrationTest extends Specification { GPathResult restPostResponse3 = Util.extractXmlResponse(response3) restPostResponse3.name() == 'goodResponseRest' when: - List mockEvents1 = remoteMockServer.removeMock('testRest') + List mockEvents1 = remoteMockServer.removeMock('testRest') then: mockEvents1.size() == 2 mockEvents1[0].request.text == '' - !mockEvents1[0].request.headers?.keySet()?.empty - mockEvents1[0].request.query == [:] - mockEvents1[0].request.path == ['testEndpoint'] - !mockEvents1[0].response.headers?.keySet()?.empty + !mockEvents1[0].request.headers?.empty + mockEvents1[0].request.queryParams == [] + mockEvents1[0].request.paths == ['testEndpoint'] + !mockEvents1[0].response.headers?.empty mockEvents1[0].response.text == '' mockEvents1[0].response.statusCode == 201 mockEvents1[1].request.text == '' - !mockEvents1[1].request.headers?.keySet()?.empty - mockEvents1[1].request.query == [:] - mockEvents1[1].request.path == ['testEndpoint', 'hello'] - !mockEvents1[1].response.headers?.keySet()?.empty + !mockEvents1[1].request.headers?.empty + mockEvents1[1].request.queryParams == [] + mockEvents1[1].request.paths == ['testEndpoint', 'hello'] + !mockEvents1[1].response.headers?.empty mockEvents1[1].response.text == '' mockEvents1[1].response.statusCode == 201 when: - List mockEvents2 = remoteMockServer.removeMock('testRest2') + List mockEvents2 = remoteMockServer.removeMock('testRest2') then: mockEvents2.size() == 1 mockEvents2[0].request.text == '' - !mockEvents2[0].request.headers?.keySet()?.empty - mockEvents2[0].request.query == [id: '123'] - mockEvents2[0].request.path == ['testEndpoint'] - mockEvents2[0].response.headers.aaa == '15' + !mockEvents2[0].request.headers?.empty + mockEvents2[0].request.queryParams == [new Parameter(name: 'id', value: '123')] + mockEvents2[0].request.paths == ['testEndpoint'] + mockEvents2[0].response.headers.find { it.name == 'aaa' }?.value == '15' mockEvents2[0].response.text == '' mockEvents2[0].response.statusCode == 202 } def "should get mock report when peeking mock"() { expect: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -749,7 +754,7 @@ class MockServerIntegrationTest extends Specification { responseHeaders: '''{req -> ['aaa':'14']}''', soap: false )) - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest2', path: 'testEndpoint', port: 9999, @@ -781,33 +786,33 @@ class MockServerIntegrationTest extends Specification { GPathResult restPostResponse3 = Util.extractXmlResponse(response3) restPostResponse3.name() == 'goodResponseRest' when: - List mockEvents1 = remoteMockServer.peekMock('testRest') + List mockEvents1 = remoteMockServer.peekMock('testRest') then: mockEvents1.size() == 2 mockEvents1[0].request.text == '' - !mockEvents1[0].request.headers?.keySet()?.empty - mockEvents1[0].request.query == [:] - mockEvents1[0].request.path == ['testEndpoint'] - !mockEvents1[0].response.headers?.keySet()?.empty + !mockEvents1[0].request.headers?.empty + mockEvents1[0].request.queryParams == [] + mockEvents1[0].request.paths == ['testEndpoint'] + !mockEvents1[0].response.headers?.empty mockEvents1[0].response.text == '' mockEvents1[0].response.statusCode == 201 mockEvents1[1].request.text == '' - !mockEvents1[1].request.headers?.keySet()?.empty - mockEvents1[1].request.query == [:] - mockEvents1[1].request.path == ['testEndpoint', 'hello'] - !mockEvents1[1].response.headers?.keySet()?.empty + !mockEvents1[1].request.headers?.empty + mockEvents1[1].request.queryParams == [] + mockEvents1[1].request.paths == ['testEndpoint', 'hello'] + !mockEvents1[1].response.headers?.empty mockEvents1[1].response.text == '' mockEvents1[1].response.statusCode == 201 when: - List mockEvents2 = remoteMockServer.peekMock('testRest2') + List mockEvents2 = remoteMockServer.peekMock('testRest2') then: mockEvents2.size() == 1 mockEvents2[0].request.text == '' - !mockEvents2[0].request.headers?.keySet()?.empty - mockEvents2[0].request.query == [id: '123'] - mockEvents2[0].request.path == ['testEndpoint'] - mockEvents2[0].response.headers.aaa == '15' + !mockEvents2[0].request.headers?.empty + mockEvents2[0].request.queryParams == [new Parameter(name: 'id', value: '123')] + mockEvents2[0].request.paths == ['testEndpoint'] + mockEvents2[0].response.headers.find {it.name == 'aaa'}?.value == '15' mockEvents2[0].response.text == '' mockEvents2[0].response.statusCode == 202 } @@ -815,7 +820,7 @@ class MockServerIntegrationTest extends Specification { @Unroll def "should return mock report with #mockEvents events when deleting mock with flag skip mock = #skipReport"() { expect: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy index 2ee891c..4ab9e3e 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy @@ -1,34 +1,40 @@ package pl.touk.mockserver.tests -import groovy.util.slurpersupport.GPathResult import org.apache.http.client.HttpClient import org.apache.http.client.methods.CloseableHttpResponse import org.apache.http.client.methods.HttpPost import org.apache.http.entity.ContentType import org.apache.http.entity.StringEntity import org.apache.http.impl.client.HttpClients -import pl.touk.mockserver.client.AddMockRequestData +import pl.touk.mockserver.api.request.AddMock import pl.touk.mockserver.client.RemoteMockServer import pl.touk.mockserver.client.Util import pl.touk.mockserver.server.HttpMockServer import spock.lang.Specification +import spock.lang.Timeout + +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit class ServerMockPT extends Specification { + + @Timeout(value = 60) def "should handle many request simultaneously"() { given: + HttpClient client = HttpClients.createDefault() HttpMockServer httpMockServer = new HttpMockServer() RemoteMockServer controlServerClient = new RemoteMockServer("localhost", 9999) - HttpClient client = HttpClients.createDefault() int requestAmount = 1000 - GPathResult[] responses = new GPathResult[requestAmount] - Thread[] threads = new Thread[requestAmount] + String[] responses = new String[requestAmount] + ExecutorService executorService = Executors.newFixedThreadPool(20) for (int i = 0; i < requestAmount; ++i) { int current = i - threads[i] = new Thread({ + executorService.submit { int endpointNumber = current % 10 int port = 9000 + (current % 7) - controlServerClient.addMock(new AddMockRequestData( + controlServerClient.addMock(new AddMock( name: "testRest$current", path: "testEndpoint$endpointNumber", port: port, @@ -38,15 +44,14 @@ class ServerMockPT extends Specification { HttpPost restPost = new HttpPost("http://localhost:$port/testEndpoint$endpointNumber") restPost.entity = new StringEntity("", ContentType.create("text/xml", "UTF-8")) CloseableHttpResponse response = client.execute(restPost) - responses[current] = Util.extractXmlResponse(response) - assert controlServerClient.removeMock("testRest$current").size() == 1 - }) + responses[current] = Util.extractStringResponse(response) + assert controlServerClient.removeMock("testRest$current", false).size() == 1 + } } when: - threads*.start() - Thread.sleep(60000) + executorService.awaitTermination(60, TimeUnit.SECONDS) then: - responses.eachWithIndex { res, i -> assert res.name() == "goodResponse$i" } + responses.eachWithIndex { res, i -> assert new XmlSlurper().parseText(res).name() == "goodResponse$i" as String } cleanup: httpMockServer.stop() } diff --git a/mockserver/pom.xml b/mockserver/pom.xml index b6ddbb7..6223937 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -26,6 +26,10 @@ org.apache.commons commons-lang3 + + pl.touk.mockserver + mockserver-api + 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 eae893d..322ec64 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -2,9 +2,13 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.util.logging.Slf4j -import groovy.util.slurpersupport.GPathResult -import groovy.xml.MarkupBuilder +import pl.touk.mockserver.api.request.AddMock +import pl.touk.mockserver.api.request.MockServerRequest +import pl.touk.mockserver.api.request.PeekMock +import pl.touk.mockserver.api.request.RemoveMock +import pl.touk.mockserver.api.response.* +import javax.xml.bind.JAXBContext import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.CopyOnWriteArraySet @@ -17,6 +21,9 @@ class HttpMockServer { private final List childServers = new CopyOnWriteArrayList<>() private final Set mockNames = new CopyOnWriteArraySet<>() + private static + final JAXBContext requestJaxbContext = JAXBContext.newInstance(AddMock.package.name, AddMock.classLoader) + HttpMockServer(int port = 9999) { httpServerWraper = new HttpServerWraper(port) @@ -26,12 +33,12 @@ class HttpMockServer { if (ex.requestMethod == 'GET') { listMocks(ex) } else if (ex.requestMethod == 'POST') { - GPathResult request = new XmlSlurper().parse(ex.requestBody) - if (request.name() == 'addMock') { + MockServerRequest request = requestJaxbContext.createUnmarshaller().unmarshal(ex.requestBody) as MockServerRequest + if (request instanceof AddMock) { addMock(request, ex) - } else if (request.name() == 'removeMock') { + } else if (request instanceof RemoveMock) { removeMock(request, ex) - } else if (request.name() == 'peekMock') { + } else if (request instanceof PeekMock) { peekMock(request, ex) } else { throw new RuntimeException('Unknown request') @@ -46,29 +53,26 @@ class HttpMockServer { } void listMocks(HttpExchange ex) { - StringWriter sw = new StringWriter() - MarkupBuilder builder = new MarkupBuilder(sw) - builder.mocks { - listMocks().each { - Mock mock -> - builder.mock { - name mock.name - path mock.path - port mock.port - predicate mock.predicateClosureText - response mock.responseClosureText - responseHeaders mock.responseHeadersClosureText - } - } - } - createResponse(ex, sw.toString(), 200) + MockListing mockListing = new MockListing( + mocks: listMocks().collect { + new MockReport( + name: it.name, + path: it.path, + port: it.port, + predicate: it.predicateClosureText, + response: it.responseClosureText, + responseHeaders: it.responseHeadersClosureText + ) + } + ) + createResponse(ex, mockListing, 200) } Set listMocks() { - return childServers.collect { it.mocks }.flatten() as TreeSet + return childServers.collect { it.mocks }.flatten() as TreeSet } - private void addMock(GPathResult request, HttpExchange ex) { + private void addMock(AddMock request, HttpExchange ex) { String name = request.name if (name in mockNames) { throw new RuntimeException('mock already registered') @@ -77,13 +81,13 @@ class HttpMockServer { HttpServerWraper child = getOrCreateChildServer(mock.port) child.addMock(mock) mockNames << name - createResponse(ex, '', 200) + createResponse(ex, new MockAdded(), 200) } - private static Mock mockFromRequest(GPathResult request) { + private static Mock mockFromRequest(AddMock request) { String name = request.name String mockPath = request.path - int mockPort = Integer.valueOf(request.port as String) + int mockPort = request.port Mock mock = new Mock(name, mockPath, mockPort) mock.predicate = request.predicate mock.response = request.response @@ -103,85 +107,62 @@ class HttpMockServer { return child } - private void removeMock(GPathResult request, HttpExchange ex) { + private void removeMock(RemoveMock request, HttpExchange ex) { String name = request.name - boolean skipReport = Boolean.parseBoolean(request.skipReport?.toString() ?: 'false') + boolean skipReport = request.skipReport ?: false if (!(name in mockNames)) { throw new RuntimeException('mock not registered') } log.info("Removing mock $name") - List mockEvents = skipReport ? [] : childServers.collect { it.removeMock(name) }.flatten() + List mockEvents = skipReport ? [] : childServers.collect { + it.removeMock(name) + }.flatten() as List mockNames.remove(name) - createResponse(ex, createMockRemovedResponse(mockEvents), 200) + MockRemoved mockRemoved = new MockRemoved( + mockEvents: createMockEventReports(mockEvents) + ) + createResponse(ex, mockRemoved, 200) } - private void peekMock(GPathResult request, HttpExchange ex) { + private static List createMockEventReports(List mockEvents) { + return mockEvents.collect { + new MockEventReport( + request: new MockRequestReport( + text: it.request.text, + headers: it.request.headers.collect { + new Parameter(name: it.key, value: it.value) + }, + queryParams: it.request.query.collect { + new Parameter(name: it.key, value: it.value) + }, + paths: it.request.path + ), + response: new MockResponseReport( + statusCode: it.response.statusCode, + text: it.response.text, + headers: it.response.headers.collect { + new Parameter(name: it.key, value: it.value) + } + ) + ) + } + } + + private void peekMock(PeekMock request, HttpExchange ex) { String name = request.name if (!(name in mockNames)) { throw new RuntimeException('mock not registered') } log.trace("Peeking mock $name") - List mockEvents = childServers.collect { it.peekMock(name) }.flatten() - createResponse(ex, createMockPeekedResponse(mockEvents), 200) - } - - private static String createMockRemovedResponse(List mockEvents) { - StringWriter sw = new StringWriter() - MarkupBuilder builder = new MarkupBuilder(sw) - builder.mockRemoved { - mockEventsToXml(mockEvents, builder) - } - return sw.toString() - } - - private static String createMockPeekedResponse(List mockEvents) { - StringWriter sw = new StringWriter() - MarkupBuilder builder = new MarkupBuilder(sw) - builder.mockPeeked { - mockEventsToXml(mockEvents, builder) - } - return sw.toString() - } - - private static void mockEventsToXml(List events, MarkupBuilder builder) { - events.each { MockEvent event -> - builder.mockEvent { - builder.request { - text event.request.text - headers { - event.request.headers.each { - builder.param(name: it.key, it.value) - } - } - query { - event.request.query.each { - builder.param(name: it.key, it.value) - } - } - path { - event.request.path.each { - builder.elem it - } - } - } - builder.response { - text event.response.text - headers { - event.response.headers.each { - builder.param(name: it.key, it.value) - } - } - statusCode event.response.statusCode - } - } - } + List mockEvents = childServers.collect { it.peekMock(name) }.flatten() as List + MockPeeked mockPeeked = new MockPeeked( + mockEvents: createMockEventReports(mockEvents) + ) + createResponse(ex, mockPeeked, 200) } private static void createErrorResponse(HttpExchange ex, Exception e) { - StringWriter sw = new StringWriter() - MarkupBuilder builder = new MarkupBuilder(sw) - builder.exceptionOccured e.message - createResponse(ex, sw.toString(), 400) + createResponse(ex, new ExceptionOccured(message: e.message), 400) } void stop() { diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/Util.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/Util.groovy index 93ab7a5..3864afa 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Util.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Util.groovy @@ -1,14 +1,32 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange +import pl.touk.mockserver.api.response.MockAdded + +import javax.xml.bind.JAXBContext class Util { - static void createResponse(HttpExchange ex, String response, int statusCode) { - byte[] responseBytes = response ? response.getBytes('UTF-8') : new byte[0] + + private static + final JAXBContext responseJaxbContext = JAXBContext.newInstance(MockAdded.package.name, MockAdded.classLoader) + + static void createResponse(HttpExchange ex, Object response, int statusCode) { + String responseString = marshall(response) + createResponse(ex, responseString, statusCode) + } + + static void createResponse(HttpExchange ex, String responseString, int statusCode) { + byte[] responseBytes = responseString ? responseString.getBytes('UTF-8') : new byte[0] ex.sendResponseHeaders(statusCode, responseBytes.length ?: -1) - if (response) { + if (responseString) { ex.responseBody << responseBytes ex.responseBody.close() } } + + private static String marshall(Object response) { + StringWriter sw = new StringWriter() + responseJaxbContext.createMarshaller().marshal(response, sw) + return sw.toString() + } } diff --git a/pom.xml b/pom.xml index 7bb19e5..223871d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,7 @@ mockserver-client mockserver mockserver-tests + mockserver-api @@ -22,6 +23,7 @@ 3.3.2 1.7.7 1.0.13 + 1.16.6 @@ -63,6 +65,16 @@ logback-classic ${logback-classic.version} + + org.projectlombok + lombok + ${lombok.version} + + + pl.touk.mockserver + mockserver-api + ${project.version} + From ed217704f4c24b02f1e335aa1b0b72e610568600 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 29 Aug 2015 15:44:16 +0200 Subject: [PATCH 028/116] Some changes in performance tests Change-Id: Ieeb2ec1bc3c771cfb0e511b400ab4e6b7666b9c0 --- .../pl/touk/mockserver/tests/ServerMockPT.groovy | 15 ++++++++------- .../touk/mockserver/server/ContextExecutor.groovy | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy index 4ab9e3e..a696a98 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy @@ -19,8 +19,7 @@ import java.util.concurrent.TimeUnit class ServerMockPT extends Specification { - - @Timeout(value = 60) + @Timeout(value = 90) def "should handle many request simultaneously"() { given: HttpClient client = HttpClients.createDefault() @@ -28,7 +27,8 @@ class ServerMockPT extends Specification { RemoteMockServer controlServerClient = new RemoteMockServer("localhost", 9999) int requestAmount = 1000 String[] responses = new String[requestAmount] - ExecutorService executorService = Executors.newFixedThreadPool(20) + ExecutorService executorService = Executors.newCachedThreadPool() + when: for (int i = 0; i < requestAmount; ++i) { int current = i executorService.submit { @@ -45,14 +45,15 @@ class ServerMockPT extends Specification { restPost.entity = new StringEntity("", ContentType.create("text/xml", "UTF-8")) CloseableHttpResponse response = client.execute(restPost) responses[current] = Util.extractStringResponse(response) - assert controlServerClient.removeMock("testRest$current", false).size() == 1 + controlServerClient.removeMock("testRest$current", true) } } - when: - executorService.awaitTermination(60, TimeUnit.SECONDS) + executorService.shutdown() + executorService.awaitTermination(90, TimeUnit.SECONDS) then: - responses.eachWithIndex { res, i -> assert new XmlSlurper().parseText(res).name() == "goodResponse$i" as String } + responses.eachWithIndex { res, i -> assert res && new XmlSlurper().parseText(res).name() == "goodResponse$i" as String } cleanup: + executorService.shutdown() httpMockServer.stop() } } 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 d5a8230..e5c9c98 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -15,12 +15,12 @@ class ContextExecutor { ContextExecutor(HttpServerWraper httpServerWraper, Mock initialMock) { this.httpServerWraper = httpServerWraper - this.path = '/' + initialMock.path + this.path = "/${initialMock.path}" this.mocks = new CopyOnWriteArrayList<>([initialMock]) httpServerWraper.createContext(path) { HttpExchange ex -> 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) { try { From 4e70d3b8bdb208405a3af88d4b9dc30c4e0513f6 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sun, 30 Aug 2015 00:52:24 +0200 Subject: [PATCH 029/116] Some smal improvements Change-Id: I3559572293359bf3fb1c4e4e6892e19d4373ba63 --- .../mockserver/api/response/MockReport.java | 10 ++++++ .../tests/MockServerIntegrationTest.groovy | 15 +++++---- .../mockserver/server/ContextExecutor.groovy | 3 +- .../mockserver/server/HttpMockServer.groovy | 31 +++++++++---------- .../mockserver/server/HttpServerWraper.groovy | 8 ++--- .../pl/touk/mockserver/server/Mock.groovy | 7 +++-- .../touk/mockserver/server/MockRequest.groovy | 4 +-- 7 files changed, 45 insertions(+), 33 deletions(-) diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java index 4ea7449..aa7bd8f 100644 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java @@ -2,6 +2,7 @@ package pl.touk.mockserver.api.response; import lombok.Data; import lombok.EqualsAndHashCode; +import pl.touk.mockserver.api.request.Method; import javax.xml.bind.annotation.XmlElement; @@ -24,4 +25,13 @@ public class MockReport { @XmlElement(required = true) private String responseHeaders; + + @XmlElement(required = true) + private boolean soap; + + @XmlElement(required = true) + private Method method; + + @XmlElement(required = true) + private int statusCode; } 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 1fba403..32c9623 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 @@ -611,7 +611,10 @@ class MockServerIntegrationTest extends Specification { remoteMockServer.addMock(new AddMock( name: 'testRest4', path: 'testEndpoint', - port: 9999 + port: 9999, + soap: true, + statusCode: 204, + method: Method.PUT )) remoteMockServer.addMock(new AddMock( name: 'testRest3', @@ -636,11 +639,11 @@ class MockServerIntegrationTest extends Specification { remoteMockServer.removeMock('testRest5') expect: remoteMockServer.listMocks() == [ - new MockReport(name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }'), - new MockReport(name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '' }''', responseHeaders: '{ _ -> [a: "b"] }'), - new MockReport(name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }'), - new MockReport(name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }'), - new MockReport(name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }') + new MockReport(name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST), + new MockReport(name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST), + new MockReport(name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST), + new MockReport(name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT), + new MockReport(name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST) ] } 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 e5c9c98..545dfed 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -3,6 +3,7 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.transform.PackageScope import groovy.util.logging.Slf4j +import pl.touk.mockserver.api.request.Method import java.util.concurrent.CopyOnWriteArrayList @@ -24,7 +25,7 @@ class ContextExecutor { log.debug("Request: ${request.text}") for (Mock mock : mocks) { try { - if (mock.match(ex.requestMethod, request)) { + if (mock.match(Method.valueOf(ex.requestMethod), request)) { log.debug("Mock ${mock.name} match request ${request.text}") MockResponse httpResponse = mock.apply(request) fillExchange(ex, httpResponse) 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 322ec64..1b8fc9a 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -2,14 +2,11 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.util.logging.Slf4j -import pl.touk.mockserver.api.request.AddMock -import pl.touk.mockserver.api.request.MockServerRequest -import pl.touk.mockserver.api.request.PeekMock -import pl.touk.mockserver.api.request.RemoveMock +import pl.touk.mockserver.api.request.* import pl.touk.mockserver.api.response.* import javax.xml.bind.JAXBContext -import java.util.concurrent.CopyOnWriteArrayList +import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArraySet import static pl.touk.mockserver.server.Util.createResponse @@ -18,7 +15,7 @@ import static pl.touk.mockserver.server.Util.createResponse class HttpMockServer { private final HttpServerWraper httpServerWraper - private final List childServers = new CopyOnWriteArrayList<>() + private final Map childServers = new ConcurrentHashMap<>() private final Set mockNames = new CopyOnWriteArraySet<>() private static @@ -61,7 +58,10 @@ class HttpMockServer { port: it.port, predicate: it.predicateClosureText, response: it.responseClosureText, - responseHeaders: it.responseHeadersClosureText + responseHeaders: it.responseHeadersClosureText, + soap: it.soap, + method: it.method, + statusCode: it.statusCode as int ) } ) @@ -69,7 +69,7 @@ class HttpMockServer { } Set listMocks() { - return childServers.collect { it.mocks }.flatten() as TreeSet + return childServers.values().collect { it.mocks }.flatten() as TreeSet } private void addMock(AddMock request, HttpExchange ex) { @@ -85,10 +85,7 @@ class HttpMockServer { } private static Mock mockFromRequest(AddMock request) { - String name = request.name - String mockPath = request.path - int mockPort = request.port - Mock mock = new Mock(name, mockPath, mockPort) + Mock mock = new Mock(request.name, request.path, request.port) mock.predicate = request.predicate mock.response = request.response mock.soap = request.soap @@ -99,10 +96,10 @@ class HttpMockServer { } private HttpServerWraper getOrCreateChildServer(int mockPort) { - HttpServerWraper child = childServers.find { it.port == mockPort } + HttpServerWraper child = childServers[mockPort] if (!child) { child = new HttpServerWraper(mockPort) - childServers << child + childServers.put(mockPort, child) } return child } @@ -114,7 +111,7 @@ class HttpMockServer { throw new RuntimeException('mock not registered') } log.info("Removing mock $name") - List mockEvents = skipReport ? [] : childServers.collect { + List mockEvents = skipReport ? [] : childServers.values().collect { it.removeMock(name) }.flatten() as List mockNames.remove(name) @@ -154,7 +151,7 @@ class HttpMockServer { throw new RuntimeException('mock not registered') } log.trace("Peeking mock $name") - List mockEvents = childServers.collect { it.peekMock(name) }.flatten() as List + List mockEvents = childServers.values().collect { it.peekMock(name) }.flatten() as List MockPeeked mockPeeked = new MockPeeked( mockEvents: createMockEventReports(mockEvents) ) @@ -166,7 +163,7 @@ class HttpMockServer { } void stop() { - childServers.each { it.stop() } + childServers.values().each { it.stop() } httpServerWraper.stop() } } diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy index 43692f6..b13b7a2 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy @@ -19,7 +19,7 @@ class HttpServerWraper { this.port = port InetSocketAddress addr = new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), port) httpServer = HttpServer.create(addr, 0) - httpServer.executor = Executors.newCachedThreadPool() + httpServer.executor = Executors.newWorkStealingPool() log.info("Http server starting on port $port...") httpServer.start() log.info('Http server is started') @@ -45,14 +45,14 @@ class HttpServerWraper { } List removeMock(String name) { - return executors.collect { it.removeMock(name) }.flatten() + return executors.collect { it.removeMock(name) }.flatten() as List } List peekMock(String name) { - return executors.collect { it.peekMock(name) }.flatten() + return executors.collect { it.peekMock(name) }.flatten() as List } List getMocks() { - return executors.collect { it.mocks }.flatten() + return executors.collect { it.mocks }.flatten() as List } } 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 25f0168..5f3aa06 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -3,6 +3,7 @@ package pl.touk.mockserver.server import groovy.transform.EqualsAndHashCode import groovy.transform.PackageScope import groovy.util.logging.Slf4j +import pl.touk.mockserver.api.request.Method import java.util.concurrent.CopyOnWriteArrayList @@ -21,7 +22,7 @@ class Mock implements Comparable { Closure responseHeaders = toClosure(responseHeadersClosureText) boolean soap = false int statusCode = 200 - String method = 'POST' + Method method = Method.POST int counter = 0 final List history = new CopyOnWriteArrayList<>() @@ -34,7 +35,7 @@ class Mock implements Comparable { this.port = port } - boolean match(String method, MockRequest request) { + boolean match(Method method, MockRequest request) { return this.method == method && predicate(request) } @@ -90,7 +91,7 @@ class Mock implements Comparable { } } - void setMethod(String method) { + void setMethod(Method method) { if (method) { this.method = method } diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy index 5e6ddc8..c4ebe01 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy @@ -46,7 +46,7 @@ class MockRequest { } private static GPathResult getSoapBodyContent(GPathResult xml) { - return xml.Body.'**'[1] + return xml.Body.'**'[1] as GPathResult } private static Object inputToJson(String text) { @@ -66,7 +66,7 @@ class MockRequest { private static Map headersToMap(Headers headers) { return headers.collectEntries { [it.key.toLowerCase(), it.value.join(',')] - } + } as Map } } From d71c191f0f84e3b968410bb7abba9d689b077ac1 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sun, 30 Aug 2015 07:24:48 +0200 Subject: [PATCH 030/116] Fix wrappers names in mock event reports Change-Id: Iecbdbe6310358701f3ce22a97ce453adeefbb40e --- .../touk/mockserver/api/response/MockRequestReport.java | 8 ++++---- .../touk/mockserver/api/response/MockResponseReport.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java index 194b27d..aecd48f 100644 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java @@ -11,14 +11,14 @@ public class MockRequestReport { private String text; @XmlElementWrapper(name = "headers") - @XmlElement(name = "param") + @XmlElement(name = "header") private List headers; - @XmlElementWrapper(name = "query") - @XmlElement(name = "param") + @XmlElementWrapper(name = "queryParams") + @XmlElement(name = "queryParam") private List queryParams; @XmlElementWrapper(name = "path") - @XmlElement(name = "elem") + @XmlElement(name = "pathPart") private List paths; } diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java index 56ac5d5..83d3da5 100644 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java +++ b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java @@ -14,6 +14,6 @@ public class MockResponseReport { private String text; @XmlElementWrapper(name = "headers") - @XmlElement(name = "param") + @XmlElement(name = "header") private List headers; } From 80dbbc034f748b79b8a5370a56e178f9e1abb757 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Wed, 2 Sep 2015 22:59:50 +0200 Subject: [PATCH 031/116] Add xsd and docker Change-Id: Ifad2e3a8678a487e6f13114f910e19bce4d80964 --- Dockerfile | 7 + buildImage.sh | 6 + mockserver-api/pom.xml | 27 ++++ .../touk/mockserver/api/request/AddMock.java | 33 ----- .../touk/mockserver/api/request/Method.java | 15 -- .../api/request/MockServerRequest.java | 4 - .../touk/mockserver/api/request/PeekMock.java | 15 -- .../mockserver/api/request/RemoveMock.java | 17 --- .../mockserver/api/request/package-info.java | 4 - .../api/response/ExceptionOccured.java | 13 -- .../mockserver/api/response/MockAdded.java | 12 -- .../api/response/MockEventReport.java | 14 -- .../mockserver/api/response/MockListing.java | 16 --- .../mockserver/api/response/MockPeeked.java | 16 --- .../mockserver/api/response/MockRemoved.java | 16 --- .../mockserver/api/response/MockReport.java | 37 ----- .../api/response/MockRequestReport.java | 24 ---- .../api/response/MockResponseReport.java | 19 --- .../api/response/MockServerResponse.java | 4 - .../mockserver/api/response/Parameter.java | 15 -- .../mockserver/api/response/package-info.java | 4 - .../pl/touk/mockserver/api/request/jaxb.index | 4 - .../touk/mockserver/api/response/jaxb.index | 11 -- mockserver-api/src/main/xjb/binding.xjb | 10 ++ .../xsd/pl/touk/mockserver/api/common.xsd | 17 +++ .../xsd/pl/touk/mockserver/api/request.xsd | 51 +++++++ .../xsd/pl/touk/mockserver/api/response.xsd | 134 ++++++++++++++++++ .../mockserver/client/RemoteMockServer.groovy | 8 +- .../pl/touk/mockserver/client/Util.groovy | 2 +- .../tests/MockServerIntegrationTest.groovy | 73 +++++----- .../mockserver/server/ContextExecutor.groovy | 2 +- .../mockserver/server/HttpMockServer.groovy | 23 +-- .../pl/touk/mockserver/server/Mock.groovy | 8 +- 33 files changed, 313 insertions(+), 348 deletions(-) create mode 100644 Dockerfile create mode 100755 buildImage.sh delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java delete mode 100644 mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index delete mode 100644 mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index create mode 100644 mockserver-api/src/main/xjb/binding.xjb create mode 100644 mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd create mode 100644 mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd create mode 100644 mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f76ca67 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM java:8 + +ADD mockserver/target/mockserver-1.1.1-SNAPSHOT-jar-with-dependencies.jar /mockserver.jar + +EXPOSE 9999 + +CMD java -jar /mockserver.jar diff --git a/buildImage.sh b/buildImage.sh new file mode 100755 index 0000000..ada5685 --- /dev/null +++ b/buildImage.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +mvn clean install +mvn -f mockserver/pom.xml package assembly:single + +docker build -t mockserver . diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index a7c59b9..c7cbf27 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -17,4 +17,31 @@ lombok + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + org.codehaus.mojo + jaxb2-maven-plugin + + + xjc + process-resources + + xjc + + + + + + \ No newline at end of file diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java deleted file mode 100644 index 80ad580..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java +++ /dev/null @@ -1,33 +0,0 @@ -package pl.touk.mockserver.api.request; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class AddMock extends MockServerRequest { - @XmlElement(required = true) - private String name; - - @XmlElement(required = true) - private String path; - - @XmlElement(required = true) - private int port; - - private String predicate; - - private String response; - - private Boolean soap; - - private Integer statusCode; - - private Method method; - - private String responseHeaders; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java deleted file mode 100644 index 9e471a1..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java +++ /dev/null @@ -1,15 +0,0 @@ -package pl.touk.mockserver.api.request; - -import javax.xml.bind.annotation.XmlEnum; - -@XmlEnum -public enum Method { - POST, - GET, - DELETE, - PUT, - TRACE, - HEAD, - OPTIONS, - PATCH; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java deleted file mode 100644 index 91c1ba9..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java +++ /dev/null @@ -1,4 +0,0 @@ -package pl.touk.mockserver.api.request; - -public abstract class MockServerRequest { -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java deleted file mode 100644 index d4f14ca..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java +++ /dev/null @@ -1,15 +0,0 @@ -package pl.touk.mockserver.api.request; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class PeekMock extends MockServerRequest{ - @XmlElement(required = true) - private String name; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java deleted file mode 100644 index 49c8b0b..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java +++ /dev/null @@ -1,17 +0,0 @@ -package pl.touk.mockserver.api.request; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class RemoveMock extends MockServerRequest { - @XmlElement(required = true) - private String name; - - private Boolean skipReport; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java deleted file mode 100644 index 6ccf1df..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@XmlAccessorType(XmlAccessType.FIELD) package pl.touk.mockserver.api.request; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; \ No newline at end of file diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java deleted file mode 100644 index a10382b..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java +++ /dev/null @@ -1,13 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; - -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlValue; - -@XmlRootElement -@Data -public class ExceptionOccured { - @XmlValue - private String message; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java deleted file mode 100644 index 8dc13a9..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java +++ /dev/null @@ -1,12 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class MockAdded extends MockServerResponse { -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java deleted file mode 100644 index faa2497..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java +++ /dev/null @@ -1,14 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; - -import javax.xml.bind.annotation.XmlElement; - -@Data -public class MockEventReport { - @XmlElement(required = true) - private MockRequestReport request; - - @XmlElement(required = true) - private MockResponseReport response; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java deleted file mode 100644 index 77f5e24..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java +++ /dev/null @@ -1,16 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; - -@XmlRootElement(name = "mocks") -@Data -@EqualsAndHashCode(callSuper = false) -public class MockListing extends MockServerResponse { - @XmlElement(name = "mock") - private List mocks; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java deleted file mode 100644 index a23daae..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java +++ /dev/null @@ -1,16 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class MockPeeked extends MockServerResponse { - @XmlElement(name = "mockEvent") - private List mockEvents; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java deleted file mode 100644 index 008d318..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java +++ /dev/null @@ -1,16 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class MockRemoved extends MockServerResponse { - @XmlElement(name = "mockEvent") - private List mockEvents; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java deleted file mode 100644 index aa7bd8f..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java +++ /dev/null @@ -1,37 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import pl.touk.mockserver.api.request.Method; - -import javax.xml.bind.annotation.XmlElement; - -@Data -public class MockReport { - @XmlElement(required = true) - private String name; - - @XmlElement(required = true) - private String path; - - @XmlElement(required = true) - private int port; - - @XmlElement(required = true) - private String predicate; - - @XmlElement(required = true) - private String response; - - @XmlElement(required = true) - private String responseHeaders; - - @XmlElement(required = true) - private boolean soap; - - @XmlElement(required = true) - private Method method; - - @XmlElement(required = true) - private int statusCode; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java deleted file mode 100644 index aecd48f..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java +++ /dev/null @@ -1,24 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import java.util.List; - -@Data -public class MockRequestReport { - private String text; - - @XmlElementWrapper(name = "headers") - @XmlElement(name = "header") - private List headers; - - @XmlElementWrapper(name = "queryParams") - @XmlElement(name = "queryParam") - private List queryParams; - - @XmlElementWrapper(name = "path") - @XmlElement(name = "pathPart") - private List paths; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java deleted file mode 100644 index 83d3da5..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java +++ /dev/null @@ -1,19 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import java.util.List; - -@Data -public class MockResponseReport { - @XmlElement(required = true) - private int statusCode; - - private String text; - - @XmlElementWrapper(name = "headers") - @XmlElement(name = "header") - private List headers; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java deleted file mode 100644 index bf7e0ae..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package pl.touk.mockserver.api.response; - -public abstract class MockServerResponse { -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java deleted file mode 100644 index 6a9c0c3..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java +++ /dev/null @@ -1,15 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlValue; - -@Data -public class Parameter { - @XmlAttribute(required = true) - private String name; - - @XmlValue - private String value; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java deleted file mode 100644 index d317cb9..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@XmlAccessorType(XmlAccessType.FIELD) package pl.touk.mockserver.api.response; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; \ No newline at end of file diff --git a/mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index b/mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index deleted file mode 100644 index 233becc..0000000 --- a/mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index +++ /dev/null @@ -1,4 +0,0 @@ -AddMock -Method -PeekMock -RemoveMock \ No newline at end of file diff --git a/mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index b/mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index deleted file mode 100644 index 86bdb57..0000000 --- a/mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index +++ /dev/null @@ -1,11 +0,0 @@ -ExceptionOccured -MockAdded -MockEventReport -MockListing -MockPeeked -MockRemoved -MockReport -MockRequestReport -MockResponseReport -MockServerResponse -Parameter \ No newline at end of file diff --git a/mockserver-api/src/main/xjb/binding.xjb b/mockserver-api/src/main/xjb/binding.xjb new file mode 100644 index 0000000..a735d24 --- /dev/null +++ b/mockserver-api/src/main/xjb/binding.xjb @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd new file mode 100644 index 0000000..a48f724 --- /dev/null +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd new file mode 100644 index 0000000..fb4afca --- /dev/null +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd new file mode 100644 index 0000000..21ffd9b --- /dev/null +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 14664e0..ffbc9a0 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 @@ -18,9 +18,7 @@ import javax.xml.bind.JAXBContext class RemoteMockServer { private final String address private final CloseableHttpClient client = HttpClients.createDefault() - private static final JAXBContext requestContext = JAXBContext.newInstance(AddMock.package.name, AddMock.classLoader) - private static - final JAXBContext responseContext = JAXBContext.newInstance(MockAdded.package.name, MockAdded.classLoader) + private static final JAXBContext requestContext = JAXBContext.newInstance(AddMock, PeekMock, RemoveMock) RemoteMockServer(String host, int port) { address = "http://$host:$port/serverControl" @@ -70,7 +68,7 @@ class RemoteMockServer { List listMocks() { HttpGet get = new HttpGet(address) CloseableHttpResponse response = client.execute(get) - MockListing mockListing = Util.extractResponse(response) as MockListing - return mockListing.mocks + Mocks mocks = Util.extractResponse(response) as Mocks + return mocks.mocks } } diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy index 446ebf0..966625f 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy @@ -35,7 +35,7 @@ class Util { return responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as MockServerResponse } ExceptionOccured exceptionOccured = responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as ExceptionOccured - String message = exceptionOccured.message + String message = exceptionOccured.value if (message == 'mock already registered') { throw new MockAlreadyExists() } 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 32c9623..018a28d 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 @@ -8,7 +8,7 @@ import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients import org.apache.http.util.EntityUtils import pl.touk.mockserver.api.request.AddMock -import pl.touk.mockserver.api.request.Method +import pl.touk.mockserver.api.common.Method import pl.touk.mockserver.api.response.MockEventReport import pl.touk.mockserver.api.response.MockReport import pl.touk.mockserver.api.response.Parameter @@ -637,14 +637,21 @@ class MockServerIntegrationTest extends Specification { port: 9999 )) remoteMockServer.removeMock('testRest5') - expect: - remoteMockServer.listMocks() == [ - new MockReport(name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST), - new MockReport(name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST), - new MockReport(name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST), - new MockReport(name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT), - new MockReport(name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST) - ] + when: + List mockReport = remoteMockServer.listMocks() + then: + mockReport.size() == 5 + assertMockReport(mockReport[0], [name:'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) + assertMockReport(mockReport[1], [name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST]) + assertMockReport(mockReport[2], [name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) + assertMockReport(mockReport[3], [name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT]) + assertMockReport(mockReport[4], [name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) + } + + private void assertMockReport( MockReport mockReport, Map props) { + props.each { + assert mockReport."${it.key}" == it.value + } } def "should add mock accepts path certain path params"() { @@ -718,18 +725,18 @@ class MockServerIntegrationTest extends Specification { then: mockEvents1.size() == 2 mockEvents1[0].request.text == '' - !mockEvents1[0].request.headers?.empty - mockEvents1[0].request.queryParams == [] - mockEvents1[0].request.paths == ['testEndpoint'] - !mockEvents1[0].response.headers?.empty + !mockEvents1[0].request.headers?.headers?.empty + mockEvents1[0].request.queryParams.queryParams == [] + mockEvents1[0].request.path.pathParts == ['testEndpoint'] + !mockEvents1[0].response.headers?.headers?.empty mockEvents1[0].response.text == '' mockEvents1[0].response.statusCode == 201 mockEvents1[1].request.text == '' - !mockEvents1[1].request.headers?.empty - mockEvents1[1].request.queryParams == [] - mockEvents1[1].request.paths == ['testEndpoint', 'hello'] - !mockEvents1[1].response.headers?.empty + !mockEvents1[1].request.headers?.headers?.empty + mockEvents1[1].request.queryParams.queryParams == [] + mockEvents1[1].request.path.pathParts == ['testEndpoint', 'hello'] + !mockEvents1[1].response.headers?.headers?.empty mockEvents1[1].response.text == '' mockEvents1[1].response.statusCode == 201 when: @@ -737,10 +744,10 @@ class MockServerIntegrationTest extends Specification { then: mockEvents2.size() == 1 mockEvents2[0].request.text == '' - !mockEvents2[0].request.headers?.empty - mockEvents2[0].request.queryParams == [new Parameter(name: 'id', value: '123')] - mockEvents2[0].request.paths == ['testEndpoint'] - mockEvents2[0].response.headers.find { it.name == 'aaa' }?.value == '15' + !mockEvents2[0].request.headers?.headers?.empty + mockEvents2[0].request.queryParams.queryParams.find { it.name == 'id' }?.value == '123' + mockEvents2[0].request.path.pathParts == ['testEndpoint'] + mockEvents2[0].response.headers.headers.find { it.name == 'aaa' }?.value == '15' mockEvents2[0].response.text == '' mockEvents2[0].response.statusCode == 202 } @@ -793,18 +800,18 @@ class MockServerIntegrationTest extends Specification { then: mockEvents1.size() == 2 mockEvents1[0].request.text == '' - !mockEvents1[0].request.headers?.empty - mockEvents1[0].request.queryParams == [] - mockEvents1[0].request.paths == ['testEndpoint'] - !mockEvents1[0].response.headers?.empty + !mockEvents1[0].request.headers?.headers?.empty + mockEvents1[0].request.queryParams.queryParams == [] + mockEvents1[0].request.path.pathParts == ['testEndpoint'] + !mockEvents1[0].response.headers?.headers?.empty mockEvents1[0].response.text == '' mockEvents1[0].response.statusCode == 201 mockEvents1[1].request.text == '' - !mockEvents1[1].request.headers?.empty - mockEvents1[1].request.queryParams == [] - mockEvents1[1].request.paths == ['testEndpoint', 'hello'] - !mockEvents1[1].response.headers?.empty + !mockEvents1[1].request.headers?.headers?.empty + mockEvents1[1].request.queryParams.queryParams == [] + mockEvents1[1].request.path.pathParts == ['testEndpoint', 'hello'] + !mockEvents1[1].response.headers?.headers?.empty mockEvents1[1].response.text == '' mockEvents1[1].response.statusCode == 201 when: @@ -812,10 +819,10 @@ class MockServerIntegrationTest extends Specification { then: mockEvents2.size() == 1 mockEvents2[0].request.text == '' - !mockEvents2[0].request.headers?.empty - mockEvents2[0].request.queryParams == [new Parameter(name: 'id', value: '123')] - mockEvents2[0].request.paths == ['testEndpoint'] - mockEvents2[0].response.headers.find {it.name == 'aaa'}?.value == '15' + !mockEvents2[0].request.headers?.headers?.empty + mockEvents2[0].request.queryParams.queryParams.find{it.name == 'id'}?.value == '123' + mockEvents2[0].request.path.pathParts == ['testEndpoint'] + mockEvents2[0].response.headers.headers.find {it.name == 'aaa'}?.value == '15' mockEvents2[0].response.text == '' mockEvents2[0].response.statusCode == 202 } 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 545dfed..f450df4 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -3,7 +3,7 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.transform.PackageScope import groovy.util.logging.Slf4j -import pl.touk.mockserver.api.request.Method +import pl.touk.mockserver.api.common.Method import java.util.concurrent.CopyOnWriteArrayList 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 1b8fc9a..0b601ff 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -2,7 +2,10 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.util.logging.Slf4j -import pl.touk.mockserver.api.request.* +import pl.touk.mockserver.api.request.AddMock +import pl.touk.mockserver.api.request.MockServerRequest +import pl.touk.mockserver.api.request.PeekMock +import pl.touk.mockserver.api.request.RemoveMock import pl.touk.mockserver.api.response.* import javax.xml.bind.JAXBContext @@ -50,7 +53,7 @@ class HttpMockServer { } void listMocks(HttpExchange ex) { - MockListing mockListing = new MockListing( + Mocks mockListing = new Mocks( mocks: listMocks().collect { new MockReport( name: it.name, @@ -126,20 +129,20 @@ class HttpMockServer { new MockEventReport( request: new MockRequestReport( text: it.request.text, - headers: it.request.headers.collect { + headers: new MockRequestReport.Headers(headers: it.request.headers.collect { new Parameter(name: it.key, value: it.value) - }, - queryParams: it.request.query.collect { + }), + queryParams: new MockRequestReport.QueryParams(queryParams: it.request.query.collect { new Parameter(name: it.key, value: it.value) - }, - paths: it.request.path + }), + path: new MockRequestReport.Path(pathParts: it.request.path) ), response: new MockResponseReport( statusCode: it.response.statusCode, text: it.response.text, - headers: it.response.headers.collect { + headers: new MockResponseReport.Headers(headers: it.response.headers.collect { new Parameter(name: it.key, value: it.value) - } + }) ) ) } @@ -159,7 +162,7 @@ class HttpMockServer { } private static void createErrorResponse(HttpExchange ex, Exception e) { - createResponse(ex, new ExceptionOccured(message: e.message), 400) + createResponse(ex, new ExceptionOccured(value: e.message), 400) } void stop() { 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 5f3aa06..32bad68 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -3,7 +3,7 @@ package pl.touk.mockserver.server import groovy.transform.EqualsAndHashCode import groovy.transform.PackageScope import groovy.util.logging.Slf4j -import pl.touk.mockserver.api.request.Method +import pl.touk.mockserver.api.common.Method import java.util.concurrent.CopyOnWriteArrayList @@ -79,10 +79,8 @@ class Mock implements Comparable { } } - void setSoap(String soap) { - if (soap) { - this.soap = Boolean.valueOf(soap) - } + void setSoap(Boolean soap) { + this.soap = soap ?: false } void setStatusCode(String statusCode) { From b75a6d84dbcf3bc0115d54ac54111cf7ef6fe772 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Thu, 3 Sep 2015 20:44:06 +0200 Subject: [PATCH 032/116] Add docker compose configuration Change-Id: I391482d93b0274a8b9b6500da94d6406d1341137 --- docker-compose.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..89a125a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,4 @@ +mocks: + image: mockserver + ports: + - "9999:9999" From 18e75f33525ca3698dd3750098ab232a79921d8d Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 19 Sep 2015 19:35:23 +0200 Subject: [PATCH 033/116] Update readme of jaxb version Change-Id: I09479e17c8e7c1bbc5be881c8526de63c681f4e4 --- README.md | 64 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 96c7c4c..9f46938 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ java -jar mockserver--jar-with-dependencies.jar [PORT] ```java RemoteMockServer remoteMockServer = new RemoteMockServer('localhost', ) -remoteMockServer.addMock(new AddMockRequestData( +remoteMockServer.addMock(new AddMock( name: '...', path: '...', port: ..., @@ -35,7 +35,7 @@ or via sending POST request to localhost:/serverControl ```xml - + ... ... ... @@ -72,13 +72,13 @@ In closures input parameter (called req) contains properties: Response if success: ```xml - + ``` Response with error message if failure: ```xml -... +... ``` ## Mock could be peeked to get get report of its invocations. @@ -91,61 +91,60 @@ List mockEvents = remoteMockServer.peekMock('...') Via sending POST request to localhost:/serverControl ```xml - - ... + + ... ``` Response if success: ```xml - + ... - ... +
...
...
- - ... + + ... ... - + - ... + ... ...
+ ... ... - ... +
...
...
- ...
- ...
``` Response with error message if failure: ```xml -... +... ``` -## When mock was used it could be unregistered by name. It also returns report of mock invocations. +## When mock was used it could be unregistered by name. It also optionally returns report of mock invocations if second parameter is true. Via client: ```java -List mockEvents = remoteMockServer.removeMock('...') +List mockEvents = remoteMockServer.removeMock('...', ...) ``` Via sending POST request to localhost:/serverControl ```xml - + ... ... @@ -154,47 +153,46 @@ Via sending POST request to localhost:/serverControl Response if success (and skipReport not given or equal false): ```xml - + ... - ... +
...
...
- - ... + + ... ... - + - ... + ... ...
+ ... ... - ... +
...
...
- ...
- ...
``` If skipReport is set to true then response will be: ```xml - + ``` Response with error message if failure: ```xml -... +... ``` @@ -215,6 +213,12 @@ Response: ... ... ... + ... + ... + ... + ... + ... + ...
...
From b5a14d463e6af7214c49ec9cd865d44e0a69207b Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 19 Sep 2015 19:48:17 +0200 Subject: [PATCH 034/116] Mockserver works only on Java 8 Change-Id: I47e5ad027399cfeb5874837b3e206e052a4922da --- .travis.yml | 1 - mockserver-api/pom.xml | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ad81e63..bfa78aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: groovy jdk: - - oraclejdk7 - oraclejdk8 diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index c7cbf27..4d64a21 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -32,6 +32,7 @@ org.codehaus.mojo jaxb2-maven-plugin + 2.2 xjc From 49f211eef76d046d67508d7da28cb31e695e4a43 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 19 Sep 2015 20:19:44 +0200 Subject: [PATCH 035/116] Fix after rebase Change-Id: Ia01b2a6122b7fd778a90b8383d503f65c65e80ea --- .../pl/touk/mockserver/tests/MockServerIntegrationTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 018a28d..3dd7ec4 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 @@ -858,7 +858,7 @@ class MockServerIntegrationTest extends Specification { @Unroll def "should reject mock when it has System.exit in closure"() { when: - remoteMockServer.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', port: 9999, From 784e8ea8f0d65a4adfc62e8df8abf710f996d89a Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Sat, 19 Sep 2015 20:27:28 +0200 Subject: [PATCH 036/116] [maven-release-plugin] prepare release http-mock-server-2.0.0 --- mockserver-api/pom.xml | 6 ++---- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 4d64a21..597ea07 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -1,11 +1,9 @@ - + http-mock-server pl.touk.mockserver - 1.1.1-SNAPSHOT + 2.0.0 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 5041602..ccb2253 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.1.1-SNAPSHOT + 2.0.0 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index fa4cc9b..6585e7e 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.1.1-SNAPSHOT + 2.0.0 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 6223937..a786ce6 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 1.1.1-SNAPSHOT + 2.0.0 4.0.0 diff --git a/pom.xml b/pom.xml index 223871d..6ca3180 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 1.1.1-SNAPSHOT + 2.0.0 mockserver-client mockserver From 0f45ccd82ae3b235c0574a2b04645f0682358c95 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Sat, 19 Sep 2015 20:27:29 +0200 Subject: [PATCH 037/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 597ea07..14dc337 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.0.0 + 2.0.1-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index ccb2253..f41dfe5 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.0.0 + 2.0.1-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 6585e7e..f1eefd8 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.0.0 + 2.0.1-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index a786ce6..2c35d90 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.0.0 + 2.0.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 6ca3180..da7b792 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 2.0.0 + 2.0.1-SNAPSHOT mockserver-client mockserver From aabc9d75f213d803263bea4cdb85396db152e8b8 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Sat, 19 Sep 2015 20:54:52 +0200 Subject: [PATCH 038/116] Update version in Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f76ca67..38a4b1f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM java:8 -ADD mockserver/target/mockserver-1.1.1-SNAPSHOT-jar-with-dependencies.jar /mockserver.jar +ADD mockserver/target/mockserver-2.0.0-jar-with-dependencies.jar /mockserver.jar EXPOSE 9999 From 9a14f9bfabbbba7aba4427403b8c37dfce295ade Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 13:46:52 +0200 Subject: [PATCH 039/116] Add request validation against xsd Change-Id: Iadf618e50d01dd92bf9eed5b8ed98138b56c20c9 --- .../xsd/pl/touk/mockserver/api/request.xsd | 1 + .../xsd/pl/touk/mockserver/api/response.xsd | 1 + .../client/InvalidMockRequestSchema.groovy | 9 ++ .../pl/touk/mockserver/client/Util.groovy | 3 + .../tests/MockServerIntegrationTest.groovy | 124 +++++++++++++++++- .../src/test/resources/schema1.xsd | 19 +++ .../src/test/resources/schema2.xsd | 12 ++ .../mockserver/server/HttpMockServer.groovy | 9 +- .../pl/touk/mockserver/server/Mock.groovy | 33 +++++ .../touk/mockserver/server/MockRequest.groovy | 4 + 10 files changed, 205 insertions(+), 10 deletions(-) create mode 100644 mockserver-client/src/main/groovy/pl/touk/mockserver/client/InvalidMockRequestSchema.groovy create mode 100644 mockserver-tests/src/test/resources/schema1.xsd create mode 100644 mockserver-tests/src/test/resources/schema2.xsd diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd index fb4afca..10c7190 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd @@ -21,6 +21,7 @@ + diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd index 21ffd9b..9e630dc 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd @@ -108,6 +108,7 @@ + diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/InvalidMockRequestSchema.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/InvalidMockRequestSchema.groovy new file mode 100644 index 0000000..ff3d401 --- /dev/null +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/InvalidMockRequestSchema.groovy @@ -0,0 +1,9 @@ +package pl.touk.mockserver.client + +import groovy.transform.CompileStatic +import groovy.transform.TypeChecked + +@CompileStatic +@TypeChecked +class InvalidMockRequestSchema extends RuntimeException { +} diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy index 966625f..3a427d6 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy @@ -42,6 +42,9 @@ class Util { if (message == 'mock not registered') { throw new MockDoesNotExist() } + if (message == 'mock request schema is invalid schema') { + throw new InvalidMockRequestSchema() + } throw new InvalidMockDefinition(message) } 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 3dd7ec4..fa61e4a 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 @@ -7,11 +7,10 @@ import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients import org.apache.http.util.EntityUtils -import pl.touk.mockserver.api.request.AddMock import pl.touk.mockserver.api.common.Method +import pl.touk.mockserver.api.request.AddMock import pl.touk.mockserver.api.response.MockEventReport import pl.touk.mockserver.api.response.MockReport -import pl.touk.mockserver.api.response.Parameter import pl.touk.mockserver.client.* import pl.touk.mockserver.server.HttpMockServer import spock.lang.Shared @@ -146,6 +145,20 @@ class MockServerIntegrationTest extends Specification { thrown(MockAlreadyExists) } + def "should not add mock when schema does not exist"() { + when: + remoteMockServer.addMock(new AddMock( + name: 'test', + path: 'testEndpoint2', + port: 9998, + response: '''{req -> ""}''', + soap: false, + schema: 'ble.xsd' + )) + then: + thrown(InvalidMockRequestSchema) + } + def "should not add mock with empty name"() { when: remoteMockServer.addMock(new AddMock( @@ -634,21 +647,22 @@ class MockServerIntegrationTest extends Specification { remoteMockServer.addMock(new AddMock( name: 'testRest', path: 'testEndpoint', - port: 9999 + port: 9999, + schema: 'schema2.xsd' )) remoteMockServer.removeMock('testRest5') when: List mockReport = remoteMockServer.listMocks() then: mockReport.size() == 5 - assertMockReport(mockReport[0], [name:'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) + assertMockReport(mockReport[0], [name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST, schema: 'schema2.xsd']) assertMockReport(mockReport[1], [name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST]) assertMockReport(mockReport[2], [name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) assertMockReport(mockReport[3], [name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT]) assertMockReport(mockReport[4], [name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) } - private void assertMockReport( MockReport mockReport, Map props) { + private static void assertMockReport(MockReport mockReport, Map props) { props.each { assert mockReport."${it.key}" == it.value } @@ -820,9 +834,9 @@ class MockServerIntegrationTest extends Specification { mockEvents2.size() == 1 mockEvents2[0].request.text == '' !mockEvents2[0].request.headers?.headers?.empty - mockEvents2[0].request.queryParams.queryParams.find{it.name == 'id'}?.value == '123' + mockEvents2[0].request.queryParams.queryParams.find { it.name == 'id' }?.value == '123' mockEvents2[0].request.path.pathParts == ['testEndpoint'] - mockEvents2[0].response.headers.headers.find {it.name == 'aaa'}?.value == '15' + mockEvents2[0].response.headers.headers.find { it.name == 'aaa' }?.value == '15' mockEvents2[0].response.text == '' mockEvents2[0].response.statusCode == 202 } @@ -881,4 +895,100 @@ class MockServerIntegrationTest extends Specification { '''{req -> System.exit (-1); req.xml.name() == 'request'}''' ] } + + def "should validate request against multiple schema files"() { + expect: + remoteMockServer.addMock(new AddMock( + name: 'testRest', + path: 'testEndpoint', + port: 9999, + schema: 'schema1.xsd', + response: '''{req -> ''}''', + soap: false + )) + when: + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity('15unknown', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then: + response.statusLine.statusCode == 400 + Util.extractStringResponse(response).contains('''Value 'unknown' is not facet-valid with respect to enumeration '[test, prod, preprod]'.''') + when: + HttpPost restPost2 = new HttpPost('http://localhost:9999/testEndpoint') + restPost2.entity = new StringEntity('15test', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response2 = client.execute(restPost2) + then: + Util.consumeResponse(response2) + response2.statusLine.statusCode == 200 + expect: + remoteMockServer.removeMock('testRest')?.size() == 2 + } + + def "should validate soap request"() { + expect: + remoteMockServer.addMock(new AddMock( + name: 'testSoap', + path: 'testEndpoint', + port: 9999, + schema: 'schema1.xsd', + response: '''{req -> ''}''', + soap: true + )) + when: + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity(Util.soap('15unknown'), ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then: + response.statusLine.statusCode == 400 + Util.extractStringResponse(response).contains('''Value 'unknown' is not facet-valid with respect to enumeration '[test, prod, preprod]'.''') + when: + HttpPost restPost2 = new HttpPost('http://localhost:9999/testEndpoint') + restPost2.entity = new StringEntity(Util.soap('15test'), ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response2 = client.execute(restPost2) + then: + Util.consumeResponse(response2) + response2.statusLine.statusCode == 200 + expect: + remoteMockServer.removeMock('testSoap')?.size() == 2 + } + + def "should validate soap request with namespace in envelope"() { + expect: + remoteMockServer.addMock(new AddMock( + name: 'testSoap', + path: 'testEndpoint', + port: 9999, + schema: 'schema1.xsd', + response: '''{req -> ''}''', + soap: true + )) + when: + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity(''' + + 15unknown + +''', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then: + response.statusLine.statusCode == 400 + Util.extractStringResponse(response).contains('''Value 'unknown' is not facet-valid with respect to enumeration '[test, prod, preprod]'.''') + when: + HttpPost restPost2 = new HttpPost('http://localhost:9999/testEndpoint') + restPost2.entity = new StringEntity(''' + + 15test + +''', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response2 = client.execute(restPost2) + then: + Util.consumeResponse(response2) + response2.statusLine.statusCode == 200 + expect: + remoteMockServer.removeMock('testSoap')?.size() == 2 + } } diff --git a/mockserver-tests/src/test/resources/schema1.xsd b/mockserver-tests/src/test/resources/schema1.xsd new file mode 100644 index 0000000..4ca340a --- /dev/null +++ b/mockserver-tests/src/test/resources/schema1.xsd @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + diff --git a/mockserver-tests/src/test/resources/schema2.xsd b/mockserver-tests/src/test/resources/schema2.xsd new file mode 100644 index 0000000..611d010 --- /dev/null +++ b/mockserver-tests/src/test/resources/schema2.xsd @@ -0,0 +1,12 @@ + + + + + + + + + + + + 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 0b601ff..8eaab6d 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -64,7 +64,8 @@ class HttpMockServer { responseHeaders: it.responseHeadersClosureText, soap: it.soap, method: it.method, - statusCode: it.statusCode as int + statusCode: it.statusCode as int, + schema: it.schema ) } ) @@ -95,6 +96,7 @@ class HttpMockServer { mock.statusCode = request.statusCode mock.method = request.method mock.responseHeaders = request.responseHeaders + mock.schema = request.schema return mock } @@ -135,12 +137,12 @@ class HttpMockServer { queryParams: new MockRequestReport.QueryParams(queryParams: it.request.query.collect { new Parameter(name: it.key, value: it.value) }), - path: new MockRequestReport.Path(pathParts: it.request.path) + path: new MockRequestReport.Path(pathParts: it.request.path) ), response: new MockResponseReport( statusCode: it.response.statusCode, text: it.response.text, - headers: new MockResponseReport.Headers(headers: it.response.headers.collect { + headers: new MockResponseReport.Headers(headers: it.response.headers.collect { new Parameter(name: it.key, value: it.value) }) ) @@ -162,6 +164,7 @@ class HttpMockServer { } private static void createErrorResponse(HttpExchange ex, Exception e) { + log.warn('Exception occured', e) createResponse(ex, new ExceptionOccured(value: e.message), 400) } 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 32bad68..15b538f 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -5,6 +5,10 @@ import groovy.transform.PackageScope import groovy.util.logging.Slf4j import pl.touk.mockserver.api.common.Method +import javax.xml.XMLConstants +import javax.xml.transform.stream.StreamSource +import javax.xml.validation.SchemaFactory +import javax.xml.validation.Validator import java.util.concurrent.CopyOnWriteArrayList @PackageScope @@ -25,6 +29,8 @@ class Mock implements Comparable { Method method = Method.POST int counter = 0 final List history = new CopyOnWriteArrayList<>() + String schema + private Validator validator Mock(String name, String path, int port) { if (!(name)) { @@ -41,6 +47,20 @@ class Mock implements Comparable { MockResponse apply(MockRequest request) { log.debug("Mock $name invoked") + if (validator) { + try { + log.debug('Validating...') + if (soap) { + validator.validate(new StreamSource(new StringReader(request.textWithoutSoap))) + } else { + validator.validate(new StreamSource(new StringReader(request.text))) + } + } catch (Exception e) { + MockResponse response = new MockResponse(400, e.message, [:]) + history << new MockEvent(request, response) + return response + } + } ++counter String responseText = response(request) String response = soap ? wrapSoap(responseText) : responseText @@ -106,4 +126,17 @@ class Mock implements Comparable { int compareTo(Mock o) { return name.compareTo(o.name) } + + void setSchema(String schema) { + this.schema = schema + if (schema) { + try { + validator = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI) + .newSchema(new File(this.class.getResource("/$schema").path)) + .newValidator() + } catch (Exception e) { + throw new RuntimeException('mock request schema is invalid schema', e) + } + } + } } diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy index c4ebe01..f8dc561 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy @@ -4,6 +4,7 @@ import com.sun.net.httpserver.Headers import groovy.json.JsonSlurper import groovy.transform.PackageScope import groovy.util.slurpersupport.GPathResult +import groovy.xml.XmlUtil @PackageScope class MockRequest { @@ -69,4 +70,7 @@ class MockRequest { } as Map } + String getTextWithoutSoap() { + return XmlUtil.serialize(soap) + } } From faf8f8006a8cb51e5492eeb08970bc69c6d43c87 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 14:16:26 +0200 Subject: [PATCH 040/116] Describe schema validation parameter Change-Id: I45e2a2d5af6317c626d797613028693635e3c936 --- README.md | 57 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 9f46938..366ef30 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,24 @@ # HTTP MOCK SERVER -## Create server jar (in mockserver directory) +## Create server jar ``` +cd mockserver mvn clean package assembly:single ``` -## Start server on port (default 9999) +## Start server ``` java -jar mockserver--jar-with-dependencies.jar [PORT] ``` -## Create mock on server via client +Default port is 9999. + +## Create mock on server + +### Via client ```java RemoteMockServer remoteMockServer = new RemoteMockServer('localhost', ) @@ -27,11 +32,13 @@ remoteMockServer.addMock(new AddMock( soap: ..., statusCode: ..., method: ..., - responseHeaders: ... + responseHeaders: ..., + schema: ... )) ``` - -or via sending POST request to localhost:/serverControl +### Via HTTP + +Send POST request to localhost:/serverControl ```xml @@ -45,9 +52,12 @@ or via sending POST request to localhost:/serverControl ... ... ... + ...
``` +### Parameters + * name - name of mock, must be unique * path - path on which mock should be created * port - inteer, port on which mock should be created, cannot be the same as mock server port @@ -57,17 +67,19 @@ or via sending POST request to localhost:/serverControl * statusCode - integer, status code of response when predicate is satisfied, default 200 * method - POST|PUT|DELETE|GET|TRACE|OPTION|HEAD, expected http method of request, default POST * responseHeaders - groovyClosure as string which must evaluate to Map which will be added to response headers, default { _ -> [:] } +* schema - path to xsd schema file on mockserver classpath; default empty, so no vallidation of request is performed; if validation fails then response has got status 400 and response is raw message from validator + +### Closures request properties In closures input parameter (called req) contains properties: - * text - request body as java.util.String * headers - java.util.Map with request headers * query - java.util.Map with query parameters * xml - groovy.util.slurpersupport.GPathResult created from request body (if request body is valid xml) * soap - groovy.util.slurpersupport.GPathResult created from request body without Envelope and Body elements (if request body is valid soap xml) * json - java.lang.Object created from request body (if request body is valid json) -* path - java.util.List with not empty parts of request path +* path - java.util.List with not empty parts of request path Response if success: @@ -81,14 +93,17 @@ Response with error message if failure: ... ``` -## Mock could be peeked to get get report of its invocations. -Via client: +## Peek mock +Mock could be peeked to get get report of its invocations. + +### Via client ```java List mockEvents = remoteMockServer.peekMock('...') ``` -Via sending POST request to localhost:/serverControl +### Via HTTP +Send POST request to localhost:/serverControl ```xml @@ -134,14 +149,17 @@ Response with error message if failure: ... ``` -## When mock was used it could be unregistered by name. It also optionally returns report of mock invocations if second parameter is true. -Via client: +## Remove mock + +When mock was used it could be unregistered by name. It also optionally returns report of mock invocations if second parameter is true. + +### Via client ```java List mockEvents = remoteMockServer.removeMock('...', ...) ``` - -Via sending POST request to localhost:/serverControl +### Via HTTP +Send POST request to localhost:/serverControl ```xml @@ -188,22 +206,23 @@ If skipReport is set to true then response will be: ``` - Response with error message if failure: ```xml ... ``` +## List mocks definitions -## List of current registered mocks could be retrieved: -Via client: +### Via client ```java List mocks = remoteMockServer.listMocks() ``` -or via sending GET request to localhost:/serverControl +### Via HTTP + +Send GET request to localhost:/serverControl Response: From 3e695fcb78b8a8955f1331e10e823846a075eb70 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 15:01:44 +0200 Subject: [PATCH 041/116] Create full docker with static name Change-Id: Id376cf70702371a7cd6496dab9ce85b7fdc643a3 --- Dockerfile | 8 ++++++-- README.md | 2 +- buildImage.sh | 3 +-- docker-compose.yml | 2 ++ mockserver/pom.xml | 5 ++++- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 38a4b1f..fc44fd1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,11 @@ FROM java:8 -ADD mockserver/target/mockserver-2.0.0-jar-with-dependencies.jar /mockserver.jar +ADD mockserver/target/mockserver-full.jar /mockserver.jar EXPOSE 9999 -CMD java -jar /mockserver.jar +RUN mkdir /externalSchema + +VOLUME /externalSchema + +CMD java -cp /mockserver.jar:/externalSchema -jar /mockserver.jar diff --git a/README.md b/README.md index 366ef30..ff776e7 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ mvn clean package assembly:single ## Start server ``` -java -jar mockserver--jar-with-dependencies.jar [PORT] +java -jar mockserver.jar [PORT] ``` Default port is 9999. diff --git a/buildImage.sh b/buildImage.sh index ada5685..7916512 100755 --- a/buildImage.sh +++ b/buildImage.sh @@ -1,6 +1,5 @@ #!/bin/sh -mvn clean install -mvn -f mockserver/pom.xml package assembly:single +mvn -f mockserver/pom.xml clean package assembly:single docker build -t mockserver . diff --git a/docker-compose.yml b/docker-compose.yml index 89a125a..6cb6ea7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,3 +2,5 @@ mocks: image: mockserver ports: - "9999:9999" + volumes: + - /tmp:/externalSchema diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 2c35d90..e572886 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -1,5 +1,6 @@ - + http-mock-server pl.touk.mockserver @@ -46,6 +47,8 @@ jar-with-dependencies + mockserver-full + false
From 1a5e0e5e17ab518ad208ecd300ba98704345e618 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 15:07:00 +0200 Subject: [PATCH 042/116] Change scm in pom Change-Id: I22f0eed1f3e23d2ffd5de32377d08dd04def2778 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index da7b792..cab07bf 100644 --- a/pom.xml +++ b/pom.xml @@ -27,8 +27,8 @@ - scm:git:ssh://gerrit.touk.pl:29418/integracja/http-mock-server - scm:git:ssh://gerrit.touk.pl:29418/integracja/http-mock-server + scm:git:ssh://git@github.com:TouK/http-mock-server.git + scm:git:ssh://git@github.com:TouK/http-mock-server.git HEAD From 70c0f678ef62f04c1cd929b65935d08328255193 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 15:09:54 +0200 Subject: [PATCH 043/116] Let all modules release without asking Change-Id: Ide781016b656ddbf392ae75bb8de7f45bd7e91b8 --- pom.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pom.xml b/pom.xml index cab07bf..080698a 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,8 @@ 1.7.7 1.0.13 1.16.6 + + true @@ -94,6 +96,14 @@
+ + org.apache.maven.plugins + maven-release-plugin + 2.5.2 + + true + + From f4dde98f175905616478728b87591134ebbcbee3 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 15:15:00 +0200 Subject: [PATCH 044/116] Fix connection in scm Change-Id: If051253e6ffc95ed789b2e173a7bb78d38160ce9 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 080698a..cdf1bcd 100644 --- a/pom.xml +++ b/pom.xml @@ -29,8 +29,8 @@ - scm:git:ssh://git@github.com:TouK/http-mock-server.git - scm:git:ssh://git@github.com:TouK/http-mock-server.git + scm:git:git@github.com:TouK/http-mock-server.git + scm:git:git@github.com:TouK/http-mock-server.git HEAD From 6b90bbdc819f68e6001547c65755132d53f8a0b4 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 15:29:14 +0200 Subject: [PATCH 045/116] [maven-release-plugin] prepare release http-mock-server-2.1.0 Change-Id: I4a700aa706a0de0f358635c30248778f8a6521ad --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 5 ++--- pom.xml | 4 ++-- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 14dc337..3a57b94 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.0.1-SNAPSHOT + 2.1.0 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index f41dfe5..375ab6b 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.0.1-SNAPSHOT + 2.1.0 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index f1eefd8..9bc3391 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.0.1-SNAPSHOT + 2.1.0 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index e572886..94e82d3 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -1,10 +1,9 @@ - + http-mock-server pl.touk.mockserver - 2.0.1-SNAPSHOT + 2.1.0 4.0.0 diff --git a/pom.xml b/pom.xml index cdf1bcd..21e4986 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 2.0.1-SNAPSHOT + 2.1.0 mockserver-client mockserver @@ -31,7 +31,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.1.0 From e104672d83b4aec4838613426e0bbfdec074a05e Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 15:29:20 +0200 Subject: [PATCH 046/116] [maven-release-plugin] prepare for next development iteration Change-Id: I227f5f5d3528f06c34333f582063d85da60b2335 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 3a57b94..0b85a82 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.0 + 2.1.1-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 375ab6b..3dc3d2f 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.0 + 2.1.1-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 9bc3391..2cf1d44 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.0 + 2.1.1-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 94e82d3..4bcadaa 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.0 + 2.1.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 21e4986..615bf9f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pl.touk.mockserver http-mock-server pom - 2.1.0 + 2.1.1-SNAPSHOT mockserver-client mockserver @@ -31,7 +31,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.1.0 + HEAD From e17e20fadb07fb03098ba04340d43984c50ece49 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 15:47:13 +0200 Subject: [PATCH 047/116] Change parent pom and repository Change-Id: I7527e7f0da8fe0c0b4809074008ec97b93894992 --- pom.xml | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 615bf9f..81e2639 100644 --- a/pom.xml +++ b/pom.xml @@ -2,6 +2,12 @@ 4.0.0 + + pl.touk + top + 1.0.7 + + pl.touk.mockserver http-mock-server pom @@ -107,17 +113,19 @@ - + + + Dominik Przybysz + alien11689@gmail.com + + + + - touk.nexus.release - TouK Virtual Repository - http://nexus.touk.pl/nexus/content/repositories/releases + touk + TouK Open source repository + https://philanthropist.touk.pl/nexus/content/repositories/releases - - touk.nexus.snapshots - TouK Virtual Repository - http://nexus.touk.pl/nexus/content/repositories/snapshots - - + From 631a6515104ec75104cdc68c8d3b21439764501c Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 15:49:25 +0200 Subject: [PATCH 048/116] [maven-release-plugin] prepare release http-mock-server-2.1.1 Change-Id: Ib3b2ee456709c9c9ba1dab867f0db2b83c0e05c0 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 0b85a82..29e5f4a 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.1-SNAPSHOT + 2.1.1 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 3dc3d2f..e06e381 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.1-SNAPSHOT + 2.1.1 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 2cf1d44..a5ce51f 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.1-SNAPSHOT + 2.1.1 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 4bcadaa..c15c9b7 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.1-SNAPSHOT + 2.1.1 4.0.0 diff --git a/pom.xml b/pom.xml index 81e2639..8d5b443 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.1.1-SNAPSHOT + 2.1.1 mockserver-client mockserver @@ -37,7 +37,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.1.1 From 2b4ca48d798680ddb84f8e426f329778eb957f6e Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 15:49:31 +0200 Subject: [PATCH 049/116] [maven-release-plugin] prepare for next development iteration Change-Id: I78090933a7aae4f9a53e3b688407dd2f7f7e988b --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 29e5f4a..ad7b62a 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.1 + 2.1.2-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index e06e381..eac180e 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.1 + 2.1.2-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index a5ce51f..0d25c06 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.1 + 2.1.2-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index c15c9b7..76da791 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.1 + 2.1.2-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 8d5b443..bf7d049 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.1.1 + 2.1.2-SNAPSHOT mockserver-client mockserver @@ -37,7 +37,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.1.1 + HEAD From 54739cff85fe80b5221156d18645b21c9df3b28c Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 16:06:05 +0200 Subject: [PATCH 050/116] Add info about remote respoitory to README Change-Id: Ia316e81b64c361620031f7bbc0031e81aad05e7b --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index ff776e7..8f4977d 100644 --- a/README.md +++ b/README.md @@ -242,3 +242,24 @@ Response: ... ``` + +## Remote repository + +Mockserver is available at `philanthropist.touk.pl`. + +Just add repository to maven pom: + +```xml + + ... + + ... + + touk + https://philanthropist.touk.pl/nexus/content/repositories/releases + + ... + + ... + +``` From 261126d58b5de62d8426289adb3ad525f02d49bb Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 24 Oct 2015 16:47:45 +0200 Subject: [PATCH 051/116] Add info about docker to README Change-Id: I93b5a78cdce42c17a97423d65fb7ca05ecf19ced --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 8f4977d..a06f405 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,23 @@ mvn clean package assembly:single ## Start server +### Native start + ``` java -jar mockserver.jar [PORT] ``` Default port is 9999. +### Start with docker + +Docker and docker-compose is needed. + +``` +./buildImage.sh +docker-compose up -d +``` + ## Create mock on server ### Via client From 493bb8fd912dcff166ac1d9a060e38c1cb9e7862 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Tue, 22 Dec 2015 15:24:06 +0100 Subject: [PATCH 052/116] Add imports support in closures --- .../xsd/pl/touk/mockserver/api/common.xsd | 29 ++- .../xsd/pl/touk/mockserver/api/request.xsd | 79 +++--- .../xsd/pl/touk/mockserver/api/response.xsd | 227 +++++++++--------- .../tests/MockServerIntegrationTest.groovy | 46 +++- .../mockserver/server/HttpMockServer.groovy | 16 +- .../pl/touk/mockserver/server/Mock.groovy | 11 +- 6 files changed, 237 insertions(+), 171 deletions(-) diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd index a48f724..ac21246 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd @@ -1,17 +1,22 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd index 10c7190..809cb44 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd @@ -1,52 +1,53 @@ - + - + - + - + - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + - - - + - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + + + + + diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd index 9e630dc..152a293 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd @@ -1,135 +1,136 @@ - + - + - + - + - + - + - - - - - + + + + + - - - + + + + + + + + + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + - - - + - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + - - - + - - - + + + + + + + + + - + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 fa61e4a..1412de1 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 @@ -1,17 +1,31 @@ package pl.touk.mockserver.tests import groovy.util.slurpersupport.GPathResult -import org.apache.http.client.methods.* +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.client.methods.HttpDelete +import org.apache.http.client.methods.HttpGet +import org.apache.http.client.methods.HttpHead +import org.apache.http.client.methods.HttpOptions +import org.apache.http.client.methods.HttpPatch +import org.apache.http.client.methods.HttpPost +import org.apache.http.client.methods.HttpPut +import org.apache.http.client.methods.HttpTrace import org.apache.http.entity.ContentType import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients import org.apache.http.util.EntityUtils +import pl.touk.mockserver.api.common.ImportAlias import pl.touk.mockserver.api.common.Method import pl.touk.mockserver.api.request.AddMock import pl.touk.mockserver.api.response.MockEventReport import pl.touk.mockserver.api.response.MockReport -import pl.touk.mockserver.client.* +import pl.touk.mockserver.client.InvalidMockDefinition +import pl.touk.mockserver.client.InvalidMockRequestSchema +import pl.touk.mockserver.client.MockAlreadyExists +import pl.touk.mockserver.client.MockDoesNotExist +import pl.touk.mockserver.client.RemoteMockServer +import pl.touk.mockserver.client.Util import pl.touk.mockserver.server.HttpMockServer import spock.lang.Shared import spock.lang.Specification @@ -611,7 +625,7 @@ class MockServerIntegrationTest extends Specification { restPostResponse.name == 'goodResponse-1' } - def "should get list mocks"() { + def "should get list of mocks"() { given: remoteMockServer.addMock(new AddMock( name: 'testRest2', @@ -648,7 +662,8 @@ class MockServerIntegrationTest extends Specification { name: 'testRest', path: 'testEndpoint', port: 9999, - schema: 'schema2.xsd' + schema: 'schema2.xsd', + imports: [new ImportAlias(alias: 'aaa', fullClassName: 'bbb')] )) remoteMockServer.removeMock('testRest5') when: @@ -660,6 +675,7 @@ class MockServerIntegrationTest extends Specification { assertMockReport(mockReport[2], [name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) assertMockReport(mockReport[3], [name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT]) assertMockReport(mockReport[4], [name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) + mockReport[0].imports.find { it.alias == 'aaa' }?.fullClassName == 'bbb' } private static void assertMockReport(MockReport mockReport, Map props) { @@ -991,4 +1007,26 @@ class MockServerIntegrationTest extends Specification { expect: remoteMockServer.removeMock('testSoap')?.size() == 2 } + + def "should add mock with alias"() { + expect: + remoteMockServer.addMock(new AddMock( + name: 'testRest', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> ""}''', + soap: false, + imports: [new ImportAlias(alias: 'AAA', fullClassName: 'javax.xml.XMLConstants')] + )) + when: + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then: + GPathResult restPostResponse = Util.extractXmlResponse(response) + restPostResponse.name() == 'goodResponseRest-xmlns' + expect: + remoteMockServer.removeMock('testRest')?.size() == 1 + } } 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 8eaab6d..c25b990 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -2,11 +2,21 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.util.logging.Slf4j +import pl.touk.mockserver.api.common.ImportAlias import pl.touk.mockserver.api.request.AddMock import pl.touk.mockserver.api.request.MockServerRequest import pl.touk.mockserver.api.request.PeekMock import pl.touk.mockserver.api.request.RemoveMock -import pl.touk.mockserver.api.response.* +import pl.touk.mockserver.api.response.ExceptionOccured +import pl.touk.mockserver.api.response.MockAdded +import pl.touk.mockserver.api.response.MockEventReport +import pl.touk.mockserver.api.response.MockPeeked +import pl.touk.mockserver.api.response.MockRemoved +import pl.touk.mockserver.api.response.MockReport +import pl.touk.mockserver.api.response.MockRequestReport +import pl.touk.mockserver.api.response.MockResponseReport +import pl.touk.mockserver.api.response.Mocks +import pl.touk.mockserver.api.response.Parameter import javax.xml.bind.JAXBContext import java.util.concurrent.ConcurrentHashMap @@ -65,7 +75,8 @@ class HttpMockServer { soap: it.soap, method: it.method, statusCode: it.statusCode as int, - schema: it.schema + schema: it.schema, + imports: it.imports.collect { new ImportAlias(alias: it.key, fullClassName: it.value) } ) } ) @@ -90,6 +101,7 @@ class HttpMockServer { private static Mock mockFromRequest(AddMock request) { Mock mock = new Mock(request.name, request.path, request.port) + mock.imports = request.imports?.collectEntries { [(it.alias): it.fullClassName] } ?: [:] mock.predicate = request.predicate mock.response = request.response mock.soap = request.soap 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 15b538f..6511078 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -3,6 +3,8 @@ package pl.touk.mockserver.server import groovy.transform.EqualsAndHashCode import groovy.transform.PackageScope import groovy.util.logging.Slf4j +import org.codehaus.groovy.control.CompilerConfiguration +import org.codehaus.groovy.control.customizers.ImportCustomizer import pl.touk.mockserver.api.common.Method import javax.xml.XMLConstants @@ -31,6 +33,7 @@ class Mock implements Comparable { final List history = new CopyOnWriteArrayList<>() String schema private Validator validator + Map imports = [:] Mock(String name, String path, int port) { if (!(name)) { @@ -88,7 +91,13 @@ class Mock implements Comparable { if (predicate ==~ /(?m).*System\s*\.\s*exit\s*\(.*/) { throw new RuntimeException('System.exit is forbidden') } - GroovyShell sh = new GroovyShell(this.class.classLoader); + CompilerConfiguration compilerConfiguration = new CompilerConfiguration() + ImportCustomizer customizer = new ImportCustomizer() + imports.each { + customizer.addImport(it.key, it.value) + } + compilerConfiguration.addCompilationCustomizers(customizer) + GroovyShell sh = new GroovyShell(this.class.classLoader, compilerConfiguration); return sh.evaluate(predicate) as Closure } From d272f7014187e4eb18110790255bf64c58571892 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Tue, 22 Dec 2015 15:25:58 +0100 Subject: [PATCH 053/116] [maven-release-plugin] prepare release http-mock-server-2.2.0 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index ad7b62a..06cf7e7 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.2-SNAPSHOT + 2.2.0 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index eac180e..997ed8a 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.2-SNAPSHOT + 2.2.0 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 0d25c06..43ad941 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.2-SNAPSHOT + 2.2.0 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 76da791..967e9f5 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.1.2-SNAPSHOT + 2.2.0 4.0.0 diff --git a/pom.xml b/pom.xml index bf7d049..c486df6 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.1.2-SNAPSHOT + 2.2.0 mockserver-client mockserver @@ -37,7 +37,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.2.0 From c02e93edc3f5f12d37c0cfcc0982706c613e295b Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Tue, 22 Dec 2015 15:26:02 +0100 Subject: [PATCH 054/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 06cf7e7..54d04a6 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.2.0 + 2.2.1-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 997ed8a..3402631 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.2.0 + 2.2.1-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 43ad941..8d190c9 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.2.0 + 2.2.1-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 967e9f5..2c49f48 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.2.0 + 2.2.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index c486df6..567f106 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.2.0 + 2.2.1-SNAPSHOT mockserver-client mockserver @@ -37,7 +37,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.2.0 + HEAD From 44f44ee392835edbd91d64c212242898a2013769 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 23 Dec 2015 11:14:49 +0100 Subject: [PATCH 055/116] Add mocks configuration dump and restore --- Dockerfile | 2 +- README.md | 168 +++++++++++++++--- .../mockserver/client/RemoteMockServer.groovy | 13 +- .../tests/MockServerIntegrationTest.groovy | 62 +++++++ .../mockserver/server/HttpMockServer.groovy | 59 +++++- .../pl/touk/mockserver/server/Main.groovy | 13 +- 6 files changed, 285 insertions(+), 32 deletions(-) diff --git a/Dockerfile b/Dockerfile index fc44fd1..87dd9dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,4 +8,4 @@ RUN mkdir /externalSchema VOLUME /externalSchema -CMD java -cp /mockserver.jar:/externalSchema -jar /mockserver.jar +CMD java -cp /mockserver.jar:/externalSchema pl.touk.mockserver.server.Main diff --git a/README.md b/README.md index a06f405..139c19e 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,71 @@ [![Build Status](https://img.shields.io/travis/TouK/http-mock-server/master.svg?style=flat)](https://travis-ci.org/TouK/http-mock-server) -# HTTP MOCK SERVER +HTTP MOCK SERVER +================ -## Create server jar +Http Mock Server allows to mock HTTP request using groovy closures. + +Create server jar +----------------- ``` cd mockserver mvn clean package assembly:single ``` -## Start server +Start server +------------ ### Native start ``` -java -jar mockserver.jar [PORT] +java -jar mockserver-full.jar [PORT] [CONFIGURATION_FILE] ``` Default port is 9999. +If configuration file is passed then port must be defined. + +Configuration file is groovy configuration script e.g. : + +```groovy +testRest2 { + port=9998 + response='{ req -> \'\' }' + responseHeaders='{ _ -> [a: "b"] }' + path='testEndpoint' + predicate='{ req -> req.xml.name() == \'request1\'}' + name='testRest2' +} +testRest4 { + soap=true + port=9999 + path='testEndpoint' + name='testRest4' + method='PUT' + statusCode=204 +} +testRest3 { + port=9999 + path='testEndpoint2' + name='testRest3' +} +testRest6 { + port=9999 + path='testEndpoint2' + name='testRest6' +} +testRest { + imports { + aaa='bbb' + ccc='bla' + } + port=10001 + path='testEndpoint' + name='testRest' +} +``` + ### Start with docker Docker and docker-compose is needed. @@ -28,7 +75,8 @@ Docker and docker-compose is needed. docker-compose up -d ``` -## Create mock on server +Create mock on server +--------------------- ### Via client @@ -47,11 +95,11 @@ remoteMockServer.addMock(new AddMock( schema: ... )) ``` + ### Via HTTP Send POST request to localhost:/serverControl - ```xml ... @@ -64,33 +112,35 @@ Send POST request to localhost:/serverControl ... ... ... + ``` ### Parameters -* name - name of mock, must be unique -* path - path on which mock should be created -* port - inteer, port on which mock should be created, cannot be the same as mock server port -* predicate - groovy closure as string which must evaluate to true, when request object will be given to satisfy mock, optional, default {_ -> true} -* response - groovy closure as string which must evaluate to string which will be response of mock when predicate is satisfied, optional, default { _ -> '' } -* soap - true or false, is request and response should be wrapped in soap Envelope and Body elements, default false -* statusCode - integer, status code of response when predicate is satisfied, default 200 -* method - POST|PUT|DELETE|GET|TRACE|OPTION|HEAD, expected http method of request, default POST -* responseHeaders - groovyClosure as string which must evaluate to Map which will be added to response headers, default { _ -> [:] } -* schema - path to xsd schema file on mockserver classpath; default empty, so no vallidation of request is performed; if validation fails then response has got status 400 and response is raw message from validator +- name - name of mock, must be unique +- path - path on which mock should be created +- port - inteer, port on which mock should be created, cannot be the same as mock server port +- predicate - groovy closure as string which must evaluate to true, when request object will be given to satisfy mock, optional, default {_ -> true} +- response - groovy closure as string which must evaluate to string which will be response of mock when predicate is satisfied, optional, default { _ -> '' } +- soap - true or false, is request and response should be wrapped in soap Envelope and Body elements, default false +- statusCode - integer, status code of response when predicate is satisfied, default 200 +- method - POST|PUT|DELETE|GET|TRACE|OPTION|HEAD, expected http method of request, default POST +- responseHeaders - groovyClosure as string which must evaluate to Map which will be added to response headers, default { _ -> \[:] } +- schema - path to xsd schema file on mockserver classpath; default empty, so no vallidation of request is performed; if validation fails then response has got status 400 and response is raw message from validator +- imports - list of imports for closures (each import is separate tag); `alias` is the name of `fullClassName` available in closure; `fullClassName` must be available on classpath of mock server ### Closures request properties In closures input parameter (called req) contains properties: -* text - request body as java.util.String -* headers - java.util.Map with request headers -* query - java.util.Map with query parameters -* xml - groovy.util.slurpersupport.GPathResult created from request body (if request body is valid xml) -* soap - groovy.util.slurpersupport.GPathResult created from request body without Envelope and Body elements (if request body is valid soap xml) -* json - java.lang.Object created from request body (if request body is valid json) -* path - java.util.List with not empty parts of request path +- text - request body as java.util.String +- headers - java.util.Map with request headers +- query - java.util.Map with query parameters +- xml - groovy.util.slurpersupport.GPathResult created from request body (if request body is valid xml) +- soap - groovy.util.slurpersupport.GPathResult created from request body without Envelope and Body elements (if request body is valid soap xml) +- json - java.lang.Object created from request body (if request body is valid json) +- path - java.util.List with not empty parts of request path Response if success: @@ -104,7 +154,9 @@ Response with error message if failure: ... ``` -## Peek mock +Peek mock +--------- + Mock could be peeked to get get report of its invocations. ### Via client @@ -114,6 +166,7 @@ List mockEvents = remoteMockServer.peekMock('...') ``` ### Via HTTP + Send POST request to localhost:/serverControl ```xml @@ -160,7 +213,8 @@ Response with error message if failure: ... ``` -## Remove mock +Remove mock +----------- When mock was used it could be unregistered by name. It also optionally returns report of mock invocations if second parameter is true. @@ -169,7 +223,9 @@ When mock was used it could be unregistered by name. It also optionally returns ```java List mockEvents = remoteMockServer.removeMock('...', ...) ``` + ### Via HTTP + Send POST request to localhost:/serverControl ```xml @@ -223,7 +279,8 @@ Response with error message if failure: ... ``` -## List mocks definitions +List mocks definitions +---------------------- ### Via client @@ -249,12 +306,69 @@ Response: ... ... ... + ... ``` -## Remote repository +Get mocks configuration +----------------------- + +### Via client + +```java +ConfigObject mocks = remoteMockServer.getConfiguration() +``` + +### Via HTTP + +Send GET request to localhost:/serverControl/configuration + +Response: + +```groovy +testRest2 { + port=9998 + response='{ req -> \'\' }' + responseHeaders='{ _ -> [a: "b"] }' + path='testEndpoint' + predicate='{ req -> req.xml.name() == \'request1\'}' + name='testRest2' +} +testRest4 { + soap=true + port=9999 + path='testEndpoint' + name='testRest4' + method='PUT' + statusCode=204 +} +testRest3 { + port=9999 + path='testEndpoint2' + name='testRest3' +} +testRest6 { + port=9999 + path='testEndpoint2' + name='testRest6' +} +testRest { + imports { + aaa='bbb' + ccc='bla' + } + port=10001 + path='testEndpoint' + name='testRest' +} +``` + +This response could be saved to file and passed as it is during mock server creation. + +Remote repository +----------------- Mockserver is available at `philanthropist.touk.pl`. 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 ffbc9a0..91ebc33 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 @@ -11,7 +11,11 @@ import pl.touk.mockserver.api.request.AddMock import pl.touk.mockserver.api.request.MockServerRequest import pl.touk.mockserver.api.request.PeekMock import pl.touk.mockserver.api.request.RemoveMock -import pl.touk.mockserver.api.response.* +import pl.touk.mockserver.api.response.MockEventReport +import pl.touk.mockserver.api.response.MockPeeked +import pl.touk.mockserver.api.response.MockRemoved +import pl.touk.mockserver.api.response.MockReport +import pl.touk.mockserver.api.response.Mocks import javax.xml.bind.JAXBContext @@ -47,6 +51,13 @@ class RemoteMockServer { return mockPeeked.mockEvents ?: [] } + ConfigObject getConfiguration() { + HttpGet get = new HttpGet(address + '/configuration') + CloseableHttpResponse response = client.execute(get) + String configuration = Util.extractStringResponse(response) + return new ConfigSlurper().parse(configuration) + } + private static StringEntity buildRemoveMockRequest(RemoveMock data) { return new StringEntity(marshallRequest(data), ContentType.create("text/xml", "UTF-8")) } 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 1412de1..6476a96 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 @@ -1029,4 +1029,66 @@ class MockServerIntegrationTest extends Specification { expect: remoteMockServer.removeMock('testRest')?.size() == 1 } + + def "should get configuration of mocks and reconfigure new mock server based on it"() { + given: + remoteMockServer.addMock(new AddMock( + name: 'testRest2', + path: 'testEndpoint', + port: 9998, + predicate: '''{ req -> req.xml.name() == 'request1'}''', + response: '''{ req -> '' }''', + responseHeaders: '{ _ -> [a: "b"] }' + )) + remoteMockServer.addMock(new AddMock( + name: 'testRest4', + path: 'testEndpoint', + port: 9999, + soap: true, + statusCode: 204, + method: Method.PUT + )) + remoteMockServer.addMock(new AddMock( + name: 'testRest3', + path: 'testEndpoint2', + port: 9999 + )) + remoteMockServer.addMock(new AddMock( + name: 'testRest5', + path: 'testEndpoint', + port: 9999 + )) + remoteMockServer.addMock(new AddMock( + name: 'testRest6', + path: 'testEndpoint2', + port: 9999 + )) + remoteMockServer.addMock(new AddMock( + name: 'testRest', + path: 'testEndpoint', + port: 9999, + schema: 'schema2.xsd', + imports: [ + new ImportAlias(alias: 'aaa', fullClassName: 'bbb'), + new ImportAlias(alias: 'ccc', fullClassName: 'bla') + ] + )) + remoteMockServer.removeMock('testRest5') + when: + ConfigObject configObject = remoteMockServer.configuration + httpMockServer.stop() + httpMockServer = new HttpMockServer(9000, configObject) + + then: + List mockReport = remoteMockServer.listMocks() + mockReport.size() == 5 + assertMockReport(mockReport[0], [name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST, schema: 'schema2.xsd']) + assertMockReport(mockReport[1], [name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST]) + assertMockReport(mockReport[2], [name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) + assertMockReport(mockReport[3], [name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT]) + assertMockReport(mockReport[4], [name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) + mockReport[0].imports.find { it.alias == 'aaa' }?.fullClassName == 'bbb' + mockReport[0].imports.find { it.alias == 'ccc' }?.fullClassName == 'bla' + } + } 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 c25b990..171d72a 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -3,6 +3,7 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.util.logging.Slf4j import pl.touk.mockserver.api.common.ImportAlias +import pl.touk.mockserver.api.common.Method import pl.touk.mockserver.api.request.AddMock import pl.touk.mockserver.api.request.MockServerRequest import pl.touk.mockserver.api.request.PeekMock @@ -30,18 +31,27 @@ class HttpMockServer { private final HttpServerWraper httpServerWraper private final Map childServers = new ConcurrentHashMap<>() private final Set mockNames = new CopyOnWriteArraySet<>() + private final ConfigObject configuration = new ConfigObject() private static final JAXBContext requestJaxbContext = JAXBContext.newInstance(AddMock.package.name, AddMock.classLoader) - HttpMockServer(int port = 9999) { + HttpMockServer(int port = 9999, ConfigObject initialConfiguration = new ConfigObject()) { httpServerWraper = new HttpServerWraper(port) + initialConfiguration.values()?.each { ConfigObject co -> + addMock(co) + } + httpServerWraper.createContext('/serverControl', { HttpExchange ex -> try { if (ex.requestMethod == 'GET') { - listMocks(ex) + if (ex.requestURI.path == '/serverControl/configuration') { + createResponse(ex, configuration.prettyPrint(), 200) + } else { + listMocks(ex) + } } else if (ex.requestMethod == 'POST') { MockServerRequest request = requestJaxbContext.createUnmarshaller().unmarshal(ex.requestBody) as MockServerRequest if (request instanceof AddMock) { @@ -95,10 +105,41 @@ class HttpMockServer { Mock mock = mockFromRequest(request) HttpServerWraper child = getOrCreateChildServer(mock.port) child.addMock(mock) + saveConfiguration(request) mockNames << name createResponse(ex, new MockAdded(), 200) } + private void addMock(ConfigObject co) { + String name = co.name + if (name in mockNames) { + throw new RuntimeException('mock already registered') + } + Mock mock = mockFromConfig(co) + HttpServerWraper child = getOrCreateChildServer(mock.port) + child.addMock(mock) + configuration.put(name, co) + mockNames << name + } + + private void saveConfiguration(AddMock request) { + ConfigObject mockDefinition = new ConfigObject() + request.metaPropertyValues.findAll { it.name != 'class' && it.value }.each { + if (it.name == 'imports') { + ConfigObject configObject = new ConfigObject() + it.value.each { ImportAlias imp -> + configObject.put(imp.alias, imp.fullClassName) + } + mockDefinition.put(it.name, configObject) + } else if (it.name == 'method') { + mockDefinition.put(it.name, it.value.name()) + } else { + mockDefinition.put(it.name, it.value) + } + } + configuration.put(request.name, mockDefinition) + } + private static Mock mockFromRequest(AddMock request) { Mock mock = new Mock(request.name, request.path, request.port) mock.imports = request.imports?.collectEntries { [(it.alias): it.fullClassName] } ?: [:] @@ -112,6 +153,19 @@ class HttpMockServer { return mock } + private static Mock mockFromConfig(ConfigObject co) { + Mock mock = new Mock(co.name, co.path, co.port) + mock.imports = co.imports + mock.predicate = co.predicate ?: null + mock.response = co.response ?: null + mock.soap = co.soap ?: null + mock.statusCode = co.statusCode ?: null + mock.method = co.method ? Method.valueOf(co.method) : null + mock.responseHeaders = co.responseHeaders ?: null + mock.schema = co.schema ?: null + return mock + } + private HttpServerWraper getOrCreateChildServer(int mockPort) { HttpServerWraper child = childServers[mockPort] if (!child) { @@ -132,6 +186,7 @@ class HttpMockServer { it.removeMock(name) }.flatten() as List mockNames.remove(name) + configuration.remove(name) MockRemoved mockRemoved = new MockRemoved( mockEvents: createMockEventReports(mockEvents) ) diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/Main.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/Main.groovy index 759a11a..aba7f6e 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Main.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Main.groovy @@ -5,7 +5,7 @@ import groovy.util.logging.Slf4j @Slf4j class Main { static void main(String[] args) { - HttpMockServer httpMockServer = args.length == 1 ? new HttpMockServer(args[0] as int) : new HttpMockServer() + HttpMockServer httpMockServer = startMockServer(args) Runtime.runtime.addShutdownHook(new Thread({ log.info('Http server is stopping...') @@ -17,4 +17,15 @@ class Main { Thread.sleep(10000) } } + + private static HttpMockServer startMockServer(String... args) { + switch (args.length) { + case 1: + return new HttpMockServer(args[0] as int) + case 2: + return new HttpMockServer(args[0] as int, new ConfigSlurper().parse(new File(args[1]).toURI().toURL())) + default: + return new HttpMockServer() + } + } } From da9cfc0ffbe642e82725862697e3efca2612272a Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 23 Dec 2015 11:15:24 +0100 Subject: [PATCH 056/116] [maven-release-plugin] prepare release http-mock-server-2.3.0 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 54d04a6..9d531a9 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.2.1-SNAPSHOT + 2.3.0 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 3402631..bb79c32 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.2.1-SNAPSHOT + 2.3.0 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 8d190c9..afcb37c 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.2.1-SNAPSHOT + 2.3.0 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 2c49f48..caa2d6d 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.2.1-SNAPSHOT + 2.3.0 4.0.0 diff --git a/pom.xml b/pom.xml index 567f106..dc3663f 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.2.1-SNAPSHOT + 2.3.0 mockserver-client mockserver @@ -37,7 +37,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.3.0 From ba820bfcf28f6ef19b1ebbd517a23b972a23b773 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 23 Dec 2015 11:15:28 +0100 Subject: [PATCH 057/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- pom.xml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 9d531a9..42865c4 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.3.0 + 2.3.1-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index bb79c32..cc0bc0d 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.3.0 + 2.3.1-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index afcb37c..3540d04 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.3.0 + 2.3.1-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index caa2d6d..11ff86d 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.3.0 + 2.3.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index dc3663f..8f06801 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.3.0 + 2.3.1-SNAPSHOT mockserver-client mockserver @@ -37,7 +37,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.3.0 + HEAD From 23e2813e2b854ce7ed465a51e780d81f9ee6e31a Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 23 Dec 2015 11:42:24 +0100 Subject: [PATCH 058/116] Add link to docker hub --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 139c19e..c9ee033 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ testRest { } ``` -### Start with docker +### Build with docker Docker and docker-compose is needed. @@ -75,6 +75,10 @@ Docker and docker-compose is needed. docker-compose up -d ``` +### Docker repoository + +Built image is available at https://hub.docker.com/r/alien11689/mockserver/ + Create mock on server --------------------- From f110ffe8a958fbf0842e26a8153858c663ec8860 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Tue, 15 Dec 2015 05:42:22 +0100 Subject: [PATCH 059/116] Add benchmark in separate project Change-Id: Ib0d29c334cf46744e33fa609eedce52892740af7 --- performance-tests/pom.xml | 67 ++++++++++++++++ .../mockserver/client/MockserverTest.java | 80 +++++++++++++++++++ pom.xml | 1 + 3 files changed, 148 insertions(+) create mode 100644 performance-tests/pom.xml create mode 100644 performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml new file mode 100644 index 0000000..2987f78 --- /dev/null +++ b/performance-tests/pom.xml @@ -0,0 +1,67 @@ + + + + http-mock-server + pl.touk.mockserver + 2.1.2-SNAPSHOT + + 4.0.0 + + mockserver-performance-tests + + + + pl.touk.mockserver + mockserver + ${project.version} + + + pl.touk.mockserver + mockserver-client + ${project.version} + + + org.openjdk.jmh + jmh-core + 1.11.2 + test + + + org.openjdk.jmh + jmh-generator-annprocess + 1.11.2 + test + + + + + + + org.codehaus.mojo + exec-maven-plugin + + + run-benchmarks + integration-test + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + \ No newline at end of file diff --git a/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java b/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java new file mode 100644 index 0000000..44e6910 --- /dev/null +++ b/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java @@ -0,0 +1,80 @@ +package pl.touk.mockserver.client; + +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClients; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.BenchmarkParams; +import org.openjdk.jmh.infra.ThreadParams; +import pl.touk.mockserver.api.request.AddMock; +import pl.touk.mockserver.server.HttpMockServer; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +@State(Scope.Benchmark) +@OutputTimeUnit(TimeUnit.SECONDS) +public class MockserverTest { + HttpMockServer httpMockServer; + + @Setup + public void prepareMockServer(BenchmarkParams params) { + try { + httpMockServer = new HttpMockServer(9999); + } catch (Exception e) { + //OK + } + } + + @TearDown + public void stopMockServer() { + try { + httpMockServer.stop(); + } catch (Exception e) { + } + } + + @State(Scope.Thread) + public static class TestState { + RemoteMockServer remoteMockServer; + HttpClient httpClient; + int current; + + @Setup + public void prepareMockServer(ThreadParams params) { + remoteMockServer = new RemoteMockServer("localhost", 9999); + httpClient = HttpClients.createDefault(); + current = params.getThreadIndex(); + } + } + + + @Benchmark + @Measurement(iterations = 60) + @Fork(warmups = 1, value = 1) + @BenchmarkMode({Mode.AverageTime, Mode.Throughput}) + @Warmup(iterations = 10) + @Threads(4) + public void shouldHandleManyRequestsSimultaneously(TestState testState) throws IOException { + int current = testState.current; + int endpointNumber = current % 10; + int port = 9000 + (current % 7); + AddMock addMock = new AddMock(); + addMock.setName("testRest" + current); + addMock.setPath("testEndpoint" + endpointNumber); + addMock.setPort(port); + addMock.setPredicate("{req -> req.xml.name() == 'request" + current + "' }"); + addMock.setResponse("{req -> ''}"); + testState.remoteMockServer.addMock(addMock); + HttpPost restPost = new HttpPost("http://localhost:" + port + "/testEndpoint" + endpointNumber); + restPost.setEntity(new StringEntity("", ContentType.create("text/xml", "UTF-8"))); + CloseableHttpResponse response = (CloseableHttpResponse) testState.httpClient.execute(restPost); + String stringResponse = Util.extractStringResponse(response); + testState.remoteMockServer.removeMock("testRest" + current, true); + assert stringResponse.equals(""); + } + +} diff --git a/pom.xml b/pom.xml index 8f06801..fdceb5f 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,7 @@ mockserver mockserver-tests mockserver-api + performance-tests From d6b9abfe05e7770839ec1ba59bd30f13a491b440 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 16 Dec 2015 08:37:58 +0100 Subject: [PATCH 060/116] Add maven compiler plugin --- pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pom.xml b/pom.xml index fdceb5f..b5a145b 100644 --- a/pom.xml +++ b/pom.xml @@ -90,6 +90,14 @@ clean install + + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + org.codehaus.gmavenplus gmavenplus-plugin From 159f0a4987bbaedfe47146f470ee373b770c508b Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Wed, 16 Dec 2015 20:00:50 +0100 Subject: [PATCH 061/116] Small fixes Change-Id: I985d91d6d8ac2ff88760f5011e75711ad7c68649 --- .../mockserver/client/MockserverTest.java | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java b/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java index 44e6910..f762284 100644 --- a/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java +++ b/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java @@ -8,6 +8,7 @@ import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClients; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.BenchmarkParams; +import org.openjdk.jmh.infra.Blackhole; import org.openjdk.jmh.infra.ThreadParams; import pl.touk.mockserver.api.request.AddMock; import pl.touk.mockserver.server.HttpMockServer; @@ -22,19 +23,12 @@ public class MockserverTest { @Setup public void prepareMockServer(BenchmarkParams params) { - try { - httpMockServer = new HttpMockServer(9999); - } catch (Exception e) { - //OK - } + httpMockServer = new HttpMockServer(9999); } @TearDown public void stopMockServer() { - try { - httpMockServer.stop(); - } catch (Exception e) { - } + httpMockServer.stop(); } @State(Scope.Thread) @@ -51,14 +45,13 @@ public class MockserverTest { } } - @Benchmark - @Measurement(iterations = 60) - @Fork(warmups = 1, value = 1) - @BenchmarkMode({Mode.AverageTime, Mode.Throughput}) - @Warmup(iterations = 10) + @Measurement(iterations = 10) + @Fork(value = 2) + @BenchmarkMode({Mode.AverageTime, Mode.Throughput, Mode.SampleTime}) + @Warmup(iterations = 5) @Threads(4) - public void shouldHandleManyRequestsSimultaneously(TestState testState) throws IOException { + public void shouldHandleManyRequestsSimultaneously(TestState testState, Blackhole bh) throws IOException { int current = testState.current; int endpointNumber = current % 10; int port = 9000 + (current % 7); @@ -75,6 +68,7 @@ public class MockserverTest { String stringResponse = Util.extractStringResponse(response); testState.remoteMockServer.removeMock("testRest" + current, true); assert stringResponse.equals(""); + bh.consume(stringResponse); } } From 229f2d02d31d52a3d12811fe9844533a381ce590 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Wed, 16 Dec 2015 20:07:47 +0100 Subject: [PATCH 062/116] Add params Change-Id: I30d8d140a0ac01db9a5fbc184616fff487852109 --- .../test/java/pl/touk/mockserver/client/MockserverTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java b/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java index f762284..a917b90 100644 --- a/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java +++ b/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java @@ -21,6 +21,9 @@ import java.util.concurrent.TimeUnit; public class MockserverTest { HttpMockServer httpMockServer; + @Param({"9000", "8000"}) + int initialPort; + @Setup public void prepareMockServer(BenchmarkParams params) { httpMockServer = new HttpMockServer(9999); @@ -54,7 +57,7 @@ public class MockserverTest { public void shouldHandleManyRequestsSimultaneously(TestState testState, Blackhole bh) throws IOException { int current = testState.current; int endpointNumber = current % 10; - int port = 9000 + (current % 7); + int port = initialPort + (current % 7); AddMock addMock = new AddMock(); addMock.setName("testRest" + current); addMock.setPath("testEndpoint" + endpointNumber); From bfc547721e3e8b1f45f0bd22fc0ad6e8c31571f2 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Wed, 16 Dec 2015 20:30:49 +0100 Subject: [PATCH 063/116] Add logger configuration Change-Id: I8a7c4ac0e09eb114845547202aa27792741cf549 --- performance-tests/src/test/resources/logback.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 performance-tests/src/test/resources/logback.xml diff --git a/performance-tests/src/test/resources/logback.xml b/performance-tests/src/test/resources/logback.xml new file mode 100644 index 0000000..b37e533 --- /dev/null +++ b/performance-tests/src/test/resources/logback.xml @@ -0,0 +1,15 @@ + + + + %highlight(%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n) + + + + + %msg%n + + + + + + \ No newline at end of file From 951a0f1b56815f7b61334f0c39179790e3f241dc Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Wed, 16 Dec 2015 20:30:49 +0100 Subject: [PATCH 064/116] Add logger configuration Change-Id: I8a7c4ac0e09eb114845547202aa27792741cf549 --- .../touk/mockserver/tests/ServerMockPT.groovy | 59 ------------------- performance-tests/pom.xml | 10 ++-- pom.xml | 35 +++++++---- 3 files changed, 30 insertions(+), 74 deletions(-) delete mode 100644 mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy deleted file mode 100644 index a696a98..0000000 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy +++ /dev/null @@ -1,59 +0,0 @@ -package pl.touk.mockserver.tests - -import org.apache.http.client.HttpClient -import org.apache.http.client.methods.CloseableHttpResponse -import org.apache.http.client.methods.HttpPost -import org.apache.http.entity.ContentType -import org.apache.http.entity.StringEntity -import org.apache.http.impl.client.HttpClients -import pl.touk.mockserver.api.request.AddMock -import pl.touk.mockserver.client.RemoteMockServer -import pl.touk.mockserver.client.Util -import pl.touk.mockserver.server.HttpMockServer -import spock.lang.Specification -import spock.lang.Timeout - -import java.util.concurrent.ExecutorService -import java.util.concurrent.Executors -import java.util.concurrent.TimeUnit - -class ServerMockPT extends Specification { - - @Timeout(value = 90) - def "should handle many request simultaneously"() { - given: - HttpClient client = HttpClients.createDefault() - HttpMockServer httpMockServer = new HttpMockServer() - RemoteMockServer controlServerClient = new RemoteMockServer("localhost", 9999) - int requestAmount = 1000 - String[] responses = new String[requestAmount] - ExecutorService executorService = Executors.newCachedThreadPool() - when: - for (int i = 0; i < requestAmount; ++i) { - int current = i - executorService.submit { - int endpointNumber = current % 10 - int port = 9000 + (current % 7) - controlServerClient.addMock(new AddMock( - name: "testRest$current", - path: "testEndpoint$endpointNumber", - port: port, - predicate: """{req -> req.xml.name() == 'request$current'}""", - response: """{req -> ""}""" - )) - HttpPost restPost = new HttpPost("http://localhost:$port/testEndpoint$endpointNumber") - restPost.entity = new StringEntity("", ContentType.create("text/xml", "UTF-8")) - CloseableHttpResponse response = client.execute(restPost) - responses[current] = Util.extractStringResponse(response) - controlServerClient.removeMock("testRest$current", true) - } - } - executorService.shutdown() - executorService.awaitTermination(90, TimeUnit.SECONDS) - then: - responses.eachWithIndex { res, i -> assert res && new XmlSlurper().parseText(res).name() == "goodResponse$i" as String } - cleanup: - executorService.shutdown() - httpMockServer.stop() - } -} diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 2987f78..205a3b6 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -5,7 +5,7 @@ http-mock-server pl.touk.mockserver - 2.1.2-SNAPSHOT + 2.3.1-SNAPSHOT 4.0.0 @@ -25,22 +25,22 @@ org.openjdk.jmh jmh-core - 1.11.2 - test org.openjdk.jmh jmh-generator-annprocess - 1.11.2 - test + + 1.4.0 + org.codehaus.mojo exec-maven-plugin + ${exec-maven-plugin.version} run-benchmarks diff --git a/pom.xml b/pom.xml index b5a145b..a245f8a 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,9 @@ 1.16.6 true + 1.11.2 + 2.5.2 + 1.4 @@ -84,24 +87,36 @@ mockserver-api ${project.version} + + org.openjdk.jmh + jmh-core + ${jmh.version} + test + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + test + clean install - - maven-compiler-plugin - 2.3.2 - - 1.8 - 1.8 - - + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + org.codehaus.gmavenplus gmavenplus-plugin - 1.4 + ${gmavenplus-plugin.version} @@ -114,7 +129,7 @@ org.apache.maven.plugins maven-release-plugin - 2.5.2 + ${maven-release-plugin.version} true From 7a13cb2ce5251f2d9dfd71bf867046196d37ab6c Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Mon, 28 Dec 2015 09:18:02 +0100 Subject: [PATCH 065/116] Add profile with performance tests --- performance-tests/pom.xml | 61 ++++++++++--------- .../mockserver/client/MockserverTest.java | 23 ++++--- 2 files changed, 47 insertions(+), 37 deletions(-) diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 205a3b6..de44e56 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -35,33 +35,38 @@ 1.4.0 - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - - run-benchmarks - integration-test - - exec - - - test - java - - -classpath - - org.openjdk.jmh.Main - .* - - - - - - - + + + performance-test + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + + run-benchmarks + integration-test + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + \ No newline at end of file diff --git a/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java b/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java index a917b90..233a5f7 100644 --- a/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java +++ b/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java @@ -6,8 +6,16 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClients; -import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.infra.BenchmarkParams; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; import org.openjdk.jmh.infra.Blackhole; import org.openjdk.jmh.infra.ThreadParams; import pl.touk.mockserver.api.request.AddMock; @@ -21,11 +29,10 @@ import java.util.concurrent.TimeUnit; public class MockserverTest { HttpMockServer httpMockServer; - @Param({"9000", "8000"}) - int initialPort; + int initialPort = 9000; @Setup - public void prepareMockServer(BenchmarkParams params) { + public void prepareMockServer() { httpMockServer = new HttpMockServer(9999); } @@ -49,11 +56,9 @@ public class MockserverTest { } @Benchmark - @Measurement(iterations = 10) - @Fork(value = 2) + @Measurement(iterations = 20) @BenchmarkMode({Mode.AverageTime, Mode.Throughput, Mode.SampleTime}) - @Warmup(iterations = 5) - @Threads(4) + @Warmup(iterations = 10) public void shouldHandleManyRequestsSimultaneously(TestState testState, Blackhole bh) throws IOException { int current = testState.current; int endpointNumber = current % 10; From 359930019168440ec2ca90ed54f2e143a4779fbc Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Mon, 28 Dec 2015 14:11:02 +0100 Subject: [PATCH 066/116] Add preserveHistory option for mock --- .../xsd/pl/touk/mockserver/api/request.xsd | 1 + .../xsd/pl/touk/mockserver/api/response.xsd | 1 + .../tests/MockServerIntegrationTest.groovy | 27 ++++++- .../mockserver/server/HttpMockServer.groovy | 71 ++++++++++--------- .../pl/touk/mockserver/server/Mock.groovy | 9 ++- 5 files changed, 71 insertions(+), 38 deletions(-) diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd index 809cb44..6636b53 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd @@ -23,6 +23,7 @@ + diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd index 152a293..1f96dc8 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd @@ -110,6 +110,7 @@ + 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 6476a96..5bb550b 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 @@ -1071,7 +1071,8 @@ class MockServerIntegrationTest extends Specification { imports: [ new ImportAlias(alias: 'aaa', fullClassName: 'bbb'), new ImportAlias(alias: 'ccc', fullClassName: 'bla') - ] + ], + preserveHistory: true )) remoteMockServer.removeMock('testRest5') when: @@ -1082,7 +1083,7 @@ class MockServerIntegrationTest extends Specification { then: List mockReport = remoteMockServer.listMocks() mockReport.size() == 5 - assertMockReport(mockReport[0], [name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST, schema: 'schema2.xsd']) + assertMockReport(mockReport[0], [name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST, schema: 'schema2.xsd', preserveHistory: true]) assertMockReport(mockReport[1], [name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST]) assertMockReport(mockReport[2], [name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) assertMockReport(mockReport[3], [name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT]) @@ -1091,4 +1092,26 @@ class MockServerIntegrationTest extends Specification { mockReport[0].imports.find { it.alias == 'ccc' }?.fullClassName == 'bla' } + def "should add mock without history"() { + expect: + remoteMockServer.addMock(new AddMock( + name: 'testRest', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> ""}''', + soap: false, + preserveHistory: false + )) + when: + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then: + GPathResult restPostResponse = Util.extractXmlResponse(response) + restPostResponse.name() == 'goodResponseRest-request' + expect: + remoteMockServer.removeMock('testRest')?.size() == 0 + } + } 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 171d72a..3ec1ece 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -74,21 +74,22 @@ class HttpMockServer { void listMocks(HttpExchange ex) { Mocks mockListing = new Mocks( - mocks: listMocks().collect { - new MockReport( - name: it.name, - path: it.path, - port: it.port, - predicate: it.predicateClosureText, - response: it.responseClosureText, - responseHeaders: it.responseHeadersClosureText, - soap: it.soap, - method: it.method, - statusCode: it.statusCode as int, - schema: it.schema, - imports: it.imports.collect { new ImportAlias(alias: it.key, fullClassName: it.value) } - ) - } + mocks: listMocks().collect { + new MockReport( + name: it.name, + path: it.path, + port: it.port, + predicate: it.predicateClosureText, + response: it.responseClosureText, + responseHeaders: it.responseHeadersClosureText, + soap: it.soap, + method: it.method, + statusCode: it.statusCode as int, + schema: it.schema, + imports: it.imports.collect { new ImportAlias(alias: it.key, fullClassName: it.value) }, + preserveHistory: it.preserveHistory + ) + } ) createResponse(ex, mockListing, 200) } @@ -150,6 +151,7 @@ class HttpMockServer { mock.method = request.method mock.responseHeaders = request.responseHeaders mock.schema = request.schema + mock.preserveHistory = request.preserveHistory != false return mock } @@ -163,6 +165,7 @@ class HttpMockServer { mock.method = co.method ? Method.valueOf(co.method) : null mock.responseHeaders = co.responseHeaders ?: null mock.schema = co.schema ?: null + mock.preserveHistory = co.preserveHistory != false return mock } @@ -188,7 +191,7 @@ class HttpMockServer { mockNames.remove(name) configuration.remove(name) MockRemoved mockRemoved = new MockRemoved( - mockEvents: createMockEventReports(mockEvents) + mockEvents: createMockEventReports(mockEvents) ) createResponse(ex, mockRemoved, 200) } @@ -196,23 +199,23 @@ class HttpMockServer { private static List createMockEventReports(List mockEvents) { return mockEvents.collect { new MockEventReport( - request: new MockRequestReport( - text: it.request.text, - headers: new MockRequestReport.Headers(headers: it.request.headers.collect { - new Parameter(name: it.key, value: it.value) - }), - queryParams: new MockRequestReport.QueryParams(queryParams: it.request.query.collect { - new Parameter(name: it.key, value: it.value) - }), - path: new MockRequestReport.Path(pathParts: it.request.path) - ), - response: new MockResponseReport( - statusCode: it.response.statusCode, - text: it.response.text, - headers: new MockResponseReport.Headers(headers: it.response.headers.collect { - new Parameter(name: it.key, value: it.value) - }) - ) + request: new MockRequestReport( + text: it.request.text, + headers: new MockRequestReport.Headers(headers: it.request.headers.collect { + new Parameter(name: it.key, value: it.value) + }), + queryParams: new MockRequestReport.QueryParams(queryParams: it.request.query.collect { + new Parameter(name: it.key, value: it.value) + }), + path: new MockRequestReport.Path(pathParts: it.request.path) + ), + response: new MockResponseReport( + statusCode: it.response.statusCode, + text: it.response.text, + headers: new MockResponseReport.Headers(headers: it.response.headers.collect { + new Parameter(name: it.key, value: it.value) + }) + ) ) } } @@ -225,7 +228,7 @@ class HttpMockServer { log.trace("Peeking mock $name") List mockEvents = childServers.values().collect { it.peekMock(name) }.flatten() as List MockPeeked mockPeeked = new MockPeeked( - mockEvents: createMockEventReports(mockEvents) + mockEvents: createMockEventReports(mockEvents) ) createResponse(ex, mockPeeked, 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 6511078..db67f47 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -34,6 +34,7 @@ class Mock implements Comparable { String schema private Validator validator Map imports = [:] + boolean preserveHistory = true Mock(String name, String path, int port) { if (!(name)) { @@ -60,7 +61,9 @@ class Mock implements Comparable { } } catch (Exception e) { MockResponse response = new MockResponse(400, e.message, [:]) - history << new MockEvent(request, response) + if(preserveHistory) { + history << new MockEvent(request, response) + } return response } } @@ -69,7 +72,9 @@ class Mock implements Comparable { String response = soap ? wrapSoap(responseText) : responseText Map headers = responseHeaders(request) MockResponse mockResponse = new MockResponse(statusCode, response, headers) - history << new MockEvent(request, mockResponse) + if(preserveHistory) { + history << new MockEvent(request, mockResponse) + } return mockResponse } From fca39a835587d5fbe633d65c40c6f2775f33f004 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Tue, 12 Apr 2016 17:10:15 +0200 Subject: [PATCH 067/116] [maven-release-plugin] prepare release http-mock-server-2.4.0 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 8 +++----- pom.xml | 4 ++-- 6 files changed, 9 insertions(+), 11 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 42865c4..fe59879 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.3.1-SNAPSHOT + 2.4.0 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index cc0bc0d..70fe791 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.3.1-SNAPSHOT + 2.4.0 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 3540d04..66c964c 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.3.1-SNAPSHOT + 2.4.0 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 11ff86d..450f777 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.3.1-SNAPSHOT + 2.4.0 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index de44e56..c71ee05 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -1,11 +1,9 @@ - + http-mock-server pl.touk.mockserver - 2.3.1-SNAPSHOT + 2.4.0 4.0.0 @@ -56,7 +54,7 @@ java -classpath - + org.openjdk.jmh.Main .* diff --git a/pom.xml b/pom.xml index a245f8a..d1a6b5a 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.3.1-SNAPSHOT + 2.4.0 mockserver-client mockserver @@ -41,7 +41,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.4.0 From 3fcfec451aa1a7696464785a006958e5e08c5631 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Tue, 12 Apr 2016 17:10:19 +0200 Subject: [PATCH 068/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index fe59879..45d0999 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.4.0 + 2.4.1-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 70fe791..2b2d077 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.4.0 + 2.4.1-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 66c964c..6a95e7d 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.4.0 + 2.4.1-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 450f777..fb2d788 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.4.0 + 2.4.1-SNAPSHOT 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index c71ee05..2d88b68 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.4.0 + 2.4.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index d1a6b5a..35dac1a 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.4.0 + 2.4.1-SNAPSHOT mockserver-client mockserver @@ -41,7 +41,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.4.0 + HEAD From 2b57ba08067ddaf2a3c4bd20d1ed37acfc6afa69 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Tue, 30 May 2017 12:54:36 +0200 Subject: [PATCH 069/116] Do not create xml or json when request does not look like xml or json --- .../groovy/pl/touk/mockserver/server/MockRequest.groovy | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy index f8dc561..3657131 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy @@ -27,6 +27,9 @@ class MockRequest { } private static GPathResult inputToXml(String text) { + if (!text.startsWith('<')) { + return null + } try { return new XmlSlurper().parseText(text) } catch (Exception _) { @@ -36,7 +39,7 @@ class MockRequest { private static GPathResult inputToSoap(GPathResult xml) { try { - if (xml.name() == 'Envelope' && xml.Body.size() > 0) { + if (xml != null && xml.name() == 'Envelope' && xml.Body.size() > 0) { return getSoapBodyContent(xml) } else { return null @@ -51,6 +54,9 @@ class MockRequest { } private static Object inputToJson(String text) { + if (!text.startsWith('[') && !text.startsWith('{')) { + return null + } try { return new JsonSlurper().parseText(text) } catch (Exception _) { From 4fb0c9cfced03cda850cf779e49ef40f02220557 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 31 May 2017 09:53:38 +0200 Subject: [PATCH 070/116] Fix memory leak on closure compilation --- .../pl/touk/mockserver/server/HttpMockServer.groovy | 10 +++++++--- .../pl/touk/mockserver/server/HttpServerWraper.groovy | 6 +++--- .../main/groovy/pl/touk/mockserver/server/Main.groovy | 4 +++- .../main/groovy/pl/touk/mockserver/server/Mock.groovy | 4 +++- pom.xml | 2 +- 5 files changed, 17 insertions(+), 9 deletions(-) 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 3ec1ece..7d2f86b 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -22,6 +22,8 @@ import pl.touk.mockserver.api.response.Parameter import javax.xml.bind.JAXBContext import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArraySet +import java.util.concurrent.Executor +import java.util.concurrent.Executors import static pl.touk.mockserver.server.Util.createResponse @@ -32,12 +34,14 @@ class HttpMockServer { private final Map childServers = new ConcurrentHashMap<>() private final Set mockNames = new CopyOnWriteArraySet<>() private final ConfigObject configuration = new ConfigObject() + private final Executor executor private static final JAXBContext requestJaxbContext = JAXBContext.newInstance(AddMock.package.name, AddMock.classLoader) - HttpMockServer(int port = 9999, ConfigObject initialConfiguration = new ConfigObject()) { - httpServerWraper = new HttpServerWraper(port) + HttpMockServer(int port = 9999, ConfigObject initialConfiguration = new ConfigObject(), int threads = 10) { + executor = Executors.newFixedThreadPool(threads) + httpServerWraper = new HttpServerWraper(port, executor) initialConfiguration.values()?.each { ConfigObject co -> addMock(co) @@ -172,7 +176,7 @@ class HttpMockServer { private HttpServerWraper getOrCreateChildServer(int mockPort) { HttpServerWraper child = childServers[mockPort] if (!child) { - child = new HttpServerWraper(mockPort) + child = new HttpServerWraper(mockPort, executor) childServers.put(mockPort, child) } return child diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy index b13b7a2..e1ef2f8 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy @@ -5,7 +5,7 @@ import com.sun.net.httpserver.HttpServer import groovy.transform.PackageScope import groovy.util.logging.Slf4j -import java.util.concurrent.Executors +import java.util.concurrent.Executor @Slf4j @PackageScope @@ -15,11 +15,11 @@ class HttpServerWraper { private List executors = [] - HttpServerWraper(int port) { + HttpServerWraper(int port, Executor executor) { this.port = port InetSocketAddress addr = new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), port) httpServer = HttpServer.create(addr, 0) - httpServer.executor = Executors.newWorkStealingPool() + httpServer.executor = executor log.info("Http server starting on port $port...") httpServer.start() log.info('Http server is started') diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/Main.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/Main.groovy index aba7f6e..0b8d42a 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Main.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Main.groovy @@ -21,9 +21,11 @@ class Main { private static HttpMockServer startMockServer(String... args) { switch (args.length) { case 1: - return new HttpMockServer(args[0] as int) + return new HttpMockServer(args[0] as int, new ConfigObject()) case 2: return new HttpMockServer(args[0] as int, new ConfigSlurper().parse(new File(args[1]).toURI().toURL())) + case 3: + return new HttpMockServer(args[0] as int, new ConfigSlurper().parse(new File(args[1]).toURI().toURL()), args[2] as int) default: return new HttpMockServer() } 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 db67f47..83c3c7e 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -103,7 +103,9 @@ class Mock implements Comparable { } compilerConfiguration.addCompilationCustomizers(customizer) GroovyShell sh = new GroovyShell(this.class.classLoader, compilerConfiguration); - return sh.evaluate(predicate) as Closure + Closure closure = sh.evaluate(predicate) as Closure + sh.resetLoadedClasses() + return closure } void setResponse(String response) { diff --git a/pom.xml b/pom.xml index 35dac1a..635fed9 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ UTF-8 UTF-8 3.1 - 2.4.1 + 2.4.11 4.3.5 1.0-groovy-2.4 3.3.2 From 4bda8606091d8867a8d80407fb16ebf64191d14c Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 31 May 2017 09:57:01 +0200 Subject: [PATCH 071/116] [maven-release-plugin] prepare release http-mock-server-2.5.0 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 45d0999..fd5e719 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.4.1-SNAPSHOT + 2.5.0 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 2b2d077..c9b56d6 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.4.1-SNAPSHOT + 2.5.0 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 6a95e7d..3b224c2 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.4.1-SNAPSHOT + 2.5.0 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index fb2d788..842f1d7 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.4.1-SNAPSHOT + 2.5.0 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 2d88b68..2e5a3bb 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.4.1-SNAPSHOT + 2.5.0 4.0.0 diff --git a/pom.xml b/pom.xml index 635fed9..5f03ec2 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.4.1-SNAPSHOT + 2.5.0 mockserver-client mockserver @@ -41,7 +41,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.5.0 From ab2b3f94817024aa8091cd0d9c4ad9fe61a75305 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 31 May 2017 09:57:08 +0200 Subject: [PATCH 072/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index fd5e719..e3ee4d5 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.0 + 2.5.1-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index c9b56d6..637b649 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.0 + 2.5.1-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 3b224c2..f0930ad 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.0 + 2.5.1-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 842f1d7..e1fc9ed 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.0 + 2.5.1-SNAPSHOT 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 2e5a3bb..f1ec59b 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.0 + 2.5.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 5f03ec2..f9eceee 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.5.0 + 2.5.1-SNAPSHOT mockserver-client mockserver @@ -41,7 +41,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.5.0 + HEAD From 5a3af95f0b3b566b40da77b9d2ac3215993567e9 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Fri, 2 Jun 2017 08:30:36 +0200 Subject: [PATCH 073/116] Close http exchange at the end of http handler --- .../tests/MockServerIntegrationTest.groovy | 19 ++++++++ .../mockserver/server/ContextExecutor.groovy | 47 ++++++++++++------- 2 files changed, 48 insertions(+), 18 deletions(-) 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 5bb550b..e8f4d87 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 @@ -1114,4 +1114,23 @@ class MockServerIntegrationTest extends Specification { remoteMockServer.removeMock('testRest')?.size() == 0 } + def "should handle empty post"() { + expect: + remoteMockServer.addMock(new AddMock( + name: 'testRest', + path: 'testEndpoint', + port: 9999, + statusCode: 201, + soap: false + )) + when: + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + CloseableHttpResponse response = client.execute(restPost) + then: + response.statusLine.statusCode == 201 + Util.consumeResponse(response) + expect: + remoteMockServer.removeMock('testRest')?.size() == 1 + } + } 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 f450df4..b26eb5a 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -20,28 +20,39 @@ class ContextExecutor { this.mocks = new CopyOnWriteArrayList<>([initialMock]) 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(Method.valueOf(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) { - log.warn("An exception occured when matching or applying mock ${mock.name}", e) - } + try { + applyMocks(ex) + } catch (Exception e) { + log.error("Exceptiony occured handling request", e) + throw e + } finally { + ex.close() } - log.warn("Any mock does not match request ${request.text}") - Util.createResponse(ex, request.text, 404) } } + private void applyMocks(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(Method.valueOf(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) { + 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() { return path.substring(1) } From dbc0410f52fb6252ace07200fe8bade1c85efdcc Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Fri, 2 Jun 2017 08:32:17 +0200 Subject: [PATCH 074/116] [maven-release-plugin] prepare release http-mock-server-2.5.1 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index e3ee4d5..3dab503 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.1-SNAPSHOT + 2.5.1 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 637b649..7f0d504 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.1-SNAPSHOT + 2.5.1 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index f0930ad..3ed3b1f 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.1-SNAPSHOT + 2.5.1 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index e1fc9ed..0202c91 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.1-SNAPSHOT + 2.5.1 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index f1ec59b..0476064 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.1-SNAPSHOT + 2.5.1 4.0.0 diff --git a/pom.xml b/pom.xml index f9eceee..25812f9 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.5.1-SNAPSHOT + 2.5.1 mockserver-client mockserver @@ -41,7 +41,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.5.1 From 6036bd2c3bfcad7480303396c63f59d8a8e45fe3 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Fri, 2 Jun 2017 08:32:23 +0200 Subject: [PATCH 075/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 3dab503..873227b 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.1 + 2.5.2-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 7f0d504..8e40314 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.1 + 2.5.2-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 3ed3b1f..f09c8cd 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.1 + 2.5.2-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 0202c91..3c743ee 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.1 + 2.5.2-SNAPSHOT 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 0476064..3ac9362 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.1 + 2.5.2-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 25812f9..43ce7cd 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.5.1 + 2.5.2-SNAPSHOT mockserver-client mockserver @@ -41,7 +41,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.5.1 + HEAD From f8e0cc44f99e9b93d6823f55ea4a79b46d9c751f Mon Sep 17 00:00:00 2001 From: piotrekfus91 Date: Sun, 28 Jan 2018 18:30:50 +0100 Subject: [PATCH 076/116] Handle leading slash (#1) * Handle leading slash --- .gitignore | 2 ++ .../tests/MockServerIntegrationTest.groovy | 29 +++++++++++++++++++ .../pl/touk/mockserver/server/Mock.groovy | 10 ++++++- 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7f995f3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.iml +target/ 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 e8f4d87..ab16248 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 @@ -1133,4 +1133,33 @@ class MockServerIntegrationTest extends Specification { remoteMockServer.removeMock('testRest')?.size() == 1 } + @Unroll + def 'should handle leading slash'() { + given: + String name = "testRest-${UUID.randomUUID().toString()}" + expect: + remoteMockServer.addMock(new AddMock( + name: name, + path: mockPath, + port: 9999, + statusCode: 201, + soap: false + )) + when: + HttpPost restPost = new HttpPost("http://localhost:9999/$urlPath") + CloseableHttpResponse response = client.execute(restPost) + then: + response.statusLine.statusCode == 201 + Util.consumeResponse(response) + expect: + remoteMockServer.removeMock(name)?.size() == 1 + where: + mockPath | urlPath + '' | '' + '/' | '' + 'test' | 'test' + '/test' | 'test' + 'test/other' | 'test/other' + '/test/other' | 'test/other' + } } 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 83c3c7e..ed37f89 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -41,10 +41,18 @@ class Mock implements Comparable { throw new RuntimeException("Mock name must be given") } this.name = name - this.path = path + this.path = stripLeadingSlash(path) this.port = port } + private static String stripLeadingSlash(String path) { + if (path?.startsWith('/')) { + return path - '/' + } else { + return path + } + } + boolean match(Method method, MockRequest request) { return this.method == method && predicate(request) } From 0727ced422df452e426035a37d5cf5082d153fa3 Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Mon, 26 Feb 2018 17:48:11 +0100 Subject: [PATCH 077/116] Add https support --- README.md | 45 +++++- .../xsd/pl/touk/mockserver/api/common.xsd | 11 ++ .../xsd/pl/touk/mockserver/api/request.xsd | 1 + mockserver-tests/pom.xml | 4 + .../tests/MockServerHttpsTest.groovy | 152 ++++++++++++++++++ .../tests/MockServerIntegrationTest.groovy | 12 +- .../src/test/resources/keystore.jks | Bin 0 -> 2257 bytes .../src/test/resources/trusted.jks | Bin 0 -> 2235 bytes .../src/test/resources/truststore.jks | Bin 0 -> 1880 bytes .../src/test/resources/untrusted.jks | Bin 0 -> 2255 bytes .../mockserver/server/ContextExecutor.groovy | 8 +- .../mockserver/server/HttpMockServer.groovy | 32 ++-- .../mockserver/server/HttpServerWraper.groovy | 58 ------- .../server/HttpServerWrapper.groovy | 106 ++++++++++++ .../touk/mockserver/server/HttpsConfig.groovy | 28 ++++ .../pl/touk/mockserver/server/Mock.groovy | 2 + pom.xml | 7 + 17 files changed, 383 insertions(+), 83 deletions(-) create mode 100644 mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerHttpsTest.groovy create mode 100644 mockserver-tests/src/test/resources/keystore.jks create mode 100644 mockserver-tests/src/test/resources/trusted.jks create mode 100644 mockserver-tests/src/test/resources/truststore.jks create mode 100644 mockserver-tests/src/test/resources/untrusted.jks delete mode 100644 mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy create mode 100644 mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWrapper.groovy create mode 100644 mockserver/src/main/groovy/pl/touk/mockserver/server/HttpsConfig.groovy diff --git a/README.md b/README.md index c9ee033..2552e18 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,21 @@ testRest { path='testEndpoint' name='testRest' } +testHttps { + soap=false + port=10443 + path='testHttps' + name='testHttps' + method='GET' + https={ + keystorePath='/tmp/keystore.jks' + keystorePassword='keystorePass' + keyPassword='keyPass' + truststorePath='/tmp/truststore.jks' + truststorePassword='truststorePass' + requireClientAuth=true + } +} ``` ### Build with docker @@ -96,7 +111,15 @@ remoteMockServer.addMock(new AddMock( statusCode: ..., method: ..., responseHeaders: ..., - schema: ... + schema: ..., + https: new Https( + keystorePath: '/tmp/keystore.jks', + keystorePassword: 'keystorePass', + keyPassword: 'keyPass', + truststorePath: '/tmp/truststore.jks', + truststorePassword: 'truststorePass', + requireClientAuth: true + ) )) ``` @@ -117,6 +140,14 @@ Send POST request to localhost:/serverControl ... ... + + /tmp/keystore.jks + keystorePass + keyPass + /tmp/truststore.jks + truststorePass + true + ``` @@ -133,6 +164,18 @@ Send POST request to localhost:/serverControl - responseHeaders - groovyClosure as string which must evaluate to Map which will be added to response headers, default { _ -> \[:] } - schema - path to xsd schema file on mockserver classpath; default empty, so no vallidation of request is performed; if validation fails then response has got status 400 and response is raw message from validator - imports - list of imports for closures (each import is separate tag); `alias` is the name of `fullClassName` available in closure; `fullClassName` must be available on classpath of mock server +- https - HTTPS configuration + +#### HTTPS configuration + +- keystorePath - path to keystore in JKS format, keystore should contains only one privateKeyEntry +- keystorePassword - keystore password +- keyPassword - key password +- truststorePath - path to truststore in JKS format +- truststorePassword - truststore password +- requireClientAuth - whether client auth is required (two-way SSL) + +**HTTP** and **HTTPS** should be started on separated ports. ### Closures request properties diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd index ac21246..673be7d 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd @@ -18,5 +18,16 @@ + + + + + + + + + + + diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd index 6636b53..23786bc 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd @@ -20,6 +20,7 @@ + diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index f09c8cd..ffc9d6c 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -44,6 +44,10 @@ mockserver-client ${project.version} + + info.solidsoft.spock + spock-global-unroll + diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerHttpsTest.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerHttpsTest.groovy new file mode 100644 index 0000000..8d6eff8 --- /dev/null +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerHttpsTest.groovy @@ -0,0 +1,152 @@ +package pl.touk.mockserver.tests + +import groovy.util.slurpersupport.GPathResult +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.client.methods.HttpPost +import org.apache.http.conn.ssl.SSLConnectionSocketFactory +import org.apache.http.conn.ssl.SSLContexts +import org.apache.http.entity.ContentType +import org.apache.http.entity.StringEntity +import org.apache.http.impl.client.CloseableHttpClient +import org.apache.http.impl.client.HttpClients +import pl.touk.mockserver.api.common.Https +import pl.touk.mockserver.api.request.AddMock +import pl.touk.mockserver.client.RemoteMockServer +import pl.touk.mockserver.client.Util +import pl.touk.mockserver.server.HttpMockServer +import spock.lang.AutoCleanup +import spock.lang.Shared +import spock.lang.Specification + +import javax.net.ssl.SSLContext +import javax.net.ssl.SSLHandshakeException +import java.security.KeyStore + +class MockServerHttpsTest extends Specification { + + RemoteMockServer remoteMockServer = new RemoteMockServer('localhost', 19000) + + @AutoCleanup('stop') + HttpMockServer httpMockServer = new HttpMockServer(19000) + + @Shared + SSLContext noClientAuthSslContext = SSLContexts.custom() + .loadTrustMaterial(trustStore()) + .build() + + @Shared + SSLContext trustedCertificateSslContext = SSLContexts.custom() + .loadKeyMaterial(trustedCertificateKeystore(), 'changeit'.toCharArray()) + .loadTrustMaterial(trustStore()) + .build() + + @Shared + SSLContext untrustedCertificateSslContext = SSLContexts.custom() + .loadKeyMaterial(untrustedCertificateKeystore(), 'changeit'.toCharArray()) + .loadTrustMaterial(trustStore()) + .build() + + def 'should handle HTTPS server' () { + given: + remoteMockServer.addMock(new AddMock( + name: 'testHttps', + path: 'testEndpoint', + port: 10443, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> ""}''', + https: new Https( + keyPassword: 'changeit', + keystorePassword: 'changeit', + keystorePath: MockServerHttpsTest.classLoader.getResource('keystore.jks').path + ), + soap: false + )) + when: + HttpPost restPost = new HttpPost('https://localhost:10443/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client(noClientAuthSslContext).execute(restPost) + then: + GPathResult restPostResponse = Util.extractXmlResponse(response) + restPostResponse.name() == 'goodResponse-request' + } + + def 'should handle HTTPS server with client auth' () { + given: + remoteMockServer.addMock(new AddMock( + name: 'testHttps', + path: 'testEndpoint', + port: 10443, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> ""}''', + https: new Https( + keyPassword: 'changeit', + keystorePassword: 'changeit', + keystorePath: MockServerHttpsTest.classLoader.getResource('keystore.jks').path, + truststorePath: MockServerHttpsTest.classLoader.getResource('truststore.jks').path, + truststorePassword: 'changeit', + requireClientAuth: true + ), + soap: false + )) + when: + HttpPost restPost = new HttpPost('https://localhost:10443/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client(trustedCertificateSslContext).execute(restPost) + then: + GPathResult restPostResponse = Util.extractXmlResponse(response) + restPostResponse.name() == 'goodResponse-request' + } + + def 'should handle HTTPS server with wrong client auth' () { + given: + remoteMockServer.addMock(new AddMock( + name: 'testHttps', + path: 'testEndpoint', + port: 10443, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> ""}''', + https: new Https( + keyPassword: 'changeit', + keystorePassword: 'changeit', + keystorePath: MockServerHttpsTest.classLoader.getResource('keystore.jks').path, + truststorePath: MockServerHttpsTest.classLoader.getResource('truststore.jks').path, + truststorePassword: 'changeit', + requireClientAuth: true + ), + soap: false + )) + when: + HttpPost restPost = new HttpPost('https://localhost:10443/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + client(sslContext).execute(restPost) + then: + thrown(SSLHandshakeException) + where: + sslContext << [noClientAuthSslContext, untrustedCertificateSslContext] + } + + private CloseableHttpClient client(SSLContext sslContext) { + return HttpClients.custom() + .setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) + .setSslcontext(sslContext) + .build() + } + + private KeyStore trustedCertificateKeystore() { + return loadKeystore('trusted.jks') + } + + private KeyStore untrustedCertificateKeystore() { + return loadKeystore('untrusted.jks') + } + + private KeyStore trustStore() { + return loadKeystore('truststore.jks') + } + + private KeyStore loadKeystore(String fileName) { + KeyStore truststore = KeyStore.getInstance(KeyStore.defaultType) + truststore.load(new FileInputStream(MockServerHttpsTest.classLoader.getResource(fileName).path), "changeit".toCharArray()); + return truststore + } +} 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 ab16248..e9f2d42 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 @@ -27,14 +27,15 @@ import pl.touk.mockserver.client.MockDoesNotExist import pl.touk.mockserver.client.RemoteMockServer import pl.touk.mockserver.client.Util import pl.touk.mockserver.server.HttpMockServer +import spock.lang.AutoCleanup import spock.lang.Shared import spock.lang.Specification -import spock.lang.Unroll class MockServerIntegrationTest extends Specification { RemoteMockServer remoteMockServer + @AutoCleanup('stop') HttpMockServer httpMockServer @Shared @@ -45,10 +46,6 @@ class MockServerIntegrationTest extends Specification { remoteMockServer = new RemoteMockServer('localhost', 9000) } - def cleanup() { - httpMockServer.stop() - } - def "should add working rest mock on endpoint"() { expect: remoteMockServer.addMock(new AddMock( @@ -244,7 +241,6 @@ class MockServerIntegrationTest extends Specification { soapPostResponse.Body.'goodResponseSoap-request'.size() == 1 } - @Unroll def "should dispatch rest mocks when second on #name"() { given: remoteMockServer.addMock(new AddMock( @@ -283,7 +279,6 @@ class MockServerIntegrationTest extends Specification { 9998 | 'test2' | 'another port and path' } - @Unroll def "should dispatch rest mock with response code"() { given: remoteMockServer.addMock(new AddMock( @@ -857,7 +852,6 @@ class MockServerIntegrationTest extends Specification { mockEvents2[0].response.statusCode == 202 } - @Unroll def "should return mock report with #mockEvents events when deleting mock with flag skip mock = #skipReport"() { expect: remoteMockServer.addMock(new AddMock( @@ -885,7 +879,6 @@ class MockServerIntegrationTest extends Specification { true | 0 } - @Unroll def "should reject mock when it has System.exit in closure"() { when: remoteMockServer.addMock(new AddMock( @@ -1133,7 +1126,6 @@ class MockServerIntegrationTest extends Specification { remoteMockServer.removeMock('testRest')?.size() == 1 } - @Unroll def 'should handle leading slash'() { given: String name = "testRest-${UUID.randomUUID().toString()}" diff --git a/mockserver-tests/src/test/resources/keystore.jks b/mockserver-tests/src/test/resources/keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..d5e35d1551194e1ced94cb1f249b8decfa66aa0a GIT binary patch literal 2257 zcmc(gX*kr29>?cD3o-U3O9qi*I>XG^mpFr%GWLCMY>mbesZJ;iMp5i8xBaZLn*Pa&yxKlP>n>7CAy@#LoIJ^s?%3^}d*dwO4oQeB zBfPWB*Iy4*Bs_h?*e=idB>zQCreCGnUlPX8$xQ=8%OP{(uVv?o#H$44Sv(e)lf2ey zJ7inI{d5(b!85)w@Xf<~no6QW%zpEjitAk{wiPm~xxhC+rJD3MWCot+AvmKrJ}281 zAqVL1uo~T$Z?{#iKIV(W#*B^_EkOB_?c+Iwl9@F1PDG2aYU%c9c;?!Al9?fmDLX{I zMK7%7E84GCp3>60C(aH;Kgihj+8b4@-{^n7;x}G~XZ(5`q^D|rEOR-qOsq)Xn%viv zpW@cUaG*znRE2i^IMDksFacqpYBG*wli#%LU;GPX%@G6r#wt_Z;2sQDY#4GS7M0=+ zW4a#PNId1SBi0rmkUQ1mRF-HkYh@2PVH92LR$H@GZ%pwX>CF~M19ntzjE8~p}hiV-36bTAvWFJGK zabJ|fa`$Kxi>5Z;xnByEur11gHb<{#;9w|nYIMnG`?reY9(sN37Sz%}`0Sj$wohr8 zmD<~wq&Ii?YUWxR2ww5<20laETO;ZEb+1JuZ+o^Hby0JTBXSitT9?uyS|5% zNwZ&%RcCWt?%Kqm){Yy9+KUkg_j-)S9g)?5~x+k-$){8E(`y*fmIJSO1@Jgt@3{qIE$a zNFtg7i9=JsfkhB700u)P?vELu`MG$IR6KQy9{}Jm5IPJ4NAqw&9HCsIU>gEP1TFNp zIVAeOh5aw%{t4s#34{NHL4IIpSqXlO4jO~i#pqyl(HJ)ge(c{?`#<*oaS{bk_%WD+ zzX72Df*>>n;003v0Mz`8;2^tLi*>>8+b+BztJ|@-wA>D@AWd4^a+P|Yf4Mg;RP1be zwDQhZCK1oHY@lT@r3zd$tVb?yF4juxE+eAo3WJ9q#-aRiUiFag@|IIVj2;+t)|Ojg z4q0V(z1jDVZ5Zo0QbiW|JnKT`w{HsV`hpQ(-$xIUkvXNGJEv~gMY^r(HcXP%In0ky z;PQ$qD=`jWOJts#`8+vzdz!7C^(>a}kU3XIJ>pj_a?cJ~Vk*)(2A`sQ`TJW?=MfPk zqb~e}w9=={;R|qg=Dvkd)O4?ADQ+J|yhb&E{8b81E+>v)Gw>Kw5=y3B^Hu-EX)AeA z7w@nj!YFkX3;{qu$x*Z%8gWn$gaGs~R7_&g>EX!ybX^M9DkH3O_Y*z3#qq}w588DQ zA^?)BRD*^D+nlq1xq3@g%?TI;PF3zTuW z?R}7i{cjHLxLkI;{mIPDYH8&5}-V}wK8;kd? z+pnx)Gm8X8Yf%j-0gJ4))7%S}Prxu(&c?3`1I^X-!<{!80o`vB!m)dhk;X-)Dqj%6NwhwqUmG2C<4WbpMA_SH zk({wN#6WDxZ0860wzRtYXDb{%MXWE21)$et^KC#Y=gBmt^i$@DsSOUeBX{+v2b-ju zEPsG>b^_`iw7Cz~>P2-mmhZZ^3BNYvw4bgBAp2`$M<C_rc zg74$j=)Tbd8GcRygrz)j3myC~Puk(N_4cn7UWH7?ytu_%%@LoQ_bz08kzF5_#IrSZ z6+PMF{f4yb?#~%K`4hOE_#V65`Gd@siI0(_pwHK9sEnV^H~n!nFUP9-vD>yjtsK9G znzO=7*M*KzMniQl&ey&;S)5XYoL7^W8bPyP0?D2J)6s!_1`_8~v*`I@=Y@dZvES{6b)W$F_j zvbV;N=aes>(;?3a*m<5?9^KqicJw}DJ&L7jn|FU7#SB-Q$$Gdq;ldsOgR03voH?Gh zNRHQ|uOfV#jd|NL(XotPl3yK)39(({#kmPLFSLCIW%x(Tq*FC(DZHhm=y@TO2SIX9 zW#HzKI@afcjD~hM_`;{}pH)z)T`EFq6>;XUT`A5%virK@AaG9eFTm-b5p%xIqKC@$J@Q%9Dn7W8D zU_1*we_cA4d;Ft5X})Tq@&yDeO?LbWF!~-r7n;#^>?kr4T`%++H!JAyw;NCmAc|XO&xAth5Ic zWli|B%4-`wIp^D`;rs3uzpdtIa!_w7dtby-@7h$^)i0!Oc1pXfL>M62Dp<+alZJ&BMBYH^tqjO5}%EAd8xyJfB!%Z|0eT80GNW0y7ccBW{%niF7MN*|6~$ZT z7I?mFCyYOdauYMKNi=(V^x00E&A84b7bY)FMK`Gw;u|C2=q6W)I-RMqmMrhjOO%6Ef_?Q`9>Ozm!qrmuEc&P3>-$96L{xcsv zrH$pz=RIJ8-0qx4ajemLGHeRPo%wnq4J5S5x)K8aEF?6IUpDw_8ey(lI%qurfP|wH zAi?MaFp&lUgTP?uvFP-NXhAridZJb0wjc<^4+GGF7=AP#972S`#liLjjL6}B9vWWp zzxVZT!t(<`{6P4BAdvqNw7j$+<}@0kt*4DfW3@5v(t_ImvDp9G|KA}AAmx9CaQGu2 z2_Rtrod80B6F?v!N57D`QN)xM9zv956nsh$VSlKZ6_^bb;HUR&O7^gtaL0uLy+i0z z7un|bnD2K*fBnTAofz}_I#&0*5%osD@=cpPow{k}hp*001C6X>qS%&|=!+8h4K7}h z7I{TyF;7btM8<8waE$)I{Ue?!cb#Xz7WFnc^+4DKpFaH7J+9HIy{=2-K9bxj<0gkm zOZ=nvY?ICRxSC3>H~fedZuhN3PbV}Zyol0t<9>-!(vj#3GU2rsi0g#s0uwU{CN7gI z{wI|fGfhNy%kmh0C|t(hSESvc?4lOMQ~*JT(PH%M@6i%`?^X9h15C6UmQXDb@S6GvFYa-PH_0yq7b*bJ@C%#x1jniBSa$!(kW)NKp}X^E%2zRi4VYx3t%R`IELsrO48 zUT<8`w*0v7PVc|S0+WI)ABz}^$n+mBI$TF~zq#&pu2FP- z_^BEH7d}M}L|{q+1|lPa9;4T1zH<-a8CG912!BD%=|b!De+mowT7Ig%6jEj24ZOC<;L);j5zdDi z|MF8E^|rrK+g-%AXJY$%-e-#XR}g%{^i~>`Dp0ECCh>gl%z5~evg#AH@Eb7Z@!3Ee~reUPkRzQ z_V{j@IAM?Eya*Hji>2RQZjiEkBU?RP>5SO=M%`4$xXsMJ6nt+9%s9r%@-UEH>9N*I zx7wY_>wd7FJ))&4r*&j<){37$mG)cnmwdWcb0%AB+LG4?Z`B1=MSZZ`ax>%emp#v` znU*atdtV>I-5RC8?l2sb z7SfursYqQ)^~IzMS=`Zk{(IY3-#%`-#PL6CVr82R^Y10xUCR8IJ z)D2fZ1>uPJ!W^GVZ4a?!Q}LH!>n}dJy{Vh+!;Hd%e_u?m*%gYGy1>~~euX|uUT#1_ z@VO72dir53qRq@9bLZ`Nm{PXuihxUum-6*n#s4I%Z(fqkD_D7n`R&K#oJBzaclX-8 zIjLr0sdUV`&CKGUdHTu8g`1C`xcPFzw!EO}j?;}6{Ye$5itRZe>vBTZX_>_8JC7r} zilSB~HgD;k+4Nmqa!-JfR6w~41B^Q*ZpMOoIKRqJRjNesC6^}}At5Gm&K^K!4T zOtg9V#DB^Tz0bFWIFs}~9-nshsknEF_tAwXA2ofM5O<+;6-)WO`zn@gbFWN2`Xuh; c-UT~myb*gL`u>sUT7xSMcXgI*(%Ya10Jt*6!~g&Q literal 0 HcmV?d00001 diff --git a/mockserver-tests/src/test/resources/untrusted.jks b/mockserver-tests/src/test/resources/untrusted.jks new file mode 100644 index 0000000000000000000000000000000000000000..ca94b454c5d413ac28dbcf921a5b678eb20896a5 GIT binary patch literal 2255 zcmc(gX*kr29>?cz#xNNBQWQd6hL{<<7(&QSS(6T8h-(?k8D$-eP-Mx3v9?)eLLn^} zB8@HTpzJ3p3{qySgX5g%-skqB_xHv3#rN~-_k5q<^Zo8E?=6EsAdUk8{|FWt9D$1r zkMO;GK)g)SSI&Y!oFF6t!bb8#d6c051VC^I0RSfmLV(OGZ&JRCH8R4@^J^DW8`_3_ z6rWi>v{S9NoI!bfsxbh%!D-lhck{xHgzm4F`ofr$A%t{j5 zdc0=sU3`1phd6T`3$b&HimkERIZfVAy3#GxALgM%6)?5r;%jNw6xJ8k_DcBBwPaVv zQ?7%r)s=P3^yE8?#e;h>1(c5Tq6j6XS=N%6rP})QE)# z--?D8&4V3+ZFN8_TdqDUz?0qv%rcRhb<^$r9vi z_dDnEWWa7GcA{ZDZ$wmm#uePdT#MUl-uhyzx)czlPJ@haBC=CxBH?`7{h`RYCUgn+ zB-Vck7mi6;PrMg1FUd9~{n@E`gAkPPCCY-wW7nK``3B~+OU)I7--4Lqzu&K%=KR5; zR@t5XF#LIZeEMr{i=S-}Z~xQ@TCL%Vs_G&2m->=XH%^FJL91(L4IVjU@v6SX!}e?yC76w~E|)0H8s3&r zNYd5JE8Z)}UY+jP;=QMc@!%X3c}I&WSw4l6a8&ndR4XA@{;O_5aM`rKH-BiPQeTH~ z!FQ``?DLusjeFY9rcGew`Ki@p94B_SxT^pgQaA*vx!LdK^vng3 ztP!#z=*|^jN`_|I?`rKEzR-jzxc+!xN%wY?D_@a|-si$;oGfb@|9nX~J&cNH8?%^u zu%q}lZYbW{$1iPvOv~vJW=TXH?bYMFc-BwtzKqwx9i%*cl$yM__~ClQsC+&h?>WpY zKGr?W(5Gpw)LsZ%JyVNKxr^}Sz8O^B-gibulwGu+%PNg{>w!l(LP}@iDXaUWxO}HQDl}GF6R&nF(y3aDf4CyM5d&e=A03)sBDree>QlQP1WwYlZvIXcB#!Y z`t9%dS*=@-MV#wnwL}WAP8|FxemO6clgw(iaP;3+`#<*oaS{QL`#G3{)c_L! zfrB{#csK|E0HR*a@y3nEJSY^;9)a2fPB+sEbrp5nzoX|`^Qa#+wXjtpyv zf6r6k6!Ttm6YLoFO1Gq8uw}>ogt1|4g)w%SNDf1~O?}owG1BG-e z0jO3(_A3VEiE%t1$btTQ*#h%Xo)qQcxe7Hl2B0CoB7G_bD*6W>pRVHaa|<$SnWWOG z8o636{^c&c&4?E}qt91=lrE)F`#-29AE$h+&zYrK^{GLkE8q$afqn0TPq?%=e9KQbX|(gsBXRbvB;F4Lp=DdgAf6b z8)ItfjFEyO5j*Q{CvzNwpy!Ez1wGPD`0i(3LSQmve z6h-!@kDm-vl7lk2ge$!w^X@)nRkv}=b@I5elZ>EM{tI1n%*@B9R#hEpZH`%CdmHN-9^-;H_Artw!Fcc;HOhxwt?)s||HqqyZYN(KMPJDq#mZzvJ! z6RK-A0_wMsUa3A0&FVv5G80c!ys=TW)_*95(`|27pf8$eNqO8vu5RAv`;yvJAqxuu WR1{UN&PgWK`+(=#3qkv-?7slilILmw literal 0 HcmV?d00001 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 b26eb5a..ce11c4c 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -10,15 +10,15 @@ import java.util.concurrent.CopyOnWriteArrayList @Slf4j @PackageScope class ContextExecutor { - private final HttpServerWraper httpServerWraper + private final HttpServerWrapper httpServerWrapper final String path private final List mocks - ContextExecutor(HttpServerWraper httpServerWraper, Mock initialMock) { - this.httpServerWraper = httpServerWraper + ContextExecutor(HttpServerWrapper httpServerWrapper, Mock initialMock) { + this.httpServerWrapper = httpServerWrapper this.path = "/${initialMock.path}" this.mocks = new CopyOnWriteArrayList<>([initialMock]) - httpServerWraper.createContext(path) { + httpServerWrapper.createContext(path) { HttpExchange ex -> try { applyMocks(ex) 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 7d2f86b..6a57f12 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -2,6 +2,7 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.util.logging.Slf4j +import pl.touk.mockserver.api.common.Https import pl.touk.mockserver.api.common.ImportAlias import pl.touk.mockserver.api.common.Method import pl.touk.mockserver.api.request.AddMock @@ -30,8 +31,8 @@ import static pl.touk.mockserver.server.Util.createResponse @Slf4j class HttpMockServer { - private final HttpServerWraper httpServerWraper - private final Map childServers = new ConcurrentHashMap<>() + private final HttpServerWrapper httpServerWrapper + private final Map childServers = new ConcurrentHashMap<>() private final Set mockNames = new CopyOnWriteArraySet<>() private final ConfigObject configuration = new ConfigObject() private final Executor executor @@ -41,13 +42,13 @@ class HttpMockServer { HttpMockServer(int port = 9999, ConfigObject initialConfiguration = new ConfigObject(), int threads = 10) { executor = Executors.newFixedThreadPool(threads) - httpServerWraper = new HttpServerWraper(port, executor) + httpServerWrapper = new HttpServerWrapper(port, executor) initialConfiguration.values()?.each { ConfigObject co -> addMock(co) } - httpServerWraper.createContext('/serverControl', { + httpServerWrapper.createContext('/serverControl', { HttpExchange ex -> try { if (ex.requestMethod == 'GET') { @@ -108,7 +109,7 @@ class HttpMockServer { throw new RuntimeException('mock already registered') } Mock mock = mockFromRequest(request) - HttpServerWraper child = getOrCreateChildServer(mock.port) + HttpServerWrapper child = getOrCreateChildServer(mock.port, mock.https) child.addMock(mock) saveConfiguration(request) mockNames << name @@ -121,7 +122,7 @@ class HttpMockServer { throw new RuntimeException('mock already registered') } Mock mock = mockFromConfig(co) - HttpServerWraper child = getOrCreateChildServer(mock.port) + HttpServerWrapper child = getOrCreateChildServer(mock.port, mock.https) child.addMock(mock) configuration.put(name, co) mockNames << name @@ -156,6 +157,7 @@ class HttpMockServer { mock.responseHeaders = request.responseHeaders mock.schema = request.schema mock.preserveHistory = request.preserveHistory != false + mock.https = request.https return mock } @@ -170,13 +172,23 @@ class HttpMockServer { mock.responseHeaders = co.responseHeaders ?: null mock.schema = co.schema ?: null mock.preserveHistory = co.preserveHistory != false + if (co.https) { + mock.https = new Https( + keystorePath: co.https.keystorePath ?: null, + keystorePassword: co.https.keystorePassword, + keyPassword: co.https.keyPassword, + truststorePath: co.https.truststorePath, + truststorePassword: co.https.truststorePassword, + requireClientAuth: co.https?.requireClientAuth?.asBoolean() ?: false + ) + } return mock } - private HttpServerWraper getOrCreateChildServer(int mockPort) { - HttpServerWraper child = childServers[mockPort] + private HttpServerWrapper getOrCreateChildServer(int mockPort, Https https) { + HttpServerWrapper child = childServers[mockPort] if (!child) { - child = new HttpServerWraper(mockPort, executor) + child = new HttpServerWrapper(mockPort, executor, https) childServers.put(mockPort, child) } return child @@ -244,6 +256,6 @@ class HttpMockServer { void stop() { childServers.values().each { it.stop() } - httpServerWraper.stop() + httpServerWrapper.stop() } } diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy deleted file mode 100644 index e1ef2f8..0000000 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy +++ /dev/null @@ -1,58 +0,0 @@ -package pl.touk.mockserver.server - -import com.sun.net.httpserver.HttpHandler -import com.sun.net.httpserver.HttpServer -import groovy.transform.PackageScope -import groovy.util.logging.Slf4j - -import java.util.concurrent.Executor - -@Slf4j -@PackageScope -class HttpServerWraper { - private final HttpServer httpServer - final int port - - private List executors = [] - - HttpServerWraper(int port, Executor executor) { - this.port = port - InetSocketAddress addr = new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), port) - httpServer = HttpServer.create(addr, 0) - httpServer.executor = executor - log.info("Http server starting on port $port...") - httpServer.start() - log.info('Http server is started') - } - - void createContext(String context, HttpHandler handler) { - httpServer.createContext(context, handler) - } - - void addMock(Mock mock) { - ContextExecutor executor = executors.find { it.path == mock.path } - if (executor) { - executor.addMock(mock) - } else { - executors << new ContextExecutor(this, mock) - } - log.info("Added mock ${mock.name}") - } - - void stop() { - executors.each { httpServer.removeContext(it.contextPath) } - httpServer.stop(0) - } - - List removeMock(String name) { - return executors.collect { it.removeMock(name) }.flatten() as List - } - - List peekMock(String name) { - return executors.collect { it.peekMock(name) }.flatten() as List - } - - List getMocks() { - return executors.collect { it.mocks }.flatten() as List - } -} diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWrapper.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWrapper.groovy new file mode 100644 index 0000000..c9e63e9 --- /dev/null +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWrapper.groovy @@ -0,0 +1,106 @@ +package pl.touk.mockserver.server + +import com.sun.net.httpserver.HttpHandler +import com.sun.net.httpserver.HttpServer +import com.sun.net.httpserver.HttpsServer +import groovy.transform.PackageScope +import groovy.util.logging.Slf4j +import pl.touk.mockserver.api.common.Https + +import javax.net.ssl.KeyManager +import javax.net.ssl.KeyManagerFactory +import javax.net.ssl.SSLContext +import javax.net.ssl.TrustManager +import javax.net.ssl.TrustManagerFactory +import java.security.KeyStore +import java.security.SecureRandom +import java.util.concurrent.Executor + +@Slf4j +@PackageScope +class HttpServerWrapper { + private final HttpServer httpServer + final int port + + private List executors = [] + + HttpServerWrapper(int port, Executor executor, Https https = null) { + this.port = port + InetSocketAddress addr = new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), port) + httpServer = buildServer(addr, https) + httpServer.executor = executor + log.info("Http server starting on port $port...") + httpServer.start() + log.info('Http server is started') + } + + private HttpServer buildServer(InetSocketAddress addr, Https https) { + if (https) { + HttpsServer httpsServer = HttpsServer.create(addr, 0) + httpsServer.httpsConfigurator = new HttpsConfig(buildSslContext(https), https) + return httpsServer + } else { + return HttpServer.create(addr, 0) + } + } + + private SSLContext buildSslContext(Https https) { + KeyManager[] keyManagers = buildKeyManager(https) + TrustManager[] trustManagers = buildTrustManager(https) + + SSLContext ssl = SSLContext.getInstance('TLSv1') + ssl.init(keyManagers, trustManagers, new SecureRandom()) + return ssl + } + + private KeyManager[] buildKeyManager(Https https) { + KeyStore keyStore = KeyStore.getInstance('jks') + keyStore.load(new FileInputStream(https.keystorePath), https.keystorePassword.toCharArray()) + KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.defaultAlgorithm) + kmf.init(keyStore, https.keyPassword.toCharArray()) + return kmf.keyManagers + } + + private TrustManager[] buildTrustManager(Https https) { + if (https.requireClientAuth) { + KeyStore trustStore = KeyStore.getInstance('jks') + trustStore.load(new FileInputStream(https.truststorePath), https.truststorePassword.toCharArray()) + TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.defaultAlgorithm) + tmf.init(trustStore) + return tmf.trustManagers + } else { + return [] + } + } + + void createContext(String context, HttpHandler handler) { + httpServer.createContext(context, handler) + } + + void addMock(Mock mock) { + ContextExecutor executor = executors.find { it.path == mock.path } + if (executor) { + executor.addMock(mock) + } else { + executors << new ContextExecutor(this, mock) + } + log.info("Added mock ${mock.name}") + } + + void stop() { + executors.each { httpServer.removeContext(it.contextPath) } + httpServer.stop(0) + } + + List removeMock(String name) { + return executors.collect { it.removeMock(name) }.flatten() as List + } + + List peekMock(String name) { + return executors.collect { it.peekMock(name) }.flatten() as List + } + + List getMocks() { + return executors.collect { it.mocks }.flatten() as List + } +} diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpsConfig.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpsConfig.groovy new file mode 100644 index 0000000..68b5550 --- /dev/null +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpsConfig.groovy @@ -0,0 +1,28 @@ +package pl.touk.mockserver.server + +import com.sun.net.httpserver.HttpsConfigurator +import com.sun.net.httpserver.HttpsParameters +import groovy.transform.CompileStatic +import pl.touk.mockserver.api.common.Https + +import javax.net.ssl.SSLContext +import javax.net.ssl.SSLParameters + +@CompileStatic +class HttpsConfig extends HttpsConfigurator { + private final Https https + + HttpsConfig(SSLContext sslContext, Https https) { + super(sslContext) + this.https = https + } + + @Override + void configure(HttpsParameters httpsParameters) { + SSLContext sslContext = getSSLContext() + SSLParameters sslParameters = sslContext.defaultSSLParameters + sslParameters.needClientAuth = https.requireClientAuth + httpsParameters.needClientAuth = https.requireClientAuth + httpsParameters.SSLParameters = sslParameters + } +} 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 ed37f89..e132ac9 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -5,6 +5,7 @@ import groovy.transform.PackageScope import groovy.util.logging.Slf4j import org.codehaus.groovy.control.CompilerConfiguration import org.codehaus.groovy.control.customizers.ImportCustomizer +import pl.touk.mockserver.api.common.Https import pl.touk.mockserver.api.common.Method import javax.xml.XMLConstants @@ -35,6 +36,7 @@ class Mock implements Comparable { private Validator validator Map imports = [:] boolean preserveHistory = true + Https https Mock(String name, String path, int port) { if (!(name)) { diff --git a/pom.xml b/pom.xml index 43ce7cd..c99b3f7 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,7 @@ 1.11.2 2.5.2 1.4 + 0.5.1 @@ -99,6 +100,12 @@ ${jmh.version} test + + info.solidsoft.spock + spock-global-unroll + ${spock-global-unroll.version} + test + From 181f9dbcd9b58e661897f89da6c220e1ce4819bd Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 28 Feb 2018 14:30:22 +0100 Subject: [PATCH 078/116] [maven-release-plugin] prepare release http-mock-server-2.6.0 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 873227b..83d9ddc 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.2-SNAPSHOT + 2.6.0 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 8e40314..1b5e956 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.2-SNAPSHOT + 2.6.0 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index ffc9d6c..7ee772b 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.2-SNAPSHOT + 2.6.0 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 3c743ee..1fc8679 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.2-SNAPSHOT + 2.6.0 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 3ac9362..d8bbe17 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.5.2-SNAPSHOT + 2.6.0 4.0.0 diff --git a/pom.xml b/pom.xml index c99b3f7..1d78ed5 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.5.2-SNAPSHOT + 2.6.0 mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.6.0 From 579dd08d2fe832bf8f7a3bd5e8c9103d4c4057ea Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 28 Feb 2018 14:30:32 +0100 Subject: [PATCH 079/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 83d9ddc..3f59297 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.0 + 2.6.1-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 1b5e956..83b435b 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.0 + 2.6.1-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 7ee772b..fc48782 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.0 + 2.6.1-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 1fc8679..a866671 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.0 + 2.6.1-SNAPSHOT 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index d8bbe17..db37c4d 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.0 + 2.6.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 1d78ed5..c7c87d6 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.6.0 + 2.6.1-SNAPSHOT mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.6.0 + HEAD From 9c6afd599f610622639e76e83d1ec82def98b389 Mon Sep 17 00:00:00 2001 From: Anna Czajka Date: Mon, 3 Sep 2018 12:30:40 +0200 Subject: [PATCH 080/116] Change schema resource fetching (#3) --- .../src/main/groovy/pl/touk/mockserver/server/Mock.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e132ac9..a285d6e 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -158,7 +158,7 @@ class Mock implements Comparable { if (schema) { try { validator = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI) - .newSchema(new File(this.class.getResource("/$schema").path)) + .newSchema(this.class.getResource("/$schema")) .newValidator() } catch (Exception e) { throw new RuntimeException('mock request schema is invalid schema', e) From 4128b8b49d669604fbdeb644252ec91b7f4a83a9 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Tue, 4 Sep 2018 13:07:18 +0200 Subject: [PATCH 081/116] [maven-release-plugin] prepare release http-mock-server-2.6.1 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 3f59297..fdc2aeb 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.1-SNAPSHOT + 2.6.1 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 83b435b..6046eb5 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.1-SNAPSHOT + 2.6.1 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index fc48782..a1078a0 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.1-SNAPSHOT + 2.6.1 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index a866671..886e641 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.1-SNAPSHOT + 2.6.1 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index db37c4d..5f5a1b9 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.1-SNAPSHOT + 2.6.1 4.0.0 diff --git a/pom.xml b/pom.xml index c7c87d6..906a194 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.6.1-SNAPSHOT + 2.6.1 mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.6.1 From c118365bbeed907b5d77ae275df93dabf282dca6 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Tue, 4 Sep 2018 13:07:27 +0200 Subject: [PATCH 082/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index fdc2aeb..14cab09 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.1 + 2.6.2-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 6046eb5..b0f6b04 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.1 + 2.6.2-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index a1078a0..55fbecc 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.1 + 2.6.2-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 886e641..f5e6b12 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.1 + 2.6.2-SNAPSHOT 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 5f5a1b9..6d058cb 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.1 + 2.6.2-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 906a194..6ddde3c 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.6.1 + 2.6.2-SNAPSHOT mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.6.1 + HEAD From fcd99cf61f228d540d2ba48fa8547fd84a46c2a2 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Thu, 4 Apr 2019 19:42:37 +0200 Subject: [PATCH 083/116] Build assembly by default --- mockserver/pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mockserver/pom.xml b/mockserver/pom.xml index f5e6b12..fab15f3 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -49,6 +49,15 @@ mockserver-full false + + + create-archive + package + + single + + + From 79622a41776413566c7ebbb531319569ee4fadbe Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Fri, 7 Aug 2020 08:55:16 +0200 Subject: [PATCH 084/116] Add limited mock uses --- .travis.yml | 2 +- README.md | 114 +++++---- .../xsd/pl/touk/mockserver/api/request.xsd | 2 + .../tests/MockServerMaxUsesTest.groovy | 239 ++++++++++++++++++ .../mockserver/server/ContextExecutor.groovy | 19 ++ .../mockserver/server/HttpMockServer.groovy | 10 + .../pl/touk/mockserver/server/Mock.groovy | 34 +++ 7 files changed, 369 insertions(+), 51 deletions(-) create mode 100644 mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy diff --git a/.travis.yml b/.travis.yml index bfa78aa..672c068 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: groovy jdk: - - oraclejdk8 + - openjdk8 diff --git a/README.md b/README.md index 2552e18..7439888 100644 --- a/README.md +++ b/README.md @@ -30,39 +30,41 @@ Configuration file is groovy configuration script e.g. : ```groovy testRest2 { - port=9998 - response='{ req -> \'\' }' - responseHeaders='{ _ -> [a: "b"] }' - path='testEndpoint' - predicate='{ req -> req.xml.name() == \'request1\'}' - name='testRest2' + port=9998 + response='{ req -> \'\' }' + responseHeaders='{ _ -> [a: "b"] }' + path='testEndpoint' + predicate='{ req -> req.xml.name() == \'request1\'}' + name='testRest2' } testRest4 { - soap=true - port=9999 - path='testEndpoint' - name='testRest4' - method='PUT' - statusCode=204 + soap=true + port=9999 + path='testEndpoint' + name='testRest4' + method='PUT' + statusCode=204 } testRest3 { - port=9999 - path='testEndpoint2' - name='testRest3' + port=9999 + path='testEndpoint2' + name='testRest3' } testRest6 { - port=9999 - path='testEndpoint2' - name='testRest6' + port=9999 + path='testEndpoint2' + name='testRest6' + maxUses=1 + cyclic=true } testRest { - imports { - aaa='bbb' - ccc='bla' - } - port=10001 - path='testEndpoint' - name='testRest' + imports { + aaa='bbb' + ccc='bla' + } + port=10001 + path='testEndpoint' + name='testRest' } testHttps { soap=false @@ -112,6 +114,8 @@ remoteMockServer.addMock(new AddMock( method: ..., responseHeaders: ..., schema: ..., + maxUses: ..., + cyclic: ..., https: new Https( keystorePath: '/tmp/keystore.jks', keystorePassword: 'keystorePass', @@ -140,6 +144,8 @@ Send POST request to localhost:/serverControl ... ... + ... + ... /tmp/keystore.jks keystorePass @@ -165,6 +171,8 @@ Send POST request to localhost:/serverControl - schema - path to xsd schema file on mockserver classpath; default empty, so no vallidation of request is performed; if validation fails then response has got status 400 and response is raw message from validator - imports - list of imports for closures (each import is separate tag); `alias` is the name of `fullClassName` available in closure; `fullClassName` must be available on classpath of mock server - https - HTTPS configuration +- maxUses - limit uses of mock to the specific number, after that mock is removed (any negative number means unlimited - default, cannot set value to 0) +- cyclic - should mock be added after `maxUses` uses at the end of the mock list (by default false) #### HTTPS configuration @@ -376,39 +384,39 @@ Response: ```groovy testRest2 { - port=9998 - response='{ req -> \'\' }' - responseHeaders='{ _ -> [a: "b"] }' - path='testEndpoint' - predicate='{ req -> req.xml.name() == \'request1\'}' - name='testRest2' + port=9998 + response='{ req -> \'\' }' + responseHeaders='{ _ -> [a: "b"] }' + path='testEndpoint' + predicate='{ req -> req.xml.name() == \'request1\'}' + name='testRest2' } testRest4 { - soap=true - port=9999 - path='testEndpoint' - name='testRest4' - method='PUT' - statusCode=204 + soap=true + port=9999 + path='testEndpoint' + name='testRest4' + method='PUT' + statusCode=204 } testRest3 { - port=9999 - path='testEndpoint2' - name='testRest3' + port=9999 + path='testEndpoint2' + name='testRest3' } testRest6 { - port=9999 - path='testEndpoint2' - name='testRest6' + port=9999 + path='testEndpoint2' + name='testRest6' } testRest { - imports { - aaa='bbb' - ccc='bla' - } - port=10001 - path='testEndpoint' - name='testRest' + imports { + aaa='bbb' + ccc='bla' + } + port=10001 + path='testEndpoint' + name='testRest' } ``` @@ -435,3 +443,9 @@ Just add repository to maven pom: ... ``` + +FAQ +--- + +Q: *Can I have two mocks returning responses interchangeably for the same request?* +A: Yes, you can. Just set two mocks with `maxUses: 1` and `cyclic: true`. diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd index 23786bc..25287c8 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd @@ -25,6 +25,8 @@ + + diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy new file mode 100644 index 0000000..08d2c12 --- /dev/null +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy @@ -0,0 +1,239 @@ +package pl.touk.mockserver.tests + + +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.client.methods.HttpPost +import org.apache.http.entity.ContentType +import org.apache.http.entity.StringEntity +import org.apache.http.impl.client.CloseableHttpClient +import org.apache.http.impl.client.HttpClients +import pl.touk.mockserver.api.request.AddMock +import pl.touk.mockserver.client.RemoteMockServer +import pl.touk.mockserver.server.HttpMockServer +import spock.lang.AutoCleanup +import spock.lang.Shared +import spock.lang.Specification + +class MockServerMaxUsesTest extends Specification { + + RemoteMockServer remoteMockServer + + @AutoCleanup('stop') + HttpMockServer httpMockServer + + @Shared + CloseableHttpClient client = HttpClients.createDefault() + + def setup() { + httpMockServer = new HttpMockServer(9000) + remoteMockServer = new RemoteMockServer('localhost', 9000) + } + + def 'should return two mocks in order'() { + given:'mock with predicate is given but for only one use' + remoteMockServer.addMock(new AddMock( + name: 'mock1', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> 'mock1'}''', + maxUses: 1 + )) + and:'mock with the same predicate is given' + remoteMockServer.addMock(new AddMock( + name: 'mock2', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> 'mock2'}''', + )) + when:'we call the first time' + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then:'first mock should be returned and expired' + response.entity.content.text == 'mock1' + when:'we call the second time using the same request' + CloseableHttpResponse response2 = client.execute(restPost) + then:'second mock should be returned' + response2.entity.content.text == 'mock2' + when:'we call the third time using the same request' + CloseableHttpResponse response3 = client.execute(restPost) + then:'second mock should be returned, because it has unlimited uses' + response3.entity.content.text == 'mock2' + } + + def 'should return two mocks in order but only once'() { + given:'mock with predicate is given but for only one use' + remoteMockServer.addMock(new AddMock( + name: 'mock1', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> 'mock1'}''', + maxUses: 1 + )) + and:'mock with the same predicate is given' + remoteMockServer.addMock(new AddMock( + name: 'mock2', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> 'mock2'}''', + maxUses: 1, + )) + when:'we call the first time' + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then:'first mock should be returned and expired' + response.entity.content.text == 'mock1' + when:'we call the second time using the same request' + CloseableHttpResponse response2 = client.execute(restPost) + then:'second mock should be returned' + response2.entity.content.text == 'mock2' + when:'we call the third time using the same request' + CloseableHttpResponse response3 = client.execute(restPost) + then:'no mock should be found' + response3.statusLine.statusCode == 404 + } + + def 'should return two mocks in cyclic order'() { + given:'mock with predicate is given but for only one use' + remoteMockServer.addMock(new AddMock( + name: 'mock1', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> 'mock1'}''', + maxUses: 1, + cyclic: true, + preserveHistory: true + )) + and:'mock with the same predicate is given' + remoteMockServer.addMock(new AddMock( + name: 'mock2', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> 'mock2'}''', + maxUses: 1, + cyclic: true + )) + when:'we call the first time' + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then:'first mock should be returned and expired' + response.entity.content.text == 'mock1' + when:'we call the second time using the same request' + CloseableHttpResponse response2 = client.execute(restPost) + then:'second mock should be returned and expired' + response2.entity.content.text == 'mock2' + when:'we call the third time using the same request' + CloseableHttpResponse response3 = client.execute(restPost) + then:'first mock should be returned, because these mocks are cyclic' + response3.entity.content.text == 'mock1' + when:'we call the fourth time using the same request' + CloseableHttpResponse response4 = client.execute(restPost) + then:'second mock should be returned, because these mocks are cyclic' + response4.entity.content.text == 'mock2' + and: + remoteMockServer.peekMock('mock1').size() == 2 + } + + def 'should return two mocks with the same request interjected by another'() { + given:'mock with predicate is given but for only one use' + remoteMockServer.addMock(new AddMock( + name: 'mock1', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> 'mock1'}''', + maxUses: 1, + cyclic: true + )) + and:'mock with the same predicate is given' + remoteMockServer.addMock(new AddMock( + name: 'mock2', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> 'mock2'}''', + maxUses: 1, + cyclic: true + )) + and:'mock with other predicate is given' + remoteMockServer.addMock(new AddMock( + name: 'otherMock', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'otherRequest'}''', + response: '''{req -> 'otherMock'}''' + )) + when:'we call the first time' + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then:'first mock should be returned and expired' + response.entity.content.text == 'mock1' + when:'we call other request' + HttpPost otherRestPost = new HttpPost('http://localhost:9999/testEndpoint') + otherRestPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse otherResponse = client.execute(otherRestPost) + then:'other mock should be called' + otherResponse.entity.content.text == 'otherMock' + when:'we call the second time using the same request' + CloseableHttpResponse response2 = client.execute(restPost) + then:'second mock should be returned and expired' + response2.entity.content.text == 'mock2' + when:'we call the third time using the same request' + CloseableHttpResponse response3 = client.execute(restPost) + then:'first mock should be returned, because these mocks are cyclic' + response3.entity.content.text == 'mock1' + } + + def 'should return first mock twice'() { + given:'mock with predicate is given but for only one use' + remoteMockServer.addMock(new AddMock( + name: 'mock1', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> 'mock1'}''', + maxUses: 2 + )) + and:'mock with the same predicate is given' + remoteMockServer.addMock(new AddMock( + name: 'mock2', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'request'}''', + response: '''{req -> 'mock2'}''', + )) + when:'we call the first time' + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then:'first mock should be returned and expired' + response.entity.content.text == 'mock1' + when:'we call the second time using the same request' + CloseableHttpResponse response2 = client.execute(restPost) + then:'again first mock should be returned' + response2.entity.content.text == 'mock1' + when:'we call the third time using the same request' + CloseableHttpResponse response3 = client.execute(restPost) + then:'second mock should be returned' + response3.entity.content.text == 'mock2' + } + + def 'should throw exception if adding mock with incorrect maxUses'() { + when: + remoteMockServer.addMock(new AddMock( + name: 'mock1', + maxUses: 0 + )) + then: + thrown(RuntimeException) + } +} 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 ce11c4c..7b31b22 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -39,6 +39,7 @@ class ContextExecutor { try { if (mock.match(Method.valueOf(ex.requestMethod), request)) { log.debug("Mock ${mock.name} match request ${request.text}") + handleMaxUses(mock) MockResponse httpResponse = mock.apply(request) fillExchange(ex, httpResponse) log.trace("Mock ${mock.name} response with body ${httpResponse.text}") @@ -92,4 +93,22 @@ class ContextExecutor { List getMocks() { return mocks } + + private synchronized void handleMaxUses(Mock mock) { + if (mock.hasLimitedUses()) { + mock.decrementUses() + removeAndResetIfNeeded(mock) + log.debug("Uses left ${mock.usesLeft} of ${mock.maxUses} (is cyclic: ${mock.cyclic})") + } + } + + private void removeAndResetIfNeeded(Mock mock) { + if (mock.shouldBeRemoved()) { + mocks.remove(mock) + } + if (mock.shouldUsesBeReset()) { + mock.resetUses() + mocks.add(mock) + } + } } 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 6a57f12..f0352ae 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -108,6 +108,9 @@ class HttpMockServer { if (name in mockNames) { throw new RuntimeException('mock already registered') } + if (request.maxUses == 0) { + throw new RuntimeException('cannot set maxUses to 0') + } Mock mock = mockFromRequest(request) HttpServerWrapper child = getOrCreateChildServer(mock.port, mock.https) child.addMock(mock) @@ -121,6 +124,9 @@ class HttpMockServer { if (name in mockNames) { throw new RuntimeException('mock already registered') } + if (co.maxUses == 0) { + throw new RuntimeException('cannot set maxUses to 0') + } Mock mock = mockFromConfig(co) HttpServerWrapper child = getOrCreateChildServer(mock.port, mock.https) child.addMock(mock) @@ -158,6 +164,8 @@ class HttpMockServer { mock.schema = request.schema mock.preserveHistory = request.preserveHistory != false mock.https = request.https + mock.maxUses = request.maxUses + mock.cyclic = request.cyclic return mock } @@ -182,6 +190,8 @@ class HttpMockServer { requireClientAuth: co.https?.requireClientAuth?.asBoolean() ?: false ) } + mock.maxUses = co.maxUses ?: null + mock.cyclic = co.cyclic ?: null return mock } 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 a285d6e..0a4fa42 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -37,6 +37,9 @@ class Mock implements Comparable { Map imports = [:] boolean preserveHistory = true Https https + int maxUses = -1 + int usesLeft + boolean cyclic Mock(String name, String path, int port) { if (!(name)) { @@ -148,6 +151,17 @@ class Mock implements Comparable { } } + void setMaxUses(Integer maxUses) { + if (maxUses > 0) { + this.maxUses = maxUses + this.usesLeft = maxUses + } + } + + void setCyclic(Boolean cyclic) { + this.cyclic = cyclic ?: false + } + @Override int compareTo(Mock o) { return name.compareTo(o.name) @@ -165,4 +179,24 @@ class Mock implements Comparable { } } } + + boolean hasLimitedUses() { + return maxUses > 0 + } + + void decrementUses() { + usesLeft-- + } + + boolean shouldBeRemoved() { + return hasLimitedUses() && usesLeft <= 0 + } + + boolean shouldUsesBeReset() { + return shouldBeRemoved() && cyclic + } + + void resetUses() { + setMaxUses(maxUses) + } } From 2cd84e3052c9a34ebf18fa245d39b32f6eb0b975 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2020 09:53:13 +0000 Subject: [PATCH 085/116] Bump httpclient from 4.3.5 to 4.3.6 Bumps httpclient from 4.3.5 to 4.3.6. Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6ddde3c..c8a8e9e 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ UTF-8 3.1 2.4.11 - 4.3.5 + 4.3.6 1.0-groovy-2.4 3.3.2 1.7.7 From aa3919dbd25390308d7d5a2e1988eab02bcbad56 Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Mon, 10 Aug 2020 12:27:09 +0200 Subject: [PATCH 086/116] [maven-release-plugin] prepare release http-mock-server-2.7.0 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 14cab09..27e8b15 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.2-SNAPSHOT + 2.7.0 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index b0f6b04..22a12d7 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.2-SNAPSHOT + 2.7.0 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 55fbecc..afac34e 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.2-SNAPSHOT + 2.7.0 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index fab15f3..88302f4 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.2-SNAPSHOT + 2.7.0 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 6d058cb..807ab5a 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.6.2-SNAPSHOT + 2.7.0 4.0.0 diff --git a/pom.xml b/pom.xml index c8a8e9e..4c3cdca 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.6.2-SNAPSHOT + 2.7.0 mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.7.0 From 769199f5d49d124d7fb11f0bf089441fb7a3e803 Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Mon, 10 Aug 2020 12:27:17 +0200 Subject: [PATCH 087/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 27e8b15..833ac35 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.7.0 + 2.7.1-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 22a12d7..1306d75 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.7.0 + 2.7.1-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index afac34e..8fa4379 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.7.0 + 2.7.1-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 88302f4..411f356 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.7.0 + 2.7.1-SNAPSHOT 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 807ab5a..8ba171e 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.7.0 + 2.7.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 4c3cdca..f57fc38 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.7.0 + 2.7.1-SNAPSHOT mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.7.0 + HEAD From fe9ef89970d7c4031791c575f734bc3ebf54cf64 Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Tue, 11 Aug 2020 12:53:35 +0200 Subject: [PATCH 088/116] Do not remove mock from history after max uses --- README.md | 2 +- .../touk/mockserver/tests/MockServerMaxUsesTest.groovy | 2 ++ .../pl/touk/mockserver/server/ContextExecutor.groovy | 8 +++----- .../main/groovy/pl/touk/mockserver/server/Mock.groovy | 9 +++------ 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 7439888..042fc5d 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ Send POST request to localhost:/serverControl - schema - path to xsd schema file on mockserver classpath; default empty, so no vallidation of request is performed; if validation fails then response has got status 400 and response is raw message from validator - imports - list of imports for closures (each import is separate tag); `alias` is the name of `fullClassName` available in closure; `fullClassName` must be available on classpath of mock server - https - HTTPS configuration -- maxUses - limit uses of mock to the specific number, after that mock is removed (any negative number means unlimited - default, cannot set value to 0) +- maxUses - limit uses of mock to the specific number, after that mock is marked as ignored (any negative number means unlimited - default, cannot set value to 0), after this number of invocation mock history is still available, but mock does not apply to any request - cyclic - should mock be added after `maxUses` uses at the end of the mock list (by default false) #### HTTPS configuration diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy index 08d2c12..9e05890 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy @@ -96,6 +96,8 @@ class MockServerMaxUsesTest extends Specification { CloseableHttpResponse response3 = client.execute(restPost) then:'no mock should be found' response3.statusLine.statusCode == 404 + and:'mock should exist' + remoteMockServer.listMocks().find { it.name == 'mock1' } != null } def 'should return two mocks in cyclic order'() { 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 7b31b22..57aa952 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -97,17 +97,15 @@ class ContextExecutor { private synchronized void handleMaxUses(Mock mock) { if (mock.hasLimitedUses()) { mock.decrementUses() - removeAndResetIfNeeded(mock) + resetIfNeeded(mock) log.debug("Uses left ${mock.usesLeft} of ${mock.maxUses} (is cyclic: ${mock.cyclic})") } } - private void removeAndResetIfNeeded(Mock mock) { - if (mock.shouldBeRemoved()) { - mocks.remove(mock) - } + private void resetIfNeeded(Mock mock) { if (mock.shouldUsesBeReset()) { mock.resetUses() + mocks.remove(mock) mocks.add(mock) } } 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 0a4fa42..434dd0f 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -59,7 +59,8 @@ class Mock implements Comparable { } boolean match(Method method, MockRequest request) { - return this.method == method && predicate(request) + boolean usesCondition = hasLimitedUses() ? usesLeft > 0 : true + return usesCondition && this.method == method && predicate(request) } MockResponse apply(MockRequest request) { @@ -188,12 +189,8 @@ class Mock implements Comparable { usesLeft-- } - boolean shouldBeRemoved() { - return hasLimitedUses() && usesLeft <= 0 - } - boolean shouldUsesBeReset() { - return shouldBeRemoved() && cyclic + return hasLimitedUses() && usesLeft <= 0 && cyclic } void resetUses() { From 531daa0fbe5700d3855a4b018d95c1b8cb310d7e Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Wed, 12 Aug 2020 07:30:14 +0200 Subject: [PATCH 089/116] [maven-release-plugin] prepare release http-mock-server-2.8.0 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 833ac35..4d023e6 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.7.1-SNAPSHOT + 2.8.0 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 1306d75..274139f 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.7.1-SNAPSHOT + 2.8.0 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 8fa4379..32cef51 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.7.1-SNAPSHOT + 2.8.0 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 411f356..f2f828d 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.7.1-SNAPSHOT + 2.8.0 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 8ba171e..50c9e6b 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.7.1-SNAPSHOT + 2.8.0 4.0.0 diff --git a/pom.xml b/pom.xml index f57fc38..a7c3307 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.7.1-SNAPSHOT + 2.8.0 mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.8.0 From 6438c661da53d29c1d2b966284dbac1b8c6d1287 Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Wed, 12 Aug 2020 07:30:23 +0200 Subject: [PATCH 090/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 4d023e6..818ecf0 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.0 + 2.8.1-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 274139f..48e8824 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.0 + 2.8.1-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 32cef51..3b85e8b 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.0 + 2.8.1-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index f2f828d..985da28 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.0 + 2.8.1-SNAPSHOT 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 50c9e6b..5fd80cf 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.0 + 2.8.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index a7c3307..8f1b899 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.8.0 + 2.8.1-SNAPSHOT mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.8.0 + HEAD From 170fb58c9946a96f39647cae4e114235fff084d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Bigorajski?= Date: Wed, 7 Oct 2020 13:25:07 +0200 Subject: [PATCH 091/116] Bump groovy version --- .gitignore | 1 + mockserver-client/pom.xml | 10 +++++++++- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 10 +++++++++- pom.xml | 16 +++++++++++++--- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 7f995f3..18e3da1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.iml target/ +.idea diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 48e8824..31f2353 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -15,7 +15,15 @@ org.codehaus.groovy - groovy-all + groovy + + + org.codehaus.groovy + groovy-json + + + org.codehaus.groovy + groovy-xml org.apache.httpcomponents diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 3b85e8b..1015716 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -16,7 +16,7 @@ org.codehaus.groovy - groovy-all + groovy org.spockframework diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 985da28..3a10008 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -12,7 +12,15 @@ org.codehaus.groovy - groovy-all + groovy + + + org.codehaus.groovy + groovy-json + + + org.codehaus.groovy + groovy-xml org.slf4j diff --git a/pom.xml b/pom.xml index 8f1b899..7a94c96 100644 --- a/pom.xml +++ b/pom.xml @@ -24,9 +24,9 @@ UTF-8 UTF-8 3.1 - 2.4.11 + 2.5.7 4.3.6 - 1.0-groovy-2.4 + 1.3-groovy-2.5 3.3.2 1.7.7 1.0.13 @@ -49,7 +49,17 @@ org.codehaus.groovy - groovy-all + groovy + ${groovy.version} + + + org.codehaus.groovy + groovy-json + ${groovy.version} + + + org.codehaus.groovy + groovy-xml ${groovy.version} From 6d52f8bcebda8b5c1e731fdc54d1515970f15baa Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Wed, 7 Oct 2020 14:44:38 +0200 Subject: [PATCH 092/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 818ecf0..ac5af8a 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.1-SNAPSHOT + 2.8.2-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 31f2353..d352432 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.1-SNAPSHOT + 2.8.2-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 1015716..d7b5020 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.1-SNAPSHOT + 2.8.2-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 3a10008..bad71fb 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.1-SNAPSHOT + 2.8.2-SNAPSHOT 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 5fd80cf..b9250dc 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.1-SNAPSHOT + 2.8.2-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 7a94c96..0688576 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.8.1-SNAPSHOT + 2.8.2-SNAPSHOT mockserver-client mockserver From 8824634652cbca89765046f72039f63249acfe9e Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Wed, 7 Oct 2020 14:48:48 +0200 Subject: [PATCH 093/116] [maven-release-plugin] prepare release http-mock-server-2.8.2 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index ac5af8a..1529101 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.2-SNAPSHOT + 2.8.2 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index d352432..69c73cc 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.2-SNAPSHOT + 2.8.2 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index d7b5020..62f34ca 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.2-SNAPSHOT + 2.8.2 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index bad71fb..b160013 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.2-SNAPSHOT + 2.8.2 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index b9250dc..ee58976 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.2-SNAPSHOT + 2.8.2 4.0.0 diff --git a/pom.xml b/pom.xml index 0688576..37f67e7 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.8.2-SNAPSHOT + 2.8.2 mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.8.2 From db93a99b9aae3968cb8bda2991ee6b8aee69cf94 Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Wed, 7 Oct 2020 14:48:56 +0200 Subject: [PATCH 094/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 1529101..ed644df 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.2 + 2.8.3-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 69c73cc..54ac4be 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.2 + 2.8.3-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 62f34ca..c9f2e44 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.2 + 2.8.3-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index b160013..1e5230f 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.2 + 2.8.3-SNAPSHOT 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index ee58976..d0e4f87 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.2 + 2.8.3-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 37f67e7..f79af09 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.8.2 + 2.8.3-SNAPSHOT mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.8.2 + HEAD From f8f2cfb125ec04965b8f9ffb27206552ec99e2d7 Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Mon, 7 Jun 2021 20:39:08 +0200 Subject: [PATCH 095/116] Update logback --- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 4 ++++ pom.xml | 11 ++++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index c9f2e44..53fbf93 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -28,7 +28,7 @@ ch.qos.logback - logback-classic + logback-core org.apache.httpcomponents diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 1e5230f..8cf7683 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -26,6 +26,10 @@ org.slf4j slf4j-api + + ch.qos.logback + logback-core + ch.qos.logback logback-classic diff --git a/pom.xml b/pom.xml index f79af09..4455e34 100644 --- a/pom.xml +++ b/pom.xml @@ -28,8 +28,8 @@ 4.3.6 1.3-groovy-2.5 3.3.2 - 1.7.7 - 1.0.13 + 1.7.30 + 1.2.3 1.16.6 true @@ -83,10 +83,15 @@ slf4j-api ${slf4j-api.version} + + ch.qos.logback + logback-core + ${logback.version} + ch.qos.logback logback-classic - ${logback-classic.version} + ${logback.version} org.projectlombok From 1a422fefca6bac137fcded1b8285801f963af44c Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Mon, 7 Jun 2021 21:01:56 +0200 Subject: [PATCH 096/116] Update httpclient --- .../pl/touk/mockserver/tests/MockServerIntegrationTest.groovy | 2 -- .../pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy | 1 - pom.xml | 2 +- 3 files changed, 1 insertion(+), 4 deletions(-) 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 e9f2d42..d0c3593 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 @@ -28,7 +28,6 @@ import pl.touk.mockserver.client.RemoteMockServer import pl.touk.mockserver.client.Util import pl.touk.mockserver.server.HttpMockServer import spock.lang.AutoCleanup -import spock.lang.Shared import spock.lang.Specification class MockServerIntegrationTest extends Specification { @@ -38,7 +37,6 @@ class MockServerIntegrationTest extends Specification { @AutoCleanup('stop') HttpMockServer httpMockServer - @Shared CloseableHttpClient client = HttpClients.createDefault() def setup() { diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy index 9e05890..fd21436 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy @@ -21,7 +21,6 @@ class MockServerMaxUsesTest extends Specification { @AutoCleanup('stop') HttpMockServer httpMockServer - @Shared CloseableHttpClient client = HttpClients.createDefault() def setup() { diff --git a/pom.xml b/pom.xml index f79af09..48ad9ae 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ UTF-8 3.1 2.5.7 - 4.3.6 + 4.5.13 1.3-groovy-2.5 3.3.2 1.7.7 From 23bba7e713097d68e49fde37ccde12b5de76b69b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 16 Apr 2023 12:31:25 +0000 Subject: [PATCH 097/116] Bump logback-core from 1.2.3 to 1.2.9 Bumps logback-core from 1.2.3 to 1.2.9. --- updated-dependencies: - dependency-name: ch.qos.logback:logback-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6f738d7..8db5787 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 1.3-groovy-2.5 3.3.2 1.7.30 - 1.2.3 + 1.2.9 1.16.6 true From ab6345234f7a1ee06a9ff0f68d72f924c417f248 Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Sun, 28 May 2023 19:16:51 +0200 Subject: [PATCH 098/116] Setup maven wrapper --- .gitignore | 2 + .mvn/wrapper/maven-wrapper.properties | 18 ++ mvnw | 308 ++++++++++++++++++++++++++ mvnw.cmd | 205 +++++++++++++++++ 4 files changed, 533 insertions(+) create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100755 mvnw create mode 100644 mvnw.cmd diff --git a/.gitignore b/.gitignore index 18e3da1..8b71f67 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ *.iml target/ .idea + +.mvn/wrapper/maven-wrapper.jar \ No newline at end of file diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..7d02699 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..8d937f4 --- /dev/null +++ b/mvnw @@ -0,0 +1,308 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.2.0 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "$(uname)" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin ; then + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "\"$javaExecutable\"")" + fi + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround + done + printf '%s' "$(cd "$basedir" || exit 1; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..f80fbad --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,205 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% From 8ba339b8a0d1ee120e97682956bf62f182f4bb40 Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Sun, 28 May 2023 18:53:32 +0200 Subject: [PATCH 099/116] Setup github actions --- .github/workflows/build.yml | 14 ++++++++++++++ .travis.yml | 5 ----- .../mockserver/tests/MockServerHttpsTest.groovy | 2 ++ 3 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/build.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..0ab96ff --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,14 @@ +name: Build mockserver +on: [push] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'temurin' + - name: Build with Maven + run: ./mvnw package \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 672c068..0000000 --- a/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: groovy - -jdk: - - openjdk8 - diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerHttpsTest.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerHttpsTest.groovy index 8d6eff8..58c922e 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerHttpsTest.groovy +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerHttpsTest.groovy @@ -15,6 +15,7 @@ import pl.touk.mockserver.client.RemoteMockServer import pl.touk.mockserver.client.Util import pl.touk.mockserver.server.HttpMockServer import spock.lang.AutoCleanup +import spock.lang.Ignore import spock.lang.Shared import spock.lang.Specification @@ -22,6 +23,7 @@ import javax.net.ssl.SSLContext import javax.net.ssl.SSLHandshakeException import java.security.KeyStore +@Ignore('Upgrade of Java needed') class MockServerHttpsTest extends Specification { RemoteMockServer remoteMockServer = new RemoteMockServer('localhost', 19000) From 374947847dd1a45995e842ac49d42288e0774e48 Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Sun, 28 May 2023 18:46:16 +0200 Subject: [PATCH 100/116] Handle any method as mock request method --- README.md | 2 +- .../xsd/pl/touk/mockserver/api/common.xsd | 1 + .../tests/MockServerIntegrationTest.groovy | 26 +++++++++++++++++++ .../pl/touk/mockserver/server/Mock.groovy | 2 +- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 042fc5d..a8336d3 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,7 @@ Send POST request to localhost:/serverControl - response - groovy closure as string which must evaluate to string which will be response of mock when predicate is satisfied, optional, default { _ -> '' } - soap - true or false, is request and response should be wrapped in soap Envelope and Body elements, default false - statusCode - integer, status code of response when predicate is satisfied, default 200 -- method - POST|PUT|DELETE|GET|TRACE|OPTION|HEAD, expected http method of request, default POST +- method - POST|PUT|DELETE|GET|TRACE|OPTION|HEAD|ANY_METHOD, expected http method of request, default `POST`, `ANY_METHOD` matches all HTTP methods - responseHeaders - groovyClosure as string which must evaluate to Map which will be added to response headers, default { _ -> \[:] } - schema - path to xsd schema file on mockserver classpath; default empty, so no vallidation of request is performed; if validation fails then response has got status 400 and response is raw message from validator - imports - list of imports for closures (each import is separate tag); `alias` is the name of `fullClassName` available in closure; `fullClassName` must be available on classpath of mock server diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd index 673be7d..4b084dd 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd @@ -11,6 +11,7 @@ + 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 d0c3593..1ab1dad 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 @@ -1152,4 +1152,30 @@ class MockServerIntegrationTest extends Specification { 'test/other' | 'test/other' '/test/other' | 'test/other' } + + def 'should match any method'() { + given: + String name = "testRest-${UUID.randomUUID().toString()}" + remoteMockServer.addMock(new AddMock( + name: name, + path: 'any-method', + port: 9999, + statusCode: 201, + soap: false, + method: Method.ANY_METHOD + )) + when: + CloseableHttpResponse response = client.execute(req) + then: + response.statusLine.statusCode == 201 + Util.consumeResponse(response) + cleanup: + remoteMockServer.removeMock(name) + where: + req << [ + new HttpGet('http://localhost:9999/any-method'), + new HttpPost('http://localhost:9999/any-method'), + new HttpPatch('http://localhost:9999/any-method') + ] + } } 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 434dd0f..3f0f4fe 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -60,7 +60,7 @@ class Mock implements Comparable { boolean match(Method method, MockRequest request) { boolean usesCondition = hasLimitedUses() ? usesLeft > 0 : true - return usesCondition && this.method == method && predicate(request) + return usesCondition && (this.method == method || this.method == Method.ANY_METHOD) && predicate(request) } MockResponse apply(MockRequest request) { From a825ad6fa21815a841da8fb391441777f6016116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Bigorajski?= Date: Thu, 1 Jun 2023 11:11:53 +0200 Subject: [PATCH 101/116] [maven-release-plugin] prepare release http-mock-server-2.8.3 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index ed644df..820140f 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.3-SNAPSHOT + 2.8.3 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 54ac4be..d8c62f5 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.3-SNAPSHOT + 2.8.3 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 53fbf93..4654440 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.3-SNAPSHOT + 2.8.3 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 8cf7683..ddd8208 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.3-SNAPSHOT + 2.8.3 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index d0e4f87..c3b5fef 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.3-SNAPSHOT + 2.8.3 4.0.0 diff --git a/pom.xml b/pom.xml index 8db5787..7e2ab12 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.8.3-SNAPSHOT + 2.8.3 mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.8.3 From 3413bfa0adf857815e7ae6b84a40c1297f68b386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Bigorajski?= Date: Thu, 1 Jun 2023 11:11:57 +0200 Subject: [PATCH 102/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 820140f..3984007 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.3 + 2.8.4-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index d8c62f5..d9e8999 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.3 + 2.8.4-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 4654440..cfbe1ff 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.3 + 2.8.4-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index ddd8208..5e379d7 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.3 + 2.8.4-SNAPSHOT 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index c3b5fef..5c5c2cf 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.3 + 2.8.4-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 7e2ab12..9e4a08f 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.8.3 + 2.8.4-SNAPSHOT mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.8.3 + HEAD From e44c1de1a2901b4005e05e764cb825e215437d3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Bigorajski?= Date: Thu, 1 Jun 2023 17:51:30 +0200 Subject: [PATCH 103/116] [maven-release-plugin] prepare release http-mock-server-2.8.4 --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 3984007..47ee838 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.4-SNAPSHOT + 2.8.4 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index d9e8999..0cef548 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.4-SNAPSHOT + 2.8.4 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index cfbe1ff..87a06b0 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.4-SNAPSHOT + 2.8.4 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 5e379d7..28d4ca1 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.4-SNAPSHOT + 2.8.4 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 5c5c2cf..c9730a5 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.4-SNAPSHOT + 2.8.4 4.0.0 diff --git a/pom.xml b/pom.xml index 9e4a08f..360fdec 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.8.4-SNAPSHOT + 2.8.4 mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - HEAD + http-mock-server-2.8.4 From a3a7c4f8dc92eb996cb22387b12c19571919cada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Bigorajski?= Date: Thu, 1 Jun 2023 17:51:38 +0200 Subject: [PATCH 104/116] [maven-release-plugin] prepare for next development iteration --- mockserver-api/pom.xml | 2 +- mockserver-client/pom.xml | 2 +- mockserver-tests/pom.xml | 2 +- mockserver/pom.xml | 2 +- performance-tests/pom.xml | 2 +- pom.xml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 47ee838..c48fbca 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.4 + 2.8.5-SNAPSHOT 4.0.0 diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 0cef548..fb10031 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.4 + 2.8.5-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 87a06b0..afcfe3c 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.4 + 2.8.5-SNAPSHOT 4.0.0 diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 28d4ca1..25e8617 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.4 + 2.8.5-SNAPSHOT 4.0.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index c9730a5..4655442 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ http-mock-server pl.touk.mockserver - 2.8.4 + 2.8.5-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 360fdec..fa70e25 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ pl.touk.mockserver http-mock-server pom - 2.8.4 + 2.8.5-SNAPSHOT mockserver-client mockserver @@ -42,7 +42,7 @@ scm:git:git@github.com:TouK/http-mock-server.git scm:git:git@github.com:TouK/http-mock-server.git - http-mock-server-2.8.4 + HEAD From f9ae4a8003f4c9c74bf5bd95ed8a261bcf376839 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 22:06:34 +0000 Subject: [PATCH 105/116] Bump ch.qos.logback:logback-core from 1.2.9 to 1.3.12 Bumps [ch.qos.logback:logback-core](https://github.com/qos-ch/logback) from 1.2.9 to 1.3.12. - [Commits](https://github.com/qos-ch/logback/compare/v_1.2.9...v_1.3.12) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fa70e25..c35c484 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 1.3-groovy-2.5 3.3.2 1.7.30 - 1.2.9 + 1.3.12 1.16.6 true From 36bc5dd14b831392c83aa17b670f06d51601d418 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Thu, 22 Feb 2024 22:42:33 +0100 Subject: [PATCH 106/116] Rebranding --- .mvn/wrapper/maven-wrapper.properties | 2 +- Dockerfile | 2 +- README.md | 24 ++++++------ mockserver-api/pom.xml | 4 +- .../ztsh}/mockserver/api/common.xsd | 2 +- .../ztsh}/mockserver/api/request.xsd | 4 +- .../ztsh}/mockserver/api/response.xsd | 4 +- mockserver-client/pom.xml | 6 +-- .../client/InvalidMockDefinition.groovy | 2 +- .../client/InvalidMockRequestSchema.groovy | 2 +- .../client/MockAlreadyExists.groovy | 2 +- .../mockserver/client/MockDoesNotExist.groovy | 2 +- .../mockserver/client/RemoteMockServer.groovy | 20 +++++----- .../ztsh}/mockserver/client/Util.groovy | 8 ++-- mockserver-tests/pom.xml | 8 ++-- .../tests/MockServerHttpsTest.groovy | 12 +++--- .../tests/MockServerIntegrationTest.groovy | 26 ++++++------- .../tests/MockServerMaxUsesTest.groovy | 9 ++--- mockserver/pom.xml | 8 ++-- .../mockserver/server/ContextExecutor.groovy | 4 +- .../mockserver/server/HttpMockServer.groovy | 38 +++++++++---------- .../server/HttpServerWrapper.groovy | 4 +- .../mockserver/server/HttpsConfig.groovy | 4 +- .../ztsh}/mockserver/server/Main.groovy | 2 +- .../ztsh}/mockserver/server/Mock.groovy | 6 +-- .../ztsh}/mockserver/server/MockEvent.groovy | 2 +- .../mockserver/server/MockRequest.groovy | 2 +- .../mockserver/server/MockResponse.groovy | 2 +- .../ztsh}/mockserver/server/Util.groovy | 4 +- performance-tests/pom.xml | 8 ++-- .../mockserver/client/MockserverTest.java | 6 +-- pom.xml | 37 +++--------------- 32 files changed, 120 insertions(+), 146 deletions(-) rename mockserver-api/src/main/xsd/{pl/touk => eu/ztsh}/mockserver/api/common.xsd (95%) rename mockserver-api/src/main/xsd/{pl/touk => eu/ztsh}/mockserver/api/request.xsd (90%) rename mockserver-api/src/main/xsd/{pl/touk => eu/ztsh}/mockserver/api/response.xsd (95%) rename mockserver-client/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/client/InvalidMockDefinition.groovy (86%) rename mockserver-client/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/client/InvalidMockRequestSchema.groovy (82%) rename mockserver-client/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/client/MockAlreadyExists.groovy (82%) rename mockserver-client/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/client/MockDoesNotExist.groovy (82%) rename mockserver-client/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/client/RemoteMockServer.groovy (86%) rename mockserver-client/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/client/Util.groovy (92%) rename mockserver-tests/src/test/groovy/{pl/touk => eu/ztsh}/mockserver/tests/MockServerHttpsTest.groovy (95%) rename mockserver-tests/src/test/groovy/{pl/touk => eu/ztsh}/mockserver/tests/MockServerIntegrationTest.groovy (98%) rename mockserver-tests/src/test/groovy/{pl/touk => eu/ztsh}/mockserver/tests/MockServerMaxUsesTest.groovy (98%) rename mockserver/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/server/ContextExecutor.groovy (97%) rename mockserver/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/server/HttpMockServer.groovy (91%) rename mockserver/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/server/HttpServerWrapper.groovy (97%) rename mockserver/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/server/HttpsConfig.groovy (91%) rename mockserver/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/server/Main.groovy (96%) rename mockserver/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/server/Mock.groovy (98%) rename mockserver/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/server/MockEvent.groovy (88%) rename mockserver/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/server/MockRequest.groovy (98%) rename mockserver/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/server/MockResponse.groovy (90%) rename mockserver/src/main/groovy/{pl/touk => eu/ztsh}/mockserver/server/Util.groovy (92%) rename performance-tests/src/test/java/{pl/touk => eu/ztsh}/mockserver/client/MockserverTest.java (95%) diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index 7d02699..f3283b0 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -14,5 +14,5 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/Dockerfile b/Dockerfile index 87dd9dd..6ea2981 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,4 +8,4 @@ RUN mkdir /externalSchema VOLUME /externalSchema -CMD java -cp /mockserver.jar:/externalSchema pl.touk.mockserver.server.Main +CMD java -cp /mockserver.jar:/externalSchema eu.ztsh.mockserver.server.Main diff --git a/README.md b/README.md index a8336d3..6869c93 100644 --- a/README.md +++ b/README.md @@ -132,7 +132,7 @@ remoteMockServer.addMock(new AddMock( Send POST request to localhost:/serverControl ```xml - + ... ... ... @@ -200,13 +200,13 @@ In closures input parameter (called req) contains properties: Response if success: ```xml - + ``` Response with error message if failure: ```xml -... +... ``` Peek mock @@ -225,7 +225,7 @@ List mockEvents = remoteMockServer.peekMock('...') Send POST request to localhost:/serverControl ```xml - + ... ``` @@ -233,7 +233,7 @@ Send POST request to localhost:/serverControl Response if success: ```xml - + ... @@ -265,7 +265,7 @@ Response if success: Response with error message if failure: ```xml -... +... ``` Remove mock @@ -284,7 +284,7 @@ List mockEvents = remoteMockServer.removeMock('...', ...) Send POST request to localhost:/serverControl ```xml - + ... ... @@ -293,7 +293,7 @@ Send POST request to localhost:/serverControl Response if success (and skipReport not given or equal false): ```xml - + ... @@ -325,13 +325,13 @@ Response if success (and skipReport not given or equal false): If skipReport is set to true then response will be: ```xml - + ``` Response with error message if failure: ```xml -... +... ``` List mocks definitions @@ -425,7 +425,7 @@ This response could be saved to file and passed as it is during mock server crea Remote repository ----------------- -Mockserver is available at `philanthropist.touk.pl`. +Mockserver is available at `philanthropist.ztsh.eu`. Just add repository to maven pom: @@ -436,7 +436,7 @@ Just add repository to maven pom: ... touk - https://philanthropist.touk.pl/nexus/content/repositories/releases + https://philanthropist.ztsh.eu/nexus/content/repositories/releases ... diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index c48fbca..3b26bf1 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -2,8 +2,8 @@ http-mock-server - pl.touk.mockserver - 2.8.5-SNAPSHOT + eu.ztsh.mockserver + 3.0.0-SNAPSHOT 4.0.0 diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd b/mockserver-api/src/main/xsd/eu/ztsh/mockserver/api/common.xsd similarity index 95% rename from mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd rename to mockserver-api/src/main/xsd/eu/ztsh/mockserver/api/common.xsd index 4b084dd..6dac2a9 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd +++ b/mockserver-api/src/main/xsd/eu/ztsh/mockserver/api/common.xsd @@ -1,5 +1,5 @@ - + diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd b/mockserver-api/src/main/xsd/eu/ztsh/mockserver/api/request.xsd similarity index 90% rename from mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd rename to mockserver-api/src/main/xsd/eu/ztsh/mockserver/api/request.xsd index 25287c8..891aebf 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd +++ b/mockserver-api/src/main/xsd/eu/ztsh/mockserver/api/request.xsd @@ -1,7 +1,7 @@ - + - + diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd b/mockserver-api/src/main/xsd/eu/ztsh/mockserver/api/response.xsd similarity index 95% rename from mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd rename to mockserver-api/src/main/xsd/eu/ztsh/mockserver/api/response.xsd index 1f96dc8..66d4566 100644 --- a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd +++ b/mockserver-api/src/main/xsd/eu/ztsh/mockserver/api/response.xsd @@ -1,7 +1,7 @@ - + - + diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index fb10031..ac9bac3 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -2,8 +2,8 @@ http-mock-server - pl.touk.mockserver - 2.8.5-SNAPSHOT + eu.ztsh.mockserver + 3.0.0-SNAPSHOT 4.0.0 @@ -34,7 +34,7 @@ commons-lang3 - pl.touk.mockserver + eu.ztsh.mockserver mockserver-api diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/InvalidMockDefinition.groovy b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/InvalidMockDefinition.groovy similarity index 86% rename from mockserver-client/src/main/groovy/pl/touk/mockserver/client/InvalidMockDefinition.groovy rename to mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/InvalidMockDefinition.groovy index f95b584..a39ef77 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/InvalidMockDefinition.groovy +++ b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/InvalidMockDefinition.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.client +package eu.ztsh.mockserver.client import groovy.transform.CompileStatic import groovy.transform.TypeChecked diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/InvalidMockRequestSchema.groovy b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/InvalidMockRequestSchema.groovy similarity index 82% rename from mockserver-client/src/main/groovy/pl/touk/mockserver/client/InvalidMockRequestSchema.groovy rename to mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/InvalidMockRequestSchema.groovy index ff3d401..b1de96f 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/InvalidMockRequestSchema.groovy +++ b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/InvalidMockRequestSchema.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.client +package eu.ztsh.mockserver.client import groovy.transform.CompileStatic import groovy.transform.TypeChecked diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockAlreadyExists.groovy b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/MockAlreadyExists.groovy similarity index 82% rename from mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockAlreadyExists.groovy rename to mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/MockAlreadyExists.groovy index f0c00a9..40d5dce 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockAlreadyExists.groovy +++ b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/MockAlreadyExists.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.client +package eu.ztsh.mockserver.client import groovy.transform.CompileStatic import groovy.transform.TypeChecked diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockDoesNotExist.groovy b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/MockDoesNotExist.groovy similarity index 82% rename from mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockDoesNotExist.groovy rename to mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/MockDoesNotExist.groovy index 02d0bee..fe93dc0 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/MockDoesNotExist.groovy +++ b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/MockDoesNotExist.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.client +package eu.ztsh.mockserver.client import groovy.transform.CompileStatic import groovy.transform.TypeChecked diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/RemoteMockServer.groovy similarity index 86% rename from mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy rename to mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/RemoteMockServer.groovy index 91ebc33..8439124 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy +++ b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/RemoteMockServer.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.client +package eu.ztsh.mockserver.client import org.apache.http.client.methods.CloseableHttpResponse import org.apache.http.client.methods.HttpGet @@ -7,15 +7,15 @@ import org.apache.http.entity.ContentType import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients -import pl.touk.mockserver.api.request.AddMock -import pl.touk.mockserver.api.request.MockServerRequest -import pl.touk.mockserver.api.request.PeekMock -import pl.touk.mockserver.api.request.RemoveMock -import pl.touk.mockserver.api.response.MockEventReport -import pl.touk.mockserver.api.response.MockPeeked -import pl.touk.mockserver.api.response.MockRemoved -import pl.touk.mockserver.api.response.MockReport -import pl.touk.mockserver.api.response.Mocks +import eu.ztsh.mockserver.api.request.AddMock +import eu.ztsh.mockserver.api.request.MockServerRequest +import eu.ztsh.mockserver.api.request.PeekMock +import eu.ztsh.mockserver.api.request.RemoveMock +import eu.ztsh.mockserver.api.response.MockEventReport +import eu.ztsh.mockserver.api.response.MockPeeked +import eu.ztsh.mockserver.api.response.MockRemoved +import eu.ztsh.mockserver.api.response.MockReport +import eu.ztsh.mockserver.api.response.Mocks import javax.xml.bind.JAXBContext diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/Util.groovy similarity index 92% rename from mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy rename to mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/Util.groovy index 3a427d6..167cb3b 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy +++ b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/Util.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.client +package eu.ztsh.mockserver.client import groovy.json.JsonSlurper import groovy.transform.CompileStatic @@ -7,9 +7,9 @@ import groovy.util.slurpersupport.GPathResult import org.apache.http.HttpEntity import org.apache.http.client.methods.CloseableHttpResponse import org.apache.http.util.EntityUtils -import pl.touk.mockserver.api.response.ExceptionOccured -import pl.touk.mockserver.api.response.MockAdded -import pl.touk.mockserver.api.response.MockServerResponse +import eu.ztsh.mockserver.api.response.ExceptionOccured +import eu.ztsh.mockserver.api.response.MockAdded +import eu.ztsh.mockserver.api.response.MockServerResponse import javax.xml.bind.JAXBContext diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index afcfe3c..6adec6e 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -2,8 +2,8 @@ http-mock-server - pl.touk.mockserver - 2.8.5-SNAPSHOT + eu.ztsh.mockserver + 3.0.0-SNAPSHOT 4.0.0 @@ -35,12 +35,12 @@ httpclient - pl.touk.mockserver + eu.ztsh.mockserver mockserver ${project.version} - pl.touk.mockserver + eu.ztsh.mockserver mockserver-client ${project.version} diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerHttpsTest.groovy b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerHttpsTest.groovy similarity index 95% rename from mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerHttpsTest.groovy rename to mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerHttpsTest.groovy index 58c922e..c83ed6c 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerHttpsTest.groovy +++ b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerHttpsTest.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.tests +package eu.ztsh.mockserver.tests import groovy.util.slurpersupport.GPathResult import org.apache.http.client.methods.CloseableHttpResponse @@ -9,11 +9,11 @@ import org.apache.http.entity.ContentType import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients -import pl.touk.mockserver.api.common.Https -import pl.touk.mockserver.api.request.AddMock -import pl.touk.mockserver.client.RemoteMockServer -import pl.touk.mockserver.client.Util -import pl.touk.mockserver.server.HttpMockServer +import eu.ztsh.mockserver.api.common.Https +import eu.ztsh.mockserver.api.request.AddMock +import eu.ztsh.mockserver.client.RemoteMockServer +import eu.ztsh.mockserver.client.Util +import eu.ztsh.mockserver.server.HttpMockServer import spock.lang.AutoCleanup import spock.lang.Ignore import spock.lang.Shared diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerIntegrationTest.groovy similarity index 98% rename from mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy rename to mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerIntegrationTest.groovy index 1ab1dad..fc88b53 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy +++ b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerIntegrationTest.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.tests +package eu.ztsh.mockserver.tests import groovy.util.slurpersupport.GPathResult import org.apache.http.client.methods.CloseableHttpResponse @@ -15,18 +15,18 @@ import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients import org.apache.http.util.EntityUtils -import pl.touk.mockserver.api.common.ImportAlias -import pl.touk.mockserver.api.common.Method -import pl.touk.mockserver.api.request.AddMock -import pl.touk.mockserver.api.response.MockEventReport -import pl.touk.mockserver.api.response.MockReport -import pl.touk.mockserver.client.InvalidMockDefinition -import pl.touk.mockserver.client.InvalidMockRequestSchema -import pl.touk.mockserver.client.MockAlreadyExists -import pl.touk.mockserver.client.MockDoesNotExist -import pl.touk.mockserver.client.RemoteMockServer -import pl.touk.mockserver.client.Util -import pl.touk.mockserver.server.HttpMockServer +import eu.ztsh.mockserver.api.common.ImportAlias +import eu.ztsh.mockserver.api.common.Method +import eu.ztsh.mockserver.api.request.AddMock +import eu.ztsh.mockserver.api.response.MockEventReport +import eu.ztsh.mockserver.api.response.MockReport +import eu.ztsh.mockserver.client.InvalidMockDefinition +import eu.ztsh.mockserver.client.InvalidMockRequestSchema +import eu.ztsh.mockserver.client.MockAlreadyExists +import eu.ztsh.mockserver.client.MockDoesNotExist +import eu.ztsh.mockserver.client.RemoteMockServer +import eu.ztsh.mockserver.client.Util +import eu.ztsh.mockserver.server.HttpMockServer import spock.lang.AutoCleanup import spock.lang.Specification diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerMaxUsesTest.groovy similarity index 98% rename from mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy rename to mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerMaxUsesTest.groovy index fd21436..eda365c 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy +++ b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerMaxUsesTest.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.tests +package eu.ztsh.mockserver.tests import org.apache.http.client.methods.CloseableHttpResponse @@ -7,11 +7,10 @@ import org.apache.http.entity.ContentType import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients -import pl.touk.mockserver.api.request.AddMock -import pl.touk.mockserver.client.RemoteMockServer -import pl.touk.mockserver.server.HttpMockServer +import eu.ztsh.mockserver.api.request.AddMock +import eu.ztsh.mockserver.client.RemoteMockServer +import eu.ztsh.mockserver.server.HttpMockServer import spock.lang.AutoCleanup -import spock.lang.Shared import spock.lang.Specification class MockServerMaxUsesTest extends Specification { diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 25e8617..750d7d6 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -2,8 +2,8 @@ http-mock-server - pl.touk.mockserver - 2.8.5-SNAPSHOT + eu.ztsh.mockserver + 3.0.0-SNAPSHOT 4.0.0 @@ -39,7 +39,7 @@ commons-lang3 - pl.touk.mockserver + eu.ztsh.mockserver mockserver-api @@ -52,7 +52,7 @@ - pl.touk.mockserver.server.Main + eu.ztsh.mockserver.server.Main diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/ContextExecutor.groovy similarity index 97% rename from mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy rename to mockserver/src/main/groovy/eu/ztsh/mockserver/server/ContextExecutor.groovy index 57aa952..6023a1c 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/ContextExecutor.groovy @@ -1,9 +1,9 @@ -package pl.touk.mockserver.server +package eu.ztsh.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.transform.PackageScope import groovy.util.logging.Slf4j -import pl.touk.mockserver.api.common.Method +import eu.ztsh.mockserver.api.common.Method import java.util.concurrent.CopyOnWriteArrayList diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpMockServer.groovy similarity index 91% rename from mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy rename to mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpMockServer.groovy index f0352ae..88c15ce 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpMockServer.groovy @@ -1,24 +1,24 @@ -package pl.touk.mockserver.server +package eu.ztsh.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.util.logging.Slf4j -import pl.touk.mockserver.api.common.Https -import pl.touk.mockserver.api.common.ImportAlias -import pl.touk.mockserver.api.common.Method -import pl.touk.mockserver.api.request.AddMock -import pl.touk.mockserver.api.request.MockServerRequest -import pl.touk.mockserver.api.request.PeekMock -import pl.touk.mockserver.api.request.RemoveMock -import pl.touk.mockserver.api.response.ExceptionOccured -import pl.touk.mockserver.api.response.MockAdded -import pl.touk.mockserver.api.response.MockEventReport -import pl.touk.mockserver.api.response.MockPeeked -import pl.touk.mockserver.api.response.MockRemoved -import pl.touk.mockserver.api.response.MockReport -import pl.touk.mockserver.api.response.MockRequestReport -import pl.touk.mockserver.api.response.MockResponseReport -import pl.touk.mockserver.api.response.Mocks -import pl.touk.mockserver.api.response.Parameter +import eu.ztsh.mockserver.api.common.Https +import eu.ztsh.mockserver.api.common.ImportAlias +import eu.ztsh.mockserver.api.common.Method +import eu.ztsh.mockserver.api.request.AddMock +import eu.ztsh.mockserver.api.request.MockServerRequest +import eu.ztsh.mockserver.api.request.PeekMock +import eu.ztsh.mockserver.api.request.RemoveMock +import eu.ztsh.mockserver.api.response.ExceptionOccured +import eu.ztsh.mockserver.api.response.MockAdded +import eu.ztsh.mockserver.api.response.MockEventReport +import eu.ztsh.mockserver.api.response.MockPeeked +import eu.ztsh.mockserver.api.response.MockRemoved +import eu.ztsh.mockserver.api.response.MockReport +import eu.ztsh.mockserver.api.response.MockRequestReport +import eu.ztsh.mockserver.api.response.MockResponseReport +import eu.ztsh.mockserver.api.response.Mocks +import eu.ztsh.mockserver.api.response.Parameter import javax.xml.bind.JAXBContext import java.util.concurrent.ConcurrentHashMap @@ -26,7 +26,7 @@ import java.util.concurrent.CopyOnWriteArraySet import java.util.concurrent.Executor import java.util.concurrent.Executors -import static pl.touk.mockserver.server.Util.createResponse +import static eu.ztsh.mockserver.server.Util.createResponse @Slf4j class HttpMockServer { diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWrapper.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpServerWrapper.groovy similarity index 97% rename from mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWrapper.groovy rename to mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpServerWrapper.groovy index c9e63e9..5d33156 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWrapper.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpServerWrapper.groovy @@ -1,11 +1,11 @@ -package pl.touk.mockserver.server +package eu.ztsh.mockserver.server import com.sun.net.httpserver.HttpHandler import com.sun.net.httpserver.HttpServer import com.sun.net.httpserver.HttpsServer import groovy.transform.PackageScope import groovy.util.logging.Slf4j -import pl.touk.mockserver.api.common.Https +import eu.ztsh.mockserver.api.common.Https import javax.net.ssl.KeyManager import javax.net.ssl.KeyManagerFactory diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpsConfig.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpsConfig.groovy similarity index 91% rename from mockserver/src/main/groovy/pl/touk/mockserver/server/HttpsConfig.groovy rename to mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpsConfig.groovy index 68b5550..9d00714 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpsConfig.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpsConfig.groovy @@ -1,9 +1,9 @@ -package pl.touk.mockserver.server +package eu.ztsh.mockserver.server import com.sun.net.httpserver.HttpsConfigurator import com.sun.net.httpserver.HttpsParameters import groovy.transform.CompileStatic -import pl.touk.mockserver.api.common.Https +import eu.ztsh.mockserver.api.common.Https import javax.net.ssl.SSLContext import javax.net.ssl.SSLParameters diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/Main.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/Main.groovy similarity index 96% rename from mockserver/src/main/groovy/pl/touk/mockserver/server/Main.groovy rename to mockserver/src/main/groovy/eu/ztsh/mockserver/server/Main.groovy index 0b8d42a..916569e 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Main.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/Main.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.server +package eu.ztsh.mockserver.server import groovy.util.logging.Slf4j diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/Mock.groovy similarity index 98% rename from mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy rename to mockserver/src/main/groovy/eu/ztsh/mockserver/server/Mock.groovy index 3f0f4fe..821471c 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/Mock.groovy @@ -1,12 +1,12 @@ -package pl.touk.mockserver.server +package eu.ztsh.mockserver.server import groovy.transform.EqualsAndHashCode import groovy.transform.PackageScope import groovy.util.logging.Slf4j import org.codehaus.groovy.control.CompilerConfiguration import org.codehaus.groovy.control.customizers.ImportCustomizer -import pl.touk.mockserver.api.common.Https -import pl.touk.mockserver.api.common.Method +import eu.ztsh.mockserver.api.common.Https +import eu.ztsh.mockserver.api.common.Method import javax.xml.XMLConstants import javax.xml.transform.stream.StreamSource diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockEvent.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockEvent.groovy similarity index 88% rename from mockserver/src/main/groovy/pl/touk/mockserver/server/MockEvent.groovy rename to mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockEvent.groovy index 97a46a2..9c429f1 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockEvent.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockEvent.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.server +package eu.ztsh.mockserver.server import groovy.transform.PackageScope diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockRequest.groovy similarity index 98% rename from mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy rename to mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockRequest.groovy index 3657131..4d9fca0 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockRequest.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockRequest.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.server +package eu.ztsh.mockserver.server import com.sun.net.httpserver.Headers import groovy.json.JsonSlurper diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockResponse.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockResponse.groovy similarity index 90% rename from mockserver/src/main/groovy/pl/touk/mockserver/server/MockResponse.groovy rename to mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockResponse.groovy index 913f9f3..260acce 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/MockResponse.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockResponse.groovy @@ -1,4 +1,4 @@ -package pl.touk.mockserver.server +package eu.ztsh.mockserver.server import groovy.transform.PackageScope diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/Util.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/Util.groovy similarity index 92% rename from mockserver/src/main/groovy/pl/touk/mockserver/server/Util.groovy rename to mockserver/src/main/groovy/eu/ztsh/mockserver/server/Util.groovy index 3864afa..6e72916 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Util.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/Util.groovy @@ -1,7 +1,7 @@ -package pl.touk.mockserver.server +package eu.ztsh.mockserver.server import com.sun.net.httpserver.HttpExchange -import pl.touk.mockserver.api.response.MockAdded +import eu.ztsh.mockserver.api.response.MockAdded import javax.xml.bind.JAXBContext diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 4655442..a16e4e6 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -2,8 +2,8 @@ http-mock-server - pl.touk.mockserver - 2.8.5-SNAPSHOT + eu.ztsh.mockserver + 3.0.0-SNAPSHOT 4.0.0 @@ -11,12 +11,12 @@ - pl.touk.mockserver + eu.ztsh.mockserver mockserver ${project.version} - pl.touk.mockserver + eu.ztsh.mockserver mockserver-client ${project.version} diff --git a/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java b/performance-tests/src/test/java/eu/ztsh/mockserver/client/MockserverTest.java similarity index 95% rename from performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java rename to performance-tests/src/test/java/eu/ztsh/mockserver/client/MockserverTest.java index 233a5f7..2a3b943 100644 --- a/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java +++ b/performance-tests/src/test/java/eu/ztsh/mockserver/client/MockserverTest.java @@ -1,4 +1,4 @@ -package pl.touk.mockserver.client; +package eu.ztsh.mockserver.client; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.CloseableHttpResponse; @@ -18,8 +18,8 @@ import org.openjdk.jmh.annotations.TearDown; import org.openjdk.jmh.annotations.Warmup; import org.openjdk.jmh.infra.Blackhole; import org.openjdk.jmh.infra.ThreadParams; -import pl.touk.mockserver.api.request.AddMock; -import pl.touk.mockserver.server.HttpMockServer; +import eu.ztsh.mockserver.api.request.AddMock; +import eu.ztsh.mockserver.server.HttpMockServer; import java.io.IOException; import java.util.concurrent.TimeUnit; diff --git a/pom.xml b/pom.xml index c35c484..0847141 100644 --- a/pom.xml +++ b/pom.xml @@ -1,17 +1,13 @@ - + 4.0.0 - - pl.touk - top - 1.0.7 - - - pl.touk.mockserver + eu.ztsh.mockserver http-mock-server pom - 2.8.5-SNAPSHOT + 3.0.0-SNAPSHOT + mockserver-client mockserver @@ -39,12 +35,6 @@ 0.5.1 - - scm:git:git@github.com:TouK/http-mock-server.git - scm:git:git@github.com:TouK/http-mock-server.git - HEAD - - @@ -99,7 +89,7 @@ ${lombok.version} - pl.touk.mockserver + eu.ztsh.mockserver mockserver-api ${project.version} @@ -159,19 +149,4 @@ - - - Dominik Przybysz - alien11689@gmail.com - - - - - - touk - TouK Open source repository - https://philanthropist.touk.pl/nexus/content/repositories/releases - - - From 2fe3f2a67d30e9828c26042dc7a1dc109591cac2 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Thu, 22 Feb 2024 22:44:02 +0100 Subject: [PATCH 107/116] chore: Readme update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6869c93..cb67c96 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ docker-compose up -d ### Docker repoository -Built image is available at https://hub.docker.com/r/alien11689/mockserver/ +Currently unavailable Create mock on server --------------------- From 514064debc27b4b9776941249f256855eec40bd2 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Thu, 22 Feb 2024 22:48:02 +0100 Subject: [PATCH 108/116] feat!: Jakarta & JDK11 --- mockserver-api/pom.xml | 22 ++-- mockserver-api/src/main/xjb/binding.xjb | 19 ++- mockserver-client/pom.xml | 31 +++-- .../mockserver/client/RemoteMockServer.groovy | 2 +- .../eu/ztsh/mockserver/client/Util.groovy | 2 +- mockserver-tests/pom.xml | 53 ++++---- mockserver/pom.xml | 48 +++++--- .../mockserver/server/HttpMockServer.groovy | 84 ++++++------- .../eu/ztsh/mockserver/server/Util.groovy | 2 +- performance-tests/pom.xml | 8 +- pom.xml | 115 +++++++++--------- 11 files changed, 206 insertions(+), 180 deletions(-) diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index 3b26bf1..de5029a 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -1,15 +1,21 @@ - + + 4.0.0 + - http-mock-server eu.ztsh.mockserver + http-mock-server 3.0.0-SNAPSHOT - 4.0.0 mockserver-api + + jakarta.xml.bind + jakarta.xml.bind-api + org.projectlombok lombok @@ -18,19 +24,9 @@ - - org.apache.maven.plugins - maven-compiler-plugin - 3.3 - - 1.8 - 1.8 - - org.codehaus.mojo jaxb2-maven-plugin - 2.2 xjc diff --git a/mockserver-api/src/main/xjb/binding.xjb b/mockserver-api/src/main/xjb/binding.xjb index a735d24..fdf2585 100644 --- a/mockserver-api/src/main/xjb/binding.xjb +++ b/mockserver-api/src/main/xjb/binding.xjb @@ -1,10 +1,9 @@ - - - - - - - - \ No newline at end of file + + + + + + + diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index ac9bac3..223178e 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -1,18 +1,22 @@ - + + 4.0.0 + - http-mock-server eu.ztsh.mockserver + http-mock-server 3.0.0-SNAPSHOT - 4.0.0 mockserver-client - - clean install - + + eu.ztsh.mockserver + mockserver-api + + org.codehaus.groovy groovy @@ -25,6 +29,7 @@ org.codehaus.groovy groovy-xml + org.apache.httpcomponents httpclient @@ -33,9 +38,15 @@ org.apache.commons commons-lang3 - - eu.ztsh.mockserver - mockserver-api - + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + + + + diff --git a/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/RemoteMockServer.groovy b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/RemoteMockServer.groovy index 8439124..f594614 100644 --- a/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/RemoteMockServer.groovy +++ b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/RemoteMockServer.groovy @@ -17,7 +17,7 @@ import eu.ztsh.mockserver.api.response.MockRemoved import eu.ztsh.mockserver.api.response.MockReport import eu.ztsh.mockserver.api.response.Mocks -import javax.xml.bind.JAXBContext +import jakarta.xml.bind.JAXBContext class RemoteMockServer { private final String address diff --git a/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/Util.groovy b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/Util.groovy index 167cb3b..0583484 100644 --- a/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/Util.groovy +++ b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/Util.groovy @@ -11,7 +11,7 @@ import eu.ztsh.mockserver.api.response.ExceptionOccured import eu.ztsh.mockserver.api.response.MockAdded import eu.ztsh.mockserver.api.response.MockServerResponse -import javax.xml.bind.JAXBContext +import jakarta.xml.bind.JAXBContext @CompileStatic @TypeChecked diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 6adec6e..9f3cc41 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -1,27 +1,36 @@ - + + 4.0.0 + http-mock-server eu.ztsh.mockserver 3.0.0-SNAPSHOT - 4.0.0 mockserver-tests - - clean install - - + + eu.ztsh.mockserver + mockserver + + + eu.ztsh.mockserver + mockserver-client + + org.codehaus.groovy groovy + - org.spockframework - spock-core + org.apache.httpcomponents + httpclient + org.slf4j slf4j-api @@ -30,24 +39,20 @@ ch.qos.logback logback-core + - org.apache.httpcomponents - httpclient - - - eu.ztsh.mockserver - mockserver - ${project.version} - - - eu.ztsh.mockserver - mockserver-client - ${project.version} - - - info.solidsoft.spock - spock-global-unroll + org.spockframework + spock-core + + + + org.codehaus.gmavenplus + gmavenplus-plugin + + + + diff --git a/mockserver/pom.xml b/mockserver/pom.xml index 750d7d6..c1bf76c 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -1,15 +1,22 @@ - + + 4.0.0 + - http-mock-server eu.ztsh.mockserver + http-mock-server 3.0.0-SNAPSHOT - 4.0.0 mockserver + + eu.ztsh.mockserver + mockserver-api + + org.codehaus.groovy groovy @@ -22,6 +29,12 @@ org.codehaus.groovy groovy-xml + + + org.apache.commons + commons-lang3 + + org.slf4j slf4j-api @@ -34,19 +47,15 @@ ch.qos.logback logback-classic - - org.apache.commons - commons-lang3 - - - eu.ztsh.mockserver - mockserver-api - clean package assembly:single install + + org.codehaus.gmavenplus + gmavenplus-plugin + maven-assembly-plugin @@ -61,16 +70,17 @@ mockserver-full false - + - create-archive - package - - single - - - + create-archive + package + + single + + + + diff --git a/mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpMockServer.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpMockServer.groovy index 88c15ce..eaae94d 100644 --- a/mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/HttpMockServer.groovy @@ -20,7 +20,7 @@ import eu.ztsh.mockserver.api.response.MockResponseReport import eu.ztsh.mockserver.api.response.Mocks import eu.ztsh.mockserver.api.response.Parameter -import javax.xml.bind.JAXBContext +import jakarta.xml.bind.JAXBContext import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArraySet import java.util.concurrent.Executor @@ -79,22 +79,22 @@ class HttpMockServer { void listMocks(HttpExchange ex) { Mocks mockListing = new Mocks( - mocks: listMocks().collect { - new MockReport( - name: it.name, - path: it.path, - port: it.port, - predicate: it.predicateClosureText, - response: it.responseClosureText, - responseHeaders: it.responseHeadersClosureText, - soap: it.soap, - method: it.method, - statusCode: it.statusCode as int, - schema: it.schema, - imports: it.imports.collect { new ImportAlias(alias: it.key, fullClassName: it.value) }, - preserveHistory: it.preserveHistory - ) - } + mocks: listMocks().collect { + new MockReport( + name: it.name, + path: it.path, + port: it.port, + predicate: it.predicateClosureText, + response: it.responseClosureText, + responseHeaders: it.responseHeadersClosureText, + soap: it.soap, + method: it.method, + statusCode: it.statusCode as int, + schema: it.schema, + imports: it.imports.collect { new ImportAlias(alias: it.key, fullClassName: it.value) }, + preserveHistory: it.preserveHistory + ) + } ) createResponse(ex, mockListing, 200) } @@ -182,12 +182,12 @@ class HttpMockServer { mock.preserveHistory = co.preserveHistory != false if (co.https) { mock.https = new Https( - keystorePath: co.https.keystorePath ?: null, - keystorePassword: co.https.keystorePassword, - keyPassword: co.https.keyPassword, - truststorePath: co.https.truststorePath, - truststorePassword: co.https.truststorePassword, - requireClientAuth: co.https?.requireClientAuth?.asBoolean() ?: false + keystorePath: co.https.keystorePath ?: null, + keystorePassword: co.https.keystorePassword, + keyPassword: co.https.keyPassword, + truststorePath: co.https.truststorePath, + truststorePassword: co.https.truststorePassword, + requireClientAuth: co.https?.requireClientAuth?.asBoolean() ?: false ) } mock.maxUses = co.maxUses ?: null @@ -217,7 +217,7 @@ class HttpMockServer { mockNames.remove(name) configuration.remove(name) MockRemoved mockRemoved = new MockRemoved( - mockEvents: createMockEventReports(mockEvents) + mockEvents: createMockEventReports(mockEvents) ) createResponse(ex, mockRemoved, 200) } @@ -225,23 +225,23 @@ class HttpMockServer { private static List createMockEventReports(List mockEvents) { return mockEvents.collect { new MockEventReport( - request: new MockRequestReport( - text: it.request.text, - headers: new MockRequestReport.Headers(headers: it.request.headers.collect { - new Parameter(name: it.key, value: it.value) - }), - queryParams: new MockRequestReport.QueryParams(queryParams: it.request.query.collect { - new Parameter(name: it.key, value: it.value) - }), - path: new MockRequestReport.Path(pathParts: it.request.path) - ), - response: new MockResponseReport( - statusCode: it.response.statusCode, - text: it.response.text, - headers: new MockResponseReport.Headers(headers: it.response.headers.collect { - new Parameter(name: it.key, value: it.value) - }) - ) + request: new MockRequestReport( + text: it.request.text, + headers: new MockRequestReport.Headers(headers: it.request.headers.collect { + new Parameter(name: it.key, value: it.value) + }), + queryParams: new MockRequestReport.QueryParams(queryParams: it.request.query.collect { + new Parameter(name: it.key, value: it.value) + }), + path: new MockRequestReport.Path(pathParts: it.request.path) + ), + response: new MockResponseReport( + statusCode: it.response.statusCode, + text: it.response.text, + headers: new MockResponseReport.Headers(headers: it.response.headers.collect { + new Parameter(name: it.key, value: it.value) + }) + ) ) } } @@ -254,7 +254,7 @@ class HttpMockServer { log.trace("Peeking mock $name") List mockEvents = childServers.values().collect { it.peekMock(name) }.flatten() as List MockPeeked mockPeeked = new MockPeeked( - mockEvents: createMockEventReports(mockEvents) + mockEvents: createMockEventReports(mockEvents) ) createResponse(ex, mockPeeked, 200) } diff --git a/mockserver/src/main/groovy/eu/ztsh/mockserver/server/Util.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/Util.groovy index 6e72916..c51d1f0 100644 --- a/mockserver/src/main/groovy/eu/ztsh/mockserver/server/Util.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/Util.groovy @@ -3,7 +3,7 @@ package eu.ztsh.mockserver.server import com.sun.net.httpserver.HttpExchange import eu.ztsh.mockserver.api.response.MockAdded -import javax.xml.bind.JAXBContext +import jakarta.xml.bind.JAXBContext class Util { diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index a16e4e6..e73db5c 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -1,11 +1,12 @@ + 4.0.0 + - http-mock-server eu.ztsh.mockserver + http-mock-server 3.0.0-SNAPSHOT - 4.0.0 mockserver-performance-tests @@ -13,13 +14,12 @@ eu.ztsh.mockserver mockserver - ${project.version} eu.ztsh.mockserver mockserver-client - ${project.version} + org.openjdk.jmh jmh-core diff --git a/pom.xml b/pom.xml index 0847141..7e57e1d 100644 --- a/pom.xml +++ b/pom.xml @@ -17,26 +17,45 @@ + 11 + ${java.version} + ${java.version} UTF-8 + UTF-8 - 3.1 - 2.5.7 + 3.0.20 4.5.13 - 1.3-groovy-2.5 + 2.0-groovy-3.0 3.3.2 1.7.30 1.3.12 - 1.16.6 + 1.18.26 + 4.0.1 true - 1.11.2 - 2.5.2 - 1.4 - 0.5.1 + 1.37 + 3.0.2 + 3.1.0 + + eu.ztsh.mockserver + mockserver-api + ${project.version} + + + eu.ztsh.mockserver + mockserver + ${project.version} + + + eu.ztsh.mockserver + mockserver-client + ${project.version} + + org.codehaus.groovy groovy @@ -52,22 +71,22 @@ groovy-xml ${groovy.version} + org.apache.httpcomponents httpclient ${httpclient.version} - - org.spockframework - spock-core - ${spock-core.version} - test - org.apache.commons commons-lang3 ${commons-lang3.version} + + jakarta.xml.bind + jakarta.xml.bind-api + ${jakarta-xml-bind.version} + org.slf4j slf4j-api @@ -88,10 +107,12 @@ lombok ${lombok.version} + - eu.ztsh.mockserver - mockserver-api - ${project.version} + org.spockframework + spock-core + ${spock-core.version} + test org.openjdk.jmh @@ -105,48 +126,32 @@ ${jmh.version} test - - info.solidsoft.spock - spock-global-unroll - ${spock-global-unroll.version} - test - - clean install - - - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - - - org.codehaus.gmavenplus - gmavenplus-plugin - ${gmavenplus-plugin.version} - - - - compile - testCompile - - - - - - org.apache.maven.plugins - maven-release-plugin - ${maven-release-plugin.version} - - true - - - + + + + org.codehaus.mojo + jaxb2-maven-plugin + ${jaxb2-maven-plugin.version} + + + org.codehaus.gmavenplus + gmavenplus-plugin + ${gmavenplus-plugin.version} + + + + compile + compileTests + + + + + + From 5ddcb871794f4b37093bb0f398f20a3ce6968424 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Thu, 22 Feb 2024 22:48:45 +0100 Subject: [PATCH 109/116] feat!: Groovy 4 & JAXB 4 --- mockserver-client/pom.xml | 15 ++++++++--- .../eu/ztsh/mockserver/client/Util.groovy | 3 ++- mockserver-tests/pom.xml | 2 +- .../tests/MockServerHttpsTest.groovy | 15 +++++------ .../tests/MockServerIntegrationTest.groovy | 2 +- mockserver/pom.xml | 15 ++++++++--- .../ztsh/mockserver/server/MockRequest.groovy | 3 ++- pom.xml | 25 +++++++++++-------- 8 files changed, 52 insertions(+), 28 deletions(-) diff --git a/mockserver-client/pom.xml b/mockserver-client/pom.xml index 223178e..cb7acfb 100644 --- a/mockserver-client/pom.xml +++ b/mockserver-client/pom.xml @@ -18,18 +18,27 @@ - org.codehaus.groovy + org.apache.groovy groovy - org.codehaus.groovy + org.apache.groovy groovy-json - org.codehaus.groovy + org.apache.groovy groovy-xml + + org.glassfish.jaxb + jaxb-core + + + org.glassfish.jaxb + jaxb-runtime + + org.apache.httpcomponents httpclient diff --git a/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/Util.groovy b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/Util.groovy index 0583484..e79e0c3 100644 --- a/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/Util.groovy +++ b/mockserver-client/src/main/groovy/eu/ztsh/mockserver/client/Util.groovy @@ -3,7 +3,8 @@ package eu.ztsh.mockserver.client import groovy.json.JsonSlurper import groovy.transform.CompileStatic import groovy.transform.TypeChecked -import groovy.util.slurpersupport.GPathResult +import groovy.xml.XmlSlurper +import groovy.xml.slurpersupport.GPathResult import org.apache.http.HttpEntity import org.apache.http.client.methods.CloseableHttpResponse import org.apache.http.util.EntityUtils diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 9f3cc41..bd51227 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -22,7 +22,7 @@ - org.codehaus.groovy + org.apache.groovy groovy diff --git a/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerHttpsTest.groovy b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerHttpsTest.groovy index c83ed6c..5121042 100644 --- a/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerHttpsTest.groovy +++ b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerHttpsTest.groovy @@ -1,6 +1,11 @@ package eu.ztsh.mockserver.tests -import groovy.util.slurpersupport.GPathResult +import eu.ztsh.mockserver.api.common.Https +import eu.ztsh.mockserver.api.request.AddMock +import eu.ztsh.mockserver.client.RemoteMockServer +import eu.ztsh.mockserver.client.Util +import eu.ztsh.mockserver.server.HttpMockServer +import groovy.xml.slurpersupport.GPathResult import org.apache.http.client.methods.CloseableHttpResponse import org.apache.http.client.methods.HttpPost import org.apache.http.conn.ssl.SSLConnectionSocketFactory @@ -9,11 +14,6 @@ import org.apache.http.entity.ContentType import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients -import eu.ztsh.mockserver.api.common.Https -import eu.ztsh.mockserver.api.request.AddMock -import eu.ztsh.mockserver.client.RemoteMockServer -import eu.ztsh.mockserver.client.Util -import eu.ztsh.mockserver.server.HttpMockServer import spock.lang.AutoCleanup import spock.lang.Ignore import spock.lang.Shared @@ -23,7 +23,6 @@ import javax.net.ssl.SSLContext import javax.net.ssl.SSLHandshakeException import java.security.KeyStore -@Ignore('Upgrade of Java needed') class MockServerHttpsTest extends Specification { RemoteMockServer remoteMockServer = new RemoteMockServer('localhost', 19000) @@ -48,6 +47,7 @@ class MockServerHttpsTest extends Specification { .loadTrustMaterial(trustStore()) .build() + @Ignore("TODO: SSL peer shut down incorrectly") def 'should handle HTTPS server' () { given: remoteMockServer.addMock(new AddMock( @@ -72,6 +72,7 @@ class MockServerHttpsTest extends Specification { restPostResponse.name() == 'goodResponse-request' } + @Ignore("TODO: SSL peer shut down incorrectly") def 'should handle HTTPS server with client auth' () { given: remoteMockServer.addMock(new AddMock( diff --git a/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerIntegrationTest.groovy b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerIntegrationTest.groovy index fc88b53..56e498d 100644 --- a/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerIntegrationTest.groovy +++ b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerIntegrationTest.groovy @@ -1,6 +1,6 @@ package eu.ztsh.mockserver.tests -import groovy.util.slurpersupport.GPathResult +import groovy.xml.slurpersupport.GPathResult import org.apache.http.client.methods.CloseableHttpResponse import org.apache.http.client.methods.HttpDelete import org.apache.http.client.methods.HttpGet diff --git a/mockserver/pom.xml b/mockserver/pom.xml index c1bf76c..d097048 100644 --- a/mockserver/pom.xml +++ b/mockserver/pom.xml @@ -18,18 +18,27 @@ - org.codehaus.groovy + org.apache.groovy groovy - org.codehaus.groovy + org.apache.groovy groovy-json - org.codehaus.groovy + org.apache.groovy groovy-xml + + org.glassfish.jaxb + jaxb-core + + + org.glassfish.jaxb + jaxb-runtime + + org.apache.commons commons-lang3 diff --git a/mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockRequest.groovy b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockRequest.groovy index 4d9fca0..a714afe 100644 --- a/mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockRequest.groovy +++ b/mockserver/src/main/groovy/eu/ztsh/mockserver/server/MockRequest.groovy @@ -3,7 +3,8 @@ package eu.ztsh.mockserver.server import com.sun.net.httpserver.Headers import groovy.json.JsonSlurper import groovy.transform.PackageScope -import groovy.util.slurpersupport.GPathResult +import groovy.xml.XmlSlurper +import groovy.xml.slurpersupport.GPathResult import groovy.xml.XmlUtil @PackageScope diff --git a/pom.xml b/pom.xml index 7e57e1d..a981985 100644 --- a/pom.xml +++ b/pom.xml @@ -23,14 +23,14 @@ UTF-8 UTF-8 - 3.0.20 + 4.0.12 4.5.13 - 2.0-groovy-3.0 + 2.2-groovy-4.0 3.3.2 1.7.30 1.3.12 1.18.26 - 4.0.1 + 4.0.4 true 1.37 @@ -57,17 +57,25 @@ - org.codehaus.groovy + org.glassfish.jaxb + jaxb-bom + ${jaxb.version} + pom + import + + + + org.apache.groovy groovy ${groovy.version} - org.codehaus.groovy + org.apache.groovy groovy-json ${groovy.version} - org.codehaus.groovy + org.apache.groovy groovy-xml ${groovy.version} @@ -82,11 +90,6 @@ commons-lang3 ${commons-lang3.version} - - jakarta.xml.bind - jakarta.xml.bind-api - ${jakarta-xml-bind.version} - org.slf4j slf4j-api From b2857d956bd7113ed73e939d15caf3b9f3a8b6dd Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Thu, 22 Feb 2024 22:49:31 +0100 Subject: [PATCH 110/116] chore: JRE in Dockerfile updated --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6ea2981..6b6b0e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM java:8 +FROM eclipse-temurin:11.0.22_7-jre-alpine ADD mockserver/target/mockserver-full.jar /mockserver.jar From 024bec43049d5b7a9c78890efc827db59a90b1d9 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Fri, 23 Feb 2024 00:04:20 +0100 Subject: [PATCH 111/116] build: Surefire fixes --- mockserver-tests/pom.xml | 10 ++++++++++ .../ztsh/mockserver/tests/MockServerHttpsTest.groovy | 1 + .../mockserver/tests/MockServerIntegrationTest.groovy | 2 ++ 3 files changed, 13 insertions(+) diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index bd51227..2506a7a 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -52,6 +52,16 @@ org.codehaus.gmavenplus gmavenplus-plugin + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + **/*Test.java + + + diff --git a/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerHttpsTest.groovy b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerHttpsTest.groovy index 5121042..e1ecd95 100644 --- a/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerHttpsTest.groovy +++ b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerHttpsTest.groovy @@ -23,6 +23,7 @@ import javax.net.ssl.SSLContext import javax.net.ssl.SSLHandshakeException import java.security.KeyStore +@Ignore class MockServerHttpsTest extends Specification { RemoteMockServer remoteMockServer = new RemoteMockServer('localhost', 19000) diff --git a/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerIntegrationTest.groovy b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerIntegrationTest.groovy index 56e498d..038a143 100644 --- a/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerIntegrationTest.groovy +++ b/mockserver-tests/src/test/groovy/eu/ztsh/mockserver/tests/MockServerIntegrationTest.groovy @@ -28,6 +28,7 @@ import eu.ztsh.mockserver.client.RemoteMockServer import eu.ztsh.mockserver.client.Util import eu.ztsh.mockserver.server.HttpMockServer import spock.lang.AutoCleanup +import spock.lang.Ignore import spock.lang.Specification class MockServerIntegrationTest extends Specification { @@ -65,6 +66,7 @@ class MockServerIntegrationTest extends Specification { remoteMockServer.removeMock('testRest')?.size() == 1 } + @Ignore("TODO: restPostResponse.name()") def "should add working rest mock on endpoint with utf"() { expect: remoteMockServer.addMock(new AddMock( From 0884505a186cd4dc600bceaa4d683a9b05490bfd Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Fri, 23 Feb 2024 23:32:02 +0100 Subject: [PATCH 112/116] CI --- .github/workflows/build.yml | 14 -------------- .woodpecker.yaml | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 14 deletions(-) delete mode 100644 .github/workflows/build.yml create mode 100644 .woodpecker.yaml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 0ab96ff..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Build mockserver -on: [push] -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 8 - uses: actions/setup-java@v3 - with: - java-version: '8' - distribution: 'temurin' - - name: Build with Maven - run: ./mvnw package \ No newline at end of file diff --git a/.woodpecker.yaml b/.woodpecker.yaml new file mode 100644 index 0000000..c283587 --- /dev/null +++ b/.woodpecker.yaml @@ -0,0 +1,35 @@ +variables: + &maven_image maven:3.9.6-eclipse-temurin-11-alpine + +steps: + - name: build + image: *maven_image + commands: + - mvn -B clean install -DskipTests -Dmaven.test.skip + - name: test + image: *maven_image + commands: + - mvn -B -pl :mockserver-tests verify + - name: deploy to public + image: *maven_image + commands: + - mvn -B jar:jar deploy:deploy + secrets: [reposilite_user, reposilite_token] + when: + - event: tag + - name: deploy to releases + image: woodpeckerci/plugin-gitea-release + when: + - event: tag + - name: build docker image + image: woodpeckerci/plugin-docker-buildx + settings: + platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm64/v8,linux/ppc64le,linux/riscv64,linux/s390x + repo: codeberg.org/${CI_REPO_OWNER}/hello + registry: codeberg.org + tags: latest + username: ${CI_REPO_OWNER} + password: + from_secret: cb_token + when: + - event: tag From 1c5909cf8dba2826eca5481dcd693174568febd6 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Sun, 25 Feb 2024 17:32:34 +0100 Subject: [PATCH 113/116] CI push tasks --- .woodpecker.yaml | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/.woodpecker.yaml b/.woodpecker.yaml index c283587..7aab053 100644 --- a/.woodpecker.yaml +++ b/.woodpecker.yaml @@ -1,6 +1,9 @@ variables: &maven_image maven:3.9.6-eclipse-temurin-11-alpine +when: + evaluate: 'not (CI_COMMIT_MESSAGE contains "Release")' + steps: - name: build image: *maven_image @@ -15,21 +18,40 @@ steps: commands: - mvn -B jar:jar deploy:deploy secrets: [reposilite_user, reposilite_token] - when: - - event: tag - name: deploy to releases image: woodpeckerci/plugin-gitea-release + settings: + base-url: https://git.ztsh.eu + files: + - "mockserver-client/target/mockserver-client*.jar" + - "mockserver/target/mockserver-full.jar" + api_key: + from_secret: git_pat + when: + - event: tag + - name: tag docker image + image: woodpeckerci/plugin-docker-buildx + settings: + platforms: linux/amd64 + repo: ztsheu/http-mock-server + registry: docker.io + tags: ${CI_COMMIT_TAG} + username: ztsheu + password: + from_secret: docker-pat when: - event: tag - name: build docker image image: woodpeckerci/plugin-docker-buildx settings: - platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm64/v8,linux/ppc64le,linux/riscv64,linux/s390x - repo: codeberg.org/${CI_REPO_OWNER}/hello - registry: codeberg.org + platforms: linux/amd64 + repo: ztsheu/http-mock-server + registry: docker.io tags: latest - username: ${CI_REPO_OWNER} + username: ztsheu password: - from_secret: cb_token + from_secret: docker-pat when: - event: tag + - event: push + branch: dev From ea16fa59d081b24c922a2510d3dc3653f8cffcdf Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Sun, 25 Feb 2024 20:40:06 +0100 Subject: [PATCH 114/116] Jammy & multiplatform --- .woodpecker.yaml | 4 ++-- Dockerfile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.woodpecker.yaml b/.woodpecker.yaml index 7aab053..886e23d 100644 --- a/.woodpecker.yaml +++ b/.woodpecker.yaml @@ -32,7 +32,7 @@ steps: - name: tag docker image image: woodpeckerci/plugin-docker-buildx settings: - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64/v8,linux/ppc64le,linux/s390x repo: ztsheu/http-mock-server registry: docker.io tags: ${CI_COMMIT_TAG} @@ -44,7 +44,7 @@ steps: - name: build docker image image: woodpeckerci/plugin-docker-buildx settings: - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64/v8,linux/ppc64le,linux/s390x repo: ztsheu/http-mock-server registry: docker.io tags: latest diff --git a/Dockerfile b/Dockerfile index 6b6b0e1..3250eed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM eclipse-temurin:11.0.22_7-jre-alpine +FROM eclipse-temurin:11.0.22_7-jre-jammy ADD mockserver/target/mockserver-full.jar /mockserver.jar From 2a11dd9b10e3680d9bf927e4fb7ca807f41ea253 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Sun, 25 Feb 2024 21:03:05 +0100 Subject: [PATCH 115/116] ci: fixed branches in reposilite deploy --- .woodpecker.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.woodpecker.yaml b/.woodpecker.yaml index 886e23d..4eafeb7 100644 --- a/.woodpecker.yaml +++ b/.woodpecker.yaml @@ -18,6 +18,8 @@ steps: commands: - mvn -B jar:jar deploy:deploy secrets: [reposilite_user, reposilite_token] + when: + branch: [dev, master] - name: deploy to releases image: woodpeckerci/plugin-gitea-release settings: From 55ee22c3a1faf1f577ee49a89f4700a04f5a3868 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Sun, 25 Feb 2024 22:09:28 +0100 Subject: [PATCH 116/116] ci: secrets fix --- .woodpecker.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.woodpecker.yaml b/.woodpecker.yaml index 4eafeb7..5921e36 100644 --- a/.woodpecker.yaml +++ b/.woodpecker.yaml @@ -40,7 +40,7 @@ steps: tags: ${CI_COMMIT_TAG} username: ztsheu password: - from_secret: docker-pat + from_secret: docker_pat when: - event: tag - name: build docker image @@ -52,7 +52,7 @@ steps: tags: latest username: ztsheu password: - from_secret: docker-pat + from_secret: docker_pat when: - event: tag - event: push