From b431f1b7883d00cf71624fc760119cc7f90f2ba6 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 31 Jul 2017 16:09:35 +0200 Subject: [PATCH] Bumped WireMock to 2.7.1 and added debug option for WireMock fixes #374 #369 --- .../main/asciidoc/verifier/introduction.adoc | 14 ++++++++++ spring-cloud-contract-dependencies/pom.xml | 2 +- .../wiremock/WireMockHttpServerStub.java | 4 ++- .../WireMockHttpServerStubSpec.groovy | 27 +++++++++++++++++++ .../src/test/resources/simple.json | 13 +++++++++ .../bootSimple/gradle.properties | 2 +- .../sampleJerseyProject/build.gradle | 2 +- .../sampleJerseyProject/gradle.properties | 2 +- .../sampleProject/gradle.properties | 2 +- .../scenarioProject/gradle.properties | 2 +- .../wiremock/WireMockStubMappingSpec.groovy | 4 +-- .../wiremock/WireMockConfiguration.java | 2 ++ .../wiremock/WireMockRestServiceServer.java | 6 ++--- .../restdocs/BasicMappingBuilder.java | 4 ++- 14 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 spring-cloud-contract-stub-runner/src/test/resources/simple.json diff --git a/docs/src/main/asciidoc/verifier/introduction.adoc b/docs/src/main/asciidoc/verifier/introduction.adoc index 5135fd9c2b..a6b9793a11 100644 --- a/docs/src/main/asciidoc/verifier/introduction.adoc +++ b/docs/src/main/asciidoc/verifier/introduction.adoc @@ -868,6 +868,20 @@ The generated tests all boil down to RestAssured in some form or fashion which r logging.level.org.apache.http.wire=DEBUG ---- +==== How can I debug the mapping/request/response being sent by WireMock? + +Starting from version `1.2.0` we turn on WireMock logging to +info and the WireMock notifier to being verbose. Now you will +exactly know what request was received by WireMock server and which +matching response definition was picked. + +To turn off this feature just bump WireMock logging to `ERROR` + +[source,properties,indent=0] +---- +logging.level.com.github.tomakehurst.wiremock=ERROR +---- + ==== How can I see what got registered in the HTTP server stub? You can use the `mappingsOutputFolder` property on `@AutoConfigureStubRunner` or `StubRunnerRule` diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 59ade9f9e2..62b8acf9e9 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -14,7 +14,7 @@ spring-cloud-contract-dependencies Spring Cloud Contract Dependencies - 2.6.0 + 2.7.1 0.4.9 1.0.2.v20150114 diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java index 85d204b0f8..7ffbcb3695 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java @@ -12,6 +12,7 @@ import java.util.Map; import com.github.jknack.handlebars.Helper; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.common.Slf4jNotifier; import com.github.tomakehurst.wiremock.core.WireMockConfiguration; import com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer; import com.github.tomakehurst.wiremock.stubbing.StubMapping; @@ -84,7 +85,8 @@ public class WireMockHttpServerStub implements HttpServerStub { @Override public HttpServerStub start(int port) { - this.wireMockServer = new WireMockServer(config().port(port)); + this.wireMockServer = new WireMockServer(config().port(port) + .notifier(new Slf4jNotifier(true))); this.wireMockServer.start(); return this; } diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStubSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStubSpec.groovy index 141bff47cd..0a8bb1b3bd 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStubSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStubSpec.groovy @@ -18,12 +18,18 @@ package org.springframework.cloud.contract.stubrunner.provider.wiremock import com.github.tomakehurst.wiremock.http.RequestMethod import com.github.tomakehurst.wiremock.stubbing.StubMapping +import org.junit.Rule import spock.lang.Specification +import org.springframework.boot.test.rule.OutputCapture +import org.springframework.boot.test.web.client.TestRestTemplate + class WireMockHttpServerStubSpec extends Specification { public static final File MAPPING_DESCRIPTOR = new File('src/test/resources/repository/mappings/spring/cloud/ping/ping.json') + @Rule OutputCapture capture = new OutputCapture() + def 'should describe stub mapping'() { given: WireMockHttpServerStub mappingDescriptor = new WireMockHttpServerStub().start() as WireMockHttpServerStub @@ -39,5 +45,26 @@ class WireMockHttpServerStubSpec extends Specification { assert response.body == 'pong' assert response.headers.contentTypeHeader.mimeTypePart() == 'text/plain' } + + cleanup: + mappingDescriptor.stop() + } + + def 'should make WireMock print out logs on INFO'() { + given: + WireMockHttpServerStub mappingDescriptor = new WireMockHttpServerStub().start() as WireMockHttpServerStub + mappingDescriptor.registerMappings([ + new File(WireMockHttpServerStubSpec.classLoader.getResource("simple.json").toURI()) + ]) + + when: + String response = new TestRestTemplate().getForObject("http://localhost:${mappingDescriptor.port()}/foobar", String) + + then: + response == "foo" + capture.toString().contains("Matched response definition") + + cleanup: + mappingDescriptor.stop() } } diff --git a/spring-cloud-contract-stub-runner/src/test/resources/simple.json b/spring-cloud-contract-stub-runner/src/test/resources/simple.json new file mode 100644 index 0000000000..17361a09b3 --- /dev/null +++ b/spring-cloud-contract-stub-runner/src/test/resources/simple.json @@ -0,0 +1,13 @@ +{ + "id" : "77514bd4-a102-4478-a3c0-0fda8b905591", + "request" : { + "method" : "GET", + "url": "/foobar" + }, + "response" : { + "status" : 200, + "body" : "foo", + "transformers": ["response-template"] + }, + "uuid" : "77514bd4-a102-4478-a3c0-0fda8b905591" +} \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/gradle.properties index e2e31f20ff..c7265bb479 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/gradle.properties @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -wiremockVersion=2.6.0 +wiremockVersion=2.7.1 jsonAssertVersion=0.4.8 verifierVersion=1.2.0.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/build.gradle index c998624aaf..d8882713aa 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/build.gradle @@ -83,7 +83,7 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService') testCompile "org.mockito:mockito-core" testCompile "org.springframework:spring-test" testCompile "org.springframework.boot:spring-boot-test" - testCompile("com.github.tomakehurst:wiremock:2.6.0") { + testCompile("com.github.tomakehurst:wiremock:2.7.1") { exclude group: 'org.eclipse.jetty' } } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle.properties index 7fc8372e28..74e0fcf18e 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle.properties @@ -13,6 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -wiremockVersion=2.6.0 +wiremockVersion=2.7.1 jsonAssertVersion=0.4.8 verifierVersion=1.2.0.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/gradle.properties index b8669f3a52..0dd0cb1ba8 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/gradle.properties @@ -13,6 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -wiremockVersion=2.6.0 +wiremockVersion=2.7.1 jsonAssertVersion=0.4.8 verifierVersion=1.2.0.BUILD-SNAPSHOT \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties index e2e31f20ff..c7265bb479 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -wiremockVersion=2.6.0 +wiremockVersion=2.7.1 jsonAssertVersion=0.4.8 verifierVersion=1.2.0.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockStubMappingSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockStubMappingSpec.groovy index d71b28f138..40a485ea14 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockStubMappingSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockStubMappingSpec.groovy @@ -47,12 +47,12 @@ class WireMockStubMappingSpec extends Specification { WireMockStubMapping.buildFrom(stub_2_1_7) } - def "should successfully parse a WireMock 2.6.0 stub"() { + def "should successfully parse a WireMock 2.5.0 stub"() { expect: WireMockStubMapping.buildFrom(stub_2_5_1) } - def "should successfully parse a WireMock 2.6.0 stub that contains transformers"() { + def "should successfully parse a WireMock 2.5.0 stub that contains transformers"() { expect: WireMockStubMapping.buildFrom(stub_2_5_1_with_transformer) } diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java index 5098999f6a..cac6d28b48 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; import javax.annotation.PostConstruct; +import com.github.tomakehurst.wiremock.common.Slf4jNotifier; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -81,6 +82,7 @@ public class WireMockConfiguration implements SmartLifecycle { factory.httpsPort(this.wireMock.getHttpsPort()); } registerFiles(factory); + factory.notifier(new Slf4jNotifier(true)); this.options = factory; } this.server = new WireMockServer(this.options); diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestServiceServer.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestServiceServer.java index f9a07ee0a9..97f9821835 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestServiceServer.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestServiceServer.java @@ -25,6 +25,7 @@ import java.util.Comparator; import java.util.List; import javax.xml.xpath.XPathExpressionException; +import com.github.tomakehurst.wiremock.matching.ContentPattern; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.MatcherAssert; @@ -55,7 +56,6 @@ import com.github.tomakehurst.wiremock.matching.MatchesJsonPathPattern; import com.github.tomakehurst.wiremock.matching.MatchesXPathPattern; import com.github.tomakehurst.wiremock.matching.MultiValuePattern; import com.github.tomakehurst.wiremock.matching.RequestPattern; -import com.github.tomakehurst.wiremock.matching.StringValuePattern; import com.github.tomakehurst.wiremock.stubbing.StubMapping; import static org.springframework.test.web.client.match.MockRestRequestMatchers.header; @@ -214,7 +214,7 @@ public class WireMockRestServiceServer { if (request.getBodyPatterns() == null) { return; } - for (final StringValuePattern pattern : request.getBodyPatterns()) { + for (final ContentPattern pattern : request.getBodyPatterns()) { if (pattern instanceof MatchesJsonPathPattern) { expect.andExpect(MockRestRequestMatchers.jsonPath(((MatchesJsonPathPattern) pattern).getMatchesJsonPath()).exists()); } else if (pattern instanceof MatchesXPathPattern) { @@ -224,7 +224,7 @@ public class WireMockRestServiceServer { } } - private RequestMatcher matchContents(final StringValuePattern pattern) { + private RequestMatcher matchContents(final ContentPattern pattern) { return new RequestMatcher() { @Override public void match(ClientHttpRequest request) throws IOException, AssertionError { diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/BasicMappingBuilder.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/BasicMappingBuilder.java index 69f021d229..350e24155a 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/BasicMappingBuilder.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/BasicMappingBuilder.java @@ -11,6 +11,7 @@ import com.github.tomakehurst.wiremock.extension.Parameters; import com.github.tomakehurst.wiremock.http.Request; import com.github.tomakehurst.wiremock.http.RequestMethod; import com.github.tomakehurst.wiremock.http.ResponseDefinition; +import com.github.tomakehurst.wiremock.matching.ContentPattern; import com.github.tomakehurst.wiremock.matching.RequestPattern; import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder; import com.github.tomakehurst.wiremock.matching.StringValuePattern; @@ -75,7 +76,8 @@ class BasicMappingBuilder implements ScenarioMappingBuilder { return this; } - @Override public BasicMappingBuilder withRequestBody(StringValuePattern bodyPattern) { + @Override public ScenarioMappingBuilder withRequestBody( + ContentPattern bodyPattern) { this.requestPatternBuilder.withRequestBody(bodyPattern); return this; }