From 12e61702831cb8449e2f13914bf7f673850a6009 Mon Sep 17 00:00:00 2001 From: onikytchuk Date: Thu, 10 May 2018 09:23:13 +0300 Subject: [PATCH 01/84] [#584] Added inclusion configuration 'includeFiles' that allow producers to filter common repository structure and define the list of messaging topics that would be processed during the tests autogeneration. --- docs/src/main/asciidoc/verifier_faq.adoc | 105 ++++-------------- .../converter/RecursiveFilesConverter.groovy | 2 +- .../maven/verifier/GenerateTestsMojo.java | 7 ++ .../maven/verifier/PluginUnitTest.java | 15 +++ .../pom.xml | 61 ++++++++++ .../java/com/example/services/TestBase.java | 30 +++++ .../contracts-0.0.1-SNAPSHOT.pom | 25 +++++ .../1.0.4-SNAPSHOT/maven-metadata-local.xml | 24 ++++ .../services-contracts-1.0.4-SNAPSHOT.jar | Bin 0 -> 15718 bytes .../services-contracts-1.0.4-SNAPSHOT.pom | 25 +++++ .../services-contracts/maven-metadata.xml | 28 +++++ .../contract/verifier/TestGenerator.groovy | 1 + .../ContractVerifierConfigProperties.groovy | 5 + .../verifier/file/ContractFileScanner.groovy | 7 +- .../file/ContractFileScannerSpec.groovy | 26 ++++- .../messaging/couponCollectedEventV1.groovy | 27 +++++ .../messaging/couponCollectedEventV2.groovy | 27 +++++ .../messaging/couponSentEventSm.groovy | 27 +++++ .../admin/v1/shouldReturnBetRanges.groovy | 38 +++++++ ...uldReturnEmptyFriendsWhenGetFriends.groovy | 30 +++++ .../rest/shouldUpdateUserInfo.groovy | 44 ++++++++ 21 files changed, 464 insertions(+), 90 deletions(-) create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-common-repo-with-messaging/pom.xml create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-common-repo-with-messaging/src/test/java/com/example/services/TestBase.java create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/contracts/1.0.4-SNAPSHOT/contracts-0.0.1-SNAPSHOT.pom create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/1.0.4-SNAPSHOT/maven-metadata-local.xml create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/1.0.4-SNAPSHOT/services-contracts-1.0.4-SNAPSHOT.jar create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/1.0.4-SNAPSHOT/services-contracts-1.0.4-SNAPSHOT.pom create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/maven-metadata.xml create mode 100644 spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-collected/src/main/resources/contracts/rule-engine-daemon/messaging/couponCollectedEventV1.groovy create mode 100644 spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-collected/src/main/resources/contracts/rule-engine-daemon/messaging/couponCollectedEventV2.groovy create mode 100644 spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-sent/src/main/resources/contracts/rule-engine-daemon/messaging/couponSentEventSm.groovy create mode 100644 spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/reward-rules/src/main/resources/contracts/reward_rules/rest/admin/v1/shouldReturnBetRanges.groovy create mode 100644 spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/social-service/src/main/resources/contracts/coupons_new_backend/rest/shouldReturnEmptyFriendsWhenGetFriends.groovy create mode 100644 spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/social-service/src/main/resources/contracts/facebook_client/rest/shouldUpdateUserInfo.groovy diff --git a/docs/src/main/asciidoc/verifier_faq.adoc b/docs/src/main/asciidoc/verifier_faq.adoc index a15f8f8170..a452084e34 100644 --- a/docs/src/main/asciidoc/verifier_faq.adoc +++ b/docs/src/main/asciidoc/verifier_faq.adoc @@ -344,84 +344,10 @@ contracts in the folder per topic. ===== For Maven Project -To make it possible to work on the producer side we could do the following things (all via Maven plugins): +To make it possible to work on the producer side we should specify an inclusion pattern for +filtering common repository jar by messaging topics we are interested in. ```includedFiles``` property of ```Maven Spring Cloud Contract plugin``` +allows us to do that. Also ```contractsPath``` need to be specified since the default path would be the common repository ```groupid/artifactid```. -- Add common repo dependency to your classpath: - -[source,xml,indent=0] ----- - - com.example - common-repo - ${common-repo.version} - ----- - -- Download the JAR with the contracts and unpack the JAR to target: - -[source,xml,indent=0] ----- - - org.apache.maven.plugins - maven-dependency-plugin - 3.0.0 - - - unpack-dependencies - process-resources - - unpack - - - - - com.example - common-repo - jar - false - ${project.build.directory}/contracts - - - - - - ----- - -- Rip out all the folders we're not interested in: - -[source,xml,indent=0] ----- - - org.apache.maven.plugins - maven-antrun-plugin - 1.8 - - - process-resources - - run - - - - - - - - - - - - - - - - - - ----- - -- Run the contract plugin by pointing to the contracts to the folder under target: [source,xml,indent=0] ---- @@ -429,19 +355,32 @@ To make it possible to work on the producer side we could do the following thing org.springframework.cloud spring-cloud-contract-maven-plugin ${spring-cloud-contract.version} - true - com.example + REMOTE + http://link/to/your/nexus/or/artifactory/or/sth + + com.example + common-repo-with-contracts + + + + / - .*intoxication.* - com.example.intoxication.BeerIntoxicationBase + .*messaging.* + com.example.services.MessagingBase + + + .*rest.* + com.example.services.TestBase - ${project.build.directory}/contracts + + **/${project.artifactId}/** + **/${first-topic}/** + **/${second-topic}/** + ----- ===== For Gradle Project diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverter.groovy b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverter.groovy index 043002d9c7..1dbfad196b 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverter.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverter.groovy @@ -58,7 +58,7 @@ class RecursiveFilesConverter { void processFiles() { ContractFileScanner scanner = new ContractFileScanner(properties.contractsDslDir, - properties.excludedFiles as Set, [] as Set, properties.includedContracts) + properties.excludedFiles as Set, [] as Set, [] as Set, properties.includedContracts) ListMultimap contracts = scanner.findContracts() if (log.isDebugEnabled()) { log.debug("Found the following contracts $contracts") diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java index 4c466b7405..61544d6ec8 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java @@ -96,6 +96,12 @@ public class GenerateTestsMojo extends AbstractMojo { @Parameter private List excludedFiles; + /** + * Patterns that should be taken into account for processing + */ + @Parameter(property = "includedFiles") + private List includedFiles; + /** * Incubating feature. You can check the size of JSON arrays. If not turned on * explicitly will be disabled. @@ -277,6 +283,7 @@ public class GenerateTestsMojo extends AbstractMojo { config.setStaticImports(this.staticImports); config.setIgnoredFiles(this.ignoredFiles); config.setExcludedFiles(this.excludedFiles); + config.setIncludedFiles(this.includedFiles); config.setAssertJsonSize(this.assertJsonSize); config.setPackageWithBaseClasses(this.packageWithBaseClasses); if (this.baseClassMappings != null) { diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginUnitTest.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginUnitTest.java index 54beac401b..70fa7c69bc 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginUnitTest.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginUnitTest.java @@ -305,4 +305,19 @@ public class PluginUnitTest { then(this.capture.toString()).contains("Skipping pushing stubs to scm since your"); } + + @Test + public void shouldGenerateContractTestsForIncludedFilesPattern() throws Exception { + File basedir = this.resources.getBasedir("complex-common-repo-with-messaging"); + + this.maven.executeMojo(basedir, "generateTests", defaultPackageForTests(), + newParameter("contractsRepositoryUrl", + "file://" + PluginUnitTest.class.getClassLoader() + .getResource("m2repo/repository").getFile() + .replace("/", File.separator))); + assertFilesPresent(basedir, + "target/generated-test-sources/contracts/org/springframework/cloud/contract/verifier/tests/common_repo_with_inclusion/kafka_topics/coupon_sent/src/main/resources/contracts/rule_engine_daemon/MessagingTest.java"); + assertFilesPresent(basedir, + "target/generated-test-sources/contracts/org/springframework/cloud/contract/verifier/tests/common_repo_with_inclusion/reward_rules/src/main/resources/contracts/reward_rules/rest/admin/V1Test.java"); + } } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-common-repo-with-messaging/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-common-repo-with-messaging/pom.xml new file mode 100644 index 0000000000..6c71dbfd26 --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-common-repo-with-messaging/pom.xml @@ -0,0 +1,61 @@ + + + + 4.0.0 + + com.example + social-service + 0.1.BUILD-SNAPSHOT + + + + + org.springframework.cloud + spring-cloud-contract-maven-plugin + 2.0.0.BUILD-SNAPSHOT + + REMOTE + + com.example + services-contracts + + + + / + + + .*messaging.* + com.example.services.TestBase + + + .*rest.* + com.example.services.TestBase + + + + **/coupon-sent/** + **/reward-rules/** + + + + + + + \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-common-repo-with-messaging/src/test/java/com/example/services/TestBase.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-common-repo-with-messaging/src/test/java/com/example/services/TestBase.java new file mode 100644 index 0000000000..0ad45b3dcf --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-common-repo-with-messaging/src/test/java/com/example/services/TestBase.java @@ -0,0 +1,30 @@ +/** + * + * Copyright 2013-2017 the original author or authors. + * + * Licensed 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. + */ +package com.example.services; + +import io.restassured.module.mockmvc.RestAssuredMockMvc; + +import org.junit.Before; + +public class TestBase { + + @Before + public void setup() { + RestAssuredMockMvc.standaloneSetup(new FraudDetectionController()); + } + +} \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/contracts/1.0.4-SNAPSHOT/contracts-0.0.1-SNAPSHOT.pom b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/contracts/1.0.4-SNAPSHOT/contracts-0.0.1-SNAPSHOT.pom new file mode 100644 index 0000000000..1369bcaf20 --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/contracts/1.0.4-SNAPSHOT/contracts-0.0.1-SNAPSHOT.pom @@ -0,0 +1,25 @@ + + + + + 4.0.0 + com.example + contracts + 0.0.1-SNAPSHOT + pom + diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/1.0.4-SNAPSHOT/maven-metadata-local.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/1.0.4-SNAPSHOT/maven-metadata-local.xml new file mode 100644 index 0000000000..5b45432a6e --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/1.0.4-SNAPSHOT/maven-metadata-local.xml @@ -0,0 +1,24 @@ + + + com.example + services-contracts + 1.0.4-SNAPSHOT + + + true + + 20160916125313 + + + jar + 1.0.4-SNAPSHOT + 20160916125313 + + + pom + 1.0.4-SNAPSHOT + 20160916125313 + + + + diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/1.0.4-SNAPSHOT/services-contracts-1.0.4-SNAPSHOT.jar b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/1.0.4-SNAPSHOT/services-contracts-1.0.4-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..54c268d26c3bea4ea8dc2102758ec53352294585 GIT binary patch literal 15718 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 L(Ks%#ZT$Ctm)=;) literal 0 HcmV?d00001 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/1.0.4-SNAPSHOT/services-contracts-1.0.4-SNAPSHOT.pom b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/1.0.4-SNAPSHOT/services-contracts-1.0.4-SNAPSHOT.pom new file mode 100644 index 0000000000..a807f11aac --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/1.0.4-SNAPSHOT/services-contracts-1.0.4-SNAPSHOT.pom @@ -0,0 +1,25 @@ + + + + + 4.0.0 + com.example + services-contracts + 1.0.4-SNAPSHOT + pom + diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/maven-metadata.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/maven-metadata.xml new file mode 100644 index 0000000000..278b59b02a --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/services-contracts/maven-metadata.xml @@ -0,0 +1,28 @@ + + + + + com.example + services-contracts + 1.0.4-SNAPSHOT + + + 1.0.4-SNAPSHOT + + 20160409062112 + + diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy index df4ef6d63e..caa431b732 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy @@ -77,6 +77,7 @@ class TestGenerator { contractFileScanner = new ContractFileScanner(configProperties.contractsDslDir, configProperties.excludedFiles as Set, configProperties.ignoredFiles as Set, + configProperties.includedFiles as Set, this.configProperties.includedContracts) } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/ContractVerifierConfigProperties.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/ContractVerifierConfigProperties.groovy index 7093690e8f..60985f17ac 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/ContractVerifierConfigProperties.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/ContractVerifierConfigProperties.groovy @@ -60,6 +60,11 @@ class ContractVerifierConfigProperties { */ List excludedFiles = [] + /** + * Patterns that should be taken into account for processing + */ + List includedFiles = [] + /** * Patterns for which generated tests should be @Ignored */ diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy index 8ca4be4e25..b3fa7f506c 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy @@ -52,12 +52,14 @@ class ContractFileScanner { private final File baseDir private final Set excludeMatchers private final Set ignoreMatchers + private final Set includeMatchers private final String includeMatcher - ContractFileScanner(File baseDir, Set excluded, Set ignored, String includeMatcher = "") { + ContractFileScanner(File baseDir, Set excluded, Set ignored, Set included, String includeMatcher = "") { this.baseDir = baseDir this.excludeMatchers = processPatterns(excluded ?: [] as Set) this.ignoreMatchers = processPatterns(ignored ?: [] as Set) + this.includeMatchers = processPatterns(included ?: [] as Set) this.includeMatcher = includeMatcher } @@ -101,7 +103,8 @@ class ContractFileScanner { boolean excluded = matchesPattern(file, excludeMatchers) if (!excluded) { boolean contractFile = isContractFile(file) - boolean included = includeMatcher ? file.absolutePath.matches(includeMatcher) : true + boolean included = includeMatcher ? file.absolutePath.matches(includeMatcher) : true + included = includeMatchers ? matchesPattern(file, includeMatchers) : included if (contractFile && included) { addContractToTestGeneration(result, files, file, i, ContractVerifierDslConverter.convertAsCollection(baseDir, file)) } else if (YamlContractConverter.INSTANCE.isAccepted(file) && included) { diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy index d4ee0cdf48..7e76f1d7b3 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy @@ -34,7 +34,7 @@ class ContractFileScannerSpec extends Specification { File baseDir = new File(this.getClass().getResource("/directory/with/stubs").toURI()) Set excluded = ["package/**"] as Set Set ignored = ["other/different/**"] as Set - ContractFileScanner scanner = new ContractFileScanner(baseDir, excluded, ignored) + ContractFileScanner scanner = new ContractFileScanner(baseDir, excluded, ignored, [] as Set) when: ListMultimap result = scanner.findContracts() then: @@ -52,7 +52,7 @@ class ContractFileScannerSpec extends Specification { File baseDir = new File(this.getClass().getResource("/strange_[3.3.3]_directory").toURI()) Set excluded = ["foo/**"] as Set Set ignored = ["bar/**"] as Set - ContractFileScanner scanner = new ContractFileScanner(baseDir, excluded, ignored) + ContractFileScanner scanner = new ContractFileScanner(baseDir, excluded, ignored, [] as Set) when: ListMultimap result = scanner.findContracts() then: @@ -66,7 +66,7 @@ class ContractFileScannerSpec extends Specification { def "should find contracts group in scenario"() { given: File baseDir = new File(this.getClass().getResource("/directory/with/scenario").toURI()) - ContractFileScanner scanner = new ContractFileScanner(baseDir, [] as Set, [] as Set) + ContractFileScanner scanner = new ContractFileScanner(baseDir, [] as Set, [] as Set, [] as Set) when: ListMultimap contracts = scanner.findContracts() then: @@ -80,7 +80,7 @@ class ContractFileScannerSpec extends Specification { def "should find contract files with converters"() { given: File baseDir = new File(this.getClass().getResource("/directory/with/mixed").toURI()) - ContractFileScanner scanner = new ContractFileScanner(baseDir, null, null) { + ContractFileScanner scanner = new ContractFileScanner(baseDir, null, null, null) { @Override protected List converters() { return [new ContractConverter() { @@ -108,4 +108,22 @@ class ContractFileScannerSpec extends Specification { result.entries().every { it.value.convertedContract } result.entries().find { it.value.convertedContract.any { it.request.method.clientValue == "PUT" } } } + + def "should find contracts for include pattern"() { + given: + File baseDir = new File(this.getClass().getResource("/directory/with/common-messaging").toURI()) + Set included = ["social-service/**","**/coupon-collected/**/*V1*"] as Set + ContractFileScanner scanner = new ContractFileScanner(baseDir, [] as Set, [] as Set, included) + when: + ListMultimap result = scanner.findContracts() + then: + result.keySet().size() == 3 + result.values().find { (it.path.fileName.toString() == 'couponCollectedEventV1.groovy') }.groupSize==2 + result.values().find { (it.convertedContract.first().label == 'couponCollectedV1') } + result.values().findAll { (it.path.fileName.toString() == 'couponCollectedEventV2.groovy') }.isEmpty() + result.values().find { (it.path.fileName.toString() == 'shouldUpdateUserInfo.groovy') }.groupSize==1 + result.values().find { (it.path.fileName.toString() == 'shouldReturnEmptyFriendsWhenGetFriends.groovy') }.groupSize==1 + result.get(baseDir.toPath().resolve("coupon-sent")).size() == 0 + result.get(baseDir.toPath().resolve("reward-rules")).size() == 0 + } } diff --git a/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-collected/src/main/resources/contracts/rule-engine-daemon/messaging/couponCollectedEventV1.groovy b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-collected/src/main/resources/contracts/rule-engine-daemon/messaging/couponCollectedEventV1.groovy new file mode 100644 index 0000000000..b61731fbcf --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-collected/src/main/resources/contracts/rule-engine-daemon/messaging/couponCollectedEventV1.groovy @@ -0,0 +1,27 @@ +import org.springframework.cloud.contract.spec.Contract + +Contract.make { + + description("""Should send a message in topic coupon_collected""") + + label 'couponCollectedV1' + + input { + triggeredBy('couponCollectedSm()') + } + + outputMessage { + sentTo('coupon_collected') + + body([ + receiverSnId: value(consumer("receiver-sn-id"), producer(regex('([^\\W]|-)+'))), + sessionId: value(consumer(7928568413097907541), producer(regex('\\d+'))), + createdTs: value(consumer(1504688949158), producer(regex('\\d+'))), + couponToken: value(consumer("440006-6-1504688949139-xyuzzrx5"), producer(regex('([^\\W]|-)+'))) + ]) + + headers { + messagingContentType(applicationJsonUtf8()) + } + } +} \ No newline at end of file diff --git a/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-collected/src/main/resources/contracts/rule-engine-daemon/messaging/couponCollectedEventV2.groovy b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-collected/src/main/resources/contracts/rule-engine-daemon/messaging/couponCollectedEventV2.groovy new file mode 100644 index 0000000000..529f1c93f7 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-collected/src/main/resources/contracts/rule-engine-daemon/messaging/couponCollectedEventV2.groovy @@ -0,0 +1,27 @@ +import org.springframework.cloud.contract.spec.Contract + +Contract.make { + + description("""Should send a message in topic coupon_collected""") + + label 'couponCollectedSm' + + input { + triggeredBy('couponCollectedSm()') + } + + outputMessage { + sentTo('coupon_collected') + + body([ + receiverSnId: value(consumer("receiver-sn-id"), producer(regex('([^\\W]|-)+'))), + sessionId: value(consumer(7928568413097907541), producer(regex('\\d+'))), + createdTs: value(consumer(1504688949158), producer(regex('\\d+'))), + couponToken: value(consumer("440006-6-1504688949139-xyuzzrx5"), producer(regex('([^\\W]|-)+'))) + ]) + + headers { + messagingContentType(applicationJsonUtf8()) + } + } +} \ No newline at end of file diff --git a/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-sent/src/main/resources/contracts/rule-engine-daemon/messaging/couponSentEventSm.groovy b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-sent/src/main/resources/contracts/rule-engine-daemon/messaging/couponSentEventSm.groovy new file mode 100644 index 0000000000..24772ce212 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/kafka-topics/coupon-sent/src/main/resources/contracts/rule-engine-daemon/messaging/couponSentEventSm.groovy @@ -0,0 +1,27 @@ +import org.springframework.cloud.contract.spec.Contract + +Contract.make { + + description("""Should send a message in topic coupon_sent""") + + label 'couponSentSm' + + input { + triggeredBy('couponSentSm()') + } + + outputMessage { + sentTo('coupon_sent') + + body([ + senderUserId: value(consumer(123), producer(regex('\\d+'))), + sessionId: value(consumer(7928568413097907541), producer(regex('\\d+'))), + createdTs: value(consumer(1504688949158), producer(regex('\\d+'))), + couponToken: value(consumer("440006-6-1504688949139-xyuzzrx5"), producer(regex('([^\\W]|-)+'))) + ]) + + headers { + messagingContentType(applicationJsonUtf8()) + } + } +} \ No newline at end of file diff --git a/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/reward-rules/src/main/resources/contracts/reward_rules/rest/admin/v1/shouldReturnBetRanges.groovy b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/reward-rules/src/main/resources/contracts/reward_rules/rest/admin/v1/shouldReturnBetRanges.groovy new file mode 100644 index 0000000000..f70af82308 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/reward-rules/src/main/resources/contracts/reward_rules/rest/admin/v1/shouldReturnBetRanges.groovy @@ -0,0 +1,38 @@ +import org.springframework.cloud.contract.spec.Contract + +Contract.make { + description('Should return bet ranges array') + request { + method 'GET' + url('/admin/v1/spin/betRanges') + } + + response { + status 200 + body( + betRanges: [ + [ + betRangeId : 3, + fromBetPercent: -1 + ], + [ + betRangeId : 4, + fromBetPercent: 0 + ], + [ + betRangeId : 1, + fromBetPercent: 90 + ], + [ + betRangeId : 2, + fromBetPercent: 130 + ] + ] + ) + + headers { + contentType(applicationJsonUtf8()) + } + } +} + diff --git a/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/social-service/src/main/resources/contracts/coupons_new_backend/rest/shouldReturnEmptyFriendsWhenGetFriends.groovy b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/social-service/src/main/resources/contracts/coupons_new_backend/rest/shouldReturnEmptyFriendsWhenGetFriends.groovy new file mode 100644 index 0000000000..5c33f16f4f --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/social-service/src/main/resources/contracts/coupons_new_backend/rest/shouldReturnEmptyFriendsWhenGetFriends.groovy @@ -0,0 +1,30 @@ +import org.springframework.cloud.contract.spec.Contract + +Contract.make { + description(""" +Should return empty array if user has no friends +""") + request { + method 'GET' + urlPath('/SocialServer/social/getFriends') + url('/social/getFriends') { + queryParameters { + parameter 'snId': $(consumer(regex('([^\\W]|-)+')), producer('12345')) + parameter 'snType': $(consumer(regex('\\d+')), producer(2)) + } + } + } + + response { + status 200 + body( + """ + {"friends" : []} + """) + + headers { + contentType(applicationJsonUtf8()) + } + } +} + diff --git a/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/social-service/src/main/resources/contracts/facebook_client/rest/shouldUpdateUserInfo.groovy b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/social-service/src/main/resources/contracts/facebook_client/rest/shouldUpdateUserInfo.groovy new file mode 100644 index 0000000000..411bbe2496 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/resources/directory/with/common-messaging/social-service/src/main/resources/contracts/facebook_client/rest/shouldUpdateUserInfo.groovy @@ -0,0 +1,44 @@ +import org.springframework.cloud.contract.spec.Contract + +Contract.make { + description(""" +User's information should be update if has appropriate age +""") + request { + method 'POST' + url '/test/updateUserInfo' + body([ + userId: 123, + age: 25, + firstName: "asd", + lastName: "asd" + ]) + stubMatchers { + jsonPath('$.userId', byRegex("[1-9]{1}([0-9]{7})")) + jsonPath('$.age', byRegex("(1[89]|[2-9][0-9])")) + jsonPath('$.firstName', byRegex("[a-zA-Z]{2,20}")) + jsonPath('$.lastName', byRegex("[a-zA-Z]{2,20}")) + } + headers { + contentType(applicationJson()) + } + } + response { + status 200 + body([ + userId: fromRequest().body("userId"), + age: fromRequest().body("age"), + firstName: fromRequest().body("firstName"), + lastName: fromRequest().body("lastName") + ]) + testMatchers { + jsonPath('$.userId', byEquality()) + jsonPath('$.age', byEquality()) + jsonPath('$.firstName', byEquality()) + jsonPath('$.lastName', byEquality()) + } + headers { + contentType(applicationJson()) + } + } +} \ No newline at end of file From 544c1d8a42c70819c6a1879ecee1deacb7155b8b Mon Sep 17 00:00:00 2001 From: onikytchuk Date: Thu, 10 May 2018 11:24:01 +0300 Subject: [PATCH 02/84] Fixed docs issue --- docs/src/main/asciidoc/verifier_faq.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/main/asciidoc/verifier_faq.adoc b/docs/src/main/asciidoc/verifier_faq.adoc index a452084e34..8a1ca14d3e 100644 --- a/docs/src/main/asciidoc/verifier_faq.adoc +++ b/docs/src/main/asciidoc/verifier_faq.adoc @@ -381,6 +381,7 @@ allows us to do that. Also ```contractsPath``` need to be specified since the de +---- ===== For Gradle Project From 1e14427889b4b7d4f0ae2178e5ef73da33d83fba Mon Sep 17 00:00:00 2001 From: buildmaster Date: Fri, 25 May 2018 13:22:50 +0000 Subject: [PATCH 03/84] Update SNAPSHOT to 2.0.0.RC2 --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- .../project/gradle.properties | 2 +- .../pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 16 ++++++++-------- samples/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 6 +++--- samples/wiremock-native/pom.xml | 6 +++--- samples/wiremock-tomcat/pom.xml | 6 +++--- samples/wiremock-undertow-ssl/pom.xml | 6 +++--- samples/wiremock-undertow/pom.xml | 6 +++--- spring-cloud-contract-dependencies/pom.xml | 4 ++-- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../functionalTest/bootSimple/gradle.properties | 2 +- .../sampleJerseyProject/gradle.properties | 2 +- .../sampleProject/gradle.properties | 2 +- .../scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../spring-cloud-contract-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- 47 files changed, 71 insertions(+), 71 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 56aa94f9e4..8458742765 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-docker-parent pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index b904088e6f..e4cabd4892 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-docker pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index 02d46236c4..3ce5bf1430 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.0.RC2 diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index 1305d85edb..0e1f344afc 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-stub-runner-docker pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index 644d4e4222..20d181bd1a 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index 4d79ad5990..0ee3361369 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-build - 2.0.0.BUILD-SNAPSHOT + 2.0.1.RELEASE spring-cloud-contract-parent pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 Spring Cloud Contract Spring Cloud Contract @@ -26,12 +26,12 @@ 2.17 3.5.13 0.0.9 - 2.0.0.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT - Elmhurst.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT + 2.0.1.RELEASE + 2.0.0.RC1 + Elmhurst.RELEASE + 2.0.0.RC2 + 2.0.0.RC2 + 2.0.0.RC2 5.0.3 3.2.4 1.0-groovy-2.4 diff --git a/samples/pom.xml b/samples/pom.xml index 507f0b65c8..8ae9235882 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-samples pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index c44d15f4fe..83488cdcea 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-samples-standalone pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index 8fbf7d65f3..8ef3e05efd 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 jar wiremock-jetty @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.2.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index 213e758593..7837f72c35 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 jar wiremock-native @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.2.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index 63489e2b00..034eaa14fa 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 jar wiremock-tomcat @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.2.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index 2509769d4d..a2fa8aec81 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 jar wiremock-undertow-ssl @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.2.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index 5a56c2956e..c64357d4b9 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 jar wiremock-undertow @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.2.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index c4d2312890..0bf7a33503 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.0.0.BUILD-SNAPSHOT + 2.0.1.RELEASE spring-cloud-contract-dependencies - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index d9801e51b6..b25909787e 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index 57b84600ff..e04bb79dc5 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index c30ea485dc..99b3955d16 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index 8b72e0b72b..b1d54aed05 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index d2e0db15b9..ca12b4e8c8 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index 96270fd5bc..e3a1b339a0 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index e3cdfc5cb5..4d4ea8f0e1 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index 36c0f44aad..0f69926f28 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index 0f54ab7bc3..ecccc44538 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index d46fbd95d0..6dfa4cb459 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index 1946c9108a..8f9901cabd 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.0.RC2 org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index f6aa31661c..e02727ca59 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. 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 60b93febf8..7562f7445c 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.17.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.0.RC2 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 c98aae7429..48939dee7e 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.17.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.0.RC2 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 2ccc777609..5d1ed6fdb2 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.17.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT \ No newline at end of file +verifierVersion=2.0.0.RC2 \ 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 60b93febf8..7562f7445c 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.17.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.0.RC2 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 71bc3b0a02..46e9c26a96 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. @@ -33,7 +33,7 @@ 1.7 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml index 6b5ccca6d9..01f34dff45 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 4192af5a78..25dfa15699 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index b9b983d31b..b5e6fff1e8 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index 94712d4f63..3ee21a3891 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index 6d99636ccb..d0ce3cc8a4 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index e586adc71f..40f0c4514e 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index 79a18e3fcd..60ef9be636 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index 9ad4fa8a07..d1d4926e1c 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index 19e2e84ac2..ea7fc28f64 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index bd05d85268..36c4c53393 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index dc43e82d6d..bec18d12ed 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index fb29de0bb2..417967d142 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index ed4fe4a69b..70007ab7c6 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index 40a8270173..254192e0d2 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index 536e2b67d4..d87e4526c8 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index b514f41d0d..cba161ad3c 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RC2 .. spring-cloud-contract-stub-runner-stream From af93d926cbe203523721ad84fabc8e0ec48b8229 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Fri, 25 May 2018 13:31:27 +0000 Subject: [PATCH 04/84] Going back to snapshots --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- .../project/gradle.properties | 2 +- .../pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 16 ++++++++-------- samples/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 6 +++--- samples/wiremock-native/pom.xml | 6 +++--- samples/wiremock-tomcat/pom.xml | 6 +++--- samples/wiremock-undertow-ssl/pom.xml | 6 +++--- samples/wiremock-undertow/pom.xml | 6 +++--- spring-cloud-contract-dependencies/pom.xml | 4 ++-- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../functionalTest/bootSimple/gradle.properties | 2 +- .../sampleJerseyProject/gradle.properties | 2 +- .../sampleProject/gradle.properties | 2 +- .../scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../spring-cloud-contract-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- 47 files changed, 71 insertions(+), 71 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 8458742765..56aa94f9e4 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-docker-parent pom - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index e4cabd4892..b904088e6f 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-docker pom - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index 3ce5bf1430..02d46236c4 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -verifierVersion=2.0.0.RC2 +verifierVersion=2.0.0.BUILD-SNAPSHOT diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index 0e1f344afc..1305d85edb 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-docker pom - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index 20d181bd1a..644d4e4222 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index 0ee3361369..4d79ad5990 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-build - 2.0.1.RELEASE + 2.0.0.BUILD-SNAPSHOT spring-cloud-contract-parent pom - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Spring Cloud Contract @@ -26,12 +26,12 @@ 2.17 3.5.13 0.0.9 - 2.0.1.RELEASE - 2.0.0.RC1 - Elmhurst.RELEASE - 2.0.0.RC2 - 2.0.0.RC2 - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT + Elmhurst.BUILD-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT 5.0.3 3.2.4 1.0-groovy-2.4 diff --git a/samples/pom.xml b/samples/pom.xml index 8ae9235882..507f0b65c8 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-samples pom - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index 83488cdcea..c44d15f4fe 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-samples-standalone pom - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index 8ef3e05efd..8fbf7d65f3 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT jar wiremock-jetty @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.2.RELEASE + 2.0.0.RELEASE UTF-8 1.8 - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index 7837f72c35..213e758593 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT jar wiremock-native @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.2.RELEASE + 2.0.0.RELEASE UTF-8 1.8 - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index 034eaa14fa..63489e2b00 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT jar wiremock-tomcat @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.2.RELEASE + 2.0.0.RELEASE UTF-8 1.8 - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index a2fa8aec81..2509769d4d 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT jar wiremock-undertow-ssl @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.2.RELEASE + 2.0.0.RELEASE UTF-8 1.8 - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index c64357d4b9..5a56c2956e 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT jar wiremock-undertow @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.2.RELEASE + 2.0.0.RELEASE UTF-8 1.8 - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 0bf7a33503..c4d2312890 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.0.1.RELEASE + 2.0.0.BUILD-SNAPSHOT spring-cloud-contract-dependencies - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index b25909787e..d9801e51b6 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index e04bb79dc5..57b84600ff 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index 99b3955d16..c30ea485dc 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index b1d54aed05..8b72e0b72b 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index ca12b4e8c8..d2e0db15b9 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index e3a1b339a0..96270fd5bc 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index 4d4ea8f0e1..e3cdfc5cb5 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index 0f69926f28..36c0f44aad 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index ecccc44538..0f54ab7bc3 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index 6dfa4cb459..d46fbd95d0 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index 8f9901cabd..1946c9108a 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=2.0.0.RC2 +verifierVersion=2.0.0.BUILD-SNAPSHOT org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index e02727ca59..f6aa31661c 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. 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 7562f7445c..60b93febf8 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.17.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.RC2 +verifierVersion=2.0.0.BUILD-SNAPSHOT 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 48939dee7e..c98aae7429 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.17.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.RC2 +verifierVersion=2.0.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 5d1ed6fdb2..2ccc777609 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.17.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.RC2 \ No newline at end of file +verifierVersion=2.0.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 7562f7445c..60b93febf8 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.17.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.RC2 +verifierVersion=2.0.0.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 46e9c26a96..71bc3b0a02 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. @@ -33,7 +33,7 @@ 1.7 - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml index 01f34dff45..6b5ccca6d9 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 25dfa15699..4192af5a78 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index b5e6fff1e8..b9b983d31b 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index 3ee21a3891..94712d4f63 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index d0ce3cc8a4..6d99636ccb 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index 40f0c4514e..e586adc71f 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index 60ef9be636..79a18e3fcd 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index d1d4926e1c..9ad4fa8a07 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index ea7fc28f64..19e2e84ac2 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index 36c4c53393..bd05d85268 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index bec18d12ed..dc43e82d6d 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index 417967d142..fb29de0bb2 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index 70007ab7c6..ed4fe4a69b 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index 254192e0d2..40a8270173 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index d87e4526c8..536e2b67d4 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index cba161ad3c..b514f41d0d 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RC2 + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-stream From ca7ce7522c738f82fc47b854dbde0b0b19331bca Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 29 May 2018 17:08:39 +0200 Subject: [PATCH 05/84] Bumped WireMock to 2.18.0; fixes gh-659 --- spring-cloud-contract-dependencies/pom.xml | 2 +- .../functionalTest/bootSimple/gradle.properties | 2 +- .../sampleJerseyProject/gradle.properties | 2 +- .../functionalTest/sampleProject/gradle.properties | 2 +- .../scenarioProject/gradle.properties | 2 +- .../wiremock/restdocs/BasicMappingBuilder.java | 13 +++++++++++++ .../wiremock/restdocs/ContractExchangeHandler.java | 12 ++++++++++++ 7 files changed, 30 insertions(+), 5 deletions(-) diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index c4d2312890..fe614fb362 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.17.0 + 2.18.0 0.4.12 1.0.2.v20150114 3.0.7 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 60b93febf8..3643670a05 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.17.0 +wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 verifierVersion=2.0.0.BUILD-SNAPSHOT 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 c98aae7429..1ae8b4638b 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.17.0 +wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 verifierVersion=2.0.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 2ccc777609..1f273d5c74 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.17.0 +wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 verifierVersion=2.0.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 60b93febf8..3643670a05 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.17.0 +wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 verifierVersion=2.0.0.BUILD-SNAPSHOT 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 a9ebaa1db5..92ced4f27a 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 @@ -7,6 +7,7 @@ import java.util.UUID; import com.github.tomakehurst.wiremock.client.BasicCredentials; import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; import com.github.tomakehurst.wiremock.client.ScenarioMappingBuilder; +import com.github.tomakehurst.wiremock.common.Metadata; import com.github.tomakehurst.wiremock.extension.Parameters; import com.github.tomakehurst.wiremock.http.Request; import com.github.tomakehurst.wiremock.http.RequestMethod; @@ -142,6 +143,18 @@ class BasicMappingBuilder implements ScenarioMappingBuilder { return this; } + @Override public ScenarioMappingBuilder withMetadata(Map map) { + throw new UnsupportedOperationException("Metadata not supported"); + } + + @Override public ScenarioMappingBuilder withMetadata(Metadata metadata) { + throw new UnsupportedOperationException("Metadata not supported"); + } + + @Override public ScenarioMappingBuilder withMetadata(Metadata.Builder builder) { + throw new UnsupportedOperationException("Metadata not supported"); + } + @Override public StubMapping build() { if (this.scenarioName == null && (this.requiredScenarioState != null || this.newScenarioState != null)) { diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java index 6e84cd2077..f1dc5e56f3 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java @@ -131,6 +131,18 @@ class WireMockHttpRequestAdapter implements Request { return new RequestMethod(this.result.getMethod().name()); } + @Override public String getScheme() { + return this.result.getUrl().getScheme(); + } + + @Override public String getHost() { + return this.result.getUrl().getHost(); + } + + @Override public int getPort() { + return this.result.getUrl().getPort(); + } + @Override public String getClientIp() { return "127.0.0.1"; } From 6423e546166ecad776a470994ca42856e7680443 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Tue, 5 Jun 2018 16:03:25 -0400 Subject: [PATCH 06/84] Updates s-c-build to 2.0.2.BUILD-SNAPSHOT --- pom.xml | 2 +- spring-cloud-contract-dependencies/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4d79ad5990..ecf8b86043 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-build - 2.0.0.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index fe614fb362..460ca1d641 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,7 +5,7 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.0.0.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT spring-cloud-contract-dependencies From e2f9daea3bb38bc4fd3bbb581104225283a77bf4 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Tue, 5 Jun 2018 16:06:46 -0400 Subject: [PATCH 07/84] Updates s-c-build to 2.0.2.BUILD-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ecf8b86043..d63777dfb9 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ 2.17 3.5.13 0.0.9 - 2.0.0.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT Elmhurst.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT From d72524173d09cdefd8781d7e97b138c70869f88b Mon Sep 17 00:00:00 2001 From: Henry Jonathan Date: Fri, 8 Jun 2018 17:25:37 +0700 Subject: [PATCH 08/84] Contract for multipart/mixed endpoint backport to 1.2.x (#662) * apply cherry pick based on b965c49a7efee44a64c72f1c4420899cec0fa4d3 and fix conflict --- .gitignore | 1 + .../loan/LoanApplicationServiceTests.java | 45 ++++++++++++++++ .../com/example/fraud/TestController.java | 36 +++++++++++++ .../java/com/example/fraud/MultipartBase.java | 14 +++++ ...ouldWorkForMultipartWithContentType.groovy | 33 ++++++++++++ .../resources/contracts/multipart/test.json | 3 ++ .../contract/spec/internal/Common.groovy | 4 ++ .../spec/internal/NamedProperty.groovy | 23 +++++++- .../spec/internal/RegexPatterns.groovy | 16 +++++- .../spring-cloud-contract-converters/pom.xml | 5 ++ .../DslToWireMockClientConverterSpec.groovy | 4 ++ .../pom.xml | 4 +- .../WireMockRequestStubStrategy.groovy | 4 +- .../verifier/util/ContentUtils.groovy | 24 ++++++++- .../MockMvcMethodBodyBuilderSpec.groovy | 54 ++++++++++++++++++- 15 files changed, 261 insertions(+), 9 deletions(-) create mode 100644 samples/standalone/dsl/http-server/src/main/java/com/example/fraud/TestController.java create mode 100644 samples/standalone/dsl/http-server/src/test/java/com/example/fraud/MultipartBase.java create mode 100644 samples/standalone/dsl/http-server/src/test/resources/contracts/multipart/shouldWorkForMultipartWithContentType.groovy create mode 100644 samples/standalone/dsl/http-server/src/test/resources/contracts/multipart/test.json diff --git a/.gitignore b/.gitignore index e92ba1f3f9..c816816adf 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ bin/ # Package Files # *.war *.ear +*.versionsBackup # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* diff --git a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java index 97ff1f3e34..2daa188acc 100644 --- a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -6,6 +6,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; +import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; @@ -13,6 +17,9 @@ import com.example.loan.model.Client; import com.example.loan.model.LoanApplication; import com.example.loan.model.LoanApplicationResult; import com.example.loan.model.LoanApplicationStatus; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; import static org.assertj.core.api.Assertions.assertThat; @@ -79,4 +86,42 @@ public class LoanApplicationServiceTests { assertThat(cookies).isEqualTo("foo bar"); } + @Test + public void shouldSuccessfullyWorkWithMultipart() { + MultiValueMap parameters = new LinkedMultiValueMap<>(); + + parameters.add("file1", new ByteArrayResource(("content1").getBytes()) { + @Override + public String getFilename() { + return "filename1"; + } + }); + parameters.add("file2", new ByteArrayResource(("content2").getBytes()) { + @Override + public String getFilename() { + return "filename2"; + } + }); + + HttpHeaders jsonHeader = new HttpHeaders(); + jsonHeader.set("Content-Type", "application/json"); + parameters.add("test", new HttpEntity<>(new ByteArrayResource(("{\n \"status\": \"test\"\n}").getBytes()) { + @Override + public String getFilename() { + return "filename3"; + } + }, jsonHeader)); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Content-Type", "multipart/form-data"); + headers.set("Accept", "text/plain"); + + String result = new RestTemplate().postForObject( + "http://localhost:6565/tests", + new HttpEntity>(parameters, headers), + String.class); + + assertThat(result).isEqualTo("{\"status\":\"ok\"}"); + } + } diff --git a/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/TestController.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/TestController.java new file mode 100644 index 0000000000..4ca3826ef2 --- /dev/null +++ b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/TestController.java @@ -0,0 +1,36 @@ +package com.example.fraud; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RestController +public class TestController { + + @PostMapping("/tests") + public Test createNew(@RequestPart MultipartFile file1, + @RequestPart MultipartFile file2, + @RequestPart Test test) { + return new Test("ok"); + } +} + +class Test { + private String status; + + public Test(String status) { + this.status = status; + } + + public Test() { + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} \ No newline at end of file diff --git a/samples/standalone/dsl/http-server/src/test/java/com/example/fraud/MultipartBase.java b/samples/standalone/dsl/http-server/src/test/java/com/example/fraud/MultipartBase.java new file mode 100644 index 0000000000..90a87c0636 --- /dev/null +++ b/samples/standalone/dsl/http-server/src/test/java/com/example/fraud/MultipartBase.java @@ -0,0 +1,14 @@ +package com.example.fraud; + +import com.example.fraud.TestController; +import io.restassured.module.mockmvc.RestAssuredMockMvc; +import org.junit.Before; +import org.junit.runner.RunWith; + +public class MultipartBase { + + @Before + public void setUp() throws Exception { + RestAssuredMockMvc.standaloneSetup(new TestController()); + } +} \ No newline at end of file diff --git a/samples/standalone/dsl/http-server/src/test/resources/contracts/multipart/shouldWorkForMultipartWithContentType.groovy b/samples/standalone/dsl/http-server/src/test/resources/contracts/multipart/shouldWorkForMultipartWithContentType.groovy new file mode 100644 index 0000000000..d92995081f --- /dev/null +++ b/samples/standalone/dsl/http-server/src/test/resources/contracts/multipart/shouldWorkForMultipartWithContentType.groovy @@ -0,0 +1,33 @@ +import org.springframework.cloud.contract.spec.Contract + +Contract.make { + request { + method 'POST' + url '/tests' + multipart( + file1: named( + name: value(consumer(regex(nonEmpty())), producer('filename1')), + content: value(consumer(regex(nonEmpty())), producer('content1'))), + file2: named( + name: value(consumer(regex(nonEmpty())), producer('filename2')), + content: value(c(regex(nonEmpty())), producer('content2'))), + test : named( + name: value(consumer(regex(nonEmpty())), producer('filename3')), + content: value(c(regex(nonEmpty())), producer(file("test.json"))), + contentType: "application/json") + ) + + headers { + contentType('multipart/form-data') + } + } + response { + status 200 + body('''\ + {"status":"ok"} + ''') + headers { + contentType('application/json') + } + } +} diff --git a/samples/standalone/dsl/http-server/src/test/resources/contracts/multipart/test.json b/samples/standalone/dsl/http-server/src/test/resources/contracts/multipart/test.json new file mode 100644 index 0000000000..21a721f25a --- /dev/null +++ b/samples/standalone/dsl/http-server/src/test/resources/contracts/multipart/test.json @@ -0,0 +1,3 @@ +{ + "status": "test" +} \ No newline at end of file diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Common.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Common.groovy index 122d042ef0..2df6946abb 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Common.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Common.groovy @@ -71,6 +71,10 @@ class Common { return new NamedProperty(name, value) } + NamedProperty named(DslProperty name, DslProperty value, DslProperty contentType) { + return new NamedProperty(name, value, contentType) + } + NamedProperty named(Map namedMap){ return new NamedProperty(namedMap) } diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/NamedProperty.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/NamedProperty.groovy index 2907acf2f5..6ffea29205 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/NamedProperty.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/NamedProperty.groovy @@ -33,16 +33,37 @@ class NamedProperty { private static final String NAME = 'name' private static final String CONTENT = 'content' + private static final String CONTENT_TYPE = 'contentType' DslProperty name DslProperty value + DslProperty contentType NamedProperty(DslProperty name, DslProperty value) { this.name = name this.value = value + this.contentType = null + } + + NamedProperty(DslProperty name, DslProperty value, DslProperty contentType) { + this.name = name + this.value = value + this.contentType = contentType } NamedProperty(Map namedMap) { - this(namedMap?.get(NAME), namedMap?.get(CONTENT)) + this(asDslProperty(namedMap?.get(NAME)), + asDslProperty(namedMap?.get(CONTENT)), + asDslProperty(namedMap?.get(CONTENT_TYPE))) + } + + static DslProperty asDslProperty(Object o) { + if (o == null) { + return null + } + if (o instanceof DslProperty) { + return o + } + return new DslProperty(o) } } diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/RegexPatterns.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/RegexPatterns.groovy index 17be0c063a..c2ebc60754 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/RegexPatterns.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/RegexPatterns.groovy @@ -25,6 +25,8 @@ import java.util.regex.Pattern /** * Contains most common regular expression patterns * + * @author Marcin Grzejszczak + * @author Tim Ysewyn * @since 1.0.0 */ @CompileStatic @@ -114,8 +116,18 @@ class RegexPatterns { return ".*--(.*)\r\nContent-Disposition: form-data; name=\"$name\"\r\n(Content-Type: .*\r\n)?(Content-Length: \\d+\r\n)?\r\n$value\r\n--\\1.*" } - static String multipartFile(Object name, Object filename, Object content) { - return ".*--(.*)\r\nContent-Disposition: form-data; name=\"$name\"; filename=\"$filename\"\r\n(Content-Type: .*\r\n)?(Content-Length: \\d+\r\n)?\r\n$content\r\n--\\1.*"; + static String multipartFile(Object name, Object filename, Object content, Object contentType) { + return ".*--(.*)\r\nContent-Disposition: form-data; name=\"$name\"; filename=\"$filename\"\r\n(Content-Type: ${toContentType(contentType)}\r\n)?(Content-Length: \\d+\r\n)?\r\n$content\r\n--\\1.*"; + } + + private static String toContentType(Object contentType) { + if (contentType == null) { + return '.*' + } + if (contentType instanceof Pattern) { + return contentType.pattern() + } + return contentType.toString() } } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index 797fd30577..21345dd057 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -66,6 +66,11 @@ spring-boot-starter-web test + + io.rest-assured + rest-assured + test + diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockClientConverterSpec.groovy b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockClientConverterSpec.groovy index 2f1644ca0d..b15eb488b3 100755 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockClientConverterSpec.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockClientConverterSpec.groovy @@ -28,7 +28,11 @@ import org.springframework.cloud.contract.verifier.dsl.wiremock.WireMockStubMapp import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.verifier.file.ContractMetadata import org.springframework.cloud.contract.verifier.util.ContractVerifierDslConverter +import org.springframework.core.io.ByteArrayResource +import org.springframework.http.HttpEntity import org.springframework.http.RequestEntity +import org.springframework.util.LinkedMultiValueMap +import org.springframework.util.MultiValueMap import org.springframework.util.SocketUtils import spock.lang.Issue import spock.lang.Specification diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 7817a7db57..3a3d5aba61 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -208,10 +208,10 @@ true true - ${project.basedir}/src/main/java,${project.basedir}/src/main/groovy + ${project.basedir}/src/main/java,${project.basedir}/src/main/groovy - ${project.basedir}/src/test/java,${project.basedir}/src/test/groovy + ${project.basedir}/src/test/java,${project.basedir}/src/test/groovy diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy index c19f145576..0f0c83ffb7 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy @@ -132,7 +132,9 @@ class WireMockRequestStubStrategy extends BaseWireMockStubStrategy { if (request.multipart.clientValue instanceof Map) { List multipartPatterns = (request.multipart.clientValue as Map).collect { (it.value instanceof NamedProperty - ? WireMock.matching(RegexPatterns.multipartFile(it.key, (it.value as NamedProperty).name.clientValue, (it.value as NamedProperty).value.clientValue)) + ? WireMock.matching(RegexPatterns.multipartFile(it.key, (it.value as NamedProperty).name.clientValue, + (it.value as NamedProperty).value.clientValue, + (it.value as NamedProperty).contentType?.clientValue)) : WireMock.matching(RegexPatterns.multipartParam(it.key, it.value)) ) } multipartPatterns.each { diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy index 140dced5b3..5b16fc20fd 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy @@ -388,11 +388,13 @@ class ContentUtils { } static String getGroovyMultipartFileParameterContent(String propertyName, NamedProperty propertyValue) { - return "'$propertyName', ${namedPropertyName(propertyValue, "'")}, ${namedPropertyValue(propertyValue, "'")}.bytes" + return "'$propertyName', ${namedPropertyName(propertyValue, "'")}, " + + "${namedPropertyValue(propertyValue, "'")}.bytes" + namedContentTypeNameIfPresent(propertyValue, "'") } static String getJavaMultipartFileParameterContent(String propertyName, NamedProperty propertyValue) { - return """"${escapeJava(propertyName)}", ${namedPropertyName(propertyValue, '"')}, ${namedPropertyValue(propertyValue, '"')}.getBytes()""" + return """"${escapeJava(propertyName)}", ${namedPropertyName(propertyValue, '"')}, """ + + """${javaNamedPropertyValue(propertyValue, '"')}${namedContentTypeNameIfPresent(propertyValue, '"')}""" } static String namedPropertyName(NamedProperty property, String quote) { @@ -400,9 +402,27 @@ class ContentUtils { property.name.serverValue.toString() : quote + escapeJava(property.name.serverValue.toString()) + quote } + static String namedContentTypeNameIfPresent(NamedProperty property, String quote) { + if (!property.contentType) { + return "" + } + String contentType = property.contentType.serverValue instanceof ExecutionProperty ? + property.contentType.serverValue.toString() : quote + escapeJava(property.contentType.serverValue.toString()) + quote + return ", " + contentType + } + static String namedPropertyValue(NamedProperty property, String quote) { return property.value.serverValue instanceof ExecutionProperty ? property.value.serverValue.toString() : quote + escapeJava(property.value.serverValue.toString()) + quote } + static String javaNamedPropertyValue(NamedProperty property, String quote) { + if (property.value.serverValue instanceof ExecutionProperty) { + return property.value.serverValue.toString() + } else if (property.value.serverValue instanceof byte[]) { + byte[] bytes = (byte[]) property.value.serverValue + return "new byte[] {" + bytes.collect { it }.join(", ") + "}" + } + return quote + escapeJava(property.value.serverValue.toString()) + quote + ".getBytes()" + } } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy index b06594888c..4a61e3c4bf 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy @@ -1249,7 +1249,9 @@ World.'''""" // name of the file name: $(c(regex(nonEmpty())), p('filename.csv')), // content of the file - content: $(c(regex(nonEmpty())), p('file content'))) + content: $(c(regex(nonEmpty())), p('file content')), + // content type for the part + contentType: $(c(regex(nonEmpty())), p('application/json'))) ) } response { @@ -1270,6 +1272,56 @@ World.'''""" SyntaxChecker.tryToCompile(methodBuilderName, blockBuilder.toString()) where: methodBuilderName | methodBuilder | requestStrings + "MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) } | ['"Content-Type", "multipart/form-data;boundary=AaB03x"', + """.param('formParameter', '"formParameterValue"'""", + """.param('someBooleanParameter', 'true')""", + """.multiPart('file', 'filename.csv', 'file content'.bytes, 'application/json')"""] + "MockMvcJUnitMethodBuilder" | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties) } | ['"Content-Type", "multipart/form-data;boundary=AaB03x"', + '.param("formParameter", "\\"formParameterValue\\"")', + '.param("someBooleanParameter", "true")', + '.multiPart("file", "filename.csv", "file content".getBytes(), "application/json");'] + } + + @Issue('180') + def "should generate proper test code when having multipart parameters without content type with #methodBuilderName"() { + given: + org.springframework.cloud.contract.spec.Contract contractDsl = org.springframework.cloud.contract.spec.Contract.make { + request { + method "PUT" + url "/multipart" + headers { + contentType('multipart/form-data;boundary=AaB03x') + } + multipart( + // key (parameter name), value (parameter value) pair + formParameter: $(c(regex('".+"')), p('"formParameterValue"')), + someBooleanParameter: $(c(regex(anyBoolean())), p('true')), + // a named parameter (e.g. with `file` name) that represents file with + // `name` and `content`. You can also call `named("fileName", "fileContent")` + file: named( + // name of the file + name: $(c(regex(nonEmpty())), p('filename.csv')), + // content of the file + content: $(c(regex(nonEmpty())), p('file content'))) + ) + } + response { + status 200 + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + when: + builder.appendTo(blockBuilder) + def test = blockBuilder.toString() + then: + for (String requestString : requestStrings) { + assert test.contains(requestString) + } + and: + SyntaxChecker.tryToCompile(methodBuilderName, blockBuilder.toString()) + where: + methodBuilderName | methodBuilder | requestStrings "MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) } | ['"Content-Type", "multipart/form-data;boundary=AaB03x"', """.param('formParameter', '"formParameterValue"'""", """.param('someBooleanParameter', 'true')""", From 8e4af644b29025aa7d2f7337b0ef7724d77270a0 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Mon, 11 Jun 2018 10:57:13 -0400 Subject: [PATCH 09/84] adding spring boot autoconfigure processor --- spring-cloud-contract-stub-runner/pom.xml | 5 +++++ .../spring-cloud-contract-converters/pom.xml | 5 +++++ .../spring-cloud-contract-spec-pact/pom.xml | 5 +++++ spring-cloud-contract-verifier/pom.xml | 5 +++++ spring-cloud-contract-wiremock/pom.xml | 5 +++++ 5 files changed, 25 insertions(+) diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index 539b162bb9..c94cea0794 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -75,6 +75,11 @@ spring-integration-java-dsl true + + org.springframework.boot + spring-boot-autoconfigure-processor + true + junit junit diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index 21345dd057..40da48d031 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -41,6 +41,11 @@ com.github.tomakehurst wiremock-standalone + + org.springframework.boot + spring-boot-autoconfigure-processor + true + org.spockframework spock-core diff --git a/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml index a6b5630d7f..f0c965536f 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml @@ -38,6 +38,11 @@ pact-jvm-model true + + org.springframework.boot + spring-boot-autoconfigure-processor + true + org.spockframework spock-core diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 3a8579b617..9cf6c6a5ac 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -93,6 +93,11 @@ org.yaml snakeyaml + + org.springframework.boot + spring-boot-autoconfigure-processor + true + cglib cglib diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index 6f8345f2fc..d98b1fe27d 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -25,6 +25,11 @@ org.springframework.boot spring-boot-starter + + org.springframework.boot + spring-boot-autoconfigure-processor + true + org.springframework.boot spring-boot-starter-tomcat From 30614360be7b7bf264b98661c878a1e91b875a7b Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 15 Jun 2018 11:29:04 +0200 Subject: [PATCH 10/84] Updated docs with missing stubs mode env var; gixes gh-666 --- docs/src/main/asciidoc/verifier_stubrunner.adoc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/src/main/asciidoc/verifier_stubrunner.adoc b/docs/src/main/asciidoc/verifier_stubrunner.adoc index b637b07a91..f0711d1bd4 100644 --- a/docs/src/main/asciidoc/verifier_stubrunner.adoc +++ b/docs/src/main/asciidoc/verifier_stubrunner.adoc @@ -154,7 +154,7 @@ $ STUBRUNNER_PORT="8083" $ STUBRUNNER_IDS="com.example:bookstore:0.0.1.RELEASE:stubs:9876" $ STUBRUNNER_REPOSITORY_ROOT="http://${APP_IP}:8081/artifactory/libs-release-local" # Run the docker with Stub Runner Boot -$ docker run --rm -e "STUBRUNNER_IDS=${STUBRUNNER_IDS}" -e "STUBRUNNER_REPOSITORY_ROOT=${STUBRUNNER_REPOSITORY_ROOT}" -p "${STUBRUNNER_PORT}:${STUBRUNNER_PORT}" -p "9876:9876" springcloud/spring-cloud-contract-stub-runner:"${SC_CONTRACT_DOCKER_VERSION}" +$ docker run --rm -e "STUBRUNNER_IDS=${STUBRUNNER_IDS}" -e "STUBRUNNER_REPOSITORY_ROOT=${STUBRUNNER_REPOSITORY_ROOT}" -e "STUBRUNNER_STUBS_MODE=REMOTE" -p "${STUBRUNNER_PORT}:${STUBRUNNER_PORT}" -p "9876:9876" springcloud/spring-cloud-contract-stub-runner:"${SC_CONTRACT_DOCKER_VERSION}" ``` What's happening is that @@ -174,4 +174,8 @@ $ curl -H "Content-Type:application/json" -X POST --data '{ "title" : "Title", " # Now time for the second request $ curl -X GET http://localhost:9876/api/books # You will receive contents of the JSON -``` \ No newline at end of file +``` + +IMPORTANT: If you want use the stubs that you have built locally, on your host, +then you should pass the environment variable `-e STUBRUNNER_STUBS_MODE=LOCAL` and mount +the volume of your local m2 `-v "${HOME}/.m2/:/root/.m2:ro"` \ No newline at end of file From e67b969762d07dda4481c47b5d39a38ad3ebd67b Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 18 Jun 2018 13:15:46 +0200 Subject: [PATCH 11/84] Removed camel reference --- docs/src/main/asciidoc/verifier_messaging.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/main/asciidoc/verifier_messaging.adoc b/docs/src/main/asciidoc/verifier_messaging.adoc index ec9736890b..37eb497f2a 100644 --- a/docs/src/main/asciidoc/verifier_messaging.adoc +++ b/docs/src/main/asciidoc/verifier_messaging.adoc @@ -87,7 +87,7 @@ it is resolved as a channel name. For *Camel*, that's a certain component (for e ==== Scenario 1: No Input Message -Here is an example for Camel. For the given contract: +For the given contract: .Groovy DSL [source,groovy] @@ -117,7 +117,7 @@ include::{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract ==== Scenario 2: Output Triggered by Input -Here is an example for Camel. For the given contract: +For the given contract: .Groovy DSL [source,groovy] @@ -147,7 +147,7 @@ include::{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract ==== Scenario 3: No Output Message -Here is an example for Camel. For the given contract: +For the given contract: .Groovy DSL [source,groovy] From ffeb8f74eb95fa53755b5376a44405685381d3ba Mon Sep 17 00:00:00 2001 From: buildmaster Date: Tue, 19 Jun 2018 01:22:57 +0000 Subject: [PATCH 12/84] Update SNAPSHOT to 2.0.0.RELEASE --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- .../project/gradle.properties | 2 +- .../pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 16 ++++++++-------- samples/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 6 +++--- samples/wiremock-native/pom.xml | 6 +++--- samples/wiremock-tomcat/pom.xml | 6 +++--- samples/wiremock-undertow-ssl/pom.xml | 6 +++--- samples/wiremock-undertow/pom.xml | 6 +++--- spring-cloud-contract-dependencies/pom.xml | 4 ++-- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../functionalTest/bootSimple/gradle.properties | 2 +- .../sampleJerseyProject/gradle.properties | 2 +- .../sampleProject/gradle.properties | 2 +- .../scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../spring-cloud-contract-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- 47 files changed, 71 insertions(+), 71 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 56aa94f9e4..7dad9e5665 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-docker-parent pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index b904088e6f..f9f44f6a6d 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-docker pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index 02d46236c4..aa49c5f554 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.0.RELEASE diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index 1305d85edb..c052dd1bfd 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-stub-runner-docker pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index 644d4e4222..eb00e66519 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index d63777dfb9..1b00acf67f 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-build - 2.0.2.BUILD-SNAPSHOT + 2.0.2.RELEASE spring-cloud-contract-parent pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE Spring Cloud Contract Spring Cloud Contract @@ -26,12 +26,12 @@ 2.17 3.5.13 0.0.9 - 2.0.2.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT - Elmhurst.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT + 2.0.2.RELEASE + 2.0.0.RELEASE + Elmhurst.RELEASE + 2.0.0.RELEASE + 2.0.0.RELEASE + 2.0.0.RELEASE 5.0.3 3.2.4 1.0-groovy-2.4 diff --git a/samples/pom.xml b/samples/pom.xml index 507f0b65c8..273293c494 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-samples pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index c44d15f4fe..b19ef8bd78 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-samples-standalone pom - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index 8fbf7d65f3..26ef535ed7 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE jar wiremock-jetty @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index 213e758593..c98d7dbda2 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE jar wiremock-native @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index 63489e2b00..ee2a4f85d5 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE jar wiremock-tomcat @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index 2509769d4d..d5f12687ef 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE jar wiremock-undertow-ssl @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index 5a56c2956e..337af5e062 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE jar wiremock-undertow @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 460ca1d641..19f3d6e6d9 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.0.2.BUILD-SNAPSHOT + 2.0.2.RELEASE spring-cloud-contract-dependencies - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index d9801e51b6..2d0609de05 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index 57b84600ff..8a89a13152 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index c30ea485dc..cd2e83342d 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index 8b72e0b72b..5f4ba54959 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index d2e0db15b9..b1a4db926c 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index 96270fd5bc..a43ce048c4 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index e3cdfc5cb5..3d41852b3b 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index 3baa5e8fd6..cb4358258c 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index 0f54ab7bc3..aec0f6f12c 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index ea240e7ee6..2ea19fb5f6 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index 1946c9108a..01f03252eb 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.0.RELEASE org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index f6aa31661c..609a1728e7 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. 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 3643670a05..fadfe75085 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.0.RELEASE 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 1ae8b4638b..331dca75e4 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.0.RELEASE 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 1f273d5c74..6d10798d9a 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT \ No newline at end of file +verifierVersion=2.0.0.RELEASE \ 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 3643670a05..fadfe75085 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.0.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 59489db54c..7b86ef7ce7 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. @@ -33,7 +33,7 @@ 1.7 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml index d6fafbf279..a0bb4b9607 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 2a71e698e5..90cd4602d2 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index c6b64fffa8..2aef05612d 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index 94712d4f63..518217f260 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index 6d99636ccb..e8ddeba0ff 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index e586adc71f..4417603024 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index 79a18e3fcd..39eda05bb8 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index 9ad4fa8a07..4da50c0cfa 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index 19e2e84ac2..1c3cfe4ab8 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index bd05d85268..d5ea669653 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index dc43e82d6d..ca3674e49d 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index fb29de0bb2..2642f5d5e3 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index ed4fe4a69b..23b82950e9 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index 40a8270173..a28290dda6 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index 536e2b67d4..30d06181b9 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index b514f41d0d..1e40ece408 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE .. spring-cloud-contract-stub-runner-stream From 8540c6ffdded38b60fc48c4fb1cacc3867e53eb2 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Tue, 19 Jun 2018 01:35:04 +0000 Subject: [PATCH 13/84] Going back to snapshots --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- .../project/gradle.properties | 2 +- .../pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 16 ++++++++-------- samples/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 6 +++--- samples/wiremock-native/pom.xml | 6 +++--- samples/wiremock-tomcat/pom.xml | 6 +++--- samples/wiremock-undertow-ssl/pom.xml | 6 +++--- samples/wiremock-undertow/pom.xml | 6 +++--- spring-cloud-contract-dependencies/pom.xml | 4 ++-- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../functionalTest/bootSimple/gradle.properties | 2 +- .../sampleJerseyProject/gradle.properties | 2 +- .../sampleProject/gradle.properties | 2 +- .../scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../spring-cloud-contract-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- 47 files changed, 71 insertions(+), 71 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 7dad9e5665..56aa94f9e4 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-docker-parent pom - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index f9f44f6a6d..b904088e6f 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-docker pom - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index aa49c5f554..02d46236c4 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -verifierVersion=2.0.0.RELEASE +verifierVersion=2.0.0.BUILD-SNAPSHOT diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index c052dd1bfd..1305d85edb 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-docker pom - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index eb00e66519..644d4e4222 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index 1b00acf67f..d63777dfb9 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-build - 2.0.2.RELEASE + 2.0.2.BUILD-SNAPSHOT spring-cloud-contract-parent pom - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Spring Cloud Contract @@ -26,12 +26,12 @@ 2.17 3.5.13 0.0.9 - 2.0.2.RELEASE - 2.0.0.RELEASE - Elmhurst.RELEASE - 2.0.0.RELEASE - 2.0.0.RELEASE - 2.0.0.RELEASE + 2.0.2.BUILD-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT + Elmhurst.BUILD-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT 5.0.3 3.2.4 1.0-groovy-2.4 diff --git a/samples/pom.xml b/samples/pom.xml index 273293c494..507f0b65c8 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-samples pom - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index b19ef8bd78..c44d15f4fe 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-samples-standalone pom - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index 26ef535ed7..8fbf7d65f3 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT jar wiremock-jetty @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.0.RELEASE UTF-8 1.8 - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index c98d7dbda2..213e758593 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT jar wiremock-native @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.0.RELEASE UTF-8 1.8 - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index ee2a4f85d5..63489e2b00 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT jar wiremock-tomcat @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.0.RELEASE UTF-8 1.8 - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index d5f12687ef..2509769d4d 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT jar wiremock-undertow-ssl @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.0.RELEASE UTF-8 1.8 - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index 337af5e062..5a56c2956e 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT jar wiremock-undertow @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.0.RELEASE UTF-8 1.8 - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 19f3d6e6d9..460ca1d641 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.0.2.RELEASE + 2.0.2.BUILD-SNAPSHOT spring-cloud-contract-dependencies - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index 2d0609de05..d9801e51b6 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index 8a89a13152..57b84600ff 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index cd2e83342d..c30ea485dc 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index 5f4ba54959..8b72e0b72b 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index b1a4db926c..d2e0db15b9 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index a43ce048c4..96270fd5bc 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index 3d41852b3b..e3cdfc5cb5 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index cb4358258c..3baa5e8fd6 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index aec0f6f12c..0f54ab7bc3 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index 2ea19fb5f6..ea240e7ee6 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index 01f03252eb..1946c9108a 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=2.0.0.RELEASE +verifierVersion=2.0.0.BUILD-SNAPSHOT org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index 609a1728e7..f6aa31661c 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. 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 fadfe75085..3643670a05 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.RELEASE +verifierVersion=2.0.0.BUILD-SNAPSHOT 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 331dca75e4..1ae8b4638b 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.RELEASE +verifierVersion=2.0.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 6d10798d9a..1f273d5c74 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.RELEASE \ No newline at end of file +verifierVersion=2.0.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 fadfe75085..3643670a05 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.RELEASE +verifierVersion=2.0.0.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 7b86ef7ce7..59489db54c 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. @@ -33,7 +33,7 @@ 1.7 - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml index a0bb4b9607..d6fafbf279 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 90cd4602d2..2a71e698e5 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index 2aef05612d..c6b64fffa8 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index 518217f260..94712d4f63 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index e8ddeba0ff..6d99636ccb 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index 4417603024..e586adc71f 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index 39eda05bb8..79a18e3fcd 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index 4da50c0cfa..9ad4fa8a07 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index 1c3cfe4ab8..19e2e84ac2 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index d5ea669653..bd05d85268 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index ca3674e49d..dc43e82d6d 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index 2642f5d5e3..fb29de0bb2 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index 23b82950e9..ed4fe4a69b 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index a28290dda6..40a8270173 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index 30d06181b9..536e2b67d4 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index 1e40ece408..b514f41d0d 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.RELEASE + 2.0.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-stream From 3be8122604621427431551149ce66d043c21158e Mon Sep 17 00:00:00 2001 From: buildmaster Date: Tue, 19 Jun 2018 01:35:06 +0000 Subject: [PATCH 14/84] Bumping versions to 2.0.1.BUILD-SNAPSHOT after release --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- .../spring-cloud-contract-docker/project/gradle.properties | 2 +- docker/spring-cloud-contract-stub-runner-docker/pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 6 +++--- samples/pom.xml | 4 ++-- samples/standalone/contracts/com/example/server/pom.xml | 4 ++-- samples/standalone/dsl/http-client/pom.xml | 2 +- samples/standalone/dsl/http-server/gradle.properties | 2 +- samples/standalone/dsl/http-server/pom.xml | 4 ++-- samples/standalone/dsl/pom.xml | 4 ++-- samples/standalone/messaging/pom.xml | 4 ++-- samples/standalone/messaging/stream-sink/gradle.properties | 2 +- samples/standalone/messaging/stream-sink/pom.xml | 4 ++-- .../standalone/messaging/stream-source/gradle.properties | 2 +- samples/standalone/messaging/stream-source/pom.xml | 4 ++-- samples/standalone/pact/pact-http-client/pom.xml | 2 +- samples/standalone/pact/pact-http-server/gradle.properties | 2 +- samples/standalone/pact/pact-http-server/pom.xml | 4 ++-- samples/standalone/pact/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/standalone/restdocs/http-client/gradle.properties | 2 +- samples/standalone/restdocs/http-client/pom.xml | 4 ++-- samples/standalone/restdocs/http-server/gradle.properties | 2 +- samples/standalone/restdocs/http-server/pom.xml | 4 ++-- samples/standalone/restdocs/pom.xml | 4 ++-- samples/standalone/webclient/http-client/gradle.properties | 2 +- samples/standalone/webclient/http-client/pom.xml | 4 ++-- samples/standalone/webclient/http-server/gradle.properties | 2 +- samples/standalone/webclient/http-server/pom.xml | 4 ++-- samples/standalone/webclient/pom.xml | 4 ++-- samples/standalone/yml/http-client/pom.xml | 2 +- samples/standalone/yml/http-server/gradle.properties | 2 +- samples/standalone/yml/http-server/pom.xml | 4 ++-- samples/standalone/yml/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 6 +++--- samples/wiremock-native/pom.xml | 6 +++--- samples/wiremock-tomcat/pom.xml | 6 +++--- samples/wiremock-undertow-ssl/pom.xml | 6 +++--- samples/wiremock-undertow/pom.xml | 6 +++--- spring-cloud-contract-dependencies/pom.xml | 2 +- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../spring-cloud-starter-contract-stub-runner-jetty/pom.xml | 2 +- .../spring-cloud-starter-contract-stub-runner/pom.xml | 2 +- .../spring-cloud-starter-contract-verifier/pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../spring-cloud-contract-gradle-plugin/gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../resources/functionalTest/bootSimple/gradle.properties | 2 +- .../functionalTest/sampleJerseyProject/gradle.properties | 2 +- .../functionalTest/sampleProject/gradle.properties | 2 +- .../functionalTest/scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../src/test/projects/complex-configuration/pom.xml | 2 +- .../projects/different-module-configuration/module/pom.xml | 2 +- .../src/test/projects/plugin-extension/pom.xml | 2 +- .../src/test/projects/spring-boot-groovy/pom.xml | 2 +- .../src/test/projects/spring-boot-java/pom.xml | 2 +- .../spring-cloud-contract-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-amqp/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml | 2 +- .../pom.xml | 2 +- .../spring-cloud-contract-stub-runner-context-path/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-integration/pom.xml | 2 +- .../pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-moco/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-stream/pom.xml | 2 +- 80 files changed, 114 insertions(+), 114 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 56aa94f9e4..51b7b49cce 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-docker-parent pom - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index b904088e6f..0d0e54d9e2 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-docker pom - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index 02d46236c4..47067d9b60 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index 1305d85edb..ffe73509e1 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-docker pom - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index 644d4e4222..830ea6c773 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index d63777dfb9..d4836fd792 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-build - 2.0.2.BUILD-SNAPSHOT + 2.0.2.RELEASE spring-cloud-contract-parent pom - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Spring Cloud Contract @@ -26,7 +26,7 @@ 2.17 3.5.13 0.0.9 - 2.0.2.BUILD-SNAPSHOT + 2.0.2.RELEASE 2.0.0.BUILD-SNAPSHOT Elmhurst.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT diff --git a/samples/pom.xml b/samples/pom.xml index 507f0b65c8..22dbb8a427 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-samples pom - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/contracts/com/example/server/pom.xml b/samples/standalone/contracts/com/example/server/pom.xml index 28ae7a8852..830253ce4b 100644 --- a/samples/standalone/contracts/com/example/server/pom.xml +++ b/samples/standalone/contracts/com/example/server/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT Finchley.BUILD-SNAPSHOT true diff --git a/samples/standalone/dsl/http-client/pom.xml b/samples/standalone/dsl/http-client/pom.xml index 438f237aca..8ffe3ed321 100644 --- a/samples/standalone/dsl/http-client/pom.xml +++ b/samples/standalone/dsl/http-client/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE diff --git a/samples/standalone/dsl/http-server/gradle.properties b/samples/standalone/dsl/http-server/gradle.properties index cb360cc45f..2e18603809 100644 --- a/samples/standalone/dsl/http-server/gradle.properties +++ b/samples/standalone/dsl/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/dsl/http-server/pom.xml b/samples/standalone/dsl/http-server/pom.xml index 463ac693bc..3d4b867c25 100644 --- a/samples/standalone/dsl/http-server/pom.xml +++ b/samples/standalone/dsl/http-server/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/dsl/pom.xml b/samples/standalone/dsl/pom.xml index 0515f233b6..cfc57292b6 100644 --- a/samples/standalone/dsl/pom.xml +++ b/samples/standalone/dsl/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/pom.xml b/samples/standalone/messaging/pom.xml index bf67ee7ecc..c7bfa9453d 100644 --- a/samples/standalone/messaging/pom.xml +++ b/samples/standalone/messaging/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/stream-sink/gradle.properties b/samples/standalone/messaging/stream-sink/gradle.properties index cb360cc45f..2e18603809 100644 --- a/samples/standalone/messaging/stream-sink/gradle.properties +++ b/samples/standalone/messaging/stream-sink/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/messaging/stream-sink/pom.xml b/samples/standalone/messaging/stream-sink/pom.xml index bbb152bbf8..aec99d9dd4 100644 --- a/samples/standalone/messaging/stream-sink/pom.xml +++ b/samples/standalone/messaging/stream-sink/pom.xml @@ -14,14 +14,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/stream-source/gradle.properties b/samples/standalone/messaging/stream-source/gradle.properties index cb360cc45f..2e18603809 100644 --- a/samples/standalone/messaging/stream-source/gradle.properties +++ b/samples/standalone/messaging/stream-source/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/messaging/stream-source/pom.xml b/samples/standalone/messaging/stream-source/pom.xml index 2ea0dfef8e..72bfbc3652 100644 --- a/samples/standalone/messaging/stream-source/pom.xml +++ b/samples/standalone/messaging/stream-source/pom.xml @@ -14,14 +14,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/standalone/pact/pact-http-client/pom.xml b/samples/standalone/pact/pact-http-client/pom.xml index 3341e4d201..d9e913d755 100644 --- a/samples/standalone/pact/pact-http-client/pom.xml +++ b/samples/standalone/pact/pact-http-client/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE diff --git a/samples/standalone/pact/pact-http-server/gradle.properties b/samples/standalone/pact/pact-http-server/gradle.properties index cb360cc45f..2e18603809 100644 --- a/samples/standalone/pact/pact-http-server/gradle.properties +++ b/samples/standalone/pact/pact-http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/pact/pact-http-server/pom.xml b/samples/standalone/pact/pact-http-server/pom.xml index 6ee769851f..37a522faae 100644 --- a/samples/standalone/pact/pact-http-server/pom.xml +++ b/samples/standalone/pact/pact-http-server/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/pact/pom.xml b/samples/standalone/pact/pom.xml index 2035c0bc75..0679949bc2 100644 --- a/samples/standalone/pact/pom.xml +++ b/samples/standalone/pact/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests with Pact - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index c44d15f4fe..c324c58788 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-samples-standalone pom - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/standalone/restdocs/http-client/gradle.properties b/samples/standalone/restdocs/http-client/gradle.properties index cb360cc45f..2e18603809 100644 --- a/samples/standalone/restdocs/http-client/gradle.properties +++ b/samples/standalone/restdocs/http-client/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/restdocs/http-client/pom.xml b/samples/standalone/restdocs/http-client/pom.xml index 58ec98488f..3e56005f78 100644 --- a/samples/standalone/restdocs/http-client/pom.xml +++ b/samples/standalone/restdocs/http-client/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/standalone/restdocs/http-server/gradle.properties b/samples/standalone/restdocs/http-server/gradle.properties index cb360cc45f..2e18603809 100644 --- a/samples/standalone/restdocs/http-server/gradle.properties +++ b/samples/standalone/restdocs/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/pom.xml b/samples/standalone/restdocs/http-server/pom.xml index db18d0aa9d..67555ce6f0 100644 --- a/samples/standalone/restdocs/http-server/pom.xml +++ b/samples/standalone/restdocs/http-server/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT true diff --git a/samples/standalone/restdocs/pom.xml b/samples/standalone/restdocs/pom.xml index ac78d0ad0d..ed13cd985c 100644 --- a/samples/standalone/restdocs/pom.xml +++ b/samples/standalone/restdocs/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/standalone/webclient/http-client/gradle.properties b/samples/standalone/webclient/http-client/gradle.properties index cb360cc45f..2e18603809 100644 --- a/samples/standalone/webclient/http-client/gradle.properties +++ b/samples/standalone/webclient/http-client/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/webclient/http-client/pom.xml b/samples/standalone/webclient/http-client/pom.xml index c5a8c45e32..9e3192034e 100644 --- a/samples/standalone/webclient/http-client/pom.xml +++ b/samples/standalone/webclient/http-client/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/standalone/webclient/http-server/gradle.properties b/samples/standalone/webclient/http-server/gradle.properties index cb360cc45f..2e18603809 100644 --- a/samples/standalone/webclient/http-server/gradle.properties +++ b/samples/standalone/webclient/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/webclient/http-server/pom.xml b/samples/standalone/webclient/http-server/pom.xml index eb12881204..2b2a840173 100644 --- a/samples/standalone/webclient/http-server/pom.xml +++ b/samples/standalone/webclient/http-server/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/standalone/webclient/pom.xml b/samples/standalone/webclient/pom.xml index 91c397521a..a5eafebb98 100644 --- a/samples/standalone/webclient/pom.xml +++ b/samples/standalone/webclient/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-client/pom.xml b/samples/standalone/yml/http-client/pom.xml index 532799d20b..cfe99c5869 100644 --- a/samples/standalone/yml/http-client/pom.xml +++ b/samples/standalone/yml/http-client/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE diff --git a/samples/standalone/yml/http-server/gradle.properties b/samples/standalone/yml/http-server/gradle.properties index 4aa503e80a..9a46358ccd 100644 --- a/samples/standalone/yml/http-server/gradle.properties +++ b/samples/standalone/yml/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-server/pom.xml b/samples/standalone/yml/http-server/pom.xml index 0e98af9be2..7b0e026cfc 100644 --- a/samples/standalone/yml/http-server/pom.xml +++ b/samples/standalone/yml/http-server/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/pom.xml b/samples/standalone/yml/pom.xml index 85c4bb6199..267743d674 100644 --- a/samples/standalone/yml/pom.xml +++ b/samples/standalone/yml/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index 8fbf7d65f3..e2328a5087 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT jar wiremock-jetty @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index 213e758593..029fd7d0e8 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT jar wiremock-native @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index 63489e2b00..f661e39a36 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT jar wiremock-tomcat @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index 2509769d4d..8014032d55 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT jar wiremock-undertow-ssl @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index 5a56c2956e..3d21fe0a6d 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT jar wiremock-undertow @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 460ca1d641..a5055a8d28 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -9,7 +9,7 @@ spring-cloud-contract-dependencies - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index d9801e51b6..8fcc3299b4 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index 57b84600ff..9d3d6bf384 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index c30ea485dc..f492119600 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index 8b72e0b72b..29c14ddb03 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index d2e0db15b9..d3eb41672c 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index 96270fd5bc..13997ffe5d 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index e3cdfc5cb5..de364e5ee5 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index 3baa5e8fd6..b32ecc7a03 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index 0f54ab7bc3..47c4915e4c 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index ea240e7ee6..d9f69ad174 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index 1946c9108a..7886664ec4 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index f6aa31661c..8fe8da01f2 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. 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 3643670a05..4ae3b35234 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT 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 1ae8b4638b..eb06f8b1f4 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.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 1f273d5c74..5910f27817 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT \ No newline at end of file +verifierVersion=2.0.1.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 3643670a05..4ae3b35234 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.12 -verifierVersion=2.0.0.BUILD-SNAPSHOT +verifierVersion=2.0.1.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 59489db54c..4ab0cf1e80 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. @@ -33,7 +33,7 @@ 1.7 - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml index 12e3f170b5..91f52268c6 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml index 41d696374a..4579bd043c 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml index 88ecd59ebe..cad5480328 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml index c229356fed..e799171efa 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml index 211d29fc5e..c46b999596 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.0.3.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml index d6fafbf279..82a472824e 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 2a71e698e5..14f47b4a66 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index c6b64fffa8..7402e9adcc 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index 94712d4f63..4d6d66130d 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index 6d99636ccb..c046e5468c 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index e586adc71f..9143e47dea 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index 79a18e3fcd..f96228c10a 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index 9ad4fa8a07..a7048fc82c 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index 19e2e84ac2..c44db00760 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index bd05d85268..17d4e649e2 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index dc43e82d6d..8f0a614c5f 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index fb29de0bb2..95ae806043 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index ed4fe4a69b..f39151bc5b 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index 40a8270173..bc610fa233 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index 536e2b67d4..423ee01ea7 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index b514f41d0d..52916d9495 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.0.BUILD-SNAPSHOT + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-stream From 934f24437791f3f16a6498867f82973cae992248 Mon Sep 17 00:00:00 2001 From: Stephan Oudmaijer Date: Wed, 27 Jun 2018 14:37:29 +0200 Subject: [PATCH 15/84] Remove mockito-core from dependencyManagement (#674) Remove mockito-core from dependencyManagement --- pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pom.xml b/pom.xml index d4836fd792..9cf83ef9ee 100644 --- a/pom.xml +++ b/pom.xml @@ -99,10 +99,6 @@ spring-rabbit ${spring-rabbit.version} - - org.mockito - mockito-core - io.specto hoverfly-junit From 7ff571de93c308ad4aed959cb58e5aa961099b69 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 29 Jun 2018 22:07:44 +0200 Subject: [PATCH 16/84] bumped libs --- pom.xml | 12 ++++++------ spring-cloud-contract-dependencies/pom.xml | 2 +- .../spring/cloud/eureka/EurekaStubsRegistrar.java | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index c08f7b4afe..cf0b738ffb 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-build - 1.3.9.BUILD-SNAPSHOT + 1.3.10.BUILD-SNAPSHOT @@ -26,12 +26,12 @@ 5.12.1 2.18.3 2.17 - 1.3.9.BUILD-SNAPSHOT - 1.2.1.BUILD-SNAPSHOT + 1.3.10.BUILD-SNAPSHOT + 1.2.2.BUILD-SNAPSHOT Ditmars.BUILD-SNAPSHOT - 1.4.4.BUILD-SNAPSHOT - 1.3.3.BUILD-SNAPSHOT - 1.3.3.BUILD-SNAPSHOT + 1.4.5.BUILD-SNAPSHOT + 1.3.4.BUILD-SNAPSHOT + 1.3.4.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 1649bc722c..044dc4c79e 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,7 +5,7 @@ spring-cloud-dependencies-parent org.springframework.cloud - 1.3.9.BUILD-SNAPSHOT + 1.3.10.BUILD-SNAPSHOT spring-cloud-contract-dependencies diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/EurekaStubsRegistrar.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/EurekaStubsRegistrar.java index b15e3c1366..e1ff0f1905 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/EurekaStubsRegistrar.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/EurekaStubsRegistrar.java @@ -140,7 +140,6 @@ public class EurekaStubsRegistrar implements StubsRegistrar { public void close() throws Exception { for (EurekaRegistration registration : this.registrations) { this.serviceRegistry.deregister(registration); - registration.close(); } } } From 7d9dd8443149856d8623db5232d3ce8bba9c693f Mon Sep 17 00:00:00 2001 From: buildmaster Date: Fri, 29 Jun 2018 20:22:31 +0000 Subject: [PATCH 17/84] Update SNAPSHOT to 1.2.5.RELEASE --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- .../project/gradle.properties | 2 +- .../pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 16 ++++++++-------- samples/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 6 +++--- samples/wiremock-native/pom.xml | 6 +++--- samples/wiremock-tomcat/pom.xml | 6 +++--- samples/wiremock-undertow-ssl/pom.xml | 6 +++--- samples/wiremock-undertow/pom.xml | 6 +++--- spring-cloud-contract-dependencies/pom.xml | 4 ++-- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../functionalTest/bootSimple/gradle.properties | 2 +- .../sampleJerseyProject/gradle.properties | 2 +- .../sampleProject/gradle.properties | 2 +- .../scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../spring-cloud-contract-spec-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-camel/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- 49 files changed, 73 insertions(+), 73 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 783ca4eab7..2fb4fac526 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-docker-parent pom - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index 73e020ba3a..01350d5b74 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-docker pom - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index f87f5916de..213f0a888d 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.5.RELEASE bootVersion=1.5.9.RELEASE diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index 221ecf542b..4cd7f929de 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner-docker pom - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index 6a023cd021..d609daa463 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index cf0b738ffb..943158dcd5 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-build - 1.3.10.BUILD-SNAPSHOT + 1.3.10.RELEASE spring-cloud-contract-parent pom - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE Spring Cloud Contract Spring Cloud Contract @@ -26,12 +26,12 @@ 5.12.1 2.18.3 2.17 - 1.3.10.BUILD-SNAPSHOT - 1.2.2.BUILD-SNAPSHOT - Ditmars.BUILD-SNAPSHOT - 1.4.5.BUILD-SNAPSHOT - 1.3.4.BUILD-SNAPSHOT - 1.3.4.BUILD-SNAPSHOT + 1.3.10.RELEASE + 1.2.2.RELEASE + Ditmars.SR4 + 1.4.5.RELEASE + 1.3.4.RELEASE + 1.3.4.RELEASE diff --git a/samples/pom.xml b/samples/pom.xml index 893fc51237..5adb0729a5 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-samples pom - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index 559676ccd6..9343c55d4c 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-samples-standalone pom - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index 7cdbb8a5ff..59585d83c8 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE jar wiremock-jetty @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.11.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index 66d983afbc..a378a64962 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE jar wiremock-native @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.11.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index 5b939daa90..3976e9257e 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE jar wiremock-tomcat @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.11.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index 046590d5c2..eba520b3bb 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE jar wiremock-undertow-ssl @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.11.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index 97c0fde3f0..c24e8b9d47 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE jar wiremock-undertow @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.11.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 044dc4c79e..925450221d 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 1.3.10.BUILD-SNAPSHOT + 1.3.10.RELEASE spring-cloud-contract-dependencies - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index 62998e4e1a..409990dee4 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index 74da9d2a7c..ab5d2a9318 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index b7155e18c5..74bddd2f72 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index f391766d79..1b54b24bd2 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index 906074cdc5..57c61ff698 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index 9f83b8dfa8..d9d271ab28 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index 4f7395014c..3460189720 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index c94cea0794..97a05432e9 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index a308cbd3fe..c9a6c9a232 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index 40da48d031..dd770d9b4d 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index 4e9ee972b9..202d6177bd 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.5.RELEASE org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index 4148424fe8..fe5bc5c67d 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. 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 8ac43e94be..915fe3eacc 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.5.RELEASE 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 5075ae2900..3809726ba0 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.5.RELEASE 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 b6ec9f51d4..fb070fe95d 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.BUILD-SNAPSHOT \ No newline at end of file +verifierVersion=1.2.5.RELEASE \ 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 8ac43e94be..915fe3eacc 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.5.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 3a3d5aba61..a6cb14023e 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. @@ -33,7 +33,7 @@ 1.7 - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml index f0c965536f..79cd0cbfde 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-spec-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 9cf6c6a5ac..baf2f0c01e 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index d98b1fe27d..a9e5f21337 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index 8dd8d0a62a..557c42ff7c 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index b5bdb79b02..52c1235da8 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-camel/pom.xml b/tests/samples-messaging-camel/pom.xml index 17be0e2744..4a6f8281f9 100644 --- a/tests/samples-messaging-camel/pom.xml +++ b/tests/samples-messaging-camel/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-sample-camel diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index 9f1ee9e609..6588995263 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index 34fa482b4e..3675cddd6c 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index 4f859441b4..c76e1826e4 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index 6ffcfe8dc3..542f6d9839 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index 364abf6946..e3ab57e34d 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index 2ff91b8029..dd85543be7 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-camel/pom.xml b/tests/spring-cloud-contract-stub-runner-camel/pom.xml index b7490553bf..ab955e2117 100644 --- a/tests/spring-cloud-contract-stub-runner-camel/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-camel/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner-camel diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index 341e4992aa..2d9b4abde4 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index a86edd311b..421ae6cf36 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index 8b43f43d1a..c6224cc3d5 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index 115b62ef3b..4e0367d84d 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index 44d710c240..ecb5c9ab8d 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.5.RELEASE .. spring-cloud-contract-stub-runner-stream From 983b363512fc6126e534055c80b578a11cb82261 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Fri, 29 Jun 2018 20:38:47 +0000 Subject: [PATCH 18/84] Going back to snapshots --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- .../project/gradle.properties | 2 +- .../pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 16 ++++++++-------- samples/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 6 +++--- samples/wiremock-native/pom.xml | 6 +++--- samples/wiremock-tomcat/pom.xml | 6 +++--- samples/wiremock-undertow-ssl/pom.xml | 6 +++--- samples/wiremock-undertow/pom.xml | 6 +++--- spring-cloud-contract-dependencies/pom.xml | 4 ++-- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../functionalTest/bootSimple/gradle.properties | 2 +- .../sampleJerseyProject/gradle.properties | 2 +- .../sampleProject/gradle.properties | 2 +- .../scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../spring-cloud-contract-spec-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-camel/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- 49 files changed, 73 insertions(+), 73 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 2fb4fac526..783ca4eab7 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-docker-parent pom - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index 01350d5b74..73e020ba3a 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-docker pom - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index 213f0a888d..f87f5916de 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=1.2.5.RELEASE +verifierVersion=1.2.5.BUILD-SNAPSHOT bootVersion=1.5.9.RELEASE diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index 4cd7f929de..221ecf542b 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-docker pom - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index d609daa463..6a023cd021 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index 943158dcd5..cf0b738ffb 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-build - 1.3.10.RELEASE + 1.3.10.BUILD-SNAPSHOT spring-cloud-contract-parent pom - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT Spring Cloud Contract Spring Cloud Contract @@ -26,12 +26,12 @@ 5.12.1 2.18.3 2.17 - 1.3.10.RELEASE - 1.2.2.RELEASE - Ditmars.SR4 - 1.4.5.RELEASE - 1.3.4.RELEASE - 1.3.4.RELEASE + 1.3.10.BUILD-SNAPSHOT + 1.2.2.BUILD-SNAPSHOT + Ditmars.BUILD-SNAPSHOT + 1.4.5.BUILD-SNAPSHOT + 1.3.4.BUILD-SNAPSHOT + 1.3.4.BUILD-SNAPSHOT diff --git a/samples/pom.xml b/samples/pom.xml index 5adb0729a5..893fc51237 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-samples pom - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index 9343c55d4c..559676ccd6 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-samples-standalone pom - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index 59585d83c8..7cdbb8a5ff 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT jar wiremock-jetty @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.14.RELEASE + 1.5.11.RELEASE UTF-8 1.8 - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index a378a64962..66d983afbc 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT jar wiremock-native @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.14.RELEASE + 1.5.11.RELEASE UTF-8 1.8 - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index 3976e9257e..5b939daa90 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT jar wiremock-tomcat @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.14.RELEASE + 1.5.11.RELEASE UTF-8 1.8 - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index eba520b3bb..046590d5c2 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT jar wiremock-undertow-ssl @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.14.RELEASE + 1.5.11.RELEASE UTF-8 1.8 - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index c24e8b9d47..97c0fde3f0 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT jar wiremock-undertow @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.14.RELEASE + 1.5.11.RELEASE UTF-8 1.8 - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 925450221d..044dc4c79e 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 1.3.10.RELEASE + 1.3.10.BUILD-SNAPSHOT spring-cloud-contract-dependencies - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index 409990dee4..62998e4e1a 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index ab5d2a9318..74da9d2a7c 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index 74bddd2f72..b7155e18c5 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index 1b54b24bd2..f391766d79 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index 57c61ff698..906074cdc5 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index d9d271ab28..9f83b8dfa8 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index 3460189720..4f7395014c 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index 97a05432e9..c94cea0794 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index c9a6c9a232..a308cbd3fe 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index dd770d9b4d..40da48d031 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index 202d6177bd..4e9ee972b9 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=1.2.5.RELEASE +verifierVersion=1.2.5.BUILD-SNAPSHOT org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index fe5bc5c67d..4148424fe8 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. 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 915fe3eacc..8ac43e94be 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.RELEASE +verifierVersion=1.2.5.BUILD-SNAPSHOT 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 3809726ba0..5075ae2900 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.RELEASE +verifierVersion=1.2.5.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 fb070fe95d..b6ec9f51d4 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.RELEASE \ No newline at end of file +verifierVersion=1.2.5.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 915fe3eacc..8ac43e94be 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.RELEASE +verifierVersion=1.2.5.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index a6cb14023e..3a3d5aba61 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. @@ -33,7 +33,7 @@ 1.7 - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml index 79cd0cbfde..f0c965536f 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-spec-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index baf2f0c01e..9cf6c6a5ac 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index a9e5f21337..d98b1fe27d 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index 557c42ff7c..8dd8d0a62a 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index 52c1235da8..b5bdb79b02 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-camel/pom.xml b/tests/samples-messaging-camel/pom.xml index 4a6f8281f9..17be0e2744 100644 --- a/tests/samples-messaging-camel/pom.xml +++ b/tests/samples-messaging-camel/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-sample-camel diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index 6588995263..9f1ee9e609 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index 3675cddd6c..34fa482b4e 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index c76e1826e4..4f859441b4 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index 542f6d9839..6ffcfe8dc3 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index e3ab57e34d..364abf6946 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index dd85543be7..2ff91b8029 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-camel/pom.xml b/tests/spring-cloud-contract-stub-runner-camel/pom.xml index ab955e2117..b7490553bf 100644 --- a/tests/spring-cloud-contract-stub-runner-camel/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-camel/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-camel diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index 2d9b4abde4..341e4992aa 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index 421ae6cf36..a86edd311b 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index c6224cc3d5..8b43f43d1a 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index 4e0367d84d..115b62ef3b 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index ecb5c9ab8d..44d710c240 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.RELEASE + 1.2.5.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-stream From 63418e0400c2cd62aadcc14268136d8963e1d950 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Fri, 29 Jun 2018 20:38:49 +0000 Subject: [PATCH 19/84] Bumping versions to 1.2.6.BUILD-SNAPSHOT after release --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- .../spring-cloud-contract-docker/project/gradle.properties | 2 +- docker/spring-cloud-contract-stub-runner-docker/pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 6 +++--- samples/pom.xml | 4 ++-- samples/standalone/contracts/com/example/server/pom.xml | 6 +++--- samples/standalone/dsl/http-client/pom.xml | 4 ++-- samples/standalone/dsl/http-server/gradle.properties | 2 +- samples/standalone/dsl/http-server/pom.xml | 6 +++--- samples/standalone/dsl/pom.xml | 4 ++-- samples/standalone/messaging/pom.xml | 4 ++-- samples/standalone/messaging/stream-sink/gradle.properties | 2 +- samples/standalone/messaging/stream-sink/pom.xml | 4 ++-- .../standalone/messaging/stream-source/gradle.properties | 2 +- samples/standalone/messaging/stream-source/pom.xml | 4 ++-- samples/standalone/pact/pact-http-client/pom.xml | 4 ++-- samples/standalone/pact/pact-http-server/gradle.properties | 2 +- samples/standalone/pact/pact-http-server/pom.xml | 6 +++--- samples/standalone/pact/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/standalone/restdocs/http-client/gradle.properties | 2 +- samples/standalone/restdocs/http-client/pom.xml | 4 ++-- samples/standalone/restdocs/http-server/gradle.properties | 2 +- samples/standalone/restdocs/http-server/pom.xml | 4 ++-- samples/standalone/restdocs/pom.xml | 4 ++-- samples/standalone/yml/http-client/pom.xml | 4 ++-- samples/standalone/yml/http-server/gradle.properties | 2 +- samples/standalone/yml/http-server/pom.xml | 6 +++--- samples/standalone/yml/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 6 +++--- samples/wiremock-native/pom.xml | 6 +++--- samples/wiremock-tomcat/pom.xml | 6 +++--- samples/wiremock-undertow-ssl/pom.xml | 6 +++--- samples/wiremock-undertow/pom.xml | 6 +++--- spring-cloud-contract-dependencies/pom.xml | 4 ++-- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../spring-cloud-starter-contract-stub-runner-jetty/pom.xml | 2 +- .../spring-cloud-starter-contract-stub-runner/pom.xml | 2 +- .../spring-cloud-starter-contract-verifier/pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../spring-cloud-contract-gradle-plugin/gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../resources/functionalTest/bootSimple/gradle.properties | 2 +- .../functionalTest/sampleJerseyProject/gradle.properties | 2 +- .../functionalTest/sampleProject/gradle.properties | 2 +- .../functionalTest/scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../src/test/projects/complex-configuration/pom.xml | 2 +- .../projects/different-module-configuration/module/pom.xml | 2 +- .../src/test/projects/plugin-extension/pom.xml | 2 +- .../src/test/projects/spring-boot-groovy/pom.xml | 2 +- .../src/test/projects/spring-boot-java/pom.xml | 2 +- .../spring-cloud-contract-spec-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-camel/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-amqp/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml | 2 +- .../pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-camel/pom.xml | 2 +- .../spring-cloud-contract-stub-runner-context-path/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-integration/pom.xml | 2 +- .../pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-moco/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-stream/pom.xml | 2 +- 77 files changed, 116 insertions(+), 116 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 783ca4eab7..e58197af42 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-docker-parent pom - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index 73e020ba3a..b86cba653f 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-docker pom - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index f87f5916de..912d381d44 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.BUILD-SNAPSHOT bootVersion=1.5.9.RELEASE diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index 221ecf542b..89849adc14 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-docker pom - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index 6a023cd021..744515b7b4 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index cf0b738ffb..d8c769cd7e 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-build - 1.3.10.BUILD-SNAPSHOT + 1.3.10.RELEASE spring-cloud-contract-parent pom - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT Spring Cloud Contract Spring Cloud Contract @@ -26,7 +26,7 @@ 5.12.1 2.18.3 2.17 - 1.3.10.BUILD-SNAPSHOT + 1.3.10.RELEASE 1.2.2.BUILD-SNAPSHOT Ditmars.BUILD-SNAPSHOT 1.4.5.BUILD-SNAPSHOT diff --git a/samples/pom.xml b/samples/pom.xml index 893fc51237..5f7bf88147 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-samples pom - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/contracts/com/example/server/pom.xml b/samples/standalone/contracts/com/example/server/pom.xml index 6b4522c76b..833bb47ee5 100644 --- a/samples/standalone/contracts/com/example/server/pom.xml +++ b/samples/standalone/contracts/com/example/server/pom.xml @@ -13,15 +13,15 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT - Edgware.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT + 1.3.10.RELEASE true diff --git a/samples/standalone/dsl/http-client/pom.xml b/samples/standalone/dsl/http-client/pom.xml index 75c4228df4..1a09b25768 100644 --- a/samples/standalone/dsl/http-client/pom.xml +++ b/samples/standalone/dsl/http-client/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - Edgware.BUILD-SNAPSHOT + 1.3.10.RELEASE diff --git a/samples/standalone/dsl/http-server/gradle.properties b/samples/standalone/dsl/http-server/gradle.properties index e4236a09ee..392409a467 100644 --- a/samples/standalone/dsl/http-server/gradle.properties +++ b/samples/standalone/dsl/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.BUILD-SNAPSHOT BOM_VERSION=Edgware.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/dsl/http-server/pom.xml b/samples/standalone/dsl/http-server/pom.xml index 9a5369ace0..102d6826c7 100644 --- a/samples/standalone/dsl/http-server/pom.xml +++ b/samples/standalone/dsl/http-server/pom.xml @@ -13,15 +13,15 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT - Edgware.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT + 1.3.10.RELEASE diff --git a/samples/standalone/dsl/pom.xml b/samples/standalone/dsl/pom.xml index 336f12abd1..df7f9e2c56 100644 --- a/samples/standalone/dsl/pom.xml +++ b/samples/standalone/dsl/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/pom.xml b/samples/standalone/messaging/pom.xml index a6eb14846f..d539033eb9 100644 --- a/samples/standalone/messaging/pom.xml +++ b/samples/standalone/messaging/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/stream-sink/gradle.properties b/samples/standalone/messaging/stream-sink/gradle.properties index e4236a09ee..392409a467 100644 --- a/samples/standalone/messaging/stream-sink/gradle.properties +++ b/samples/standalone/messaging/stream-sink/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.BUILD-SNAPSHOT BOM_VERSION=Edgware.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/messaging/stream-sink/pom.xml b/samples/standalone/messaging/stream-sink/pom.xml index a942e9e886..b998afdb41 100644 --- a/samples/standalone/messaging/stream-sink/pom.xml +++ b/samples/standalone/messaging/stream-sink/pom.xml @@ -14,14 +14,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/stream-source/gradle.properties b/samples/standalone/messaging/stream-source/gradle.properties index e4236a09ee..392409a467 100644 --- a/samples/standalone/messaging/stream-source/gradle.properties +++ b/samples/standalone/messaging/stream-source/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.BUILD-SNAPSHOT BOM_VERSION=Edgware.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/messaging/stream-source/pom.xml b/samples/standalone/messaging/stream-source/pom.xml index be6a0cc184..9a025edb07 100644 --- a/samples/standalone/messaging/stream-source/pom.xml +++ b/samples/standalone/messaging/stream-source/pom.xml @@ -14,14 +14,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/standalone/pact/pact-http-client/pom.xml b/samples/standalone/pact/pact-http-client/pom.xml index d014662e15..533e2e4a5e 100644 --- a/samples/standalone/pact/pact-http-client/pom.xml +++ b/samples/standalone/pact/pact-http-client/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - Edgware.BUILD-SNAPSHOT + 1.3.10.RELEASE diff --git a/samples/standalone/pact/pact-http-server/gradle.properties b/samples/standalone/pact/pact-http-server/gradle.properties index e4236a09ee..392409a467 100644 --- a/samples/standalone/pact/pact-http-server/gradle.properties +++ b/samples/standalone/pact/pact-http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.BUILD-SNAPSHOT BOM_VERSION=Edgware.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/pact/pact-http-server/pom.xml b/samples/standalone/pact/pact-http-server/pom.xml index 198571c7ae..3fb9fe1885 100644 --- a/samples/standalone/pact/pact-http-server/pom.xml +++ b/samples/standalone/pact/pact-http-server/pom.xml @@ -13,15 +13,15 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT - Edgware.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT + 1.3.10.RELEASE diff --git a/samples/standalone/pact/pom.xml b/samples/standalone/pact/pom.xml index 9e64e6f99a..cb8d06c569 100644 --- a/samples/standalone/pact/pom.xml +++ b/samples/standalone/pact/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests with Pact - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index 559676ccd6..14404dabc4 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-samples-standalone pom - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/standalone/restdocs/http-client/gradle.properties b/samples/standalone/restdocs/http-client/gradle.properties index e4236a09ee..392409a467 100644 --- a/samples/standalone/restdocs/http-client/gradle.properties +++ b/samples/standalone/restdocs/http-client/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.BUILD-SNAPSHOT BOM_VERSION=Edgware.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/restdocs/http-client/pom.xml b/samples/standalone/restdocs/http-client/pom.xml index 6a7abc768a..22b467ea00 100644 --- a/samples/standalone/restdocs/http-client/pom.xml +++ b/samples/standalone/restdocs/http-client/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/standalone/restdocs/http-server/gradle.properties b/samples/standalone/restdocs/http-server/gradle.properties index e4236a09ee..392409a467 100644 --- a/samples/standalone/restdocs/http-server/gradle.properties +++ b/samples/standalone/restdocs/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.BUILD-SNAPSHOT BOM_VERSION=Edgware.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/pom.xml b/samples/standalone/restdocs/http-server/pom.xml index d1c326b0f3..026ddedbe6 100644 --- a/samples/standalone/restdocs/http-server/pom.xml +++ b/samples/standalone/restdocs/http-server/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/standalone/restdocs/pom.xml b/samples/standalone/restdocs/pom.xml index f49783d878..c8f26aa6f2 100644 --- a/samples/standalone/restdocs/pom.xml +++ b/samples/standalone/restdocs/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-client/pom.xml b/samples/standalone/yml/http-client/pom.xml index 28f3b050e2..2984de94ea 100644 --- a/samples/standalone/yml/http-client/pom.xml +++ b/samples/standalone/yml/http-client/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - Edgware.BUILD-SNAPSHOT + 1.3.10.RELEASE diff --git a/samples/standalone/yml/http-server/gradle.properties b/samples/standalone/yml/http-server/gradle.properties index b0b4f20151..321a597730 100644 --- a/samples/standalone/yml/http-server/gradle.properties +++ b/samples/standalone/yml/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.BUILD-SNAPSHOT BOM_VERSION=Edgware.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-server/pom.xml b/samples/standalone/yml/http-server/pom.xml index 41f261b8e5..731d2d9b27 100644 --- a/samples/standalone/yml/http-server/pom.xml +++ b/samples/standalone/yml/http-server/pom.xml @@ -13,15 +13,15 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT - Edgware.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT + 1.3.10.RELEASE diff --git a/samples/standalone/yml/pom.xml b/samples/standalone/yml/pom.xml index 4b91dc5225..0656e958ec 100644 --- a/samples/standalone/yml/pom.xml +++ b/samples/standalone/yml/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index 7cdbb8a5ff..d85bdb6b08 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT jar wiremock-jetty @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.11.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index 66d983afbc..b9809f0afa 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT jar wiremock-native @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.11.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index 5b939daa90..2836633188 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT jar wiremock-tomcat @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.11.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index 046590d5c2..ee77db5343 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT jar wiremock-undertow-ssl @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.11.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index 97c0fde3f0..e6e0a1ae76 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT jar wiremock-undertow @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.11.RELEASE + 1.5.14.RELEASE UTF-8 1.8 - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 044dc4c79e..e61c2f554c 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 1.3.10.BUILD-SNAPSHOT + 1.3.10.RELEASE spring-cloud-contract-dependencies - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index 62998e4e1a..bcf42e4076 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index 74da9d2a7c..311904afd6 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index b7155e18c5..6514dc9721 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index f391766d79..65b0d4ce6c 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index 906074cdc5..702c9641a9 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index 9f83b8dfa8..771bdc5953 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index 4f7395014c..806f8804db 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index c94cea0794..fddcf60092 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index a308cbd3fe..d8e965ef76 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index 40da48d031..8d5f8d03ce 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index 4e9ee972b9..3da1c23f9c 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.BUILD-SNAPSHOT org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index 4148424fe8..d00ce6ffb6 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. 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 8ac43e94be..add1fe8dda 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.BUILD-SNAPSHOT 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 5075ae2900..77ab8444ce 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.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 b6ec9f51d4..e4ef80c719 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.BUILD-SNAPSHOT \ No newline at end of file +verifierVersion=1.2.6.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 8ac43e94be..add1fe8dda 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 @@ -15,5 +15,5 @@ # wiremockVersion=2.16.0 jsonAssertVersion=0.4.12 -verifierVersion=1.2.5.BUILD-SNAPSHOT +verifierVersion=1.2.6.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 3a3d5aba61..a054a8f348 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. @@ -33,7 +33,7 @@ 1.7 - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml index a9c0d09566..f77da39ea6 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml index cb72351664..55a50e8f51 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml index ecaf5e79be..7fe508fb2b 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml index ae8ceaf4f5..bcde4365ff 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml index ecaf5e79be..7fe508fb2b 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.12.RELEASE + 1.5.14.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml index f0c965536f..c1b700bde8 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-spec-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-spec-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 9cf6c6a5ac..e3cca99c36 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index d98b1fe27d..e83d402e86 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index 8dd8d0a62a..04e3df8bf0 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index b5bdb79b02..2c4d241a1b 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-camel/pom.xml b/tests/samples-messaging-camel/pom.xml index 17be0e2744..e2ba74c92b 100644 --- a/tests/samples-messaging-camel/pom.xml +++ b/tests/samples-messaging-camel/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-sample-camel diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index 9f1ee9e609..00c15533ee 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index 34fa482b4e..fe5c0334ef 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index 4f859441b4..bd5475c1b2 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index 6ffcfe8dc3..e96876cf51 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index 364abf6946..5c87913bdd 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index 2ff91b8029..468d22c502 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-camel/pom.xml b/tests/spring-cloud-contract-stub-runner-camel/pom.xml index b7490553bf..0ef2e0c2b2 100644 --- a/tests/spring-cloud-contract-stub-runner-camel/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-camel/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-camel diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index 341e4992aa..b3a65d628f 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index a86edd311b..aae9e5d2f0 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index 8b43f43d1a..db1d8658f6 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index 115b62ef3b..6dc450fdee 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index 44d710c240..c17f783bed 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 1.2.5.BUILD-SNAPSHOT + 1.2.6.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-stream From 58baf76face628e067f80ea6a4bc72a8e273db11 Mon Sep 17 00:00:00 2001 From: Axel Hodler Date: Sat, 30 Jun 2018 07:28:09 +0200 Subject: [PATCH 20/84] Improve docs on contract priority (#675) --- .../org/springframework/cloud/contract/spec/Contract.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/Contract.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/Contract.groovy index 8f2a9389d8..7a7de8e34a 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/Contract.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/Contract.groovy @@ -37,7 +37,7 @@ class Contract { /** * You can set the level of priority of this contract. If there are two contracts * mapped for example to the same endpoint, then the one with greater priority should - * take precedence + * take precedence. A priority of 1 is highest and takes precedence over a priority of 2. */ Integer priority /** From 18c34f745fed62f5206f4f3524dfd0d630fff66d Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 2 Jul 2018 14:05:02 +0200 Subject: [PATCH 21/84] Fixed wrong sc-deps update after the release --- samples/standalone/contracts/com/example/server/pom.xml | 2 +- samples/standalone/dsl/http-client/pom.xml | 2 +- samples/standalone/dsl/http-server/pom.xml | 2 +- samples/standalone/pact/pact-http-client/pom.xml | 2 +- samples/standalone/pact/pact-http-server/pom.xml | 2 +- samples/standalone/yml/http-client/pom.xml | 2 +- samples/standalone/yml/http-server/pom.xml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/samples/standalone/contracts/com/example/server/pom.xml b/samples/standalone/contracts/com/example/server/pom.xml index 833bb47ee5..50b84850f6 100644 --- a/samples/standalone/contracts/com/example/server/pom.xml +++ b/samples/standalone/contracts/com/example/server/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.8 1.2.6.BUILD-SNAPSHOT - 1.3.10.RELEASE + Edgware.BUILD-SNAPSHOT true diff --git a/samples/standalone/dsl/http-client/pom.xml b/samples/standalone/dsl/http-client/pom.xml index 1a09b25768..a1d6bdc186 100644 --- a/samples/standalone/dsl/http-client/pom.xml +++ b/samples/standalone/dsl/http-client/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 1.3.10.RELEASE + Edgware.BUILD-SNAPSHOT diff --git a/samples/standalone/dsl/http-server/pom.xml b/samples/standalone/dsl/http-server/pom.xml index 102d6826c7..94b1cbde95 100644 --- a/samples/standalone/dsl/http-server/pom.xml +++ b/samples/standalone/dsl/http-server/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.8 1.2.6.BUILD-SNAPSHOT - 1.3.10.RELEASE + Edgware.BUILD-SNAPSHOT diff --git a/samples/standalone/pact/pact-http-client/pom.xml b/samples/standalone/pact/pact-http-client/pom.xml index 533e2e4a5e..6f49814144 100644 --- a/samples/standalone/pact/pact-http-client/pom.xml +++ b/samples/standalone/pact/pact-http-client/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 1.3.10.RELEASE + Edgware.BUILD-SNAPSHOT diff --git a/samples/standalone/pact/pact-http-server/pom.xml b/samples/standalone/pact/pact-http-server/pom.xml index 3fb9fe1885..fdd152c21b 100644 --- a/samples/standalone/pact/pact-http-server/pom.xml +++ b/samples/standalone/pact/pact-http-server/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.8 1.2.6.BUILD-SNAPSHOT - 1.3.10.RELEASE + Edgware.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-client/pom.xml b/samples/standalone/yml/http-client/pom.xml index 2984de94ea..1cd6b43811 100644 --- a/samples/standalone/yml/http-client/pom.xml +++ b/samples/standalone/yml/http-client/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 1.3.10.RELEASE + Edgware.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-server/pom.xml b/samples/standalone/yml/http-server/pom.xml index 731d2d9b27..79344ab088 100644 --- a/samples/standalone/yml/http-server/pom.xml +++ b/samples/standalone/yml/http-server/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.8 1.2.6.BUILD-SNAPSHOT - 1.3.10.RELEASE + Edgware.BUILD-SNAPSHOT From adcdf30be57931969bf00324aca8bd55ee723ba3 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 2 Jul 2018 14:19:10 +0200 Subject: [PATCH 22/84] Updated the docs with proper links; fixes gh-672 --- README.adoc | 18 +++--------------- docs/src/main/asciidoc/links.adoc | 12 +----------- .../main/asciidoc/spring-cloud-wiremock.adoc | 3 +-- docs/src/main/asciidoc/verifier_faq.adoc | 2 +- .../main/asciidoc/verifier_introduction.adoc | 3 +-- docs/src/main/asciidoc/verifier_messaging.adoc | 4 +--- docs/src/main/asciidoc/verifier_setup.adoc | 4 ++-- .../src/main/asciidoc/verifier_stubrunner.adoc | 1 + 8 files changed, 11 insertions(+), 36 deletions(-) diff --git a/README.adoc b/README.adoc index 4bb695ffdc..f14bd5a373 100644 --- a/README.adoc +++ b/README.adoc @@ -1035,8 +1035,7 @@ of an identifier or a timestamp, you need not hardcode a value. You want to allo different ranges of values. To enable ranges of values, you can set regular expressions matching those values for the consumer side. You can provide the body by means of either a map notation or String with interpolations. -https://cloud.spring.io/spring-cloud-contract/single/spring-cloud-contract.html#_contract_dsl[Consult the docs -for more information.] We highly recommend using the map notation! +Consult the <> section for more information. We highly recommend using the map notation! TIP: You must understand the map notation in order to set up contracts. Please read the http://groovy-lang.org/json.html[Groovy docs regarding JSON]. @@ -1447,23 +1446,13 @@ https://github.com/spring-cloud-samples/spring-cloud-contract-samples[samples]. == Links -The following links may be helpful when working with Spring Cloud Contract Verifier: +The following links may be helpful when working with Spring Cloud Contract: * https://github.com/spring-cloud/spring-cloud-contract/[Spring Cloud Contract Github Repository] * https://github.com/spring-cloud-samples/spring-cloud-contract-samples/[Spring Cloud Contract Samples] -* https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html[Spring Cloud -Contract Documentation] -* https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html/deprecated[Accurest -Legacy Documentation] -* https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html/#spring-cloud-contract-stub-runner[Spring -Cloud Contract Stub Runner Documentation] -* https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html/#stub-runner-for-messaging[Spring -Cloud Contract Stub Runner Messaging Documentation] * https://gitter.im/spring-cloud/spring-cloud-contract[Spring Cloud Contract Gitter] -* https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract-maven-plugin/[Spring -Cloud Contract Maven Plugin] * https://www.youtube.com/watch?v=sAAklvxmPmk[Spring Cloud Contract WJUG Presentation by Marcin Grzejszczak] @@ -1857,8 +1846,7 @@ methods to create request matchers, but you can't use both approaches. On the consumer side, you can make the `resource.json` generated earlier in this section available on the classpath (by -https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html#_publishing_stubs_as_jars[publishing -stubs as JARs], for example). After that, you can create a stub using WireMock in a +<> section. Calling `value()` or `$()` tells Spring Cloud Contract that you will be passing a dynamic value. Inside the `consumer()` method you pass the value that should be used on the consumer side (in the generated stub). diff --git a/docs/src/main/asciidoc/verifier_introduction.adoc b/docs/src/main/asciidoc/verifier_introduction.adoc index ba81ef9acb..d5c36e7f29 100644 --- a/docs/src/main/asciidoc/verifier_introduction.adoc +++ b/docs/src/main/asciidoc/verifier_introduction.adoc @@ -698,8 +698,7 @@ of an identifier or a timestamp, you need not hardcode a value. You want to allo different ranges of values. To enable ranges of values, you can set regular expressions matching those values for the consumer side. You can provide the body by means of either a map notation or String with interpolations. -https://cloud.spring.io/spring-cloud-contract/single/spring-cloud-contract.html#_contract_dsl[Consult the docs -for more information.] We highly recommend using the map notation! +Consult the <> section for more information. We highly recommend using the map notation! TIP: You must understand the map notation in order to set up contracts. Please read the http://groovy-lang.org/json.html[Groovy docs regarding JSON]. diff --git a/docs/src/main/asciidoc/verifier_messaging.adoc b/docs/src/main/asciidoc/verifier_messaging.adoc index 37eb497f2a..9d4432f756 100644 --- a/docs/src/main/asciidoc/verifier_messaging.adoc +++ b/docs/src/main/asciidoc/verifier_messaging.adoc @@ -180,9 +180,7 @@ include::{verifier_core_path}/src/test/groovy/org/springframework/cloud/contract Unlike the HTTP part, in messaging, we need to publish the Groovy DSL inside the JAR with a stub. Then it is parsed on the consumer side and proper stubbed routes are created. -For more information, see -https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html/#stub-runner-for-messaging[the -Stub Runner Messaging sections]. +For more information, see <> section. [source,xml,indent=0,subs="verbatim,attributes",role="primary"] .Maven diff --git a/docs/src/main/asciidoc/verifier_setup.adoc b/docs/src/main/asciidoc/verifier_setup.adoc index aca67ea259..a308860e3a 100644 --- a/docs/src/main/asciidoc/verifier_setup.adoc +++ b/docs/src/main/asciidoc/verifier_setup.adoc @@ -438,8 +438,8 @@ include::{standalone_samples_path}/http-server/pom.xml[tags=contract_maven_plugi ---- You can read more in the -https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract-maven-plugin/[Spring -Cloud Contract Maven Plugin Documentation]. +https://cloud.spring.io/spring-cloud-static/spring-cloud-contract/2.0.0.RELEASE/spring-cloud-contract-maven-plugin/[Spring +Cloud Contract Maven Plugin Documentation (example for `2.0.0.RELEASE` version)]. [[maven-rest-assured]] ==== Maven and Rest Assured 2.0 diff --git a/docs/src/main/asciidoc/verifier_stubrunner.adoc b/docs/src/main/asciidoc/verifier_stubrunner.adoc index f0711d1bd4..a29dfc2b69 100644 --- a/docs/src/main/asciidoc/verifier_stubrunner.adoc +++ b/docs/src/main/asciidoc/verifier_stubrunner.adoc @@ -25,6 +25,7 @@ include::{standalone_samples_path}/http-server/pom.xml[tags=repos,indent=0] include::{standalone_samples_path}/http-server/build.gradle[tags=repos,indent=0] ---- +[[publishing-stubs-as-jars]] === Publishing Stubs as JARs The easiest approach would be to centralize the way stubs are kept. For example, you can From 302347f39985608db505d973e5246947d82229c7 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 2 Jul 2018 16:06:18 +0200 Subject: [PATCH 23/84] Fixed the invalid mockito verification that ignored null; fixes gh-676 --- .../amqp/SpringAmqpStubMessages.java | 9 ++-- .../amqp/SpringAmqpStubMessagesSpec.groovy | 44 +++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessages.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessages.java index b3e4dcbb51..bf2834f225 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessages.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessages.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.core.Message; @@ -28,13 +29,11 @@ import org.springframework.amqp.core.MessageListener; import org.springframework.amqp.core.MessagePropertiesBuilder; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; -import org.springframework.amqp.rabbit.support.CorrelationData; import org.springframework.amqp.support.AmqpHeaders; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.contract.verifier.messaging.MessageVerifier; import org.springframework.util.Assert; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mockingDetails; @@ -108,7 +107,7 @@ public class SpringAmqpStubMessages implements ArgumentCaptor messageCaptor = ArgumentCaptor.forClass(Message.class); ArgumentCaptor routingKeyCaptor = ArgumentCaptor.forClass(String.class); verify(this.rabbitTemplate, atLeastOnce()).send(eq(destination), routingKeyCaptor.capture(), - messageCaptor.capture(), any(CorrelationData.class)); + messageCaptor.capture(), ArgumentMatchers.any()); if (messageCaptor.getAllValues().isEmpty()) { log.info("no messages found on destination {}", destination); return null; @@ -117,6 +116,10 @@ public class SpringAmqpStubMessages implements return messageCaptor.getValue(); } Message message = messageCaptor.getValue(); + if (message == null) { + log.info("no messages found on destination {}", destination); + return null; + } if (!routingKeyCaptor.getValue().isEmpty()) { log.info("routing key passed {}", routingKeyCaptor.getValue()); message.getMessageProperties() diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessagesSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessagesSpec.groovy index e15205d30b..87aa2ac429 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessagesSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessagesSpec.groovy @@ -1,10 +1,12 @@ package org.springframework.cloud.contract.verifier.messaging.amqp +import org.mockito.exceptions.verification.WantedButNotInvoked import wiremock.com.google.common.collect.ImmutableMap import org.springframework.amqp.core.Binding import org.springframework.amqp.core.BindingBuilder import org.springframework.amqp.core.DirectExchange import org.springframework.amqp.core.Message +import org.springframework.amqp.core.MessageProperties import org.springframework.amqp.core.Queue import org.springframework.amqp.rabbit.core.RabbitTemplate import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer @@ -22,6 +24,7 @@ class SpringAmqpStubMessagesSpec extends Specification { RabbitTemplate rabbitTemplate = mock(RabbitTemplate.class) SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer() MessageListenerAdapter messageListenerAdapter = Mock(MessageListenerAdapter.class) + Message message = Mock(Message.class) String queueName = "test.queue" String exchange = "test-exchange" @@ -51,4 +54,45 @@ class SpringAmqpStubMessagesSpec extends Specification { msg.getMessageProperties().getHeaders().get(DEFAULT_CLASSID_FIELD_NAME) == "org.example.Some" }) } + + def "should fail to receive a message if rabbit template wasn't called"() { + given: + listenerContainer.setMessageListener(messageListenerAdapter) + listenerContainer.setQueueNames(queueName) + Binding binding = BindingBuilder.bind(new Queue(queueName)).to(new DirectExchange(exchange)).with(routingKey) + MessageListenerAccessor messageListenerAccessor = new MessageListenerAccessor(null, [listenerContainer], [binding]) + SpringAmqpStubMessages messageVerifier = new SpringAmqpStubMessages(rabbitTemplate, messageListenerAccessor) + when: + messageVerifier.receive("foo") + then: + thrown(WantedButNotInvoked) + } + + def "should return null if received called and message was sent without any body"() { + given: + listenerContainer.setMessageListener(messageListenerAdapter) + listenerContainer.setQueueNames(queueName) + Binding binding = BindingBuilder.bind(new Queue(queueName)).to(new DirectExchange(exchange)).with(routingKey) + MessageListenerAccessor messageListenerAccessor = new MessageListenerAccessor(null, [listenerContainer], [binding]) + SpringAmqpStubMessages messageVerifier = new SpringAmqpStubMessages(rabbitTemplate, messageListenerAccessor) + + and: + rabbitTemplate.send("foo", "bar", null, null) + expect: + messageVerifier.receive("foo") == null + } + + def "should return match the message if received called and message was sent with a message with null payload"() { + given: + listenerContainer.setMessageListener(messageListenerAdapter) + listenerContainer.setQueueNames(queueName) + Binding binding = BindingBuilder.bind(new Queue(queueName)).to(new DirectExchange(exchange)).with(routingKey) + MessageListenerAccessor messageListenerAccessor = new MessageListenerAccessor(null, [listenerContainer], [binding]) + SpringAmqpStubMessages messageVerifier = new SpringAmqpStubMessages(rabbitTemplate, messageListenerAccessor) + message.getMessageProperties() >> new MessageProperties() + and: + rabbitTemplate.send("foo", "bar", message, null) + expect: + messageVerifier.receive("foo") is message + } } From 37c78787597fce19587d4ea58f2527aed0be1ce5 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 3 Jul 2018 08:32:03 +0200 Subject: [PATCH 24/84] Fixing the lack of picking of creds from the GIT plugins; fixes gh-678 --- .../stubrunner/ContractProjectUpdater.java | 4 +- .../cloud/contract/stubrunner/GitRepo.java | 6 +- .../ContractProjectUpdaterTest.java | 60 +++++++++++++++++++ 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ContractProjectUpdater.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ContractProjectUpdater.java index 6c27dbafac..f9b4878590 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ContractProjectUpdater.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ContractProjectUpdater.java @@ -63,8 +63,10 @@ public class ContractProjectUpdater { public void updateContractProject(String projectName, Path rootStubsFolder) { File clonedRepo = this.gitContractsRepo .clonedRepo(this.stubRunnerOptions.stubRepositoryRoot); + GitStubDownloaderProperties properties = new GitStubDownloaderProperties( + this.stubRunnerOptions.stubRepositoryRoot, this.stubRunnerOptions); copyStubs(projectName, rootStubsFolder, clonedRepo); - GitRepo gitRepo = new GitRepo(clonedRepo); + GitRepo gitRepo = new GitRepo(clonedRepo, properties); String msg = StubRunnerPropertyUtils.getProperty(this.stubRunnerOptions.getProperties(), GIT_COMMIT_MESSAGE); GitRepo.CommitResult commit = gitRepo diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/GitRepo.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/GitRepo.java index d90aaa71ed..1588e30cad 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/GitRepo.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/GitRepo.java @@ -69,7 +69,7 @@ class GitRepo { private static final Logger log = LoggerFactory.getLogger(GitRepo.class); - private final JGitFactory gitFactory; + final JGitFactory gitFactory; private final File basedir; @@ -79,12 +79,14 @@ class GitRepo { } // for tests + @Deprecated GitRepo(File basedir) { this.basedir = basedir; this.gitFactory = new JGitFactory(); } // for tests + @Deprecated GitRepo(File basedir, JGitFactory factory) { this.basedir = basedir; this.gitFactory = factory; @@ -330,7 +332,7 @@ class GitRepo { } }; - private final CredentialsProvider provider; + final CredentialsProvider provider; JGitFactory(GitStubDownloaderProperties properties) { if (org.springframework.util.StringUtils.hasText(properties.username)) { diff --git a/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/ContractProjectUpdaterTest.java b/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/ContractProjectUpdaterTest.java index 7cf6e526cc..2392696061 100644 --- a/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/ContractProjectUpdaterTest.java +++ b/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/ContractProjectUpdaterTest.java @@ -17,13 +17,17 @@ package org.springframework.cloud.contract.stubrunner; import java.io.File; +import java.util.HashMap; import org.assertj.core.api.BDDAssertions; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.ResetCommand; import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.springframework.boot.test.rule.OutputCapture; import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties; import static org.assertj.core.api.BDDAssertions.then; @@ -38,6 +42,8 @@ public class ContractProjectUpdaterTest extends AbstractGitTest { GitRepo gitRepo; File origin; + @Rule public OutputCapture outputCapture = new OutputCapture(); + @Before public void setup() throws Exception { GitContractsRepo.CACHED_LOCATIONS.clear(); @@ -69,6 +75,60 @@ public class ContractProjectUpdaterTest extends AbstractGitTest { git.reset().setMode(ResetCommand.ResetType.HARD).call(); } BDDAssertions.then(new File(this.project, "META-INF/com.example/hello-world/0.0.2/mappings/someMapping.json")).exists(); + BDDAssertions.then(gitRepo.gitFactory.provider).isNull(); + BDDAssertions.then(outputCapture.toString()).contains("No custom credentials provider will be set"); + } + + @Test + public void should_push_changes_to_current_branch_using_credentials() throws Exception { + StubRunnerOptions options = new StubRunnerOptionsBuilder() + .withStubRepositoryRoot("file://" + this.project.getAbsolutePath() + "/") + .withStubsMode(StubRunnerProperties.StubsMode.REMOTE) + .withProperties(new HashMap() { + { + put("git.username", "foo"); + put("git.password", "bar"); + } + } ) + .build(); + ContractProjectUpdater updater = new ContractProjectUpdater(options); + File stubs = new File(GitRepoTests.class.getResource("/git_samples/sample_stubs").toURI()); + + updater.updateContractProject("hello-world", stubs.toPath()); + + // project, not origin, cause we're making one more clone of the local copy + try(Git git = openGitProject(this.project)) { + RevCommit revCommit = git.log().call().iterator().next(); + then(revCommit.getShortMessage()).isEqualTo("Updating project [hello-world] with stubs"); + // I have no idea but the file gets deleted after pushing + git.reset().setMode(ResetCommand.ResetType.HARD).call(); + } + BDDAssertions.then(new File(this.project, "META-INF/com.example/hello-world/0.0.2/mappings/someMapping.json")).exists(); + BDDAssertions.then(outputCapture.toString()).contains("Passed username and password - will set a custom credentials provider"); + } + + @Test + public void should_push_changes_to_current_branch_using_root_credentials() throws Exception { + StubRunnerOptions options = new StubRunnerOptionsBuilder() + .withStubRepositoryRoot("file://" + this.project.getAbsolutePath() + "/") + .withStubsMode(StubRunnerProperties.StubsMode.REMOTE) + .withUsername("foo") + .withPassword("bar") + .build(); + ContractProjectUpdater updater = new ContractProjectUpdater(options); + File stubs = new File(GitRepoTests.class.getResource("/git_samples/sample_stubs").toURI()); + + updater.updateContractProject("hello-world", stubs.toPath()); + + // project, not origin, cause we're making one more clone of the local copy + try(Git git = openGitProject(this.project)) { + RevCommit revCommit = git.log().call().iterator().next(); + then(revCommit.getShortMessage()).isEqualTo("Updating project [hello-world] with stubs"); + // I have no idea but the file gets deleted after pushing + git.reset().setMode(ResetCommand.ResetType.HARD).call(); + } + BDDAssertions.then(new File(this.project, "META-INF/com.example/hello-world/0.0.2/mappings/someMapping.json")).exists(); + BDDAssertions.then(outputCapture.toString()).contains("Passed username and password - will set a custom credentials provider"); } @Test From 0a28d0848d34590dcc93f2431fbebb78c4487921 Mon Sep 17 00:00:00 2001 From: SvenBayer Date: Mon, 9 Jul 2018 08:52:19 +0200 Subject: [PATCH 25/84] Move YamlContractConverter list of available contract converters. (#684) Great pointer and great pull request. Thanks a lot! --- .../verifier/file/ContractFileScanner.groovy | 3 +- .../file/ContractFileScannerSpec.groovy | 38 +++++++++++++++++++ .../directory/with/custom/yml/custom.yml | 16 ++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-contract-verifier/src/test/resources/directory/with/custom/yml/custom.yml diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy index 8ca4be4e25..be2c4383ed 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy @@ -88,6 +88,7 @@ class ContractFileScanner { */ private void appendRecursively(File baseDir, ListMultimap result) { List converters = converters() + converters.add(YamlContractConverter.INSTANCE) if (log.isTraceEnabled()) { log.trace("Found the following contract converters ${converters}") } @@ -104,8 +105,6 @@ class ContractFileScanner { boolean included = includeMatcher ? file.absolutePath.matches(includeMatcher) : true if (contractFile && included) { addContractToTestGeneration(result, files, file, i, ContractVerifierDslConverter.convertAsCollection(baseDir, file)) - } else if (YamlContractConverter.INSTANCE.isAccepted(file) && included) { - addContractToTestGeneration(result, files, file, i, YamlContractConverter.INSTANCE.convertFrom(file)) } else if (!contractFile && included) { addContractToTestGeneration(converters, result, files, file, i) } else { diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy index d4ee0cdf48..08937ae415 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy @@ -108,4 +108,42 @@ class ContractFileScannerSpec extends Specification { result.entries().every { it.value.convertedContract } result.entries().find { it.value.convertedContract.any { it.request.method.clientValue == "PUT" } } } + + def "should prefer custom yaml converter over standard yaml converter"() { + given: + File baseDir = new File(this.getClass().getResource("/directory/with/custom/yml").toURI()) + ContractFileScanner scanner = new ContractFileScanner(baseDir, null, null) { + @Override + protected List converters() { + return [new ContractConverter() { + @Override + boolean isAccepted(File file) { + if (!file.name.endsWith(".yml") && !file.name.endsWith(".yaml")) { + return false + } + String line + file.withReader { + line = it.readLine() + } + return line != null && line.startsWith("custom_format: 1.0") + } + + @Override + Collection convertFrom(File file) { + return Collections.singleton(Contract.newInstance()) + } + + @Override + Object convertTo(Collection contract) { + return new Object() + } + }] + } + } + when: + ListMultimap result = scanner.findContracts() + then: + result.keySet().size() == 1 + result.entries().every { it.value.convertedContract } + } } diff --git a/spring-cloud-contract-verifier/src/test/resources/directory/with/custom/yml/custom.yml b/spring-cloud-contract-verifier/src/test/resources/directory/with/custom/yml/custom.yml new file mode 100644 index 0000000000..fce56b04db --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/resources/directory/with/custom/yml/custom.yml @@ -0,0 +1,16 @@ +custom_format: 1.0 +outbound: + request: + url: /foo + method: PUT + headers: + foo: bar + body: + foo: bar +inbound: + response: + status: 200 + headers: + foo2: bar + body: + foo2: bar \ No newline at end of file From 4aab1da0f729802d15aafc5049b57748d396cb54 Mon Sep 17 00:00:00 2001 From: SvenBayer Date: Wed, 11 Jul 2018 20:40:17 +0200 Subject: [PATCH 26/84] Move YamlContractConverter after available contract converters for producers (#687) * Move YamlContractConverter list of available contract converters. * Move available contract converters before YamlContractConverter --- .../contract/stubrunner/StubRepository.java | 4 +- .../stubrunner/StubRepositoryTest.java | 30 +++++++++++++ .../TestCustomYamlContractConverter.java | 42 +++++++++++++++++++ .../test/resources/META-INF/spring.factories | 4 +- .../customYamlRepository/contracts/custom.yml | 16 +++++++ 5 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/StubRepositoryTest.java create mode 100644 spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/TestCustomYamlContractConverter.java create mode 100644 spring-cloud-contract-stub-runner/src/test/resources/customYamlRepository/contracts/custom.yml diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java index fcb87ab830..2065033d15 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java @@ -169,10 +169,10 @@ class StubRepository { if (isContractDescriptor(file)) { contractDescriptors .addAll(ContractVerifierDslConverter.convertAsCollection(file.getParentFile(), file)); + } else if (converter != null && converter.isAccepted(file)) { + contractDescriptors.addAll(converter.convertFrom(file)); } else if (YamlContractConverter.INSTANCE.isAccepted(file)) { contractDescriptors.addAll(YamlContractConverter.INSTANCE.convertFrom(file)); - } else if (converter != null) { - contractDescriptors.addAll(converter.convertFrom(file)); } } return super.visitFile(path, attrs); diff --git a/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/StubRepositoryTest.java b/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/StubRepositoryTest.java new file mode 100644 index 0000000000..a17916b10c --- /dev/null +++ b/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/StubRepositoryTest.java @@ -0,0 +1,30 @@ +package org.springframework.cloud.contract.stubrunner; + +import org.junit.Test; +import org.springframework.cloud.contract.spec.Contract; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; + +import static org.junit.Assert.assertEquals; + +/** + * @author Sven Bayer + */ +public class StubRepositoryTest { + private static final File YAML_REPOSITORY_LOCATION = new File("src/test/resources/customYamlRepository"); + + @Test + public void should_prefer_custom_yaml_converter_over_standard() { + //given: + StubRepository repository = new StubRepository(YAML_REPOSITORY_LOCATION, new ArrayList<>(), new StubRunnerOptionsBuilder().build()); + int expectedDescriptorsSize = 1; + + //when: + Collection descriptors = repository.getContracts(); + + //then: + assertEquals(expectedDescriptorsSize, descriptors.size()); + } +} diff --git a/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/TestCustomYamlContractConverter.java b/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/TestCustomYamlContractConverter.java new file mode 100644 index 0000000000..65ce6e4f38 --- /dev/null +++ b/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/TestCustomYamlContractConverter.java @@ -0,0 +1,42 @@ +package org.springframework.cloud.contract.stubrunner; + +import groovy.lang.Closure; +import org.springframework.cloud.contract.spec.Contract; +import org.springframework.cloud.contract.spec.ContractConverter; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Collection; +import java.util.Collections; +import java.util.Optional; + +/** + * @author Sven Bayer + */ +public class TestCustomYamlContractConverter implements ContractConverter { + + @Override + public boolean isAccepted(File file) { + if (!file.getName().endsWith(".yml") && !file.getName().endsWith(".yaml")) { + return false; + } + Optional line; + try { + line = Files.lines(file.toPath()).findFirst(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + return line.isPresent() && line.get().startsWith("custom_format: 1.0"); + } + + @Override + public Collection convertFrom(File file) { + return Collections.singleton(Contract.make(Closure.IDENTITY)); + } + + @Override + public Object convertTo(Collection contract) { + return new Object(); + } +} \ No newline at end of file diff --git a/spring-cloud-contract-stub-runner/src/test/resources/META-INF/spring.factories b/spring-cloud-contract-stub-runner/src/test/resources/META-INF/spring.factories index b149be0c5b..7b88e22c0b 100644 --- a/spring-cloud-contract-stub-runner/src/test/resources/META-INF/spring.factories +++ b/spring-cloud-contract-stub-runner/src/test/resources/META-INF/spring.factories @@ -1,2 +1,4 @@ org.springframework.cloud.contract.verifier.dsl.wiremock.WireMockExtensions=\ -org.springframework.cloud.contract.stubrunner.provider.wiremock.TestWireMockExtensions \ No newline at end of file +org.springframework.cloud.contract.stubrunner.provider.wiremock.TestWireMockExtensions +org.springframework.cloud.contract.spec.ContractConverter=\ +org.springframework.cloud.contract.stubrunner.TestCustomYamlContractConverter \ No newline at end of file diff --git a/spring-cloud-contract-stub-runner/src/test/resources/customYamlRepository/contracts/custom.yml b/spring-cloud-contract-stub-runner/src/test/resources/customYamlRepository/contracts/custom.yml new file mode 100644 index 0000000000..fce56b04db --- /dev/null +++ b/spring-cloud-contract-stub-runner/src/test/resources/customYamlRepository/contracts/custom.yml @@ -0,0 +1,16 @@ +custom_format: 1.0 +outbound: + request: + url: /foo + method: PUT + headers: + foo: bar + body: + foo: bar +inbound: + response: + status: 200 + headers: + foo2: bar + body: + foo2: bar \ No newline at end of file From 58ce759ce6463555bb0a35140af42d56ddd0cd28 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 13 Jul 2018 10:59:46 -0400 Subject: [PATCH 27/84] Bumped jsonassert to 0.4.13; fixes gh-689 --- spring-cloud-contract-dependencies/pom.xml | 2 +- .../test/resources/functionalTest/bootSimple/gradle.properties | 2 +- .../functionalTest/sampleJerseyProject/gradle.properties | 2 +- .../resources/functionalTest/sampleProject/gradle.properties | 2 +- .../resources/functionalTest/scenarioProject/gradle.properties | 2 +- .../src/test/projects/complex-configuration/pom.xml | 2 +- .../test/projects/different-module-configuration/module/pom.xml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index e61c2f554c..203167d4cd 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -15,7 +15,7 @@ Spring Cloud Contract Dependencies 2.16.0 - 0.4.12 + 0.4.13 1.0.2.v20150114 3.0.7 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 add1fe8dda..a2824069db 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 @@ -14,6 +14,6 @@ # limitations under the License. # wiremockVersion=2.16.0 -jsonAssertVersion=0.4.12 +jsonAssertVersion=0.4.13 verifierVersion=1.2.6.BUILD-SNAPSHOT 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 77ab8444ce..a28596a116 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 @@ -14,5 +14,5 @@ # limitations under the License. # wiremockVersion=2.16.0 -jsonAssertVersion=0.4.12 +jsonAssertVersion=0.4.13 verifierVersion=1.2.6.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 e4ef80c719..ce169ec75d 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 @@ -14,5 +14,5 @@ # limitations under the License. # wiremockVersion=2.16.0 -jsonAssertVersion=0.4.12 +jsonAssertVersion=0.4.13 verifierVersion=1.2.6.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 add1fe8dda..a2824069db 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 @@ -14,6 +14,6 @@ # limitations under the License. # wiremockVersion=2.16.0 -jsonAssertVersion=0.4.12 +jsonAssertVersion=0.4.13 verifierVersion=1.2.6.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml index f77da39ea6..156ac26bf9 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml @@ -63,7 +63,7 @@ com.toomuchcoding.jsonassert jsonassert - 0.4.12 + 0.4.13 test diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml index 55a50e8f51..661c11aef4 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml @@ -62,7 +62,7 @@ com.toomuchcoding.jsonassert jsonassert - 0.4.12 + 0.4.13 test From cb5d1a146519b13719f3196a06a437a853a12d78 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 17 Jul 2018 12:43:04 +0200 Subject: [PATCH 28/84] Added documentation on how to set up webflux; fixes gh-688 --- docs/src/main/asciidoc/verifier_contract.adoc | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/docs/src/main/asciidoc/verifier_contract.adoc b/docs/src/main/asciidoc/verifier_contract.adoc index a780dce0f3..8301317b46 100644 --- a/docs/src/main/asciidoc/verifier_contract.adoc +++ b/docs/src/main/asciidoc/verifier_contract.adoc @@ -1103,6 +1103,47 @@ context path included (for example, `/my-context-path/url`). * Your contracts reflect that you have a context path. Your generated stubs also have that information (for example, in the stubs, you have to call `/my-context-path/url`). +=== Working with Web Flux + +Spring Cloud Contract requires the usage of `EXPLICIT` mode in your generated tests +to work with Web Flux. + +[source,xml,indent=0,subs="verbatim,attributes",role="primary"] +.Maven +---- + + org.springframework.cloud + spring-cloud-contract-maven-plugin + ${spring-cloud-contract.version} + true + + EXPLICIT + + +---- + +[source,groovy,indent=0,subs="verbatim,attributes",role="secondary"] +.Gradle +---- +contracts { + testMode = 'EXPLICIT' +} +---- + +The following example shows how to set up a base class and Rest Assured for Web Flux: + +[source,groovy,indent=0] +---- +include::{samples_url}/producer_webflux/src/test/java/com/example/BeerRestBase.java[tags=annotations,indent=0] + + // your tests go here + + // in this config class you define all controllers and mocked services + include::{samples_url}/producer_webflux/src/test/java/com/example/BeerRestBase.java[tags=config,indent=0] + +} +---- + === Messaging Top-Level Elements The DSL for messaging looks a little bit different than the one that focuses on HTTP. The From 036e3bf1171de16932ebce82b71224a93ca87326 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 19 Jul 2018 08:40:21 +0200 Subject: [PATCH 29/84] Fixed invalid docs --- docs/src/main/asciidoc/verifier_setup.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/main/asciidoc/verifier_setup.adoc b/docs/src/main/asciidoc/verifier_setup.adoc index a308860e3a..5b91f9dc64 100644 --- a/docs/src/main/asciidoc/verifier_setup.adoc +++ b/docs/src/main/asciidoc/verifier_setup.adoc @@ -962,7 +962,7 @@ For such cases we're introducing the property and plugin setup mechanism: if either of these values is set to `true`, then the stub downloader will not verify the origin of the downloaded JAR. -For the plugins you need to set the `contractsSnapshotSkipCheck` property +For the plugins you need to set the `contractsSnapshotCheckSkip` property to `true`. === Scenarios From 6ab02d8ce893d5a65feb4d115d79f140f40a0bc3 Mon Sep 17 00:00:00 2001 From: Alexey Nesterov Date: Thu, 19 Jul 2018 08:14:53 +0100 Subject: [PATCH 30/84] Fix using regex patterns when matching raw body value (#692) When matching non-json or xml body with regex the expression gets escaped. Because of that all standard patterns (number(), positiveInt()) will not work either. E.g. response { status OK() body(value(stub("1"), test(number()))) } Will generate invalid matcher: assertThat(responseBody).matches("-?(d*.d+|d+)"); Valid version is: assertThat(responseBody).matches("-?(\\d*.\\d+|\\d+)"); --- .../builder/JUnitMethodBodyBuilder.groovy | 14 ++++++--- .../RestAssuredJUnitMethodBodyBuilder.groovy | 2 +- ...kMethodRequestProcessingBodyBuilder.groovy | 8 ++++- .../verifier/util/RegexpBuilders.groovy | 2 +- .../builder/MethodBodyBuilderSpec.groovy | 30 +++++++++++++++++++ 5 files changed, 49 insertions(+), 7 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy index 0d1dbd64fb..b8ff6f9e10 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy @@ -26,12 +26,14 @@ import org.springframework.cloud.contract.spec.internal.Header import org.springframework.cloud.contract.spec.internal.NamedProperty import org.springframework.cloud.contract.spec.internal.Request import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties +import org.springframework.cloud.contract.verifier.util.RegexpBuilders import java.util.regex.Pattern import static groovy.json.StringEscapeUtils.escapeJava import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT import static org.springframework.cloud.contract.verifier.util.ContentUtils.getJavaMultipartFileParameterContent + /** * Root class for JUnit method building * @@ -78,7 +80,7 @@ abstract class JUnitMethodBodyBuilder extends RequestProcessingMethodBodyBuilder @Override protected String getResponseBodyPropertyComparisonString(String property, Pattern value) { - return "assertThat(responseBody${property}).${buildEscapedMatchesMethod(value)}" + return "assertThat(responseBody${property}).${createBodyComparison(value)}" } @Override @@ -183,6 +185,11 @@ abstract class JUnitMethodBodyBuilder extends RequestProcessingMethodBodyBuilder return buildEscapedMatchesMethod(headerValue) + ";" } + protected String createBodyComparison(Pattern bodyValue) { + String patternAsString = bodyValue.pattern() + return createMatchesMethod(RegexpBuilders.buildGStringRegexpForTestSide(patternAsString)) + ";" + } + protected String createCookieComparison(Object cookieValue) { String escapedCookie = convertUnicodeEscapesIfRequired("$cookieValue") return "isEqualTo(\"$escapedCookie\");" @@ -197,8 +204,7 @@ abstract class JUnitMethodBodyBuilder extends RequestProcessingMethodBodyBuilder return createMatchesMethod(escapedHeader) } - protected String createMatchesMethod(String escapedHeader) { - return "matches(\"$escapedHeader\")" + protected String createMatchesMethod(String pattern) { + return "matches(\"$pattern\")" } - } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RestAssuredJUnitMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RestAssuredJUnitMethodBodyBuilder.groovy index fdfabf0c72..249f260867 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RestAssuredJUnitMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RestAssuredJUnitMethodBodyBuilder.groovy @@ -72,7 +72,7 @@ class RestAssuredJUnitMethodBodyBuilder extends JUnitMethodBodyBuilder { @Override protected String getResponseBodyPropertyComparisonString(String property, Pattern value) { - return """assertThat(responseBody).${createHeaderComparison(value)}""" + return """assertThat(responseBody).${createBodyComparison(value)}""" } @Override diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy index 0e4f0022e6..3cef2d4487 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy @@ -27,6 +27,7 @@ import org.springframework.cloud.contract.spec.internal.Request import org.springframework.cloud.contract.spec.internal.ExecutionProperty import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties import org.springframework.cloud.contract.verifier.util.ContentUtils +import org.springframework.cloud.contract.verifier.util.RegexpBuilders import java.util.regex.Pattern @@ -60,7 +61,7 @@ abstract class SpockMethodRequestProcessingBodyBuilder extends RequestProcessing @Override protected String getResponseBodyPropertyComparisonString(String property, Pattern value) { - return "responseBody$property ${patternComparison(value)}" + return "responseBody$property ${createBodyComparison(value)}" } @Override @@ -173,6 +174,11 @@ abstract class SpockMethodRequestProcessingBodyBuilder extends RequestProcessing return "== '$cookieValue'" } + protected String createBodyComparison(Pattern bodyValue) { + String patternAsString = bodyValue.pattern() + return patternComparison(RegexpBuilders.buildGStringRegexpForTestSide(patternAsString)) + ";" + } + protected String convertCookieComparison(Pattern cookieValue) { return patternComparison(cookieValue) } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/RegexpBuilders.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/RegexpBuilders.groovy index f1593eb2f4..74f5f915ce 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/RegexpBuilders.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/RegexpBuilders.groovy @@ -28,7 +28,7 @@ import static ContentType.* import static ContentUtils.extractValue /** - * Useful utility methods to work with regular expresisons + * Useful utility methods to work with regular expressions * * Do not change to {@code @CompileStatic} since it's using double dispatch. * diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy index 437773ee97..7d68656ffc 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy @@ -716,4 +716,34 @@ DocumentContext parsedJson = JsonPath.parse(json); "JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } } + def "should not escape a regex pattern when matching raw body value [#methodBuilderName]"() { + def pattern = "\\d+\\w?" + def escapedPattern = "\\\\d+\\\\w?" + + given: + Contract contractDsl = Contract.make { + request { + method 'GET' + url '/api/arbitrary-url' + } + response { + status OK() + body(value(stub("1"), test(regex(pattern)))) + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + when: + builder.appendTo(blockBuilder) + then: + String test = blockBuilder.toString() + test.contains(escapedPattern) + where: + methodBuilderName | methodBuilder + "MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) } + "MockMvcJUnitMethodBuilder" | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties) } + "JaxRsClientSpockMethodRequestProcessingBodyBuilder" | { Contract dsl -> new JaxRsClientSpockMethodRequestProcessingBodyBuilder(dsl, properties) } + "JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } + } + } From fbee744992cc332fb67f8a5e127cf0faf4af4d0a Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 19 Jul 2018 14:59:36 +0200 Subject: [PATCH 31/84] Bump to Greenwich, 2.1.0 --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/project/gradle.properties | 2 +- docker/spring-cloud-contract-stub-runner-docker/pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 2 +- samples/pom.xml | 4 ++-- samples/standalone/contracts/com/example/server/pom.xml | 2 +- samples/standalone/dsl/http-server/gradle.properties | 2 +- samples/standalone/dsl/http-server/pom.xml | 2 +- samples/standalone/dsl/pom.xml | 4 ++-- samples/standalone/messaging/pom.xml | 4 ++-- samples/standalone/messaging/stream-sink/gradle.properties | 2 +- samples/standalone/messaging/stream-sink/pom.xml | 2 +- samples/standalone/messaging/stream-source/gradle.properties | 2 +- samples/standalone/messaging/stream-source/pom.xml | 2 +- samples/standalone/pact/pact-http-server/gradle.properties | 2 +- samples/standalone/pact/pact-http-server/pom.xml | 2 +- samples/standalone/pact/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/standalone/restdocs/http-client/gradle.properties | 2 +- samples/standalone/restdocs/http-client/pom.xml | 2 +- samples/standalone/restdocs/http-server/gradle.properties | 2 +- samples/standalone/restdocs/http-server/pom.xml | 2 +- samples/standalone/restdocs/pom.xml | 4 ++-- samples/standalone/webclient/http-client/gradle.properties | 2 +- samples/standalone/webclient/http-client/pom.xml | 2 +- samples/standalone/webclient/http-server/gradle.properties | 2 +- samples/standalone/webclient/http-server/pom.xml | 2 +- samples/standalone/webclient/pom.xml | 4 ++-- samples/standalone/yml/http-server/gradle.properties | 2 +- samples/standalone/yml/http-server/pom.xml | 2 +- samples/standalone/yml/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 4 ++-- samples/wiremock-native/pom.xml | 4 ++-- samples/wiremock-tomcat/pom.xml | 4 ++-- samples/wiremock-undertow-ssl/pom.xml | 4 ++-- samples/wiremock-undertow/pom.xml | 4 ++-- spring-cloud-contract-dependencies/pom.xml | 2 +- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../spring-cloud-starter-contract-stub-runner-jetty/pom.xml | 2 +- .../spring-cloud-starter-contract-stub-runner/pom.xml | 2 +- .../spring-cloud-starter-contract-verifier/pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../spring-cloud-contract-gradle-plugin/gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../resources/functionalTest/bootSimple/gradle.properties | 2 +- .../functionalTest/sampleJerseyProject/gradle.properties | 2 +- .../resources/functionalTest/sampleProject/gradle.properties | 2 +- .../functionalTest/scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../spring-cloud-contract-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-amqp/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml | 2 +- .../spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-context-path/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-integration/pom.xml | 2 +- .../pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-moco/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-stream/pom.xml | 2 +- 72 files changed, 89 insertions(+), 89 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 51b7b49cce..f897d89446 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-docker-parent pom - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index 0d0e54d9e2..4c958eb3bb 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-docker pom - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index 47067d9b60..183e436e72 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index ffe73509e1..225819da6e 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-docker pom - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index 830ea6c773..5d8c5fb915 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index 9cf83ef9ee..f502ada4fe 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ spring-cloud-contract-parent pom - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT Spring Cloud Contract Spring Cloud Contract diff --git a/samples/pom.xml b/samples/pom.xml index 22dbb8a427..ed713758fd 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-samples pom - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/contracts/com/example/server/pom.xml b/samples/standalone/contracts/com/example/server/pom.xml index 830253ce4b..f9e39e6484 100644 --- a/samples/standalone/contracts/com/example/server/pom.xml +++ b/samples/standalone/contracts/com/example/server/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT Finchley.BUILD-SNAPSHOT true diff --git a/samples/standalone/dsl/http-server/gradle.properties b/samples/standalone/dsl/http-server/gradle.properties index 2e18603809..558d820385 100644 --- a/samples/standalone/dsl/http-server/gradle.properties +++ b/samples/standalone/dsl/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/dsl/http-server/pom.xml b/samples/standalone/dsl/http-server/pom.xml index 3d4b867c25..9e2acb07aa 100644 --- a/samples/standalone/dsl/http-server/pom.xml +++ b/samples/standalone/dsl/http-server/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/dsl/pom.xml b/samples/standalone/dsl/pom.xml index cfc57292b6..76f79cf082 100644 --- a/samples/standalone/dsl/pom.xml +++ b/samples/standalone/dsl/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/pom.xml b/samples/standalone/messaging/pom.xml index c7bfa9453d..ea244d7730 100644 --- a/samples/standalone/messaging/pom.xml +++ b/samples/standalone/messaging/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/stream-sink/gradle.properties b/samples/standalone/messaging/stream-sink/gradle.properties index 2e18603809..558d820385 100644 --- a/samples/standalone/messaging/stream-sink/gradle.properties +++ b/samples/standalone/messaging/stream-sink/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/messaging/stream-sink/pom.xml b/samples/standalone/messaging/stream-sink/pom.xml index aec99d9dd4..140b2d18fe 100644 --- a/samples/standalone/messaging/stream-sink/pom.xml +++ b/samples/standalone/messaging/stream-sink/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/stream-source/gradle.properties b/samples/standalone/messaging/stream-source/gradle.properties index 2e18603809..558d820385 100644 --- a/samples/standalone/messaging/stream-source/gradle.properties +++ b/samples/standalone/messaging/stream-source/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/messaging/stream-source/pom.xml b/samples/standalone/messaging/stream-source/pom.xml index 72bfbc3652..945c289b86 100644 --- a/samples/standalone/messaging/stream-source/pom.xml +++ b/samples/standalone/messaging/stream-source/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/standalone/pact/pact-http-server/gradle.properties b/samples/standalone/pact/pact-http-server/gradle.properties index 2e18603809..558d820385 100644 --- a/samples/standalone/pact/pact-http-server/gradle.properties +++ b/samples/standalone/pact/pact-http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/pact/pact-http-server/pom.xml b/samples/standalone/pact/pact-http-server/pom.xml index 37a522faae..b48ef6c859 100644 --- a/samples/standalone/pact/pact-http-server/pom.xml +++ b/samples/standalone/pact/pact-http-server/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/pact/pom.xml b/samples/standalone/pact/pom.xml index 0679949bc2..fc17d64ea8 100644 --- a/samples/standalone/pact/pom.xml +++ b/samples/standalone/pact/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests with Pact - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index c324c58788..30047e0104 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-samples-standalone pom - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/standalone/restdocs/http-client/gradle.properties b/samples/standalone/restdocs/http-client/gradle.properties index 2e18603809..558d820385 100644 --- a/samples/standalone/restdocs/http-client/gradle.properties +++ b/samples/standalone/restdocs/http-client/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/restdocs/http-client/pom.xml b/samples/standalone/restdocs/http-client/pom.xml index 3e56005f78..937207d83e 100644 --- a/samples/standalone/restdocs/http-client/pom.xml +++ b/samples/standalone/restdocs/http-client/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/standalone/restdocs/http-server/gradle.properties b/samples/standalone/restdocs/http-server/gradle.properties index 2e18603809..558d820385 100644 --- a/samples/standalone/restdocs/http-server/gradle.properties +++ b/samples/standalone/restdocs/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/pom.xml b/samples/standalone/restdocs/http-server/pom.xml index 67555ce6f0..e7d221cade 100644 --- a/samples/standalone/restdocs/http-server/pom.xml +++ b/samples/standalone/restdocs/http-server/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT true diff --git a/samples/standalone/restdocs/pom.xml b/samples/standalone/restdocs/pom.xml index ed13cd985c..1015d252f9 100644 --- a/samples/standalone/restdocs/pom.xml +++ b/samples/standalone/restdocs/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/standalone/webclient/http-client/gradle.properties b/samples/standalone/webclient/http-client/gradle.properties index 2e18603809..558d820385 100644 --- a/samples/standalone/webclient/http-client/gradle.properties +++ b/samples/standalone/webclient/http-client/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/webclient/http-client/pom.xml b/samples/standalone/webclient/http-client/pom.xml index 9e3192034e..a5a02119ae 100644 --- a/samples/standalone/webclient/http-client/pom.xml +++ b/samples/standalone/webclient/http-client/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/standalone/webclient/http-server/gradle.properties b/samples/standalone/webclient/http-server/gradle.properties index 2e18603809..558d820385 100644 --- a/samples/standalone/webclient/http-server/gradle.properties +++ b/samples/standalone/webclient/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/webclient/http-server/pom.xml b/samples/standalone/webclient/http-server/pom.xml index 2b2a840173..9c8db657ff 100644 --- a/samples/standalone/webclient/http-server/pom.xml +++ b/samples/standalone/webclient/http-server/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/standalone/webclient/pom.xml b/samples/standalone/webclient/pom.xml index a5eafebb98..2797844013 100644 --- a/samples/standalone/webclient/pom.xml +++ b/samples/standalone/webclient/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-server/gradle.properties b/samples/standalone/yml/http-server/gradle.properties index 9a46358ccd..711450aac9 100644 --- a/samples/standalone/yml/http-server/gradle.properties +++ b/samples/standalone/yml/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-server/pom.xml b/samples/standalone/yml/http-server/pom.xml index 7b0e026cfc..e58ff2cc9a 100644 --- a/samples/standalone/yml/http-server/pom.xml +++ b/samples/standalone/yml/http-server/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/pom.xml b/samples/standalone/yml/pom.xml index 267743d674..068892b4b6 100644 --- a/samples/standalone/yml/pom.xml +++ b/samples/standalone/yml/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index e2328a5087..a974ca7a58 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT jar wiremock-jetty @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index 029fd7d0e8..a2de7fa4e6 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT jar wiremock-native @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index f661e39a36..5e80b32c10 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT jar wiremock-tomcat @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index 8014032d55..c2a2e1152c 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT jar wiremock-undertow-ssl @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index 3d21fe0a6d..f69418867c 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT jar wiremock-undertow @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 96b0398aa0..45c0d62d58 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -9,7 +9,7 @@ spring-cloud-contract-dependencies - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index 8fcc3299b4..b08de75774 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index 9d3d6bf384..acea8210ff 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index f492119600..13311eb1e5 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index 29c14ddb03..85b739e87e 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index d3eb41672c..cd1c957b2a 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index 13997ffe5d..e2df9aa5c6 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index de364e5ee5..4eacdd9de9 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index b32ecc7a03..ea8a8a9bec 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index 47c4915e4c..df5bf4bd6f 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index d9f69ad174..9cdc74f4ac 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index 7886664ec4..befbc3599e 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index 8fe8da01f2..824cfdc05f 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. 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 c2dda0c23d..63e1b05224 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT 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 c2dda0c23d..63e1b05224 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.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 c2dda0c23d..63e1b05224 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT 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 c2dda0c23d..63e1b05224 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.1.0.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 4ab0cf1e80..e400b4d0af 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. @@ -33,7 +33,7 @@ 1.7 - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml index 82a472824e..127bf49a5d 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 14f47b4a66..99b624a210 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index 7402e9adcc..17f69d42ea 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index 4d6d66130d..c1ba804d17 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index c046e5468c..72208fe766 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index 9143e47dea..6134fb9a22 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index f96228c10a..476a4ddec5 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index a7048fc82c..e3ec0afcc2 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index c44db00760..5ecf019a23 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index 17d4e649e2..3ac791fac9 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index 8f0a614c5f..a52d733f07 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index 95ae806043..70f469f621 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index f39151bc5b..2c1ca90901 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index bc610fa233..c2b6a8b8e6 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index 423ee01ea7..9b132ee2d5 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index 52916d9495..86f60e482d 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-stream From 718cca099b147dbbfbe8655f216623240e7a6d63 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 19 Jul 2018 15:03:05 +0200 Subject: [PATCH 32/84] Made stream binder optional; fixes gh-682 (#693) --- .../spring-cloud-starter-contract-stub-runner/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index cd1c957b2a..a4ec1457db 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -28,6 +28,7 @@ org.springframework.cloud spring-cloud-stream-test-support + true org.springframework.cloud From b48d50edcc4cd59faae5796c764b45dbd035676b Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Thu, 19 Jul 2018 15:03:42 +0200 Subject: [PATCH 33/84] Add junit5 support (#690) * Refactoring: extract class building methods. * Move imports to import providers. * Switch to new TestFramework implementation with TestFrameworkDefinition delegate. Handle ignoring tests correctly in JUnit5. * Implement handling JUnit5 rules. * Add tests for JUNIT5. * Update docs. fixes gh-489 --- .../main/asciidoc/verifier_introduction.adoc | 6 +- .../src/main/asciidoc/verifier_messaging.adoc | 4 +- docs/src/main/asciidoc/verifier_setup.adoc | 8 +- .../maven/verifier/GenerateTestsMojo.java | 2 + spring-cloud-contract-verifier/pom.xml | 4 + .../verifier/builder/ClassBuilder.groovy | 28 +- .../JUnitMessagingMethodBodyBuilder.groovy | 7 +- .../verifier/builder/JavaTestGenerator.groovy | 101 ++--- .../verifier/builder/MethodBuilder.groovy | 23 +- .../builder/imports/BaseImportProvider.groovy | 62 +++ .../builder/imports/HttpImportProvider.groovy | 76 ++++ .../builder/imports/ImportDefinitions.groovy | 22 ++ .../imports/MessagingImportProvider.groovy | 32 ++ .../verifier/config/TestFramework.groovy | 123 +++--- .../config/framework/CustomDefinition.groovy | 69 ++++ .../config/framework/JUnit5Definition.groovy | 69 ++++ .../config/framework/JUnitDefinition.groovy | 69 ++++ .../config/framework/SpockDefinition.groovy | 69 ++++ .../framework/TestFrameworkDefinition.groovy | 75 ++++ .../verifier/GeneratorScannerSpec.groovy | 8 +- .../builder/SingleTestGeneratorSpec.groovy | 363 ++++++++++-------- 21 files changed, 940 insertions(+), 280 deletions(-) create mode 100644 spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/BaseImportProvider.groovy create mode 100644 spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/HttpImportProvider.groovy create mode 100644 spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/ImportDefinitions.groovy create mode 100644 spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/MessagingImportProvider.groovy create mode 100644 spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/CustomDefinition.groovy create mode 100644 spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/JUnit5Definition.groovy create mode 100644 spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/JUnitDefinition.groovy create mode 100644 spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/SpockDefinition.groovy create mode 100644 spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/TestFrameworkDefinition.groovy diff --git a/docs/src/main/asciidoc/verifier_introduction.adoc b/docs/src/main/asciidoc/verifier_introduction.adoc index d5c36e7f29..be760da0a6 100644 --- a/docs/src/main/asciidoc/verifier_introduction.adoc +++ b/docs/src/main/asciidoc/verifier_introduction.adoc @@ -15,7 +15,7 @@ produced by Spring Cloud Contract Verifier. * Messaging routes, if you're using a messaging service. We integrate with Spring Integration, Spring Cloud Stream, Spring AMQP, and Apache Camel. You can also set your own integrations. -* Acceptance tests (in JUnit or Spock) are used to verify if server-side implementation +* Acceptance tests (in JUnit 4, JUnit 5 or Spock) are used to verify if server-side implementation of the API is compliant with the contract (__server tests__). A full test is generated by Spring Cloud Contract Verifier. @@ -363,8 +363,8 @@ mode for HTTP contracts. However, JAX-RX client and explicit HTTP invocations ca used. (To do so, change the `testMode` property of the plugin to `JAX-RS` or `EXPLICIT`, respectively.) -Apart from the default JUnit, you can instead use Spock tests, by setting the plugin -`testFramework` property to `Spock`. +Apart from the default JUnit 4, you can instead use JUnit 5 or Spock tests, by setting the plugin +`testFramework` property to either `JUNIT5` or `Spock`. TIP: You can now also generate WireMock scenarios based on the contracts, by including an order number followed by an underscore at the beginning of the contract file names. diff --git a/docs/src/main/asciidoc/verifier_messaging.adoc b/docs/src/main/asciidoc/verifier_messaging.adoc index 9d4432f756..811353d1ff 100644 --- a/docs/src/main/asciidoc/verifier_messaging.adoc +++ b/docs/src/main/asciidoc/verifier_messaging.adoc @@ -69,8 +69,8 @@ messaging configuration, so you only need the one annotation. === Publisher-Side Test Generation Having the `input` or `outputMessage` sections in your DSL results in creation of tests -on the publisher's side. By default, JUnit tests are created. However, there is also a -possibility to create Spock tests. +on the publisher's side. By default, JUnit 4 tests are created. However, there is also a +possibility to create JUnit 5 or Spock tests. There are 3 main scenarios that we should take into consideration: diff --git a/docs/src/main/asciidoc/verifier_setup.adoc b/docs/src/main/asciidoc/verifier_setup.adoc index 5b91f9dc64..9b3f913cbc 100644 --- a/docs/src/main/asciidoc/verifier_setup.adoc +++ b/docs/src/main/asciidoc/verifier_setup.adoc @@ -245,8 +245,8 @@ from the Groovy DSL should be placed. By default its value is `$buildDir/generated-test-sources/contractVerifier`. * *stubsOutputDir*: Specifies the directory where the generated WireMock stubs from the Groovy DSL should be placed. -* *targetFramework*: Specifies the target test framework to be used. Currently, Spock and -JUnit are supported with JUnit being the default framework. +* *targetFramework*: Specifies the target test framework to be used. Currently, Spock, JUnit 4 (`TestFramework.JUNIT` and +JUnit 5 are supported with JUnit 4 being the default framework. * *contractsProperties*: a map containing properties to be passed to Spring Cloud Contract components. Those properties might be used by e.g. inbuilt or custom Stub Downloaders. @@ -582,8 +582,8 @@ classes. use Spock classes, the class is `spock.lang.Specification`. * *contractsDirectory*: Specifies a directory containing contracts written with the GroovyDSL. The default directory is `/src/test/resources/contracts`. -* *testFramework*: Specifies the target test framework to be used. Currently, Spock and -JUnit are supported with JUnit being the default framework +* *testFramework*: Specifies the target test framework to be used. Currently, Spock, JUnit 4 (`TestFramework.JUNIT` and +6JUnit 5 are supported with JUnit 4 being the default framework. * *packageWithBaseClasses*: Defines a package where all the base classes reside. This setting takes precedence over *baseClassForTests*. The convention is such that, if you have a contract under (for example) `src/test/resources/contract/foo/bar/baz/` and set diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java index 4c466b7405..56ee9826c0 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java @@ -21,6 +21,7 @@ import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; + import javax.inject.Inject; import org.apache.maven.model.Dependency; @@ -33,6 +34,7 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; import org.eclipse.aether.RepositorySystemSession; + import org.springframework.cloud.contract.maven.verifier.stubrunner.AetherStubDownloaderFactory; import org.springframework.cloud.contract.spec.ContractVerifierException; import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties; diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 99b624a210..398a96c486 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -128,6 +128,10 @@ spring-mock-mvc test + + org.junit.jupiter + junit-jupiter-api + org.springframework.boot spring-boot-starter-jersey diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy index 12a6f66799..1f99951cf7 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy @@ -18,9 +18,10 @@ package org.springframework.cloud.contract.verifier.builder import groovy.transform.CompileStatic import groovy.transform.PackageScope + +import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties import org.springframework.cloud.contract.verifier.config.TestFramework import org.springframework.cloud.contract.verifier.util.NamesUtil -import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties /** * Builds a class. Adds all the imports, static imports etc. @@ -104,11 +105,16 @@ class ClassBuilder { return this } - ClassBuilder addImport(List importsToAdd) { + ClassBuilder addImports(List importsToAdd) { imports.addAll(importsToAdd) return this } + ClassBuilder addStaticImports(List importsToAdd) { + staticImports.addAll(importsToAdd) + return this + } + ClassBuilder addStaticImport(String importToAdd) { staticImports << importToAdd return this @@ -124,13 +130,6 @@ class ClassBuilder { return this } - private String appendColonIfJUniTest(String field) { - if (lang == TestFramework.JUNIT && !field.endsWith(';')) { - return "$field;" - } - return field - } - ClassBuilder addField(List fieldsToAdd) { fields.addAll(fieldsToAdd.collect { appendColonIfJUniTest(it) }) return this @@ -202,4 +201,15 @@ class ClassBuilder { void addClassLevelAnnotation(String annotation) { classLevelAnnotations << annotation } + + private String appendColonIfJUniTest(String field) { + if (isJUnitType(field)) { + return "$field;" + } + return field + } + + private boolean isJUnitType(String field) { + TestFramework.JUNIT == lang || TestFramework.JUNIT5 == lang && !field.endsWith(';') + } } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy index 20a0d34a12..36b81107ed 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy @@ -16,9 +16,12 @@ package org.springframework.cloud.contract.verifier.builder +import java.util.regex.Pattern + import groovy.json.StringEscapeUtils import groovy.transform.PackageScope import groovy.transform.TypeChecked + import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.spec.internal.Cookie import org.springframework.cloud.contract.spec.internal.ExecutionProperty @@ -29,8 +32,6 @@ import org.springframework.cloud.contract.spec.internal.NotToEscapePattern import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties import org.springframework.cloud.contract.verifier.util.MapConverter -import java.util.regex.Pattern - import static groovy.json.StringEscapeUtils.escapeJava import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT @@ -195,7 +196,7 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder { protected String getInputString() { String request = 'ContractVerifierMessage inputMessage = contractVerifierMessaging.create(' if (inputMessage.messageBody) { - request = "${request}\n\t\t\t\t\"${StringEscapeUtils.escapeJava(bodyAsString)}\"\n" + request = "${request}\n\t\t\t\t\"${escapeJava(bodyAsString)}\"\n" } if (inputMessage.messageHeaders) { request = "${request}\t\t\t\t, headers()" diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JavaTestGenerator.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JavaTestGenerator.groovy index c3de1c34a7..b6c09026c6 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JavaTestGenerator.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JavaTestGenerator.groovy @@ -16,20 +16,25 @@ package org.springframework.cloud.contract.verifier.builder +import java.lang.invoke.MethodHandles + import groovy.transform.Canonical import groovy.transform.EqualsAndHashCode import groovy.transform.PackageScope import org.apache.commons.logging.Log import org.apache.commons.logging.LogFactory + import org.springframework.cloud.contract.spec.Contract +import org.springframework.cloud.contract.verifier.builder.imports.HttpImportProvider +import org.springframework.cloud.contract.verifier.builder.imports.MessagingImportProvider import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties -import org.springframework.cloud.contract.verifier.config.TestFramework -import org.springframework.cloud.contract.verifier.config.TestMode import org.springframework.cloud.contract.verifier.file.ContractMetadata -import java.lang.invoke.MethodHandles - +import static org.springframework.cloud.contract.verifier.builder.imports.BaseImportProvider.getImports +import static org.springframework.cloud.contract.verifier.builder.imports.BaseImportProvider.getRuleImport +import static org.springframework.cloud.contract.verifier.builder.imports.BaseImportProvider.getStaticImports import static org.springframework.cloud.contract.verifier.util.NamesUtil.capitalize + /** * Builds a single test for the given {@link ContractVerifierConfigProperties properties} * @@ -48,61 +53,39 @@ class JavaTestGenerator implements SingleTestGenerator { @Override String buildClass(ContractVerifierConfigProperties configProperties, Collection listOfFiles, String className, String classPackage, String includedDirectoryRelativePath) { ClassBuilder clazz = ClassBuilder.createClass(capitalize(className), classPackage, configProperties, includedDirectoryRelativePath) - if (configProperties.imports) { configProperties.imports.each { clazz.addImport(it) } } - if (configProperties.staticImports) { configProperties.staticImports.each { clazz.addStaticImport(it) } } - if (isScenarioClass(listOfFiles)) { - clazz.addImport(configProperties.targetFramework.getOrderAnnotationImport()) + clazz.addImports(configProperties.targetFramework.getOrderAnnotationImports()) clazz.addClassLevelAnnotation(configProperties.targetFramework.getOrderAnnotation()) } - addJsonPathRelatedImports(clazz) + processContractFiles(listOfFiles, configProperties, clazz) + return clazz.build() + } + private void processContractFiles(Collection listOfFiles, + ContractVerifierConfigProperties configProperties, ClassBuilder clazz) { Map contracts = mapContractsToTheirTestTypes(listOfFiles) - boolean restAssured2Present = this.checker.isClassPresent(REST_ASSURED_2_0_CLASS) - String restAssuredPackage = restAssured2Present ? 'com.jayway.restassured' : 'io.restassured' - if (log.isDebugEnabled()) { - log.debug("Rest Assured version 2.x found [${restAssured2Present}]") - } boolean conditionalImportsAdded = false - boolean toIgnore = listOfFiles.ignored.find { it } - contracts.each { ParsedDsl key, TestType value -> + boolean toIgnore = listOfFiles.ignored.find {it} + contracts.each {ParsedDsl key, TestType value -> if (!conditionalImportsAdded) { + clazz.addImports(getImports(configProperties.targetFramework)) + clazz.addStaticImports(getStaticImports(configProperties.targetFramework)) if (contracts.values().contains(TestType.HTTP)) { - if (configProperties.testMode == TestMode.JAXRSCLIENT) { - clazz.addStaticImport('javax.ws.rs.client.Entity.*') - if (configProperties.targetFramework == TestFramework.JUNIT) { - clazz.addImport('javax.ws.rs.core.Response') - } - } else if (configProperties.testMode == TestMode.MOCKMVC) { - clazz.addStaticImport("${restAssuredPackage}.module.mockmvc.RestAssuredMockMvc.*") - } else { - clazz.addStaticImport("${restAssuredPackage}.RestAssured.*") - } + addHttpRelatedEntries(clazz, configProperties) } - if (configProperties.targetFramework == TestFramework.JUNIT) { - if (contracts.values().contains(TestType.HTTP) && configProperties.testMode == TestMode.MOCKMVC) { - clazz.addImport("${restAssuredPackage}.module.mockmvc.specification.MockMvcRequestSpecification") - clazz.addImport("${restAssuredPackage}.response.ResponseOptions") - } else if (contracts.values().contains(TestType.HTTP) && configProperties.testMode == TestMode.EXPLICIT) { - clazz.addImport("${restAssuredPackage}.specification.RequestSpecification") - clazz.addImport("${restAssuredPackage}.response.Response") - } - clazz.addImport('org.junit.Test') - } - clazz.addStaticImport('org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat') if (configProperties.ruleClassForTests) { - clazz.addImport('org.junit.Rule').addRule(configProperties.ruleClassForTests) + addRule(configProperties, clazz) } if (contracts.values().contains(TestType.MESSAGING)) { addMessagingRelatedEntries(clazz) @@ -116,8 +99,31 @@ class JavaTestGenerator implements SingleTestGenerator { if (toIgnore) { clazz.addImport(configProperties.targetFramework.getIgnoreClass()) } + } - return clazz.build() + private void addRule(ContractVerifierConfigProperties configProperties, ClassBuilder clazz) { + clazz.addImport(getRuleImport()) + if (configProperties.targetFramework.annotationLevelRules()) { + clazz.addClassLevelAnnotation(configProperties.targetFramework + .getRuleAnnotation(configProperties.ruleClassForTests)) + } else { + clazz.addRule(configProperties.ruleClassForTests) + } + } + + private void addHttpRelatedEntries(ClassBuilder clazz, ContractVerifierConfigProperties configProperties) { + HttpImportProvider httpImportProvider = new HttpImportProvider(getRestAssuredPackage()) + clazz.addImports(httpImportProvider.getImports(configProperties.targetFramework, configProperties.testMode)) + clazz.addStaticImports(httpImportProvider.getStaticImports(configProperties.targetFramework, configProperties.testMode)) + } + + private String getRestAssuredPackage() { + boolean restAssured2Present = this.checker.isClassPresent(REST_ASSURED_2_0_CLASS) + String restAssuredPackage = restAssured2Present ? 'com.jayway.restassured' : 'io.restassured' + if (log.isDebugEnabled()) { + log.debug("Rest Assured version 2.x found [${restAssured2Present}]") + } + return restAssuredPackage } @Override @@ -159,8 +165,8 @@ class JavaTestGenerator implements SingleTestGenerator { } private void addJsonPathRelatedImports(ClassBuilder clazz) { - clazz.addImport(['com.jayway.jsonpath.DocumentContext', - 'com.jayway.jsonpath.JsonPath', + clazz.addImports(['com.jayway.jsonpath.DocumentContext', + 'com.jayway.jsonpath.JsonPath', ]) if (this.checker.isClassPresent(JSON_ASSERT_CLASS)) { clazz.addStaticImport(JSON_ASSERT_STATIC_IMPORT) @@ -169,16 +175,11 @@ class JavaTestGenerator implements SingleTestGenerator { private void addMessagingRelatedEntries(ClassBuilder clazz) { clazz.addField(['@Inject ContractVerifierMessaging contractVerifierMessaging', - '@Inject ContractVerifierObjectMapper contractVerifierObjectMapper' + '@Inject ContractVerifierObjectMapper contractVerifierObjectMapper' ]) - clazz.addImport([ 'javax.inject.Inject', - 'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper', - 'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessage', - 'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging', - ]) - clazz.addStaticImport('org.springframework.cloud.contract.verifier.messaging.util.ContractVerifierMessagingUtil.headers') + clazz.addImports(MessagingImportProvider.getImports()) + clazz.addStaticImports(MessagingImportProvider.getStaticImports()) } - } class ClassPresenceChecker { @@ -189,7 +190,7 @@ class ClassPresenceChecker { try { Class.forName(className) return true - } catch (ClassNotFoundException e) { + } catch (ClassNotFoundException ignored) { if (log.isDebugEnabled()) { log.debug("[${className}] is not present on classpath. Will not add a static import.") } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBuilder.groovy index 4984a2e0a0..81641b06ec 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBuilder.groovy @@ -19,13 +19,17 @@ package org.springframework.cloud.contract.verifier.builder import groovy.transform.CompileStatic import groovy.transform.PackageScope import groovy.util.logging.Slf4j + import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties -import org.springframework.cloud.contract.verifier.config.TestFramework import org.springframework.cloud.contract.verifier.config.TestMode import org.springframework.cloud.contract.verifier.file.ContractMetadata import org.springframework.cloud.contract.verifier.util.NamesUtil +import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT +import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT5 +import static org.springframework.cloud.contract.verifier.config.TestFramework.SPOCK + /** * Builds a test method. Adds an ignore annotation on a method if necessary. * @@ -57,7 +61,7 @@ class MethodBuilder { if (log.isDebugEnabled()) { log.debug("Stub content Groovy DSL [$stubContent]") } - String methodName = methodName(contract, stubsFile, stubContent) + String methodName = MethodBuilder.methodName(contract, stubsFile, stubContent) return new MethodBuilder(methodName, stubContent, configProperties, contract.ignored || stubContent.ignored) } @@ -91,11 +95,11 @@ class MethodBuilder { * Appends to the {@link BlockBuilder} the contents of the test */ void appendTo(BlockBuilder blockBuilder) { - if (configProperties.targetFramework == TestFramework.JUNIT) { + if (isJUnitType()) { blockBuilder.addLine('@Test') } if (ignored) { - blockBuilder.addLine('@Ignore') + blockBuilder.addLine(configProperties.targetFramework.ignoreAnnotation) } blockBuilder.addLine(configProperties.targetFramework.methodModifier + "validate_$methodName() throws Exception {") getMethodBodyBuilder().appendTo(blockBuilder) @@ -104,26 +108,29 @@ class MethodBuilder { private MethodBodyBuilder getMethodBodyBuilder() { if (stubContent.input || stubContent.outputMessage) { - if (configProperties.targetFramework == TestFramework.JUNIT) { + if (isJUnitType()) { return new JUnitMessagingMethodBodyBuilder(stubContent, configProperties) } return new SpockMessagingMethodBodyBuilder(stubContent, configProperties) } if (configProperties.testMode == TestMode.JAXRSCLIENT) { - if (configProperties.targetFramework == TestFramework.JUNIT) { + if (isJUnitType()) { return new JaxRsClientJUnitMethodBodyBuilder(stubContent, configProperties) } return new JaxRsClientSpockMethodRequestProcessingBodyBuilder(stubContent, configProperties) } else if (configProperties.testMode == TestMode.EXPLICIT) { - if (configProperties.targetFramework == TestFramework.JUNIT) { + if (isJUnitType()) { return new ExplicitJUnitMethodBodyBuilder(stubContent, configProperties) } // in Groovy we're using def so we don't have to update the imports return new MockMvcSpockMethodRequestProcessingBodyBuilder(stubContent, configProperties) - } else if (configProperties.targetFramework == TestFramework.SPOCK) { + } else if (configProperties.targetFramework == SPOCK) { return new MockMvcSpockMethodRequestProcessingBodyBuilder(stubContent, configProperties) } return new MockMvcJUnitMethodBodyBuilder(stubContent, configProperties) } + private boolean isJUnitType() { + return JUNIT == configProperties.targetFramework || JUNIT5 == configProperties.targetFramework + } } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/BaseImportProvider.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/BaseImportProvider.groovy new file mode 100644 index 0000000000..8bb12a0e49 --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/BaseImportProvider.groovy @@ -0,0 +1,62 @@ +package org.springframework.cloud.contract.verifier.builder.imports + +import groovy.transform.CompileStatic + +import org.springframework.cloud.contract.verifier.config.TestFramework + +import static org.springframework.cloud.contract.verifier.config.TestFramework.CUSTOM +import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT +import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT5 +import static org.springframework.cloud.contract.verifier.config.TestFramework.SPOCK + +/** + * Provides imports based on test framework. + * + * @author Olga Maciaszek-Sharma + * + * @since 2.1.0 + */ +@CompileStatic +class BaseImportProvider { + + private static final ImportDefinitions GENERAL_IMPORTS = new ImportDefinitions([], [ + 'org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat' + ]) + + private static + final Map TEST_FRAMEWORK_SPECIFIC_IMPORTS = [ + (JUNIT) : new ImportDefinitions(['org.junit.Test']), + (JUNIT5): new ImportDefinitions(['org.junit.jupiter.api.Test']), + (SPOCK) : new ImportDefinitions([]), + (CUSTOM): new ImportDefinitions([])] + + private static final Map RULE_IMPORT = [ + (JUNIT) : 'org.junit.Rule', + (JUNIT5): 'org.junit.jupiter.api.extension.ExtendWith', + (SPOCK) : 'org.junit.Rule', + (CUSTOM): 'org.junit.Rule' + ] + + /** + * Returns list of imports for provided test framework. + * @param testFramework + * @return list of imports + */ + static List getImports(TestFramework testFramework) { + return GENERAL_IMPORTS.imports + TEST_FRAMEWORK_SPECIFIC_IMPORTS.get(testFramework).imports + } + + /** + * Returns list of static imports for provided test framework. + * @param testFramework + * @return + */ + static List getStaticImports(TestFramework testFramework) { + return GENERAL_IMPORTS.staticImports + TEST_FRAMEWORK_SPECIFIC_IMPORTS.get(testFramework).staticImports + } + + static String getRuleImport(TestFramework testFramework) { + return RULE_IMPORT.get(testFramework) + } +} + diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/HttpImportProvider.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/HttpImportProvider.groovy new file mode 100644 index 0000000000..879f204303 --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/HttpImportProvider.groovy @@ -0,0 +1,76 @@ +package org.springframework.cloud.contract.verifier.builder.imports + +import org.springframework.cloud.contract.verifier.config.TestFramework +import org.springframework.cloud.contract.verifier.config.TestMode + +import static org.springframework.cloud.contract.verifier.config.TestFramework.CUSTOM +import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT +import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT5 +import static org.springframework.cloud.contract.verifier.config.TestFramework.SPOCK +import static org.springframework.cloud.contract.verifier.config.TestMode.EXPLICIT +import static org.springframework.cloud.contract.verifier.config.TestMode.JAXRSCLIENT +import static org.springframework.cloud.contract.verifier.config.TestMode.MOCKMVC + +/** + * Provides imports based on test framework and test mode. + * + * @author Olga Maciaszek-Sharma + * + * @since 2.1.0 + */ +class HttpImportProvider { + + private final Map TEST_MODE_SPECIFIC_IMPORTS = [ + (JAXRSCLIENT): new ImportDefinitions([], ['javax.ws.rs.client.Entity.*']), + (MOCKMVC) : new ImportDefinitions([], ["${restAssuredPackage}.module.mockmvc.RestAssuredMockMvc.*"]), + (EXPLICIT) : new ImportDefinitions([], ["${restAssuredPackage}.RestAssured.*"])] + + private final Map, ImportDefinitions> FRAMEWORK_AND_TEST_MODE_SPECIFIC_IMPORTS = [ + (new Tuple2(JUNIT, JAXRSCLIENT)) : new ImportDefinitions(['javax.ws.rs.core.Response']), + (new Tuple2(JUNIT5, JAXRSCLIENT)): new ImportDefinitions(['javax.ws.rs.core.Response']), + (new Tuple2(JUNIT, MOCKMVC)) : new ImportDefinitions([ + "${restAssuredPackage}.module.mockmvc.specification.MockMvcRequestSpecification", + "${restAssuredPackage}.response.ResponseOptions"]), + (new Tuple2(JUNIT5, MOCKMVC)) : new ImportDefinitions([ + "${restAssuredPackage}.module.mockmvc.specification.MockMvcRequestSpecification", + "${restAssuredPackage}.response.ResponseOptions"]), + (new Tuple2(JUNIT, EXPLICIT)) : new ImportDefinitions(["${restAssuredPackage}.specification.RequestSpecification", + "${restAssuredPackage}.response.Response"]), + (new Tuple2(JUNIT5, EXPLICIT)) : new ImportDefinitions(["${restAssuredPackage}.specification.RequestSpecification", + "${restAssuredPackage}.response.Response"]), + (new Tuple2(SPOCK, JAXRSCLIENT)) : new ImportDefinitions([]), + (new Tuple2(CUSTOM, JAXRSCLIENT)): new ImportDefinitions([]), + (new Tuple2(SPOCK, MOCKMVC)) : new ImportDefinitions([]), + (new Tuple2(CUSTOM, MOCKMVC)) : new ImportDefinitions([]), + (new Tuple2(SPOCK, EXPLICIT)) : new ImportDefinitions([]), + (new Tuple2(CUSTOM, EXPLICIT)) : new ImportDefinitions([]) + ] + + private final String restAssuredPackage + + HttpImportProvider(String restAssuredPackage) { + this.restAssuredPackage = restAssuredPackage + } + + /** + * Returns list of imports for http test contracts for provided test framework and test mode. + * @param testFramework + * @param testMode + * @return list of imports + */ + List getImports(TestFramework testFramework, TestMode testMode) { + return TEST_MODE_SPECIFIC_IMPORTS.get(testMode).imports + + FRAMEWORK_AND_TEST_MODE_SPECIFIC_IMPORTS.get(new Tuple2(testFramework, testMode)).imports + } + + /** + * Returns list of static imports for http test contracts for provided test framework and test mode. + * @param testFramework + * @param testMode + * @return list of static imports + */ + List getStaticImports(TestFramework testFramework, TestMode testMode) { + return TEST_MODE_SPECIFIC_IMPORTS.get(testMode).staticImports + + FRAMEWORK_AND_TEST_MODE_SPECIFIC_IMPORTS.get(new Tuple2(testFramework, testMode)).staticImports + } +} diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/ImportDefinitions.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/ImportDefinitions.groovy new file mode 100644 index 0000000000..7fb4fe1f8f --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/ImportDefinitions.groovy @@ -0,0 +1,22 @@ +package org.springframework.cloud.contract.verifier.builder.imports + +import groovy.transform.CompileStatic +import groovy.transform.PackageScope + +/** + * @author Olga Maciaszek-Sharma + * + * @since 2.1.0 + */ +@CompileStatic +@PackageScope +class ImportDefinitions { + + final List imports + final List staticImports + + ImportDefinitions(List imports, List staticImports = []) { + this.imports = imports + this.staticImports = staticImports + } +} \ No newline at end of file diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/MessagingImportProvider.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/MessagingImportProvider.groovy new file mode 100644 index 0000000000..49897b3f0a --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/imports/MessagingImportProvider.groovy @@ -0,0 +1,32 @@ +package org.springframework.cloud.contract.verifier.builder.imports + +import groovy.transform.CompileStatic + +/** + * Provides imports based on test framework and test mode. + * + * @author Olga Maciaszek-Sharma + * + * @since 2.1.0 + */ +@CompileStatic +class MessagingImportProvider { + + /** + * @return list of imports for messaging test contracts. + */ + static List getImports() { + return ['javax.inject.Inject', + 'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper', + 'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessage', + 'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging', + ] + } + + /** + * @return list of static imports for messaging test contracts. + */ + static List getStaticImports() { + return ['org.springframework.cloud.contract.verifier.messaging.util.ContractVerifierMessagingUtil.headers'] + } +} diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/TestFramework.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/TestFramework.groovy index c223bcb6db..c68035fc5a 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/TestFramework.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/TestFramework.groovy @@ -16,68 +16,105 @@ package org.springframework.cloud.contract.verifier.config +import org.springframework.cloud.contract.verifier.config.framework.CustomDefinition +import org.springframework.cloud.contract.verifier.config.framework.JUnit5Definition +import org.springframework.cloud.contract.verifier.config.framework.JUnitDefinition +import org.springframework.cloud.contract.verifier.config.framework.SpockDefinition +import org.springframework.cloud.contract.verifier.config.framework.TestFrameworkDefinition + /** * Contains main building blocks for a test class for the given framework * * @author Jakub Kubrynski, codearte.io + * @author Olga Maciaszek-Sharma * * @since 1.0.0 */ enum TestFramework { - JUNIT("public ", "public void ", ";", ".java", "Test", "org.junit.Ignore", ["org.junit.FixMethodOrder", "org.junit.runners.MethodSorters"], "@FixMethodOrder(MethodSorters.NAME_ASCENDING)"), - SPOCK("", "def ", "", ".groovy", "Spec", "spock.lang.Ignore", ["spock.lang.Stepwise"], "@Stepwise"), - CUSTOM("", "", "", "", "", "", [], "") - private final String classModifier - private final String methodModifier - private final String lineSuffix - private final String classExtension - private final String classNameSuffix - private final String ignoreClass - private final List orderAnnotationImports - private final String orderAnnotation + SPOCK(new SpockDefinition()), + JUNIT(new JUnitDefinition()), + JUNIT5(new JUnit5Definition()), + CUSTOM(new CustomDefinition()) + @Delegate + private final TestFrameworkDefinition testFrameworkDefinition + + + TestFramework(TestFrameworkDefinition testFrameworkDefinition) { + this.testFrameworkDefinition = testFrameworkDefinition + } + + /** + * @deprecated use {@link #TestFramework(TestFrameworkDefinition)} + * @param classModifier + * @param methodModifier + * @param lineSuffix + * @param classExtension + * @param classNameSuffix + * @param ignoreClass + * @param orderAnnotationImports + * @param orderAnnotation + */ + @Deprecated TestFramework(String classModifier, String methodModifier, String lineSuffix, String classExtension, String classNameSuffix, String ignoreClass, List orderAnnotationImports, String orderAnnotation) { - this.classModifier = classModifier - this.lineSuffix = lineSuffix - this.methodModifier = methodModifier - this.classExtension = classExtension - this.classNameSuffix = classNameSuffix - this.ignoreClass = ignoreClass - this.orderAnnotationImports = orderAnnotationImports - this.orderAnnotation = orderAnnotation - } + testFrameworkDefinition = new TestFrameworkDefinition() { - String getClassModifier() { - return classModifier - } + @Override + String getClassModifier() { + return classModifier + } - String getMethodModifier() { - return methodModifier - } + @Override + String getMethodModifier() { + return methodModifier + } - String getLineSuffix() { - return lineSuffix - } + @Override + String getLineSuffix() { + return lineSuffix + } - String getClassExtension() { - return classExtension - } + @Override + String getClassExtension() { + return classExtension + } - String getClassNameSuffix() { - return classNameSuffix - } + @Override + String getClassNameSuffix() { + return classNameSuffix + } - String getIgnoreClass() { - return ignoreClass - } + @Override + String getIgnoreClass() { + return ignoreClass + } - List getOrderAnnotationImport() { - return orderAnnotationImports - } + @Override + List getOrderAnnotationImports() { + return orderAnnotationImports + } - String getOrderAnnotation() { - return orderAnnotation + @Override + String getOrderAnnotation() { + return orderAnnotation + } + + @Override + String getIgnoreAnnotation() { + return '@Ignore' + } + + @Override + boolean annotationLevelRules() { + return false + } + + @Override + String getRuleAnnotation(String annotationValue) { + throw new UnsupportedOperationException('Not available in framework.') + } + } } } \ No newline at end of file diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/CustomDefinition.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/CustomDefinition.groovy new file mode 100644 index 0000000000..b22ba212ce --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/CustomDefinition.groovy @@ -0,0 +1,69 @@ +package org.springframework.cloud.contract.verifier.config.framework + +import groovy.transform.CompileStatic + +/** + * Defines elements characteristic of Custom test framework to be used during test class construction. + * + * @author Olga Maciaszek-Sharma + * + * @since 2.1.0 + */ +@CompileStatic +class CustomDefinition implements TestFrameworkDefinition { + + @Override + String getClassModifier() { + return '' + } + + @Override + String getMethodModifier() { + return '' + } + + @Override + String getLineSuffix() { + return '' + } + + @Override + String getClassExtension() { + return '' + } + + @Override + String getClassNameSuffix() { + return '' + } + + @Override + String getIgnoreClass() { + return '' + } + + @Override + List getOrderAnnotationImports() { + return [] + } + + @Override + String getOrderAnnotation() { + return '' + } + + @Override + String getIgnoreAnnotation() { + return '@Ignore' + } + + @Override + boolean annotationLevelRules() { + return false + } + + @Override + String getRuleAnnotation(String annotationValue) { + throw new UnsupportedOperationException('Not available in framework.') + } +} diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/JUnit5Definition.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/JUnit5Definition.groovy new file mode 100644 index 0000000000..79f6d5eec9 --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/JUnit5Definition.groovy @@ -0,0 +1,69 @@ +package org.springframework.cloud.contract.verifier.config.framework + +import groovy.transform.CompileStatic + +/** + * Defines elements characteristic of JUnit5 test framework to be used during test class construction. + * + * @author Olga Maciaszek-Sharma + * + * @since 2.1.0 + */ +@CompileStatic +class JUnit5Definition implements TestFrameworkDefinition { + + @Override + String getClassModifier() { + return 'public ' + } + + @Override + String getMethodModifier() { + return 'public void ' + } + + @Override + String getLineSuffix() { + return ';' + } + + @Override + String getClassExtension() { + '.java' + } + + @Override + String getClassNameSuffix() { + return 'Test' + } + + @Override + String getIgnoreClass() { + return 'org.junit.jupiter.api.Disabled' + } + + @Override + List getOrderAnnotationImports() { + throw new UnsupportedOperationException('Not implemented yet in JUnit5 - https://github.com/junit-team/junit5/issues/48') + } + + @Override + String getOrderAnnotation() { + throw new UnsupportedOperationException('Not implemented yet in JUnit5 - https://github.com/junit-team/junit5/issues/48') + } + + @Override + String getIgnoreAnnotation() { + return '@Disabled' + } + + @Override + boolean annotationLevelRules() { + return true + } + + @Override + String getRuleAnnotation(String annotationValue) { + return ("@ExtendWith(${annotationValue}.class)") + } +} diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/JUnitDefinition.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/JUnitDefinition.groovy new file mode 100644 index 0000000000..f2b6d474fe --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/JUnitDefinition.groovy @@ -0,0 +1,69 @@ +package org.springframework.cloud.contract.verifier.config.framework + +import groovy.transform.CompileStatic + +/** + * Defines elements characteristic of JUnit test framework to be used during test class construction. + * + * @author Olga Maciaszek-Sharma + * + * @since 2.1.0 + */ +@CompileStatic +class JUnitDefinition implements TestFrameworkDefinition { + + @Override + String getClassModifier() { + return 'public ' + } + + @Override + String getMethodModifier() { + return 'public void ' + } + + @Override + String getLineSuffix() { + return ';' + } + + @Override + String getClassExtension() { + return '.java' + } + + @Override + String getClassNameSuffix() { + return 'Test' + } + + @Override + String getIgnoreClass() { + return 'org.junit.Ignore' + } + + @Override + List getOrderAnnotationImports() { + return ['org.junit.FixMethodOrder', 'org.junit.runners.MethodSorters'] + } + + @Override + String getOrderAnnotation() { + return '@FixMethodOrder(MethodSorters.NAME_ASCENDING)' + } + + @Override + String getIgnoreAnnotation() { + return '@Ignore' + } + + @Override + boolean annotationLevelRules() { + return false + } + + @Override + String getRuleAnnotation(String annotationValue) { + throw new UnsupportedOperationException('Not available in JUnit.') + } +} diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/SpockDefinition.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/SpockDefinition.groovy new file mode 100644 index 0000000000..32384a7587 --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/SpockDefinition.groovy @@ -0,0 +1,69 @@ +package org.springframework.cloud.contract.verifier.config.framework + +import groovy.transform.CompileStatic + +/** + * Defines elements characteristic of Spock test framework to be used during test class construction. + * + * @author Olga Maciaszek-Sharma + * + * @since 2.1.0 + */ +@CompileStatic +class SpockDefinition implements TestFrameworkDefinition { + + @Override + String getClassModifier() { + return '' + } + + @Override + String getMethodModifier() { + return 'def ' + } + + @Override + String getLineSuffix() { + return '' + } + + @Override + String getClassExtension() { + return '.groovy' + } + + @Override + String getClassNameSuffix() { + return 'Spec' + } + + @Override + String getIgnoreClass() { + return 'spock.lang.Ignore' + } + + @Override + List getOrderAnnotationImports() { + return ['spock.lang.Stepwise'] + } + + @Override + String getOrderAnnotation() { + return '@Stepwise' + } + + @Override + String getIgnoreAnnotation() { + return '@Ignore' + } + + @Override + boolean annotationLevelRules() { + return false + } + + @Override + String getRuleAnnotation(String annotationValue) { + throw new UnsupportedOperationException('Not available in Spock.') + } +} diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/TestFrameworkDefinition.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/TestFrameworkDefinition.groovy new file mode 100644 index 0000000000..94788716b4 --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/config/framework/TestFrameworkDefinition.groovy @@ -0,0 +1,75 @@ +package org.springframework.cloud.contract.verifier.config.framework + +import groovy.transform.CompileStatic + +/** + * Defines elements characteristic of a given test framework to be used during test class construction. + * + * @author Olga Maciaszek-Sharma + * + * @since 2.1.0 + */ +@CompileStatic +interface TestFrameworkDefinition { + + /** + * Returns the class access level modifier. E.g. for Java tests that would mean {@code public} + **/ + String getClassModifier() + + /** + * Returns the method access level modifier along with the return type. + * E.g. for Java tests that would mean {@code public void} + **/ + String getMethodModifier() + + /** + * Returns the characters that should end each line. E.g. for Java tests that would mean {@code ;} + **/ + String getLineSuffix() + + /** + * Returns the file extension. E.g. for Java tests that would be {@code .java} + **/ + String getClassExtension() + + /** + * Returns the test class name suffix. E.g. for JUnit tests that would be {@code Test} + **/ + String getClassNameSuffix() + + /** + * Returns the qualified name of the class used to ignore or disable tests. E.g. for JUnit 4 tests that would + * be {@code org.junit.Ignore} + **/ + String getIgnoreClass() + + /** + * Returns the qualified names of the classes that are used for arranging tests into scenarios. + * E.g. for JUnit 4 tests that would be {@code 'org.junit.FixMethodOrder'}, {@code 'org.junit.runners.MethodSorters'} + **/ + List getOrderAnnotationImports() + + /** + * Returns the annotation used for arranging tests into scenarios. + * E.g. for JUnit test that would be {@code @FixMethodOrder(MethodSorters.NAME_ASCENDING)} + **/ + String getOrderAnnotation() + + /** + * Returns the annotation used for ignoring or disabling tests. E.g. for JUnit tests that would mean {@code @Ignore} + **/ + String getIgnoreAnnotation() + + /** + * Returns a boolean indicating whether an annotation-type rule or extension is being used or not. + * E.g. for JUnit 5 tests that would return {@code true} + **/ + boolean annotationLevelRules() + + /** + * Returns the test rule or extension annotation with the {@annotationValue} passed as an argument. + * E.g. for JUnit 5 tests that could be {@code @ExtendWith(Example.class)} + **/ + String getRuleAnnotation(String annotationValue) +} diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/GeneratorScannerSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/GeneratorScannerSpec.groovy index 300ca595b3..24947a19da 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/GeneratorScannerSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/GeneratorScannerSpec.groovy @@ -16,10 +16,12 @@ package org.springframework.cloud.contract.verifier +import spock.lang.Specification + import org.springframework.cloud.contract.verifier.builder.JavaTestGenerator import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties -import org.springframework.cloud.contract.verifier.config.TestFramework -import spock.lang.Specification + +import static org.springframework.cloud.contract.verifier.config.TestFramework.SPOCK class GeneratorScannerSpec extends Specification { @@ -39,7 +41,7 @@ class GeneratorScannerSpec extends Specification { def "should create class with full package"() { given: - ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(targetFramework: TestFramework.SPOCK) + ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(targetFramework: SPOCK) properties.contractsDslDir = new File(this.getClass().getResource("/directory/with/stubs/package").toURI()) TestGenerator testGenerator = new TestGenerator(properties, classGenerator, Stub(FileSaver)) when: diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy index 6d72082b7c..c4f01db2eb 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy @@ -18,17 +18,23 @@ package org.springframework.cloud.contract.verifier.builder import org.junit.Rule import org.junit.rules.TemporaryFolder +import spock.lang.Issue +import spock.lang.Specification + import org.springframework.cloud.contract.verifier.TestGenerator import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties +import org.springframework.cloud.contract.verifier.config.TestFramework import org.springframework.cloud.contract.verifier.config.TestMode import org.springframework.cloud.contract.verifier.file.ContractMetadata import org.springframework.cloud.contract.verifier.util.SyntaxChecker import org.springframework.util.StringUtils -import spock.lang.Issue -import spock.lang.Specification import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT +import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT5 import static org.springframework.cloud.contract.verifier.config.TestFramework.SPOCK +import static org.springframework.cloud.contract.verifier.config.TestMode.EXPLICIT +import static org.springframework.cloud.contract.verifier.config.TestMode.JAXRSCLIENT +import static org.springframework.cloud.contract.verifier.config.TestMode.MOCKMVC import static org.springframework.cloud.contract.verifier.util.ContractVerifierDslConverter.convertAsCollection class SingleTestGeneratorSpec extends Specification { @@ -49,7 +55,6 @@ class SingleTestGeneratorSpec extends Specification { '@FixMethodOrder(MethodSorters.NAME_ASCENDING)', '@Test', '@Ignore', 'import io.restassured.module.mockmvc.specification.MockMvcRequestSpecification;', 'import io.restassured.response.ResponseOptions;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat'] - private static final List explicitJUnitRestAssured2ClassStrings = ['import com.jayway.jsonpath.DocumentContext;', 'import com.jayway.jsonpath.JsonPath;', 'import org.junit.FixMethodOrder;', 'import org.junit.Ignore;', 'import org.junit.Test;', 'import org.junit.runners.MethodSorters;', 'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;', 'import static com.jayway.restassured.RestAssured.*;', @@ -62,6 +67,34 @@ class SingleTestGeneratorSpec extends Specification { '@FixMethodOrder(MethodSorters.NAME_ASCENDING)', '@Test', '@Ignore', 'import io.restassured.specification.RequestSpecification;', 'import io.restassured.response.Response;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat'] + private static + final List mockMvcJUnit5RestAssured2ClassStrings = ['import com.jayway.jsonpath.DocumentContext;', 'import com.jayway.jsonpath.JsonPath;', + 'import org.junit.jupiter.api.Disabled;', 'import org.junit.jupiter.api.Test;', + 'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;', 'import static com.jayway.restassured.module.mockmvc.RestAssuredMockMvc.*;', + '@Test', '@Disabled', 'import com.jayway.restassured.module.mockmvc.specification.MockMvcRequestSpecification;', + 'import com.jayway.restassured.response.ResponseOptions;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat'] + private static + final List mockMvcJUnit5RestAssured3ClassStrings = ['import com.jayway.jsonpath.DocumentContext;', 'import com.jayway.jsonpath.JsonPath;', + 'import org.junit.jupiter.api.Disabled;', 'import org.junit.jupiter.api.Test;', + 'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;', 'import static io.restassured.module.mockmvc.RestAssuredMockMvc.*;', + '@Test', '@Disabled', 'import io.restassured.module.mockmvc.specification.MockMvcRequestSpecification;', + 'import io.restassured.response.ResponseOptions;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat'] + + private static + final List explicitJUnit5RestAssured2ClassStrings = ['import com.jayway.jsonpath.DocumentContext;', 'import com.jayway.jsonpath.JsonPath;', + 'import org.junit.jupiter.api.Disabled;', 'import org.junit.jupiter.api.Test;', + 'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;', 'import static com.jayway.restassured.RestAssured.*;', + '@Test', '@Disabled', 'import com.jayway.restassured.specification.RequestSpecification;', + 'import com.jayway.restassured.response.Response;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat'] + + private static + final List explicitJUnit5RestAssured3ClassStrings = ['import com.jayway.jsonpath.DocumentContext;', 'import com.jayway.jsonpath.JsonPath;', + 'import org.junit.jupiter.api.Disabled;', 'import org.junit.jupiter.api.Test;', + 'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;', 'import static io.restassured.RestAssured.*;', + '@Test', '@Disabled', 'import io.restassured.specification.RequestSpecification;', + 'import io.restassured.response.Response;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat'] + + private static final List spockClassRestAssured2Strings = ['import com.jayway.jsonpath.DocumentContext', 'import com.jayway.jsonpath.JsonPath', 'import spock.lang.Ignore', 'import spock.lang.Specification', 'import spock.lang.Stepwise', 'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson', 'import static com.jayway.restassured.module.mockmvc.RestAssuredMockMvc.*', @@ -85,23 +118,23 @@ class SingleTestGeneratorSpec extends Specification { public static final Closure JAVA_ASSERTER = { String classToTest -> String name = Math.abs(new Random().nextInt()) String changedTest = classToTest - .replace("public class Test", "public class Test${name}") - .replace("public class ContractsTest", "public class Test${name}") + .replace('public class Test', "public class Test${name}") + .replace('public class ContractsTest', "public class Test${name}") String fqn = FQN(classToTest) SyntaxChecker.tryToCompileJavaWithoutImports("${fqn}${name}", changedTest) } static String FQN(String classToTest) { - return classToTest.contains("0_1_0_dev_1_uncommitted_d1174dd") ? - "org.springframework.cloud.contract.verifier.tests.com_uscm.dale_api44_spec._0_1_0_dev_1_uncommitted_d1174dd.Test" : - "test.Test" + return classToTest.contains('0_1_0_dev_1_uncommitted_d1174dd') ? + 'org.springframework.cloud.contract.verifier.tests.com_uscm.dale_api44_spec._0_1_0_dev_1_uncommitted_d1174dd.Test' : + 'test.Test' } public static final Closure JAVA_JAXRS_ASSERTER = { String classToTest -> String name = Math.abs(new Random().nextInt()) String changedTest = classToTest - .replace("public class Test {", "public class Test${name} {\njavax.ws.rs.client.WebTarget webTarget;\n") - .replace("public class ContractsTest {", "public class Test${name} {\njavax.ws.rs.client.WebTarget webTarget;\n") + .replace('public class Test {', "public class Test${name} {\njavax.ws.rs.client.WebTarget webTarget;\n") + .replace('public class ContractsTest {', "public class Test${name} {\njavax.ws.rs.client.WebTarget webTarget;\n") String fqn = FQN(classToTest) SyntaxChecker.tryToCompileJavaWithoutImports("${fqn}${name}", changedTest) } @@ -112,11 +145,11 @@ class SingleTestGeneratorSpec extends Specification { def setup() { file = tmpFolder.newFile() - wiriteContract(file) + writeContract(file) } - private wiriteContract(File file) { - file.write(""" + private writeContract(File file) { + file.write(''' org.springframework.cloud.contract.spec.Contract.make { request { method 'PUT' @@ -126,70 +159,72 @@ class SingleTestGeneratorSpec extends Specification { status OK() } } -""") +''') } - def "should build test class for #testFramework"() { + def 'should build test class for #testFramework'() { given: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties() properties.targetFramework = testFramework properties.testMode = mode - ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, 2, convertAsCollection(new File("/"),file)) + ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, order, convertAsCollection(new File('/'), file)) contract.ignored >> true - contract.order >> 2 JavaTestGenerator testGenerator = new JavaTestGenerator() when: - String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo') + String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo') then: classStrings.each { assert clazz.contains(it) } and: asserter(clazz) where: - testFramework | mode | classStrings | asserter - JUNIT | TestMode.MOCKMVC | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER - JUNIT | TestMode.EXPLICIT | explicitJUnitRestAssured3ClassStrings | JAVA_ASSERTER - SPOCK | TestMode.MOCKMVC | spockClassRestAssured3Strings | GROOVY_ASSERTER - SPOCK | TestMode.EXPLICIT | explicitSpockRestAssured3ClassStrings | GROOVY_ASSERTER + testFramework | order | mode | classStrings | asserter + JUNIT | 2 | MOCKMVC | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER + JUNIT | 2 | TestMode.EXPLICIT | explicitJUnitRestAssured3ClassStrings | JAVA_ASSERTER + JUNIT5 | null | MOCKMVC | mockMvcJUnit5RestAssured3ClassStrings | JAVA_ASSERTER + JUNIT5 | null | TestMode.EXPLICIT | explicitJUnit5RestAssured3ClassStrings | JAVA_ASSERTER + SPOCK | 2 | MOCKMVC | spockClassRestAssured3Strings | GROOVY_ASSERTER + SPOCK | 2 | TestMode.EXPLICIT | explicitSpockRestAssured3ClassStrings | GROOVY_ASSERTER } - def "should build test class for #testFramework when the path contains bizarre signs"() { + def 'should build test class for #testFramework when the path contains bizarre signs'() { given: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties() properties.targetFramework = testFramework - properties.basePackageForTests = "org.springframework.cloud.contract.verifier.tests" + properties.basePackageForTests = 'org.springframework.cloud.contract.verifier.tests' and: - File newFolder = tmpFolder.newFolder("META_INF") - File subfolders = new File(newFolder, "/com.uscm/dale_api44_spec/0.1.0_dev.1.uncommitted+d1174dd/contracts/") + File newFolder = tmpFolder.newFolder('META_INF') + File subfolders = new File(newFolder, '/com.uscm/dale_api44_spec/0.1.0_dev.1.uncommitted+d1174dd/contracts/') subfolders.mkdirs() - File newFile = new File(subfolders, "contract.groovy") + File newFile = new File(subfolders, 'contract.groovy') newFile.createNewFile() - wiriteContract(newFile) + writeContract(newFile) properties.contractsDslDir = newFolder properties.generatedTestSourcesDir = newFolder.parentFile when: int size = new TestGenerator(properties).generate() then: size > 0 - asserter(new File(newFolder.parent, "/org/springframework/cloud/contract/verifier/tests/com_uscm/dale_api44_spec/0_1_0_dev_1_uncommitted_d1174dd/${testName}").text) + asserter(new File(newFolder.parent, '/org/springframework/cloud/contract/verifier/tests/com_uscm/dale_api44_spec/0_1_0_dev_1_uncommitted_d1174dd/' + testName).text) where: testFramework | mode | asserter | testName - JUNIT | TestMode.MOCKMVC | JAVA_ASSERTER | "ContractsTest.java" - JUNIT | TestMode.EXPLICIT | JAVA_ASSERTER | "ContractsTest.java" - SPOCK | TestMode.MOCKMVC | GROOVY_ASSERTER | "ContractsSpec.groovy" - SPOCK | TestMode.EXPLICIT | GROOVY_ASSERTER | "ContractsSpec.groovy" + JUNIT | MOCKMVC | JAVA_ASSERTER | 'ContractsTest.java' + JUNIT | TestMode.EXPLICIT | JAVA_ASSERTER | 'ContractsTest.java' + JUNIT5 | MOCKMVC | JAVA_ASSERTER | 'ContractsTest.java' + JUNIT5 | TestMode.EXPLICIT | JAVA_ASSERTER | 'ContractsTest.java' + SPOCK | MOCKMVC | GROOVY_ASSERTER | 'ContractsSpec.groovy' + SPOCK | TestMode.EXPLICIT | GROOVY_ASSERTER | 'ContractsSpec.groovy' } - def "should build test class for #testFramework with Rest Assured 2.x"() { + def 'should build test class for #testFramework with Rest Assured 2.x'() { given: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties() properties.targetFramework = testFramework properties.testMode = mode - ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, 2, - convertAsCollection(new File("/"),file) ) + ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, order, + convertAsCollection(new File('/'), file)) contract.ignored >> true - contract.order >> 2 JavaTestGenerator testGenerator = new JavaTestGenerator(checker: new ClassPresenceChecker() { @Override boolean isClassPresent(String className) { @@ -198,25 +233,27 @@ class SingleTestGeneratorSpec extends Specification { }) when: - String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo') + String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo') then: classStrings.each { assert clazz.contains(it) } - clazz.contains("com.jayway.restassured") - !clazz.contains("io.restassured") + clazz.contains('com.jayway.restassured') + !clazz.contains('io.restassured') where: - testFramework | mode | classStrings - JUNIT | TestMode.MOCKMVC | mockMvcJUnitRestAssured2ClassStrings - JUNIT | TestMode.EXPLICIT | explicitJUnitRestAssured2ClassStrings - SPOCK | TestMode.MOCKMVC | spockClassRestAssured2Strings - SPOCK | TestMode.EXPLICIT | explicitSpockRestAssured2ClassStrings + testFramework | order | mode | classStrings + JUNIT | 2 | MOCKMVC | mockMvcJUnitRestAssured2ClassStrings + JUNIT | 2 | TestMode.EXPLICIT | explicitJUnitRestAssured2ClassStrings + JUNIT5 | null | MOCKMVC | mockMvcJUnit5RestAssured2ClassStrings + JUNIT5 | null | TestMode.EXPLICIT | explicitJUnit5RestAssured2ClassStrings + SPOCK | 2 | MOCKMVC | spockClassRestAssured2Strings + SPOCK | 2 | TestMode.EXPLICIT | explicitSpockRestAssured2ClassStrings } - def "should build test class for #testFramework and mode #mode with two files"() { + def 'should build test class for #testFramework and mode #mode with two files'() { given: File file = tmpFolder.newFile() - file.write(""" + file.write(''' org.springframework.cloud.contract.spec.Contract.make { request { method 'PUT' @@ -233,10 +270,10 @@ class SingleTestGeneratorSpec extends Specification { } } } - """) + ''') and: File file2 = tmpFolder.newFile() - file2.write(""" + file2.write(''' org.springframework.cloud.contract.spec.Contract.make { request { method 'PUT' @@ -253,22 +290,22 @@ class SingleTestGeneratorSpec extends Specification { } } } -""") +''') and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties() properties.targetFramework = testFramework ContractMetadata contract = new ContractMetadata(file.toPath(), false, 1, null, - convertAsCollection(new File("/"),file) ) + convertAsCollection(new File('/'), file)) contract.ignored >> false and: ContractMetadata contract2 = new ContractMetadata(file2.toPath(), false, 1, null, - convertAsCollection(new File("/"),file2) ) + convertAsCollection(new File('/'), file2)) contract2.ignored >> false and: JavaTestGenerator testGenerator = new JavaTestGenerator() when: - String clazz = testGenerator.buildClass(properties, [contract, contract2], "test", "test", 'com/foo') + String clazz = testGenerator.buildClass(properties, [contract, contract2], 'test', 'test', 'com/foo') then: classStrings.each { clazz.contains(it) } @@ -277,25 +314,26 @@ class SingleTestGeneratorSpec extends Specification { and: textAssertion(clazz) where: - testFramework | mode | classStrings | asserter | textAssertion - JUNIT | TestMode.MOCKMVC | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER | { String test -> StringUtils.countOccurrencesOf(test, "\t\t\tMockMvcRequestSpecification") == 2 } - JUNIT | TestMode.EXPLICIT | explicitJUnitRestAssured3ClassStrings | JAVA_ASSERTER | { String test -> StringUtils.countOccurrencesOf(test, "\t\t\tMockMvcRequestSpecification") == 2 } - SPOCK | TestMode.MOCKMVC | spockClassRestAssured3Strings | GROOVY_ASSERTER | { String test -> StringUtils.countOccurrencesOf(test, "\t\t\tdef request") == 2 } - SPOCK | TestMode.EXPLICIT | explicitSpockRestAssured2ClassStrings | GROOVY_ASSERTER | { String test -> StringUtils.countOccurrencesOf(test, "\t\t\tdef request") == 2 } + testFramework | mode | classStrings | asserter | textAssertion + JUNIT | MOCKMVC | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tMockMvcRequestSpecification') == 2} + JUNIT | TestMode.EXPLICIT | explicitJUnitRestAssured3ClassStrings | JAVA_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tMockMvcRequestSpecification') == 2} + JUNIT5 | MOCKMVC | mockMvcJUnit5RestAssured3ClassStrings | JAVA_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tMockMvcRequestSpecification') == 2} + JUNIT5 | TestMode.EXPLICIT | explicitJUnit5RestAssured3ClassStrings | JAVA_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tMockMvcRequestSpecification') == 2} + SPOCK | MOCKMVC | spockClassRestAssured3Strings | GROOVY_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tdef request') == 2} + SPOCK | TestMode.EXPLICIT | explicitSpockRestAssured2ClassStrings | GROOVY_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tdef request') == 2} } - def "should build JaxRs test class for #testFramework"() { + def 'should build JaxRs test class for #testFramework'() { given: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties() properties.testMode = TestMode.JAXRSCLIENT properties.targetFramework = testFramework - ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, 2, convertAsCollection(new File("/"),file)) + ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, null, convertAsCollection(new File('/'), file)) contract.ignored >> true - contract.order >> 2 JavaTestGenerator testGenerator = new JavaTestGenerator() when: - String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo') + String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo') then: classStrings.each { clazz.contains(it) } @@ -304,15 +342,16 @@ class SingleTestGeneratorSpec extends Specification { asserter(clazz) where: - testFramework | classStrings | asserter - JUNIT | ['import static javax.ws.rs.client.Entity.*', 'import javax.ws.rs.core.Response'] | JAVA_JAXRS_ASSERTER - SPOCK | ['import static javax.ws.rs.client.Entity.*'] | GROOVY_ASSERTER + testFramework | classStrings | asserter + JUNIT | ['import static javax.ws.rs.client.Entity.*', 'import javax.ws.rs.core.Response'] | JAVA_JAXRS_ASSERTER + JUNIT5 | ['import static javax.ws.rs.client.Entity.*', 'import javax.ws.rs.core.Response'] | JAVA_JAXRS_ASSERTER + SPOCK | ['import static javax.ws.rs.client.Entity.*'] | GROOVY_ASSERTER } - def "should work if there is messaging and rest in one folder #testFramework"() { + def 'should work if there is messaging and rest in one folder #testFramework'() { given: File secondFile = tmpFolder.newFile() - secondFile.write(""" + secondFile.write(''' org.springframework.cloud.contract.spec.Contract.make { ignored() label 'some_label' @@ -327,22 +366,20 @@ class SingleTestGeneratorSpec extends Specification { assertThat('hashCode()') } } - """) + ''') and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties() properties.targetFramework = testFramework - ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, 2, convertAsCollection(new File("/"),file)) + ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, order, convertAsCollection(new File('/'), file)) contract.ignored >> true - contract.order >> 2 and: - ContractMetadata contract2 = new ContractMetadata(secondFile.toPath(), true, 1, 2, convertAsCollection(new File("/"),secondFile)) + ContractMetadata contract2 = new ContractMetadata(secondFile.toPath(), true, 1, order, convertAsCollection(new File('/'), secondFile)) contract2.ignored >> true - contract2.order >> 2 and: JavaTestGenerator testGenerator = new JavaTestGenerator() when: - String clazz = testGenerator.buildClass(properties, [contract, contract2], "test", "test", 'com/foo') + String clazz = testGenerator.buildClass(properties, [contract, contract2], 'test', 'test', 'com/foo') then: classStrings.each { clazz.contains(it) } @@ -352,16 +389,17 @@ class SingleTestGeneratorSpec extends Specification { asserter(clazz) where: - testFramework | classStrings | asserter - JUNIT | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER - SPOCK | spockClassRestAssured3Strings | GROOVY_ASSERTER + testFramework | order | classStrings | asserter + JUNIT | 2 | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER + JUNIT5 | null | mockMvcJUnit5RestAssured3ClassStrings | JAVA_ASSERTER + SPOCK | 2 | spockClassRestAssured3Strings | GROOVY_ASSERTER } @Issue('#30') - def "should ignore a test if the contract is ignored in the dsl"() { + def 'should ignore a test if the contract is ignored in the dsl'() { given: File secondFile = tmpFolder.newFile() - secondFile.write(""" + secondFile.write(''' org.springframework.cloud.contract.spec.Contract.make { ignored() request { @@ -372,37 +410,37 @@ class SingleTestGeneratorSpec extends Specification { status OK() } } - """) + ''') and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties() properties.targetFramework = testFramework and: - ContractMetadata contract2 = new ContractMetadata(secondFile.toPath(), true, 1, 2, convertAsCollection(new File("/"),file)) + ContractMetadata contract2 = new ContractMetadata(secondFile.toPath(), true, 1, order, convertAsCollection(new File('/'), file)) contract2.ignored >> false - contract2.order >> 2 and: JavaTestGenerator testGenerator = new JavaTestGenerator() when: - String clazz = testGenerator.buildClass(properties, [contract2], "test", "test", 'com/foo') + String clazz = testGenerator.buildClass(properties, [contract2], 'test', 'test', 'com/foo') then: classStrings.each { clazz.contains(it) } - clazz.contains('@Ignore') + clazz.contains(ignoreAnnotation) and: asserter(clazz) where: - testFramework | classStrings | asserter - JUNIT | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER - SPOCK | spockClassRestAssured3Strings | GROOVY_ASSERTER + testFramework | order | classStrings | ignoreAnnotation | asserter + JUNIT | 2 | mockMvcJUnitRestAssured3ClassStrings | '@Ignore' | JAVA_ASSERTER + JUNIT5 | null | mockMvcJUnit5RestAssured3ClassStrings | '@Disabled' | JAVA_ASSERTER + SPOCK | 2 | spockClassRestAssured3Strings | '@Ignore' | GROOVY_ASSERTER } @Issue('#117') - def "should generate test in explicit test mode using JUnit"() { + def 'should generate test in explicit test mode using JUnit'() { given: - String baseClass = """ + String baseClass = ''' // tag::context_path_baseclass[] import io.restassured.RestAssured; import org.junit.Before; @@ -421,11 +459,11 @@ class SingleTestGeneratorSpec extends Specification { } } // end::context_path_baseclass[] - """ - SyntaxChecker.tryToCompileJavaWithoutImports("test.ContextPathTestingBaseClass", "package test;\n${baseClass}") + ''' + SyntaxChecker.tryToCompileJavaWithoutImports('test.ContextPathTestingBaseClass', "package test;\n${baseClass}") and: File secondFile = tmpFolder.newFile() - secondFile.write(""" + secondFile.write(''' // tag::context_path_contract[] org.springframework.cloud.contract.spec.Contract.make { request { @@ -437,28 +475,28 @@ class SingleTestGeneratorSpec extends Specification { } } // end::context_path_contract[] - """) + ''') and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties() properties.targetFramework = JUNIT properties.testMode = TestMode.EXPLICIT - properties.baseClassForTests = "test.ContextPathTestingBaseClass" + properties.baseClassForTests = 'test.ContextPathTestingBaseClass' and: ContractMetadata contract = new ContractMetadata(file.toPath(), false, 1, - null, convertAsCollection(new File("/"),file)) + null, convertAsCollection(new File('/'), file)) and: SingleTestGenerator testGenerator = new JavaTestGenerator() when: - String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo') + String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo') then: - clazz.contains("RequestSpecification request = given();") - clazz.contains("Response response = given().spec(request)") + clazz.contains('RequestSpecification request = given();') + clazz.contains('Response response = given().spec(request)') } def "should pick the contract's name as the test method"() { given: File secondFile = tmpFolder.newFile() - secondFile.write(""" + secondFile.write(''' org.springframework.cloud.contract.spec.Contract.make { name("MySuperMethod") request { @@ -469,18 +507,18 @@ class SingleTestGeneratorSpec extends Specification { status OK() } } - """) + ''') and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(); properties.targetFramework = testFramework - ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File("/"),secondFile)) + ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File('/'), secondFile)) JavaTestGenerator testGenerator = new JavaTestGenerator() when: - String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo') + String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo') then: - clazz.contains("validate_mySuperMethod()") + clazz.contains('validate_mySuperMethod()') where: - testFramework << [JUNIT, SPOCK] + testFramework << [JUNIT, JUNIT5, SPOCK] } def "should pick the contract's name as the test method when there are multiple contracts"() { @@ -505,18 +543,18 @@ class SingleTestGeneratorSpec extends Specification { and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(); properties.targetFramework = testFramework - ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File("/"),secondFile)) + ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File('/'), secondFile)) JavaTestGenerator testGenerator = new JavaTestGenerator() when: - String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo') + String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo') then: - clazz.contains("validate_shouldHaveIndex1()") - clazz.contains("validate_shouldHaveIndex2()") + clazz.contains('validate_shouldHaveIndex1()') + clazz.contains('validate_shouldHaveIndex2()') where: - testFramework << [JUNIT, SPOCK] + testFramework << [JUNIT, JUNIT5, SPOCK] } - def "should generate the test method when there are multiple contracts without name field"() { + def 'should generate the test method when there are multiple contracts without name field'() { given: File secondFile = tmpFolder.newFile() secondFile.write(''' @@ -537,26 +575,26 @@ class SingleTestGeneratorSpec extends Specification { and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(); properties.targetFramework = testFramework - ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File("/"),secondFile)) + ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File('/'), secondFile)) JavaTestGenerator testGenerator = new JavaTestGenerator() when: - String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo') + String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo') then: - clazz.contains("_0() throws Exception") - clazz.contains("_1() throws Exception") + clazz.contains('_0() throws Exception') + clazz.contains('_1() throws Exception') where: - testFramework << [JUNIT, SPOCK] + testFramework << [JUNIT, JUNIT5, SPOCK] } - @Issue("#359") - def "should generate tests from a contract that references a file for [#testFramework]"() { + @Issue('#359') + def 'should generate tests from a contract that references a file for [#testFramework]'() { given: - File contractLocation = new File(SingleTestGeneratorSpec.class.getResource("/classpath/readFromFile.groovy").toURI()) + File contractLocation = new File(SingleTestGeneratorSpec.class.getResource('/classpath/readFromFile.groovy').toURI()) File temp = tmpFolder.newFolder() and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties( targetFramework: testFramework, contractsDslDir: contractLocation.parentFile, - basePackageForTests: "a.b", + basePackageForTests: 'a.b', generatedTestSourcesDir: temp ) TestGenerator testGenerator = new TestGenerator(properties) @@ -565,22 +603,22 @@ class SingleTestGeneratorSpec extends Specification { then: count == 1 and: - String test = new File(temp, "a/b/ContractVerifier" + (testFramework == JUNIT ? "Test.java" : "Spec.groovy")).text - test.contains("REQUEST") - test.contains("RESPONSE") + String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text + test.contains('REQUEST') + test.contains('RESPONSE') where: - testFramework << [JUNIT, SPOCK] + testFramework << [JUNIT, JUNIT5, SPOCK] } - @Issue("#260") - def "should generate tests in a folder taken from basePackageForTests when it is set for [#testFramework]"() { + @Issue('#260') + def 'should generate tests in a folder taken from basePackageForTests when it is set for [#testFramework]'() { given: - File contractLocation = new File(SingleTestGeneratorSpec.class.getResource("/classpath/readFromFile.groovy").toURI()) + File contractLocation = new File(SingleTestGeneratorSpec.class.getResource('/classpath/readFromFile.groovy').toURI()) File temp = tmpFolder.newFolder() and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties( targetFramework: testFramework, contractsDslDir: contractLocation.parentFile, - basePackageForTests: "a.b", generatedTestSourcesDir: temp + basePackageForTests: 'a.b', generatedTestSourcesDir: temp ) TestGenerator testGenerator = new TestGenerator(properties) when: @@ -588,22 +626,22 @@ class SingleTestGeneratorSpec extends Specification { then: count == 1 and: - String test = new File(temp, "a/b/ContractVerifier" + (testFramework == JUNIT ? "Test.java" : "Spec.groovy")).text - test.contains("REQUEST") - test.contains("RESPONSE") + String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text + test.contains('REQUEST') + test.contains('RESPONSE') where: - testFramework << [JUNIT, SPOCK] + testFramework << [JUNIT, JUNIT5, SPOCK] } - @Issue("#260") + @Issue('#260') def "should generate tests in a folder taken from baseClassForTests's package when it is set for [#testFramework]"() { given: - File contractLocation = new File(SingleTestGeneratorSpec.class.getResource("/classpath/readFromFile.groovy").toURI()) + File contractLocation = new File(SingleTestGeneratorSpec.class.getResource('/classpath/readFromFile.groovy').toURI()) File temp = tmpFolder.newFolder() and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties( targetFramework: testFramework, contractsDslDir: contractLocation.parentFile, - baseClassForTests: "a.b.SomeClass", generatedTestSourcesDir: temp + baseClassForTests: 'a.b.SomeClass', generatedTestSourcesDir: temp ) TestGenerator testGenerator = new TestGenerator(properties) when: @@ -611,22 +649,22 @@ class SingleTestGeneratorSpec extends Specification { then: count == 1 and: - String test = new File(temp, "a/b/ContractVerifier" + (testFramework == JUNIT ? "Test.java" : "Spec.groovy")).text - test.contains("REQUEST") - test.contains("RESPONSE") + String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text + test.contains('REQUEST') + test.contains('RESPONSE') where: - testFramework << [JUNIT, SPOCK] + testFramework << [JUNIT, JUNIT5, SPOCK] } - @Issue("#260") - def "should generate tests in a folder taken from packageWithBaseClasses when it is set for [#testFramework]"() { + @Issue('#260') + def 'should generate tests in a folder taken from packageWithBaseClasses when it is set for [#testFramework]'() { given: - File contractLocation = new File(SingleTestGeneratorSpec.class.getResource("/classpath/readFromFile.groovy").toURI()) + File contractLocation = new File(SingleTestGeneratorSpec.class.getResource('/classpath/readFromFile.groovy').toURI()) File temp = tmpFolder.newFolder() and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties( targetFramework: testFramework, contractsDslDir: contractLocation.parentFile, - packageWithBaseClasses: "a.b", generatedTestSourcesDir: temp + packageWithBaseClasses: 'a.b', generatedTestSourcesDir: temp ) TestGenerator testGenerator = new TestGenerator(properties) when: @@ -634,17 +672,17 @@ class SingleTestGeneratorSpec extends Specification { then: count == 1 and: - String test = new File(temp, "a/b/ContractVerifier" + (testFramework == JUNIT ? "Test.java" : "Spec.groovy")).text - test.contains("REQUEST") - test.contains("RESPONSE") + String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text + test.contains('REQUEST') + test.contains('RESPONSE') where: - testFramework << [JUNIT, SPOCK] + testFramework << [JUNIT, JUNIT5, SPOCK] } - @Issue("#260") - def "should generate tests in a default folder when no property was passed for [#testFramework]"() { + @Issue('#260') + def 'should generate tests in a default folder when no property was passed for [#testFramework]'() { given: - File contractLocation = new File(SingleTestGeneratorSpec.class.getResource("/classpath/readFromFile.groovy").toURI()) + File contractLocation = new File(SingleTestGeneratorSpec.class.getResource('/classpath/readFromFile.groovy').toURI()) File temp = tmpFolder.newFolder() and: ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties( @@ -657,14 +695,29 @@ class SingleTestGeneratorSpec extends Specification { then: count == 1 and: - String test = new File(temp, "org/springframework/cloud/contract/verifier/tests/ContractVerifier" + (testFramework == JUNIT ? "Test.java" : "Spec.groovy")).text - test.contains("REQUEST") - test.contains("RESPONSE") + String test = new File(temp, "org/springframework/cloud/contract/verifier/tests/ContractVerifier${getTestName(testFramework)}").text + test.contains('REQUEST') + test.contains('RESPONSE') where: - testFramework << [JUNIT, SPOCK] + testFramework << [JUNIT, JUNIT5, SPOCK] } + def 'should throw exception in JUnit5 when contract belongs to scenario'() { + given: + ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties() + properties.targetFramework = JUNIT5 + properties.testMode = mode + ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, 1, convertAsCollection(new File('/'), file)) + JavaTestGenerator testGenerator = new JavaTestGenerator() + when: + testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo') + then: + thrown(UnsupportedOperationException) + where: + mode << [MOCKMVC, EXPLICIT, JAXRSCLIENT] + } - - + private static String getTestName(TestFramework testFramework) { + testFramework == SPOCK ? 'Spec.groovy' : 'Test.java' + } } From ee5451a48323d2989d56614da0981cdceda95230 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 20 Jul 2018 14:46:39 +0200 Subject: [PATCH 34/84] Added compile only mode --- scripts/compileOnly.sh | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 scripts/compileOnly.sh diff --git a/scripts/compileOnly.sh b/scripts/compileOnly.sh new file mode 100755 index 0000000000..88594f6b69 --- /dev/null +++ b/scripts/compileOnly.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +source common.sh || source scripts/common.sh || echo "No common.sh script found..." + +FOLDER=`pwd` + +set -e + +./mvnw clean install -DskipTests -Pfast From f3157313e66667e0ce62b01c3f441eca290fcee2 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 20 Jul 2018 15:50:46 +0200 Subject: [PATCH 35/84] Fail at the end --- scripts/compileOnly.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/compileOnly.sh b/scripts/compileOnly.sh index 88594f6b69..d335cc8d7b 100755 --- a/scripts/compileOnly.sh +++ b/scripts/compileOnly.sh @@ -6,4 +6,4 @@ FOLDER=`pwd` set -e -./mvnw clean install -DskipTests -Pfast +./mvnw clean install -DskipTests -Pfast -fae From 7b710a0fd9d4e9f5e1f9e2697972b8b3ac03e3f0 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 24 Jul 2018 21:51:03 +0200 Subject: [PATCH 36/84] Trying to fix the doc --- docs/src/main/asciidoc/verifier_contract.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/main/asciidoc/verifier_contract.adoc b/docs/src/main/asciidoc/verifier_contract.adoc index 8301317b46..9c23c7837f 100644 --- a/docs/src/main/asciidoc/verifier_contract.adoc +++ b/docs/src/main/asciidoc/verifier_contract.adoc @@ -1139,7 +1139,7 @@ include::{samples_url}/producer_webflux/src/test/java/com/example/BeerRestBase.j // your tests go here // in this config class you define all controllers and mocked services - include::{samples_url}/producer_webflux/src/test/java/com/example/BeerRestBase.java[tags=config,indent=0] +include::{samples_url}/producer_webflux/src/test/java/com/example/BeerRestBase.java[tags=config,indent=0] } ---- From c499d5898ce8b47fb714c95757b053ba31e4bdf6 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 27 Jul 2018 10:35:59 +0200 Subject: [PATCH 37/84] Adde info about routing keys --- tests/spring-cloud-contract-stub-runner-amqp/README.adoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/spring-cloud-contract-stub-runner-amqp/README.adoc b/tests/spring-cloud-contract-stub-runner-amqp/README.adoc index ab5fb80b95..033e4fa094 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/README.adoc +++ b/tests/spring-cloud-contract-stub-runner-amqp/README.adoc @@ -20,6 +20,9 @@ match this exchange. Then it collects the queues from the Spring exchanges and t find message listeners bound to these queues. The message is triggered for all matching message listeners. +If you need to work with routing keys, it's enough to pass them via the `amqp_receivedRoutingKey` +messaging header. + ==== Adding the Runner to the Project You can have both Spring AMQP and Spring Cloud Contract Stub Runner on the classpath and From e7946c8b08bbdb86143f4f60221b0391ad19b06a Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 27 Jul 2018 14:14:55 +0200 Subject: [PATCH 38/84] Polished the docs --- docs/src/main/asciidoc/verifier_setup.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/main/asciidoc/verifier_setup.adoc b/docs/src/main/asciidoc/verifier_setup.adoc index 9b3f913cbc..4ab26828de 100644 --- a/docs/src/main/asciidoc/verifier_setup.adoc +++ b/docs/src/main/asciidoc/verifier_setup.adoc @@ -252,6 +252,7 @@ components. Those properties might be used by e.g. inbuilt or custom Stub Downlo The following properties are used when you want to specify the location of the JAR containing the contracts: + * *contractDependency*: Specifies the Dependency that provides `groupid:artifactid:version:classifier` coordinates. You can use the `contractDependency` closure to set it up. From c9758f5d4c1f1e301d781255cee62b3d0bc51157 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Tue, 31 Jul 2018 19:50:29 +0000 Subject: [PATCH 39/84] Update SNAPSHOT to 2.0.1.RELEASE --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- .../project/gradle.properties | 2 +- .../pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 16 ++++++++-------- samples/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 6 +++--- samples/wiremock-native/pom.xml | 6 +++--- samples/wiremock-tomcat/pom.xml | 6 +++--- samples/wiremock-undertow-ssl/pom.xml | 6 +++--- samples/wiremock-undertow/pom.xml | 6 +++--- spring-cloud-contract-dependencies/pom.xml | 4 ++-- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../functionalTest/bootSimple/gradle.properties | 2 +- .../sampleJerseyProject/gradle.properties | 2 +- .../sampleProject/gradle.properties | 2 +- .../scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../spring-cloud-contract-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- 47 files changed, 71 insertions(+), 71 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 51b7b49cce..4a69fdf82d 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-docker-parent pom - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index 0d0e54d9e2..ffe57c00f4 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-docker pom - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index 47067d9b60..d302eb2c50 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.1.RELEASE diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index ffe73509e1..ffd1ff7a59 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-stub-runner-docker pom - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index 830ea6c773..36c1182e02 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index 9cf83ef9ee..284304901f 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-build - 2.0.2.RELEASE + 2.0.3.RELEASE spring-cloud-contract-parent pom - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE Spring Cloud Contract Spring Cloud Contract @@ -26,12 +26,12 @@ 2.17 3.5.13 0.0.9 - 2.0.2.RELEASE - 2.0.0.BUILD-SNAPSHOT - Elmhurst.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT + 2.0.3.RELEASE + 2.0.0.RELEASE + Elmhurst.SR1 + 2.0.1.RELEASE + 2.0.1.RELEASE + 2.0.1.RELEASE 5.0.3 3.2.4 1.0-groovy-2.4 diff --git a/samples/pom.xml b/samples/pom.xml index 22dbb8a427..12eb708a0a 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-samples pom - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index c324c58788..eded735627 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-samples-standalone pom - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index e2328a5087..104a9d1dfa 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE jar wiremock-jetty @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index 029fd7d0e8..095497a240 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE jar wiremock-native @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index f661e39a36..5e40414459 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE jar wiremock-tomcat @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index 8014032d55..7eb79fe142 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE jar wiremock-undertow-ssl @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index 3d21fe0a6d..efab74b140 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE jar wiremock-undertow @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 96b0398aa0..bb2c65da47 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.0.2.BUILD-SNAPSHOT + 2.0.3.RELEASE spring-cloud-contract-dependencies - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index 8fcc3299b4..ac77049a03 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index 9d3d6bf384..ceecd42768 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index f492119600..ea5a8e2efe 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index 29c14ddb03..fcd518e6af 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index d3eb41672c..6ac9a7761c 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index 13997ffe5d..8013e4999d 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index de364e5ee5..cbb43c6228 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index b32ecc7a03..a0c4cdf42e 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index 47c4915e4c..7db49f0c99 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index d9f69ad174..f46a02909d 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index 7886664ec4..c77ea90a53 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.1.RELEASE org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index 8fe8da01f2..8101ad822c 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. 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 c2dda0c23d..d92ef1fe12 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.1.RELEASE 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 c2dda0c23d..d92ef1fe12 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.1.RELEASE 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 c2dda0c23d..d92ef1fe12 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.1.RELEASE 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 c2dda0c23d..d92ef1fe12 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.1.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 4ab0cf1e80..88d3c9b93c 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. @@ -33,7 +33,7 @@ 1.7 - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml index 82a472824e..437ac2df6a 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 14f47b4a66..f9ed169bed 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index 7402e9adcc..9469b675ca 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index 4d6d66130d..fff932fe91 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index c046e5468c..f3c5209ebd 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index 9143e47dea..ca22d1b69e 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index f96228c10a..bd003fd2a8 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index a7048fc82c..80dab59ca4 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index c44db00760..5ed5548fb7 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index 17d4e649e2..f5bedb848a 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index 8f0a614c5f..ed5bdbed32 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index 95ae806043..53ac31c87b 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index f39151bc5b..5aa9aa1e25 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index bc610fa233..01bc99aac0 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index 423ee01ea7..e1e2ea4483 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index 52916d9495..a5d578c7da 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.1.RELEASE .. spring-cloud-contract-stub-runner-stream From 2e92b65169be5c3e903417cb9d76c94b852dcedd Mon Sep 17 00:00:00 2001 From: buildmaster Date: Tue, 31 Jul 2018 20:10:09 +0000 Subject: [PATCH 40/84] Going back to snapshots --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- .../project/gradle.properties | 2 +- .../pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 16 ++++++++-------- samples/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 6 +++--- samples/wiremock-native/pom.xml | 6 +++--- samples/wiremock-tomcat/pom.xml | 6 +++--- samples/wiremock-undertow-ssl/pom.xml | 6 +++--- samples/wiremock-undertow/pom.xml | 6 +++--- spring-cloud-contract-dependencies/pom.xml | 4 ++-- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../functionalTest/bootSimple/gradle.properties | 2 +- .../sampleJerseyProject/gradle.properties | 2 +- .../sampleProject/gradle.properties | 2 +- .../scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../spring-cloud-contract-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- 47 files changed, 71 insertions(+), 71 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 4a69fdf82d..51b7b49cce 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-docker-parent pom - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index ffe57c00f4..0d0e54d9e2 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-docker pom - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index d302eb2c50..47067d9b60 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -verifierVersion=2.0.1.RELEASE +verifierVersion=2.0.1.BUILD-SNAPSHOT diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index ffd1ff7a59..ffe73509e1 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-docker pom - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index 36c1182e02..830ea6c773 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index 284304901f..9cf83ef9ee 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-build - 2.0.3.RELEASE + 2.0.2.RELEASE spring-cloud-contract-parent pom - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Spring Cloud Contract @@ -26,12 +26,12 @@ 2.17 3.5.13 0.0.9 - 2.0.3.RELEASE - 2.0.0.RELEASE - Elmhurst.SR1 - 2.0.1.RELEASE - 2.0.1.RELEASE - 2.0.1.RELEASE + 2.0.2.RELEASE + 2.0.0.BUILD-SNAPSHOT + Elmhurst.BUILD-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT 5.0.3 3.2.4 1.0-groovy-2.4 diff --git a/samples/pom.xml b/samples/pom.xml index 12eb708a0a..22dbb8a427 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-samples pom - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index eded735627..c324c58788 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-samples-standalone pom - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index 104a9d1dfa..e2328a5087 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT jar wiremock-jetty @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.4.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index 095497a240..029fd7d0e8 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT jar wiremock-native @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.4.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index 5e40414459..f661e39a36 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT jar wiremock-tomcat @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.4.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index 7eb79fe142..8014032d55 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT jar wiremock-undertow-ssl @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.4.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index efab74b140..3d21fe0a6d 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT jar wiremock-undertow @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.4.RELEASE + 2.0.3.RELEASE UTF-8 1.8 - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index bb2c65da47..96b0398aa0 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.0.3.RELEASE + 2.0.2.BUILD-SNAPSHOT spring-cloud-contract-dependencies - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index ac77049a03..8fcc3299b4 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index ceecd42768..9d3d6bf384 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index ea5a8e2efe..f492119600 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index fcd518e6af..29c14ddb03 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index 6ac9a7761c..d3eb41672c 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index 8013e4999d..13997ffe5d 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index cbb43c6228..de364e5ee5 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index a0c4cdf42e..b32ecc7a03 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index 7db49f0c99..47c4915e4c 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index f46a02909d..d9f69ad174 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index c77ea90a53..7886664ec4 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=2.0.1.RELEASE +verifierVersion=2.0.1.BUILD-SNAPSHOT org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index 8101ad822c..8fe8da01f2 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. 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 d92ef1fe12..c2dda0c23d 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.RELEASE +verifierVersion=2.0.1.BUILD-SNAPSHOT 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 d92ef1fe12..c2dda0c23d 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.RELEASE +verifierVersion=2.0.1.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 d92ef1fe12..c2dda0c23d 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.RELEASE +verifierVersion=2.0.1.BUILD-SNAPSHOT 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 d92ef1fe12..c2dda0c23d 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.RELEASE +verifierVersion=2.0.1.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 88d3c9b93c..4ab0cf1e80 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. @@ -33,7 +33,7 @@ 1.7 - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml index 437ac2df6a..82a472824e 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index f9ed169bed..14f47b4a66 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index 9469b675ca..7402e9adcc 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index fff932fe91..4d6d66130d 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index f3c5209ebd..c046e5468c 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index ca22d1b69e..9143e47dea 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index bd003fd2a8..f96228c10a 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index 80dab59ca4..a7048fc82c 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index 5ed5548fb7..c44db00760 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index f5bedb848a..17d4e649e2 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index ed5bdbed32..8f0a614c5f 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index 53ac31c87b..95ae806043 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index 5aa9aa1e25..f39151bc5b 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index 01bc99aac0..bc610fa233 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index e1e2ea4483..423ee01ea7 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index a5d578c7da..52916d9495 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.RELEASE + 2.0.1.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-stream From 5375cf51ffd24de179b140af9a3982beb2887b8e Mon Sep 17 00:00:00 2001 From: buildmaster Date: Tue, 31 Jul 2018 20:10:10 +0000 Subject: [PATCH 41/84] Bumping versions to 2.0.2.BUILD-SNAPSHOT after release --- docker/pom.xml | 4 ++-- docker/spring-cloud-contract-docker/pom.xml | 4 ++-- .../spring-cloud-contract-docker/project/gradle.properties | 2 +- docker/spring-cloud-contract-stub-runner-docker/pom.xml | 4 ++-- docs/pom.xml | 2 +- pom.xml | 6 +++--- samples/pom.xml | 4 ++-- samples/standalone/contracts/com/example/server/pom.xml | 6 +++--- samples/standalone/dsl/http-client/pom.xml | 4 ++-- samples/standalone/dsl/http-server/gradle.properties | 2 +- samples/standalone/dsl/http-server/pom.xml | 6 +++--- samples/standalone/dsl/pom.xml | 4 ++-- samples/standalone/messaging/pom.xml | 4 ++-- samples/standalone/messaging/stream-sink/gradle.properties | 2 +- samples/standalone/messaging/stream-sink/pom.xml | 4 ++-- .../standalone/messaging/stream-source/gradle.properties | 2 +- samples/standalone/messaging/stream-source/pom.xml | 4 ++-- samples/standalone/pact/pact-http-client/pom.xml | 4 ++-- samples/standalone/pact/pact-http-server/gradle.properties | 2 +- samples/standalone/pact/pact-http-server/pom.xml | 6 +++--- samples/standalone/pact/pom.xml | 4 ++-- samples/standalone/pom.xml | 4 ++-- samples/standalone/restdocs/http-client/gradle.properties | 2 +- samples/standalone/restdocs/http-client/pom.xml | 4 ++-- samples/standalone/restdocs/http-server/gradle.properties | 2 +- samples/standalone/restdocs/http-server/pom.xml | 4 ++-- samples/standalone/restdocs/pom.xml | 4 ++-- samples/standalone/webclient/http-client/gradle.properties | 2 +- samples/standalone/webclient/http-client/pom.xml | 4 ++-- samples/standalone/webclient/http-server/gradle.properties | 2 +- samples/standalone/webclient/http-server/pom.xml | 4 ++-- samples/standalone/webclient/pom.xml | 4 ++-- samples/standalone/yml/http-client/pom.xml | 4 ++-- samples/standalone/yml/http-server/gradle.properties | 2 +- samples/standalone/yml/http-server/pom.xml | 6 +++--- samples/standalone/yml/pom.xml | 4 ++-- samples/wiremock-jetty/pom.xml | 6 +++--- samples/wiremock-native/pom.xml | 6 +++--- samples/wiremock-tomcat/pom.xml | 6 +++--- samples/wiremock-undertow-ssl/pom.xml | 6 +++--- samples/wiremock-undertow/pom.xml | 6 +++--- spring-cloud-contract-dependencies/pom.xml | 4 ++-- spring-cloud-contract-shade/pom.xml | 2 +- spring-cloud-contract-spec/pom.xml | 2 +- spring-cloud-contract-starters/pom.xml | 2 +- .../spring-cloud-starter-contract-stub-runner-jetty/pom.xml | 2 +- .../spring-cloud-starter-contract-stub-runner/pom.xml | 2 +- .../spring-cloud-starter-contract-verifier/pom.xml | 2 +- spring-cloud-contract-stub-runner-boot/pom.xml | 2 +- spring-cloud-contract-stub-runner/pom.xml | 2 +- spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../spring-cloud-contract-gradle-plugin/gradle.properties | 2 +- .../spring-cloud-contract-gradle-plugin/pom.xml | 2 +- .../resources/functionalTest/bootSimple/gradle.properties | 2 +- .../functionalTest/sampleJerseyProject/gradle.properties | 2 +- .../functionalTest/sampleProject/gradle.properties | 2 +- .../functionalTest/scenarioProject/gradle.properties | 2 +- .../spring-cloud-contract-maven-plugin/pom.xml | 4 ++-- .../src/test/projects/complex-configuration/pom.xml | 2 +- .../projects/different-module-configuration/module/pom.xml | 2 +- .../src/test/projects/plugin-extension/pom.xml | 2 +- .../src/test/projects/spring-boot-groovy/pom.xml | 2 +- .../src/test/projects/spring-boot-java/pom.xml | 2 +- .../spring-cloud-contract-pact/pom.xml | 2 +- spring-cloud-contract-verifier/pom.xml | 2 +- spring-cloud-contract-wiremock/pom.xml | 2 +- tests/pom.xml | 2 +- tests/samples-messaging-amqp/pom.xml | 2 +- tests/samples-messaging-integration/pom.xml | 2 +- tests/samples-messaging-spring/pom.xml | 2 +- tests/samples-messaging-stream/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-amqp/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml | 2 +- .../pom.xml | 2 +- .../spring-cloud-contract-stub-runner-context-path/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-integration/pom.xml | 2 +- .../pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-moco/pom.xml | 2 +- tests/spring-cloud-contract-stub-runner-stream/pom.xml | 2 +- 80 files changed, 122 insertions(+), 122 deletions(-) diff --git a/docker/pom.xml b/docker/pom.xml index 51b7b49cce..f052cf379b 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-docker-parent pom - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT Spring Cloud Contract Docker Parent Spring Cloud Contract Docker Parent diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index 0d0e54d9e2..47b6d1890d 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-docker pom - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT Spring Cloud Contract Docker Spring Cloud Contract Docker diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index 47067d9b60..35ee7a5314 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT diff --git a/docker/spring-cloud-contract-stub-runner-docker/pom.xml b/docker/spring-cloud-contract-stub-runner-docker/pom.xml index ffe73509e1..97a4db6311 100644 --- a/docker/spring-cloud-contract-stub-runner-docker/pom.xml +++ b/docker/spring-cloud-contract-stub-runner-docker/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-contract-docker-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-docker pom - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT Spring Cloud Contract Stub Runner Docker Spring Cloud Contract Stub Runner Docker diff --git a/docs/pom.xml b/docs/pom.xml index 830ea6c773..2460e2e4e9 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-docs diff --git a/pom.xml b/pom.xml index 9cf83ef9ee..d758b7f2ee 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.cloud spring-cloud-build - 2.0.2.RELEASE + 2.0.3.RELEASE spring-cloud-contract-parent pom - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT Spring Cloud Contract Spring Cloud Contract @@ -26,7 +26,7 @@ 2.17 3.5.13 0.0.9 - 2.0.2.RELEASE + 2.0.3.RELEASE 2.0.0.BUILD-SNAPSHOT Elmhurst.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT diff --git a/samples/pom.xml b/samples/pom.xml index 22dbb8a427..d4d7192465 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-samples pom - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT Spring Cloud Contract Samples Spring Cloud Contract Samples diff --git a/samples/standalone/contracts/com/example/server/pom.xml b/samples/standalone/contracts/com/example/server/pom.xml index 830253ce4b..44aa553194 100644 --- a/samples/standalone/contracts/com/example/server/pom.xml +++ b/samples/standalone/contracts/com/example/server/pom.xml @@ -13,15 +13,15 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT - Finchley.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT + 2.0.3.RELEASE true diff --git a/samples/standalone/dsl/http-client/pom.xml b/samples/standalone/dsl/http-client/pom.xml index 8ffe3ed321..1092565f20 100644 --- a/samples/standalone/dsl/http-client/pom.xml +++ b/samples/standalone/dsl/http-client/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - Finchley.BUILD-SNAPSHOT + 2.0.3.RELEASE diff --git a/samples/standalone/dsl/http-server/gradle.properties b/samples/standalone/dsl/http-server/gradle.properties index 2e18603809..1488b5a8fb 100644 --- a/samples/standalone/dsl/http-server/gradle.properties +++ b/samples/standalone/dsl/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/dsl/http-server/pom.xml b/samples/standalone/dsl/http-server/pom.xml index 3d4b867c25..2bdaa5277a 100644 --- a/samples/standalone/dsl/http-server/pom.xml +++ b/samples/standalone/dsl/http-server/pom.xml @@ -13,15 +13,15 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT - Finchley.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT + 2.0.3.RELEASE diff --git a/samples/standalone/dsl/pom.xml b/samples/standalone/dsl/pom.xml index cfc57292b6..c04e0396db 100644 --- a/samples/standalone/dsl/pom.xml +++ b/samples/standalone/dsl/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/pom.xml b/samples/standalone/messaging/pom.xml index c7bfa9453d..f932965d73 100644 --- a/samples/standalone/messaging/pom.xml +++ b/samples/standalone/messaging/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/stream-sink/gradle.properties b/samples/standalone/messaging/stream-sink/gradle.properties index 2e18603809..1488b5a8fb 100644 --- a/samples/standalone/messaging/stream-sink/gradle.properties +++ b/samples/standalone/messaging/stream-sink/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/messaging/stream-sink/pom.xml b/samples/standalone/messaging/stream-sink/pom.xml index aec99d9dd4..783e5f17ca 100644 --- a/samples/standalone/messaging/stream-sink/pom.xml +++ b/samples/standalone/messaging/stream-sink/pom.xml @@ -14,14 +14,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/stream-source/gradle.properties b/samples/standalone/messaging/stream-source/gradle.properties index 2e18603809..1488b5a8fb 100644 --- a/samples/standalone/messaging/stream-source/gradle.properties +++ b/samples/standalone/messaging/stream-source/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/messaging/stream-source/pom.xml b/samples/standalone/messaging/stream-source/pom.xml index 72bfbc3652..11843e902e 100644 --- a/samples/standalone/messaging/stream-source/pom.xml +++ b/samples/standalone/messaging/stream-source/pom.xml @@ -14,14 +14,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/standalone/pact/pact-http-client/pom.xml b/samples/standalone/pact/pact-http-client/pom.xml index d9e913d755..c17bdd479d 100644 --- a/samples/standalone/pact/pact-http-client/pom.xml +++ b/samples/standalone/pact/pact-http-client/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - Finchley.BUILD-SNAPSHOT + 2.0.3.RELEASE diff --git a/samples/standalone/pact/pact-http-server/gradle.properties b/samples/standalone/pact/pact-http-server/gradle.properties index 2e18603809..1488b5a8fb 100644 --- a/samples/standalone/pact/pact-http-server/gradle.properties +++ b/samples/standalone/pact/pact-http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/pact/pact-http-server/pom.xml b/samples/standalone/pact/pact-http-server/pom.xml index 37a522faae..4fad58f58a 100644 --- a/samples/standalone/pact/pact-http-server/pom.xml +++ b/samples/standalone/pact/pact-http-server/pom.xml @@ -13,15 +13,15 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT - Finchley.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT + 2.0.3.RELEASE diff --git a/samples/standalone/pact/pom.xml b/samples/standalone/pact/pom.xml index 0679949bc2..e250420ca8 100644 --- a/samples/standalone/pact/pom.xml +++ b/samples/standalone/pact/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests with Pact - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index c324c58788..36d141bfca 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -6,13 +6,13 @@ org.springframework.cloud spring-cloud-contract-samples - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-samples-standalone pom - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT Spring Cloud Contract Standalone Test Samples Spring Cloud Contract Standalone Test Samples used for end to end tests diff --git a/samples/standalone/restdocs/http-client/gradle.properties b/samples/standalone/restdocs/http-client/gradle.properties index 2e18603809..1488b5a8fb 100644 --- a/samples/standalone/restdocs/http-client/gradle.properties +++ b/samples/standalone/restdocs/http-client/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/restdocs/http-client/pom.xml b/samples/standalone/restdocs/http-client/pom.xml index 3e56005f78..b626c3ac40 100644 --- a/samples/standalone/restdocs/http-client/pom.xml +++ b/samples/standalone/restdocs/http-client/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/standalone/restdocs/http-server/gradle.properties b/samples/standalone/restdocs/http-server/gradle.properties index 2e18603809..1488b5a8fb 100644 --- a/samples/standalone/restdocs/http-server/gradle.properties +++ b/samples/standalone/restdocs/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/pom.xml b/samples/standalone/restdocs/http-server/pom.xml index 67555ce6f0..bd53297861 100644 --- a/samples/standalone/restdocs/http-server/pom.xml +++ b/samples/standalone/restdocs/http-server/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT true diff --git a/samples/standalone/restdocs/pom.xml b/samples/standalone/restdocs/pom.xml index ed13cd985c..6fe7eb67a6 100644 --- a/samples/standalone/restdocs/pom.xml +++ b/samples/standalone/restdocs/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/standalone/webclient/http-client/gradle.properties b/samples/standalone/webclient/http-client/gradle.properties index 2e18603809..1488b5a8fb 100644 --- a/samples/standalone/webclient/http-client/gradle.properties +++ b/samples/standalone/webclient/http-client/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/webclient/http-client/pom.xml b/samples/standalone/webclient/http-client/pom.xml index 9e3192034e..bf4e769292 100644 --- a/samples/standalone/webclient/http-client/pom.xml +++ b/samples/standalone/webclient/http-client/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/standalone/webclient/http-server/gradle.properties b/samples/standalone/webclient/http-server/gradle.properties index 2e18603809..1488b5a8fb 100644 --- a/samples/standalone/webclient/http-server/gradle.properties +++ b/samples/standalone/webclient/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/webclient/http-server/pom.xml b/samples/standalone/webclient/http-server/pom.xml index 2b2a840173..37cc9c1c06 100644 --- a/samples/standalone/webclient/http-server/pom.xml +++ b/samples/standalone/webclient/http-server/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/standalone/webclient/pom.xml b/samples/standalone/webclient/pom.xml index a5eafebb98..587817e15c 100644 --- a/samples/standalone/webclient/pom.xml +++ b/samples/standalone/webclient/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-client/pom.xml b/samples/standalone/yml/http-client/pom.xml index cfe99c5869..9b28fee51a 100644 --- a/samples/standalone/yml/http-client/pom.xml +++ b/samples/standalone/yml/http-client/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - Finchley.BUILD-SNAPSHOT + 2.0.3.RELEASE diff --git a/samples/standalone/yml/http-server/gradle.properties b/samples/standalone/yml/http-server/gradle.properties index 9a46358ccd..1f29439ab4 100644 --- a/samples/standalone/yml/http-server/gradle.properties +++ b/samples/standalone/yml/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT BOM_VERSION=Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-server/pom.xml b/samples/standalone/yml/http-server/pom.xml index 7b0e026cfc..489aace7cb 100644 --- a/samples/standalone/yml/http-server/pom.xml +++ b/samples/standalone/yml/http-server/pom.xml @@ -13,15 +13,15 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT - Finchley.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT + 2.0.3.RELEASE diff --git a/samples/standalone/yml/pom.xml b/samples/standalone/yml/pom.xml index 267743d674..3c9e052309 100644 --- a/samples/standalone/yml/pom.xml +++ b/samples/standalone/yml/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-samples-standalone - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. @@ -17,7 +17,7 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index e2328a5087..8123d86f02 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-jetty - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT jar wiremock-jetty @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index 029fd7d0e8..e215a53d40 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-native - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT jar wiremock-native @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index f661e39a36..31b2986bbb 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-tomcat - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT jar wiremock-tomcat @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index 8014032d55..38348c6a6d 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow-ssl - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT jar wiremock-undertow-ssl @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index 3d21fe0a6d..9ebc1626bf 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -4,7 +4,7 @@ 4.0.0 wiremock-undertow - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT jar wiremock-undertow @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE UTF-8 1.8 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 96b0398aa0..84cb6a0eba 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.0.2.BUILD-SNAPSHOT + 2.0.3.RELEASE spring-cloud-contract-dependencies - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT pom spring-cloud-contract-dependencies Spring Cloud Contract Dependencies diff --git a/spring-cloud-contract-shade/pom.xml b/spring-cloud-contract-shade/pom.xml index 8fcc3299b4..21aefee340 100644 --- a/spring-cloud-contract-shade/pom.xml +++ b/spring-cloud-contract-shade/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-shade diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index 9d3d6bf384..32cb3ca422 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-spec diff --git a/spring-cloud-contract-starters/pom.xml b/spring-cloud-contract-starters/pom.xml index f492119600..a70284d70a 100644 --- a/spring-cloud-contract-starters/pom.xml +++ b/spring-cloud-contract-starters/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml index 29c14ddb03..825f4b73c0 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner-jetty/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner-jetty diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml index d3eb41672c..9e88dee591 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-starter-contract-stub-runner diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index 13997ffe5d..b7af60a789 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-starters - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-starter-contract-verifier diff --git a/spring-cloud-contract-stub-runner-boot/pom.xml b/spring-cloud-contract-stub-runner-boot/pom.xml index de364e5ee5..a7756103ee 100644 --- a/spring-cloud-contract-stub-runner-boot/pom.xml +++ b/spring-cloud-contract-stub-runner-boot/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index b32ecc7a03..dbd0cbd4ab 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner diff --git a/spring-cloud-contract-tools/pom.xml b/spring-cloud-contract-tools/pom.xml index 47c4915e4c..c7255b3e97 100644 --- a/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index d9f69ad174..48d49d422c 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-converters diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties index 7886664ec4..9db8b11b55 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties @@ -16,6 +16,6 @@ nexusUsername = nexusPassword = -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT org.gradle.daemon=false aetherVersion=1.0.2.v20150114 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml index 8fe8da01f2..8713ef1074 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. 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 c2dda0c23d..48f23b5a78 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT 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 c2dda0c23d..48f23b5a78 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.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 c2dda0c23d..48f23b5a78 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT 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 c2dda0c23d..48f23b5a78 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 @@ -15,4 +15,4 @@ # wiremockVersion=2.18.0 jsonAssertVersion=0.4.13 -verifierVersion=2.0.1.BUILD-SNAPSHOT +verifierVersion=2.0.2.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 4ab0cf1e80..e818180536 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. @@ -33,7 +33,7 @@ 1.7 - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT 2016 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml index cb3d4456ae..9b9c0000e6 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/complex-configuration/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml index 5f1572451d..fe0933073e 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/different-module-configuration/module/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml index cad5480328..784986df59 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml index e799171efa..f645fb0d56 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml index c46b999596..801cb2ecb5 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.0.4.RELEASE diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml index 82a472824e..d9343c8f64 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-pact diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 14f47b4a66..3730f8514f 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-verifier diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index 7402e9adcc..142cbaae6b 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-wiremock diff --git a/tests/pom.xml b/tests/pom.xml index 4d6d66130d..a1b499b525 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. diff --git a/tests/samples-messaging-amqp/pom.xml b/tests/samples-messaging-amqp/pom.xml index c046e5468c..a179478a3a 100644 --- a/tests/samples-messaging-amqp/pom.xml +++ b/tests/samples-messaging-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-sample-amqp diff --git a/tests/samples-messaging-integration/pom.xml b/tests/samples-messaging-integration/pom.xml index 9143e47dea..1105f3e4a2 100644 --- a/tests/samples-messaging-integration/pom.xml +++ b/tests/samples-messaging-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-sample-integration diff --git a/tests/samples-messaging-spring/pom.xml b/tests/samples-messaging-spring/pom.xml index f96228c10a..d35767c6f6 100644 --- a/tests/samples-messaging-spring/pom.xml +++ b/tests/samples-messaging-spring/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-sample-spring diff --git a/tests/samples-messaging-stream/pom.xml b/tests/samples-messaging-stream/pom.xml index a7048fc82c..99e8c2fc6c 100644 --- a/tests/samples-messaging-stream/pom.xml +++ b/tests/samples-messaging-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-sample-stream diff --git a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml index c44db00760..74c37a6beb 100644 --- a/tests/spring-cloud-contract-stub-runner-amqp/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-amqp diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml index 17d4e649e2..e0343eb83d 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-eureka diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml index 8f0a614c5f..a4459d6519 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-boot-zookeeper diff --git a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml index 95ae806043..85d930dfc1 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-context-path/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-context-path diff --git a/tests/spring-cloud-contract-stub-runner-integration/pom.xml b/tests/spring-cloud-contract-stub-runner-integration/pom.xml index f39151bc5b..c497b7f81a 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-integration/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-integration diff --git a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml index bc610fa233..d8538a1538 100644 --- a/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco-contract-jar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco-contract-jar diff --git a/tests/spring-cloud-contract-stub-runner-moco/pom.xml b/tests/spring-cloud-contract-stub-runner-moco/pom.xml index 423ee01ea7..818085e614 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-moco/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-moco diff --git a/tests/spring-cloud-contract-stub-runner-stream/pom.xml b/tests/spring-cloud-contract-stub-runner-stream/pom.xml index 52916d9495..66e0b09d74 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/pom.xml +++ b/tests/spring-cloud-contract-stub-runner-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tests - 2.0.1.BUILD-SNAPSHOT + 2.0.2.BUILD-SNAPSHOT .. spring-cloud-contract-stub-runner-stream From 85406875e1358256931caaf0790e9cf9827bbd60 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 1 Aug 2018 11:43:46 +0200 Subject: [PATCH 42/84] When referencing from request a number adds "L" for longs fixes gh-702 --- .../HandlebarsJsonPathHelper.groovy | 6 ++- .../builder/MethodBodyBuilderSpec.groovy | 52 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy index ff29a72e22..35ac89d92e 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy @@ -40,7 +40,11 @@ class HandlebarsJsonPathHelper implements Helper> { private Object returnObjectForTest(Object model, String jsonPath) { String body = removeSurroundingQuotes(((TestSideRequestTemplateModel) model).rawBody).replace('\\"', '"') DocumentContext documentContext = JsonPath.parse(body) - return documentContext.read(jsonPath) + Object value = documentContext.read(jsonPath) + if (value instanceof Long) { + return String.valueOf(value) + "L" + } + return value } private String removeSurroundingQuotes(String body) { diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy index 154f7c33de..db7561fbd8 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy @@ -491,6 +491,58 @@ DocumentContext parsedJson = JsonPath.parse(json); "JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } } + @Issue("#702") + def "should generate proper type for large numbers [#methodBuilderName]"() { + given: + Contract contractDsl = Contract.make { + request { + method 'PUT' + urlPath '/example/create' + headers { + contentType applicationJson() + } + body( + [ + "name" : $(consumer(~/.+/), producer("string-1")), + "updatedTs" : $(consumer(~/\d{13}/), producer(1531916906000L)), + "isDisabled": $(consumer(regex(anyBoolean())), producer(true)) + ] + ) + } + + response { + status 200 + headers { + contentType applicationJsonUtf8() + } + body( + [ + "id" : $(consumer(2222L), producer(~/\d+/)), + "name" : fromRequest().body("name"), + "updatedTs" : fromRequest().body("updatedTs"), + "isDisabled": fromRequest().body("isDisabled") + ] + ) + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + when: + builder.appendTo(blockBuilder) + then: + String test = blockBuilder.toString() + SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, test) + test.contains('''assertThatJson(parsedJson).field("['updatedTs']").isEqualTo(1531916906000L)''') + and: + stubMappingIsValidWireMockStub(contractDsl) + where: + methodBuilderName | methodBuilder + "MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) } + "MockMvcJUnitMethodBuilder" | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties) } + "JaxRsClientSpockMethodRequestProcessingBodyBuilder" | { Contract dsl -> new JaxRsClientSpockMethodRequestProcessingBodyBuilder(dsl, properties) } + "JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } + } + @Issue("#465") def "should work for '/' url for [#methodBuilderName]"() { given: From 46963e3da58996355d607f92ab2729e5838adc42 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 1 Aug 2018 12:12:37 +0200 Subject: [PATCH 43/84] Fixed invalid contract package string without this change we were matching the package for contracts with _REPLACEME_ text in it with this change we're checking it against the package for contracts in a proper way fixes gh-701 --- .../cloud/contract/verifier/TestGenerator.groovy | 13 +++++++++++-- .../contract/verifier/builder/ClassBuilder.groovy | 11 ++++++++++- .../verifier/builder/ClassBuilderSpec.groovy | 12 ++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy index 1ddc638d68..62424fae42 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy @@ -20,7 +20,10 @@ import java.nio.charset.StandardCharsets import java.nio.file.Path import java.util.concurrent.atomic.AtomicInteger +import groovy.transform.CompileStatic import groovy.transform.PackageScope +import org.apache.commons.logging.Log +import org.apache.commons.logging.LogFactory import wiremock.com.google.common.collect.ListMultimap import org.springframework.cloud.contract.spec.ContractVerifierException @@ -37,13 +40,16 @@ import static org.springframework.cloud.contract.verifier.util.NamesUtil.beforeL import static org.springframework.cloud.contract.verifier.util.NamesUtil.convertIllegalPackageChars import static org.springframework.cloud.contract.verifier.util.NamesUtil.directoryToPackage import static org.springframework.cloud.contract.verifier.util.NamesUtil.toLastDot + /** * @author Jakub Kubrynski, codearte.io */ +@CompileStatic class TestGenerator { private static final String DEFAULT_CLASS_PREFIX = "ContractVerifier" private static final String DEFAULT_TEST_PACKAGE = "org.springframework.cloud.contract.verifier.tests" + private static final Log log = LogFactory.getLog(TestGenerator) private final ContractVerifierConfigProperties configProperties private AtomicInteger counter = new AtomicInteger() @@ -101,7 +107,7 @@ class TestGenerator { } } - private String relativizeContractPath(Map.Entry> entry) { + private String relativizeContractPath(Map.Entry> entry) { Path relativePath = configProperties.contractsDslDir.toPath().relativize(entry.getKey()) if (StringUtils.isEmpty(relativePath.toString())) { return DEFAULT_CLASS_PREFIX @@ -111,8 +117,11 @@ class TestGenerator { private void processIncludedDirectory( final String includedDirectoryRelativePath, Collection contracts, final String basePackageNameForClass) { + if (log.isDebugEnabled()) { + log.debug("Included directory relative path is [${includedDirectoryRelativePath}]") + } if (contracts.size()) { - def className = afterLast(includedDirectoryRelativePath.toString(), File.separator) + resolveNameSuffix() + def className = afterLast(includedDirectoryRelativePath, File.separator) + resolveNameSuffix() def convertedClassName = convertIllegalPackageChars(className) def packageName = buildPackage(basePackageNameForClass, includedDirectoryRelativePath) def classBytes = generator.buildClass(configProperties, contracts, convertedClassName, packageName, includedDirectoryRelativePath).getBytes(StandardCharsets.UTF_8) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy index 12a6f66799..5e25c6bab4 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy @@ -18,6 +18,9 @@ package org.springframework.cloud.contract.verifier.builder import groovy.transform.CompileStatic import groovy.transform.PackageScope +import org.apache.commons.logging.Log +import org.apache.commons.logging.LogFactory + import org.springframework.cloud.contract.verifier.config.TestFramework import org.springframework.cloud.contract.verifier.util.NamesUtil import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties @@ -33,6 +36,8 @@ import org.springframework.cloud.contract.verifier.config.ContractVerifierConfig @PackageScope class ClassBuilder { + private static final Log log = LogFactory.getLog(ClassBuilder) + private static final String SEPARATOR = "_REPLACEME_" private final String className @@ -72,11 +77,15 @@ class ClassBuilder { } protected static String retrieveBaseClass(ContractVerifierConfigProperties properties, String includedDirectoryRelativePath) { + String contractPathAsPackage = includedDirectoryRelativePath.replace(File.separator, ".") String contractPackage = includedDirectoryRelativePath.replace(File.separator, SEPARATOR) // package mapping takes super precedence if (properties.baseClassMappings) { Map.Entry mapping = properties.baseClassMappings.find { String pattern, String fqn -> - return contractPackage.matches(pattern) + return contractPathAsPackage.matches(pattern) + } + if (log.isDebugEnabled()) { + log.debug("Matching pattern for contract package [${contractPathAsPackage}] with setup ${properties.baseClassMappings} is [${mapping}]") } if (mapping) { return mapping.value diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilderSpec.groovy index 5c7020876e..7181fe45c3 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilderSpec.groovy @@ -1,5 +1,7 @@ package org.springframework.cloud.contract.verifier.builder +import spock.lang.Issue + import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties import spock.lang.Specification @@ -49,6 +51,16 @@ class ClassBuilderSpec extends Specification { ClassBuilder.retrieveBaseClass(props, contractRelativeFolder) == 'com.example.base.SuperClass' } + @Issue("701") + def "should match base class when mapping regex has multiple folders"() { + given: + ContractVerifierConfigProperties props = new ContractVerifierConfigProperties( + baseClassMappings: ['.*bar.baz.some.*' : 'com.example.base.SuperClass']) + String contractRelativeFolder = 'foo/bar/baz/some/package'.split("/").join(File.separator) + expect: + ClassBuilder.retrieveBaseClass(props, contractRelativeFolder) == 'com.example.base.SuperClass' + } + def "should return the first matching base class when provided mapping doesn't match"() { given: ContractVerifierConfigProperties props = new ContractVerifierConfigProperties( From e65aa5d6d5db70fc56f5f38f4c192ca6cf802084 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 1 Aug 2018 12:54:23 +0200 Subject: [PATCH 44/84] Ensures that the proper channel will be picked for the same destination fixes gh-694 --- .../messaging/stream/StreamStubMessages.java | 31 ++++- .../stream/StreamStubMessagesSpec.groovy | 109 ++++++++++++++++++ .../StreamMessagingApplicationSpec.groovy | 2 +- 3 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessagesSpec.groovy diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessages.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessages.java index 00cebd3016..4122cac3f9 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessages.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessages.java @@ -16,6 +16,7 @@ package org.springframework.cloud.contract.verifier.messaging.stream; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -29,6 +30,7 @@ import org.springframework.cloud.stream.test.binder.MessageCollector; import org.springframework.context.ApplicationContext; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; +import org.springframework.util.StringUtils; /** * @author Marcin Grzejszczak @@ -56,7 +58,7 @@ public class StreamStubMessages implements MessageVerifier> { public void send(Message message, String destination) { try { MessageChannel messageChannel = this.context - .getBean(resolvedDestination(destination), MessageChannel.class); + .getBean(resolvedDestination(destination, DefaultChannels.OUTPUT), MessageChannel.class); messageChannel.send(message); } catch (Exception e) { @@ -70,7 +72,7 @@ public class StreamStubMessages implements MessageVerifier> { public Message receive(String destination, long timeout, TimeUnit timeUnit) { try { MessageChannel messageChannel = this.context - .getBean(resolvedDestination(destination), MessageChannel.class); + .getBean(resolvedDestination(destination, DefaultChannels.INPUT), MessageChannel.class); return this.messageCollector.forChannel(messageChannel).poll(timeout, timeUnit); } catch (Exception e) { @@ -80,10 +82,11 @@ public class StreamStubMessages implements MessageVerifier> { } } - private String resolvedDestination(String destination) { + private String resolvedDestination(String destination, DefaultChannels defaultChannel) { try { BindingServiceProperties channelBindingServiceProperties = this.context .getBean(BindingServiceProperties.class); + Map channels = new HashMap<>(); for (Map.Entry entry : channelBindingServiceProperties .getBindings().entrySet()) { if (destination.equals(entry.getValue().getDestination())) { @@ -91,9 +94,24 @@ public class StreamStubMessages implements MessageVerifier> { log.debug("Found a channel named [{}] with destination [{}]", entry.getKey(), destination); } - return entry.getKey(); + channels.put(entry.getKey().toLowerCase(), destination); } } + if (channels.size() == 1) { + return channels.keySet().iterator().next(); + } else if (channels.size() > 0) { + if (log.isDebugEnabled()) { + log.debug("Found following channels [{}] for destination [{}]. " + + "Will pick the one that matches the default channel name or the first one if none is matching", + channels, destination); + } + String defaultChannelName = channels.get(defaultChannel.name().toLowerCase()); + String matchingChannelName = StringUtils.hasText(defaultChannelName) ? defaultChannel.name().toLowerCase() : channels.keySet().iterator().next(); + if (log.isDebugEnabled()) { + log.debug("Picked channel name is [{}]", matchingChannelName); + } + return matchingChannelName; + } } catch (Exception e) { log.error("Exception took place while trying to resolve the destination. Will assume the name [" + destination + "]", e); } @@ -111,3 +129,8 @@ public class StreamStubMessages implements MessageVerifier> { } } + + +enum DefaultChannels { + INPUT, OUTPUT +} \ No newline at end of file diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessagesSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessagesSpec.groovy new file mode 100644 index 0000000000..8cfcd09210 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/stream/StreamStubMessagesSpec.groovy @@ -0,0 +1,109 @@ +package org.springframework.cloud.contract.verifier.messaging.stream + +import spock.lang.Issue +import spock.lang.Specification + +import org.springframework.cloud.stream.config.BindingProperties +import org.springframework.cloud.stream.config.BindingServiceProperties +import org.springframework.cloud.stream.test.binder.MessageCollector +import org.springframework.context.ApplicationContext +import org.springframework.messaging.MessageChannel + +/** + * @author Marcin Grzejszczak + */ +class StreamStubMessagesSpec extends Specification { + + @Issue("694") + def "should resolve input channel if input and output have same destination and receive is called"() { + given: + ApplicationContext applicationContext = Mock(ApplicationContext) + BindingServiceProperties properties = new BindingServiceProperties( + bindings: [ + input: new BindingProperties(destination: "verifications"), + output: new BindingProperties(destination: "verifications"), + ] + ) + MessageCollector collector = Stub(MessageCollector) + and: + applicationContext.getBean(BindingServiceProperties) >> properties + applicationContext.getBean(MessageCollector) >> collector + and: + StreamStubMessages messages = new StreamStubMessages(applicationContext) + when: + messages.receive("verifications") + then: + 1 * applicationContext.getBean("input", MessageChannel) >> null + } + + @Issue("694") + def "should resolve output channel if input and output have same destination and send is called"() { + given: + ApplicationContext applicationContext = Mock(ApplicationContext) + BindingServiceProperties properties = new BindingServiceProperties( + bindings: [ + input: new BindingProperties(destination: "verifications"), + output: new BindingProperties(destination: "verifications"), + ] + ) + MessageCollector collector = Stub(MessageCollector) + MessageChannel channel = Stub(MessageChannel) + and: + applicationContext.getBean(BindingServiceProperties) >> properties + applicationContext.getBean(MessageCollector) >> collector + and: + StreamStubMessages messages = new StreamStubMessages(applicationContext) + when: + messages.send("foo", [:], "verifications") + then: + 1 * applicationContext.getBean("output", MessageChannel) >> channel + } + + def "should resolve channel via destination for send and receive"() { + given: + ApplicationContext applicationContext = Mock(ApplicationContext) + BindingServiceProperties properties = new BindingServiceProperties( + bindings: [ + foo: new BindingProperties(destination: "verifications") + ] + ) + MessageCollector collector = Stub(MessageCollector) + MessageChannel channel = Stub(MessageChannel) + and: + applicationContext.getBean(BindingServiceProperties) >> properties + applicationContext.getBean(MessageCollector) >> collector + and: + StreamStubMessages messages = new StreamStubMessages(applicationContext) + when: + messageInteraction(messages) + then: + 1 * applicationContext.getBean("foo", MessageChannel) >> channel + where: + messageInteraction << [ { StreamStubMessages stream -> stream.send("foo", [:], "verifications")}, + { StreamStubMessages stream -> stream.receive("verifications")}] + } + + def "should resolve channel via channel name for send and receive"() { + given: + ApplicationContext applicationContext = Mock(ApplicationContext) + BindingServiceProperties properties = new BindingServiceProperties( + bindings: [ + verifications: new BindingProperties(destination: "bar") + ] + ) + MessageCollector collector = Stub(MessageCollector) + MessageChannel channel = Stub(MessageChannel) + and: + applicationContext.getBean(BindingServiceProperties) >> properties + applicationContext.getBean(MessageCollector) >> collector + and: + StreamStubMessages messages = new StreamStubMessages(applicationContext) + when: + messageInteraction(messages) + then: + 1 * applicationContext.getBean("verifications", MessageChannel) >> channel + where: + messageInteraction << [ { StreamStubMessages stream -> stream.send("foo", [:], "verifications")}, + { StreamStubMessages stream -> stream.receive("verifications")}] + } +} diff --git a/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy b/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy index 71f804412d..abcf7f3a9b 100644 --- a/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy +++ b/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy @@ -40,7 +40,7 @@ import javax.inject.Inject @DirtiesContext @SpringBootTest(properties = "debug=true") @AutoConfigureMessageVerifier -public class StreamMessagingApplicationSpec extends Specification { +class StreamMessagingApplicationSpec extends Specification { // ALL CASES @Inject MessageVerifier> contractVerifierMessaging From 0d33b3644e2c998214977cda4f1677a5c25bed37 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 1 Aug 2018 13:07:09 +0200 Subject: [PATCH 45/84] Fixed the build after release --- samples/standalone/dsl/http-client/pom.xml | 2 +- samples/standalone/pact/pact-http-client/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/standalone/dsl/http-client/pom.xml b/samples/standalone/dsl/http-client/pom.xml index 1092565f20..a35818632b 100644 --- a/samples/standalone/dsl/http-client/pom.xml +++ b/samples/standalone/dsl/http-client/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.3.RELEASE + Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/pact/pact-http-client/pom.xml b/samples/standalone/pact/pact-http-client/pom.xml index c17bdd479d..173e21f1e1 100644 --- a/samples/standalone/pact/pact-http-client/pom.xml +++ b/samples/standalone/pact/pact-http-client/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.3.RELEASE + Finchley.BUILD-SNAPSHOT From d9c7d8f5e11cf7cd4760e2d582ef359005a36271 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 1 Aug 2018 14:49:34 +0200 Subject: [PATCH 46/84] Fixing the build --- samples/standalone/dsl/http-client/pom.xml | 2 +- samples/standalone/pact/pact-http-client/pom.xml | 2 +- samples/standalone/yml/http-client/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/standalone/dsl/http-client/pom.xml b/samples/standalone/dsl/http-client/pom.xml index a35818632b..c18744c4af 100644 --- a/samples/standalone/dsl/http-client/pom.xml +++ b/samples/standalone/dsl/http-client/pom.xml @@ -59,7 +59,7 @@ org.springframework.cloud spring-cloud-dependencies - ${spring-cloud-dependencies.version} + ${spring-cloud-release-train.version} pom import diff --git a/samples/standalone/pact/pact-http-client/pom.xml b/samples/standalone/pact/pact-http-client/pom.xml index 173e21f1e1..3c83c95a2f 100644 --- a/samples/standalone/pact/pact-http-client/pom.xml +++ b/samples/standalone/pact/pact-http-client/pom.xml @@ -57,7 +57,7 @@ org.springframework.cloud spring-cloud-dependencies - ${spring-cloud-dependencies.version} + ${spring-cloud-release-train.version} pom import diff --git a/samples/standalone/yml/http-client/pom.xml b/samples/standalone/yml/http-client/pom.xml index 9b28fee51a..7689a70b67 100644 --- a/samples/standalone/yml/http-client/pom.xml +++ b/samples/standalone/yml/http-client/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - 2.0.3.RELEASE + Finchley.BUILD-SNAPSHOT From 740dd97ea4d42b0291ee537af50849d7698322d2 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 1 Aug 2018 15:11:42 +0200 Subject: [PATCH 47/84] Added a very brief history of the project; fixes gh-671 --- docs/src/main/asciidoc/verifier_introduction.adoc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/src/main/asciidoc/verifier_introduction.adoc b/docs/src/main/asciidoc/verifier_introduction.adoc index be760da0a6..4bcf2d1f12 100644 --- a/docs/src/main/asciidoc/verifier_introduction.adoc +++ b/docs/src/main/asciidoc/verifier_introduction.adoc @@ -1,8 +1,5 @@ == Spring Cloud Contract Verifier Introduction -TIP: The Accurest project was initially started by Marcin Grzejszczak and Jakub Kubrynski -(http://codearte.io[codearte.io]) - Spring Cloud Contract Verifier enables Consumer Driven Contract (CDC) development of JVM-based applications. It moves TDD to the level of software architecture. @@ -19,6 +16,14 @@ own integrations. of the API is compliant with the contract (__server tests__). A full test is generated by Spring Cloud Contract Verifier. +=== History + +Before becoming Spring Cloud Contract, this project was called https://github.com/Codearte/accurest[Accurest]. +It was created by https://twitter.com/mgrzejszczak[Marcin Grzejszczak] and https://twitter.com/jkubrynski[Jakub Kubrynski] +from (http://codearte.io[codearte.io]. + +The `0.1.0` release took place on 26 Jan 2015 and it became stable with `1.0.0` release on 29 Feb 2016. + === Why a Contract Verifier? Assume that we have a system consisting of multiple microservices: From 4a6162cb5acce9a35441fba12d6f715c2ad25b1f Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 1 Aug 2018 17:10:07 +0200 Subject: [PATCH 48/84] Migrated to 2.0.4.BS of build --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d758b7f2ee..a65e35f5fa 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-build - 2.0.3.RELEASE + 2.0.4.BUILD-SNAPSHOT From 562271bb24279d4cb8fa471950ea14943f7e79af Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 1 Aug 2018 17:12:12 +0200 Subject: [PATCH 49/84] Fixing the build --- pom.xml | 2 +- samples/standalone/contracts/com/example/server/pom.xml | 2 +- samples/standalone/dsl/http-server/pom.xml | 2 +- samples/standalone/pact/pact-http-server/pom.xml | 2 +- samples/standalone/yml/http-server/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index a65e35f5fa..3d66a3ad07 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ 2.17 3.5.13 0.0.9 - 2.0.3.RELEASE + 2.0.4.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT Elmhurst.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT diff --git a/samples/standalone/contracts/com/example/server/pom.xml b/samples/standalone/contracts/com/example/server/pom.xml index 44aa553194..b679f93d68 100644 --- a/samples/standalone/contracts/com/example/server/pom.xml +++ b/samples/standalone/contracts/com/example/server/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.8 2.0.2.BUILD-SNAPSHOT - 2.0.3.RELEASE + Finchley.BUILD-SNAPSHOT true diff --git a/samples/standalone/dsl/http-server/pom.xml b/samples/standalone/dsl/http-server/pom.xml index 2bdaa5277a..568f3bcbbc 100644 --- a/samples/standalone/dsl/http-server/pom.xml +++ b/samples/standalone/dsl/http-server/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.8 2.0.2.BUILD-SNAPSHOT - 2.0.3.RELEASE + Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/pact/pact-http-server/pom.xml b/samples/standalone/pact/pact-http-server/pom.xml index 4fad58f58a..9334975a94 100644 --- a/samples/standalone/pact/pact-http-server/pom.xml +++ b/samples/standalone/pact/pact-http-server/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.8 2.0.2.BUILD-SNAPSHOT - 2.0.3.RELEASE + Finchley.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-server/pom.xml b/samples/standalone/yml/http-server/pom.xml index 489aace7cb..43ae87b1da 100644 --- a/samples/standalone/yml/http-server/pom.xml +++ b/samples/standalone/yml/http-server/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.8 2.0.2.BUILD-SNAPSHOT - 2.0.3.RELEASE + Finchley.BUILD-SNAPSHOT From ec7ed5e87f86266c87a6da6fffdf206800096739 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 1 Aug 2018 17:15:26 +0200 Subject: [PATCH 50/84] Maybe now --- README.adoc | 4 ++-- samples/standalone/contracts/com/example/server/pom.xml | 2 +- samples/standalone/dsl/http-server/pom.xml | 4 ++-- samples/standalone/pact/pact-http-server/pom.xml | 4 ++-- samples/standalone/yml/http-client/pom.xml | 4 ++-- samples/standalone/yml/http-server/pom.xml | 2 +- spring-cloud-contract-dependencies/pom.xml | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.adoc b/README.adoc index f14bd5a373..b484bfe8c2 100644 --- a/README.adoc +++ b/README.adoc @@ -1068,7 +1068,7 @@ First, add the `Spring Cloud Contract` BOM. org.springframework.cloud spring-cloud-dependencies - ${spring-cloud-dependencies.version} + ${spring-cloud-release.version} pom import @@ -1149,7 +1149,7 @@ Add the `Spring Cloud Contract` BOM: org.springframework.cloud spring-cloud-dependencies - ${spring-cloud-dependencies.version} + ${spring-cloud-release.version} pom import diff --git a/samples/standalone/contracts/com/example/server/pom.xml b/samples/standalone/contracts/com/example/server/pom.xml index b679f93d68..685c1eb30a 100644 --- a/samples/standalone/contracts/com/example/server/pom.xml +++ b/samples/standalone/contracts/com/example/server/pom.xml @@ -30,7 +30,7 @@ org.springframework.cloud spring-cloud-dependencies - ${spring-cloud-dependencies.version} + ${spring-cloud-release.version} pom import diff --git a/samples/standalone/dsl/http-server/pom.xml b/samples/standalone/dsl/http-server/pom.xml index 568f3bcbbc..81d4d70612 100644 --- a/samples/standalone/dsl/http-server/pom.xml +++ b/samples/standalone/dsl/http-server/pom.xml @@ -55,7 +55,7 @@ org.springframework.cloud spring-cloud-dependencies - ${spring-cloud-dependencies.version} + ${spring-cloud-release.version} pom import @@ -105,7 +105,7 @@ - org.eclipse.m2e diff --git a/samples/standalone/pact/pact-http-server/pom.xml b/samples/standalone/pact/pact-http-server/pom.xml index 9334975a94..02a53fbccc 100644 --- a/samples/standalone/pact/pact-http-server/pom.xml +++ b/samples/standalone/pact/pact-http-server/pom.xml @@ -52,7 +52,7 @@ org.springframework.cloud spring-cloud-dependencies - ${spring-cloud-dependencies.version} + ${spring-cloud-release.version} pom import @@ -108,7 +108,7 @@ - org.eclipse.m2e diff --git a/samples/standalone/yml/http-client/pom.xml b/samples/standalone/yml/http-client/pom.xml index 7689a70b67..8a53b767b7 100644 --- a/samples/standalone/yml/http-client/pom.xml +++ b/samples/standalone/yml/http-client/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - Finchley.BUILD-SNAPSHOT + Finchley.BUILD-SNAPSHOT @@ -52,7 +52,7 @@ org.springframework.cloud spring-cloud-dependencies - ${spring-cloud-dependencies.version} + ${spring-cloud-release.version} pom import diff --git a/samples/standalone/yml/http-server/pom.xml b/samples/standalone/yml/http-server/pom.xml index 43ae87b1da..5fdc45c8be 100644 --- a/samples/standalone/yml/http-server/pom.xml +++ b/samples/standalone/yml/http-server/pom.xml @@ -55,7 +55,7 @@ org.springframework.cloud spring-cloud-dependencies - ${spring-cloud-dependencies.version} + ${spring-cloud-release.version} pom import diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index 84cb6a0eba..5d2d35157b 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,8 +5,8 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.0.3.RELEASE - + 2.0.4.BUILD-SNAPSHOT + spring-cloud-contract-dependencies 2.0.2.BUILD-SNAPSHOT From 933afbe5640fb3373303178c53133bb50637a7be Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 2 Aug 2018 10:58:28 +0200 Subject: [PATCH 51/84] Fixed corrupt merge --- spring-cloud-contract-dependencies/pom.xml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index ad03e8e577..e8b4978018 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,13 +5,8 @@ spring-cloud-dependencies-parent org.springframework.cloud -<<<<<<< HEAD - 2.0.2.BUILD-SNAPSHOT - -======= 2.0.4.BUILD-SNAPSHOT - ->>>>>>> 2.0.x + spring-cloud-contract-dependencies 2.1.0.BUILD-SNAPSHOT From e98b7a92b5c8c8fd1cfa6b3a9c30273357a7b3b8 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 2 Aug 2018 11:27:50 +0200 Subject: [PATCH 52/84] Fixes broken merge --- samples/standalone/yml/http-server/pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/samples/standalone/yml/http-server/pom.xml b/samples/standalone/yml/http-server/pom.xml index 72559f6d60..1df451ee2d 100644 --- a/samples/standalone/yml/http-server/pom.xml +++ b/samples/standalone/yml/http-server/pom.xml @@ -20,13 +20,8 @@ UTF-8 1.8 -<<<<<<< HEAD 2.1.0.BUILD-SNAPSHOT Finchley.BUILD-SNAPSHOT -======= - 2.0.2.BUILD-SNAPSHOT - Finchley.BUILD-SNAPSHOT ->>>>>>> 2.0.x From 1b890df3f416c7705c1129818365a0a119dcbb21 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 2 Aug 2018 14:19:45 +0200 Subject: [PATCH 53/84] Using build 2.1.0.BS --- pom.xml | 2 +- spring-cloud-contract-dependencies/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 5a93a08af6..0640634c13 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-build - 2.0.4.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-dependencies/pom.xml b/spring-cloud-contract-dependencies/pom.xml index e8b4978018..8d175ccd91 100644 --- a/spring-cloud-contract-dependencies/pom.xml +++ b/spring-cloud-contract-dependencies/pom.xml @@ -5,8 +5,8 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.0.4.BUILD-SNAPSHOT - + 2.1.0.BUILD-SNAPSHOT + spring-cloud-contract-dependencies 2.1.0.BUILD-SNAPSHOT From 704669084258ec70038a288857381fe0f2a159b9 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 6 Aug 2018 11:48:40 +0200 Subject: [PATCH 54/84] Fixed the way body is parsed for stub generation without this fixed some bodies were treated as XML where they should be treated as text fixes gh-493 --- .../wiremock/BaseWireMockStubStrategy.groovy | 1 + .../verifier/util/ContentUtils.groovy | 5 +- .../verifier/util/MapConverter.groovy | 3 + .../builder/MethodBodyBuilderSpec.groovy | 51 +++++++++++++ .../verifier/dsl/WireMockGroovyDslSpec.groovy | 73 +++++++++++++++++++ 5 files changed, 132 insertions(+), 1 deletion(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/BaseWireMockStubStrategy.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/BaseWireMockStubStrategy.groovy index 8c94880436..d5c681a4e5 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/BaseWireMockStubStrategy.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/BaseWireMockStubStrategy.groovy @@ -34,6 +34,7 @@ import org.springframework.cloud.contract.verifier.util.ContentUtils import org.springframework.cloud.contract.verifier.util.MapConverter import static org.springframework.cloud.contract.verifier.util.ContentUtils.extractValue +import static org.springframework.cloud.contract.verifier.util.ContentUtils.getClientContentType import static org.springframework.cloud.contract.verifier.util.MapConverter.transformValues /** * Common abstraction over WireMock Request / Response conversion implementations diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy index 5b16fc20fd..5904b7a7d8 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy @@ -183,10 +183,13 @@ class ContentUtils { } private static GStringImpl extractValueForXML(GString bodyAsValue, Closure valueProvider) { - return new GStringImpl( + GStringImpl impl = new GStringImpl( bodyAsValue.values.collect { transformXMLStringValue(it, valueProvider) } as String[], bodyAsValue.strings.clone() as String[] ) + // try to convert it to XML + new XmlSlurper().parseText(impl.toString()) + return impl } protected static Object transformJSONStringValue(Object obj, Closure valueProvider) { diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy index 6e2529f8b8..e5565a8f81 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy @@ -20,6 +20,9 @@ import groovy.json.JsonSlurper import org.springframework.cloud.contract.spec.internal.DslProperty import org.springframework.cloud.contract.verifier.template.HandlebarsTemplateProcessor import org.springframework.cloud.contract.verifier.template.TemplateProcessor + +import static org.springframework.cloud.contract.verifier.util.ContentUtils.getClientContentType + /** * Converts an object into either client or server side representation. * Iterates over the structure of an object (depending on whether it's an diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy index db7561fbd8..d067a55255 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy @@ -650,6 +650,57 @@ DocumentContext parsedJson = JsonPath.parse(json); "JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } } + @Issue("#493") + def "should not escape a form URL encoded request body another try [#methodBuilderName]"() { + given: + Contract contractDsl = Contract.make { + request { + method POST() + urlPath('/oauth/token') + headers { + header(authorization(), anyNonBlankString()) + header(contentType(), 'application/x-www-form-urlencoded; charset=UTF-8') + header(accept(), anyNonBlankString()) + } + body('username=user&password=password&grant_type=password') + } + response { + status 200 + headers { + header(contentType(), applicationJsonUtf8()) + } + body([ + refresh_token: 'RANDOM_REFRESH_TOKEN', + access_token : 'RANDOM_ACCESS_TOKEN', + token_type : 'bearer', + expires_in : 3600, + scope : ['task'], + user : [ + id : 1, + username: 'user', + name : 'User' + ] + ]) + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + when: + builder.appendTo(blockBuilder) + then: + String test = blockBuilder.toString() + SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, test) + !test.contains("&") + and: + stubMappingIsValidWireMockStub(contractDsl) + where: + methodBuilderName | methodBuilder + "MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) } + "MockMvcJUnitMethodBuilder" | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties) } + "JaxRsClientSpockMethodRequestProcessingBodyBuilder" | { Contract dsl -> new JaxRsClientSpockMethodRequestProcessingBodyBuilder(dsl, properties) } + "JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } + } + @Issue("#509") def "classToCheck() should return class of object"() { given: diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy index fabc159728..6c9d75c3e9 100755 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy @@ -2081,6 +2081,79 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie } + @Issue('#493') + def "should not escape &"() { + given: + Contract groovyDsl = Contract.make { + request { + method POST() + urlPath('/oauth/token') + headers { + header(authorization(), anyNonBlankString()) + header(contentType(), 'application/x-www-form-urlencoded; charset=UTF-8') + header(accept(), anyNonBlankString()) + } + body('username=user&password=password&grant_type=password') + } + response { + status 200 + headers { + header(contentType(), applicationJsonUtf8()) + } + body([ + refresh_token: 'RANDOM_REFRESH_TOKEN', + access_token : 'RANDOM_ACCESS_TOKEN', + token_type : 'bearer', + expires_in : 3600, + scope : ['task'], + user : [ + id : 1, + username: 'user', + name : 'User' + ] + ]) + } + } + when: + String wireMockStub = new WireMockStubStrategy("Test", new ContractMetadata(null, false, 0, null, groovyDsl), groovyDsl).toWireMockClientStub() + then: + !wireMockStub.contains("&") + and: + AssertionUtil.assertThatJsonsAreEqual(''' + { + "request" : { + "urlPath" : "/oauth/token", + "method" : "POST", + "headers" : { + "Authorization" : { + "matches" : "^\\\\s*\\\\S[\\\\S\\\\s]*" + }, + "Content-Type" : { + "equalTo" : "application/x-www-form-urlencoded; charset=UTF-8" + }, + "Accept" : { + "matches" : "^\\\\s*\\\\S[\\\\S\\\\s]*" + } + }, + "bodyPatterns" : [ { + "equalTo" : "username=user&password=password&grant_type=password" + } ] + }, + "response" : { + "status" : 200, + "body" : "{\\"access_token\\":\\"RANDOM_ACCESS_TOKEN\\",\\"refresh_token\\":\\"RANDOM_REFRESH_TOKEN\\",\\"scope\\":[\\"task\\"],\\"token_type\\":\\"bearer\\",\\"expires_in\\":3600,\\"user\\":{\\"name\\":\\"User\\",\\"id\\":1,\\"username\\":\\"user\\"}}", + "headers" : { + "Content-Type" : "application/json;charset=UTF-8" + }, + "transformers" : [ "response-template", "foo-transformer" ] + } + } + ''', wireMockStub) + and: + stubMappingIsValidWireMockStub(wireMockStub) + + } + WireMockConfiguration config() { return new WireMockConfiguration().extensions(responseTemplateTransformer()) } From c9228969de898b0c4373877dcd56b73134b1f77b Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 8 Aug 2018 17:52:28 +0200 Subject: [PATCH 55/84] Closing and restarting WireMock stub after and before each test (#707) fixes gh-665 --- README.adoc | 2 - ...oanApplicationServiceContextPathTests.java | 2 - .../loan/LoanApplicationServiceTests.java | 2 - .../src/test/resources/application.yaml | 3 + .../loan/LoanApplicationServiceTests.java | 2 - .../com/example/loan/ServiceProperties.java | 17 +++++ ...oanApplicationServiceContextPathTests.java | 2 - .../loan/LoanApplicationServiceTests.java | 2 - .../WiremockForDocsClassRuleTests.java | 1 - ...mockForDocsMockServerApplicationTests.java | 1 - .../com/example/WiremockForDocsTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../WiremockImportApplicationTests.java | 1 - .../WiremockMockServerApplicationTests.java | 1 - .../WiremockServerApplicationTests.java | 1 - .../WiremockServerApplicationTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../WiremockImportApplicationTests.java | 1 - ...mockImportContextPathApplicationTests.java | 1 - .../WiremockMockServerApplicationTests.java | 1 - .../WiremockServerApplicationTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../WiremockImportApplicationTests.java | 1 - .../WiremockMockServerApplicationTests.java | 1 - .../WiremockServerApplicationTests.java | 1 - spring-cloud-contract-stub-runner/README.adoc | 8 -- spring-cloud-contract-stub-runner/pom.xml | 5 ++ .../stubrunner/StubRunnerExecutor.java | 5 ++ .../cloud/contract/stubrunner/StubServer.java | 26 +++++++ ...ubRunnerWireMockTestExecutionListener.java | 63 ++++++++++++++++ .../wiremock/WireMockHttpServerStub.java | 49 ++++++++++++- .../main/resources/META-INF/spring.factories | 6 +- .../spring/StubRunnerConfigurationSpec.groovy | 2 - ...nerSpringCloudAutoConfigurationSpec.groovy | 2 - .../StubRunnerStubsPerConsumerSpec.groovy | 2 - ...tubsPerConsumerWithConsumerNameSpec.groovy | 2 - ...ingCloudConsulAutoConfigurationSpec.groovy | 2 - .../wiremock/WireMockConfiguration.java | 31 +++++++- .../WireMockTestExecutionListener.java | 73 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 4 + ...AutoConfigureWireMockApplicationTests.java | 5 +- ...gureWireMockAutoStubsApplicationTests.java | 1 - ...eWireMockConfigurationCustomizerTests.java | 1 - ...onfigureWireMockFilesApplicationTests.java | 1 - ...MockFilesApplicationWithoutSlashTests.java | 1 - ...gureWireMockHttpsPortApplicationTests.java | 1 - ...ConfigureWireMockPortApplicationTests.java | 1 - ...ureWireMockRandomPortApplicationTests.java | 16 ++-- ...reMockRandomPortHttpsApplicationTests.java | 1 - ...igureWireMockSamePortApplicationTests.java | 33 +++++++++ ...WireMockStubsAndFilesApplicationTests.java | 1 - ...StubsAndMultipleFilesApplicationTests.java | 1 - ...onfigureWireMockStubsApplicationTests.java | 1 - ...ireMockStubsApplicationWithSlashTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../WiremockServerApplicationTests.java | 1 - ...iremockServerRestDocsApplicationTests.java | 1 - ...ServerRestDocsMatcherApplicationTests.java | 1 - .../wiremock/WiremockTestsApplication.java | 6 +- .../src/test/resources/application.yml | 3 + .../CamelMessagingApplicationSpec.groovy | 2 - ...IntegrationMessagingApplicationSpec.groovy | 4 +- .../com/example/SpringApplicationSpec.groovy | 6 +- .../StreamMessagingApplicationSpec.groovy | 2 - ...ingCloudEurekaAutoConfigurationSpec.groovy | 2 - ...CloudZookeeperAutoConfigurationSpec.groovy | 2 - .../loan/LoanApplicationServiceTests.java | 2 - .../moco/MocoHttpServerStubSpec.groovy | 2 - 68 files changed, 330 insertions(+), 99 deletions(-) create mode 100644 samples/standalone/restdocs/http-client/src/main/java/com/example/loan/ServiceProperties.java create mode 100644 spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java create mode 100644 spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockTestExecutionListener.java create mode 100644 spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java create mode 100644 spring-cloud-contract-wiremock/src/test/resources/application.yml diff --git a/README.adoc b/README.adoc index c3a2fc1339..bbd2e8da12 100644 --- a/README.adoc +++ b/README.adoc @@ -272,7 +272,6 @@ Annotate your test class with `@AutoConfigureStubRunner`. In the annotation prov @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceTests { ---- @@ -758,7 +757,6 @@ can also provide the offline work switch. @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceTests { ---- diff --git a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java index 4aa608011d..b2cd987551 100644 --- a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java +++ b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java @@ -8,7 +8,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.example.loan.model.Client; @@ -19,7 +18,6 @@ import com.example.loan.model.LoanApplicationStatus; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE, properties="server.context-path=/app") @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceContextPathTests { @Autowired diff --git a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java index 2daa188acc..82672baaa3 100644 --- a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -10,7 +10,6 @@ import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties import org.springframework.core.io.ByteArrayResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.example.loan.model.Client; @@ -27,7 +26,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceTests { // end::autoconfigure_stubrunner[] diff --git a/samples/standalone/dsl/http-client/src/test/resources/application.yaml b/samples/standalone/dsl/http-client/src/test/resources/application.yaml index 21459f2953..fcdfd10d16 100644 --- a/samples/standalone/dsl/http-client/src/test/resources/application.yaml +++ b/samples/standalone/dsl/http-client/src/test/resources/application.yaml @@ -1,2 +1,5 @@ server: port: 6565 +logging: + level: + org.springframework.cloud.contract: debug \ No newline at end of file diff --git a/samples/standalone/pact/pact-http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/pact/pact-http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java index 9877692b94..7ccd8e164e 100644 --- a/samples/standalone/pact/pact-http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/samples/standalone/pact/pact-http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -10,7 +10,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; import org.springframework.core.env.Environment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.example.loan.model.Client; @@ -21,7 +20,6 @@ import com.example.loan.model.LoanApplicationStatus; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) @AutoConfigureStubRunner(ids = {"com.example:pact-http-server:+:stubs"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceTests { @Autowired diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/ServiceProperties.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/ServiceProperties.java new file mode 100644 index 0000000000..0dff3bd2da --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/ServiceProperties.java @@ -0,0 +1,17 @@ +package com.example.loan; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties("service") +public class ServiceProperties { + + private int port = 8080; + + public void setPort(int port) { + this.port = port; + } + + public int getPort() { + return this.port; + } +} diff --git a/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java b/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java index f8351eb14a..fd282ad322 100644 --- a/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java +++ b/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java @@ -8,7 +8,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.example.loan.model.Client; @@ -19,7 +18,6 @@ import com.example.loan.model.LoanApplicationStatus; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE, properties="server.context-path=/app") @AutoConfigureStubRunner(ids = {"com.example:http-server-yml:+:stubs:6569"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceContextPathTests { @Autowired diff --git a/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java index f4a9c0672d..e44e4f32fa 100644 --- a/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.example.loan.model.Client; @@ -20,7 +19,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) @AutoConfigureStubRunner(ids = {"com.example:http-server-yml:+:stubs:6569"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceTests { // end::autoconfigure_stubrunner[] diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java index 94aff4b974..8633d32cdb 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java @@ -20,7 +20,6 @@ import org.springframework.test.context.junit4.SpringRunner; import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @ActiveProfiles("classrule") -@DirtiesContext //tag::wiremock_test1[] @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java index 8bbcec20ff..b46bfc3c80 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java @@ -13,7 +13,6 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestTemplate; -@DirtiesContext // tag::wiremock_test[] @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.NONE) diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java index 80ee38dd34..fda739e6e9 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java @@ -19,7 +19,6 @@ import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static org.assertj.core.api.Assertions.assertThat; @ActiveProfiles("docs") -@DirtiesContext //tag::wiremock_test1[] @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java index 93b83c12d5..8e3fc669a5 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java @@ -21,7 +21,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest("app.baseUrl=https://localhost:8443") -@DirtiesContext @AutoConfigureHttpClient public class WiremockHttpsServerApplicationTests { diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java index 121f8e2d50..761c7344c6 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java @@ -18,7 +18,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:6060", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port = 6060) public class WiremockImportApplicationTests { diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java index 6044625d39..ac7d44c007 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java @@ -15,7 +15,6 @@ import org.springframework.web.client.RestTemplate; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockMockServerApplicationTests { @Autowired diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java index 9bbb1671d6..cdb6c9e950 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java @@ -28,7 +28,6 @@ import static org.hamcrest.CoreMatchers.instanceOf; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:6061", webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockServerApplicationTests { @ClassRule diff --git a/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java index faef1e5ff2..6c532787db 100644 --- a/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java @@ -19,7 +19,6 @@ import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:6063", webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockServerApplicationTests { @ClassRule diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java index 9e30002fdf..05e370b069 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java @@ -21,7 +21,6 @@ import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @RunWith(SpringRunner.class) @SpringBootTest("app.baseUrl=https://localhost:6443") -@DirtiesContext @AutoConfigureHttpClient public class WiremockHttpsServerApplicationTests { diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java index 7169d26908..1b4f3916ef 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java @@ -18,7 +18,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:6065", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port = 6065) public class WiremockImportApplicationTests { diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java index c46ffe2873..dc091a4653 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java @@ -18,7 +18,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(properties = { "app.baseUrl=http://localhost:6066", "server.context-path=/app" }, webEnvironment = WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port = 6066) public class WiremockImportContextPathApplicationTests { diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java index bf75089652..ec44e4a947 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java @@ -15,7 +15,6 @@ import org.springframework.web.client.RestTemplate; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockMockServerApplicationTests { @Autowired diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java index d4c5656527..b47123d10e 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java @@ -29,7 +29,6 @@ import static org.hamcrest.CoreMatchers.instanceOf; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:6067", webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockServerApplicationTests { @ClassRule diff --git a/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java b/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java index 4bd913d950..4fe5fe2426 100644 --- a/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java +++ b/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java @@ -22,7 +22,6 @@ import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @RunWith(SpringRunner.class) @SpringBootTest("app.baseUrl=https://localhost:7443") -@DirtiesContext @ActiveProfiles("ssl") public class WiremockHttpsServerApplicationTests { diff --git a/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java b/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java index fd6c29e060..12440cbce8 100644 --- a/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java +++ b/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java @@ -18,7 +18,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:7070", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port = 7070) public class WiremockImportApplicationTests { diff --git a/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java b/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java index f53438fc5a..ae6055a12b 100644 --- a/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java +++ b/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java @@ -15,7 +15,6 @@ import org.springframework.web.client.RestTemplate; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockMockServerApplicationTests { @Autowired diff --git a/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java index 9fd429e5b1..1dc0c5d538 100644 --- a/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java @@ -20,7 +20,6 @@ import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:7071", webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockServerApplicationTests { @ClassRule diff --git a/spring-cloud-contract-stub-runner/README.adoc b/spring-cloud-contract-stub-runner/README.adoc index 64a10cb65c..28fb0d2527 100644 --- a/spring-cloud-contract-stub-runner/README.adoc +++ b/spring-cloud-contract-stub-runner/README.adoc @@ -146,14 +146,6 @@ HTTP stubs without the need to download artifacts. ==== Running stubs -===== Limitations - -IMPORTANT: There might be a problem with StubRunner shutting down ports between tests. You might - have a situation in which you get port conflicts. As long as you use the same context across tests - everything works fine. But when the context are different (e.g. different stubs or different profiles) - then you have to either use `@DirtiesContext` to shut down the stub servers, or else run them on - different ports per test. - ===== Running using main app You can set the following options to the main class: diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index fddcf60092..e33657f528 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -75,6 +75,11 @@ spring-integration-java-dsl true + + org.springframework + spring-test + true + org.springframework.boot spring-boot-autoconfigure-processor diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java index 551076cf13..80825968fe 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java @@ -25,6 +25,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import groovy.json.JsonOutput; import org.slf4j.Logger; @@ -38,12 +39,15 @@ import org.springframework.cloud.contract.stubrunner.provider.wiremock.WireMockH import org.springframework.cloud.contract.verifier.messaging.MessageVerifier; import org.springframework.cloud.contract.verifier.messaging.noop.NoOpStubMessages; import org.springframework.cloud.contract.verifier.util.BodyExtractor; +import wiremock.org.eclipse.jetty.util.ConcurrentHashSet; /** * Runs stubs for a particular {@link StubServer} */ class StubRunnerExecutor implements StubFinder { + static final Set STUB_SERVERS = new ConcurrentHashSet<>(); + private static final Logger log = LoggerFactory.getLogger(StubRunnerExecutor.class); private final AvailablePortScanner portScanner; private final MessageVerifier contractVerifierMessaging; @@ -261,6 +265,7 @@ class StubRunnerExecutor implements StubFinder { } }); } + STUB_SERVERS.add(this.stubServer); } private boolean hasRequest(Collection contracts) { diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubServer.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubServer.java index 73c7ded42f..429edb6ac3 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubServer.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubServer.java @@ -20,6 +20,7 @@ import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.Collection; +import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,7 +60,14 @@ class StubServer { return this; } + public boolean isRunning() { + return this.httpServerStub.isRunning(); + } + public void stop() { + if (log.isDebugEnabled()) { + log.debug("Stopping the server at port [" + this.getPort() + "]"); + } this.httpServerStub.stop(); } @@ -95,4 +103,22 @@ class StubServer { return this.httpServerStub.registeredMappings(); } + @Override public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + StubServer that = (StubServer) o; + return Objects.equals(this.stubConfiguration, that.stubConfiguration) && Objects + .equals(this.contracts, that.contracts); + } + + @Override public int hashCode() { + return Objects.hash(this.stubConfiguration, this.contracts); + } + + @Override public String toString() { + return "StubServer{" + "stubConfiguration=" + this.stubConfiguration + ", mappingsSize=" + + this.mappings.size() + '}'; + } } diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java new file mode 100644 index 0000000000..b29e451bf7 --- /dev/null +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java @@ -0,0 +1,63 @@ +package org.springframework.cloud.contract.stubrunner.provider.wiremock; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.github.tomakehurst.wiremock.stubbing.StubMapping; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.cloud.contract.stubrunner.HttpServerStub; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.support.AbstractTestExecutionListener; +import org.springframework.util.Assert; +import org.springframework.web.client.RestTemplate; + +/** + * Stops the {@link HttpServerStub} after each test class + * + * @author Marcin Grzejszczak + * @since 1.2.6 + */ +public final class StubRunnerWireMockTestExecutionListener extends AbstractTestExecutionListener { + + private static final Log log = LogFactory.getLog(StubRunnerWireMockTestExecutionListener.class); + + private static Map> STUBS = new ConcurrentHashMap<>(); + + @Override public void beforeTestClass(TestContext testContext) { + Map stubs = STUBS + .get(testContext.getApplicationContext()); + if (stubs != null) { + if (log.isDebugEnabled()) { + log.debug("Found a matching application context from [" + testContext.getTestClass().getName() + "]"); + } + for (Map.Entry entry : stubs.entrySet()) { + while (entry.getKey().isRunning()) { + entry.getKey().stop(); + } + List mappings = entry.getValue().mappings; + if (log.isDebugEnabled()) { + log.debug("Stopped a running WireMock instance at " + + "port [" + entry.getValue().port + "] with stub mappings " + + "size [" + mappings.size() + "]. Restarting the stub."); + } + entry.getKey().start(entry.getValue().port); + entry.getKey().registerDescriptors(mappings); + Assert.isTrue(new RestTemplate().getForEntity("http://localhost:" + entry.getValue().port + "/__admin/mappings", String.class) + .getStatusCode().is2xxSuccessful(), "__admin/mappings endpoint wasn't accessible"); + } + } + } + + @Override public void afterTestClass(TestContext testContext) { + STUBS.put(testContext.getApplicationContext(), WireMockHttpServerStub.SERVERS); + if (log.isDebugEnabled()) { + log.debug("Stopping servers " + WireMockHttpServerStub.SERVERS); + } + for (HttpServerStub serverStub : WireMockHttpServerStub.SERVERS.keySet()) { + serverStub.stop(); + } + } +} \ No newline at end of file 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 7146153c20..4f01fbab44 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 @@ -10,6 +10,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; @@ -43,6 +44,8 @@ public class WireMockHttpServerStub implements HttpServerStub { private static final Logger log = LoggerFactory.getLogger(WireMockHttpServerStub.class); private static final int INVALID_PORT = -1; + static final Map SERVERS = new ConcurrentHashMap<>(); + private WireMockServer wireMockServer; private WireMockConfiguration config() { @@ -107,6 +110,12 @@ public class WireMockHttpServerStub implements HttpServerStub { this.wireMockServer = new WireMockServer(config().port(port) .notifier(new Slf4jNotifier(true))); this.wireMockServer.start(); + if (log.isDebugEnabled()) { + log.debug("Started WireMock at port [" + port + "]"); + } + if (!SERVERS.containsKey(this)) { + SERVERS.put(this, new PortAndMappings(port, new ArrayList())); + } return this; } @@ -159,20 +168,25 @@ public class WireMockHttpServerStub implements HttpServerStub { } private void registerStubMappings(Collection stubFiles) { - WireMock wireMock = new WireMock("localhost", port(), ""); + WireMock wireMock = wireMock(); registerDefaultHealthChecks(wireMock); registerStubs(stubFiles, wireMock); } + private WireMock wireMock() { + return new WireMock("localhost", port(), ""); + } + private void registerDefaultHealthChecks(WireMock wireMock) { registerHealthCheck(wireMock, "/ping"); registerHealthCheck(wireMock, "/health"); } private void registerStubs(Collection sortedMappings, WireMock wireMock) { + List stubMappings = new ArrayList<>(); for (File mappingDescriptor : sortedMappings) { try { - wireMock.register(getMapping(mappingDescriptor)); + stubMappings.add(registerDescriptor(wireMock, mappingDescriptor)); if (log.isDebugEnabled()) { log.debug("Registered stub mappings from [" + mappingDescriptor + "]"); } @@ -183,6 +197,23 @@ public class WireMockHttpServerStub implements HttpServerStub { } } } + PortAndMappings portAndMappings = SERVERS.get(this); + SERVERS.put(this, new PortAndMappings(portAndMappings.port, stubMappings)); + } + + private StubMapping registerDescriptor(WireMock wireMock, File mappingDescriptor) { + StubMapping mapping = getMapping(mappingDescriptor); + wireMock.register(mapping); + return mapping; + } + + void registerDescriptors(List stubMappings) { + if (log.isDebugEnabled()) { + log.debug("Registering stub mappings size [" + stubMappings.size() + "] at port [" + port() + "]"); + } + for (StubMapping mapping : stubMappings) { + wireMock().register(mapping); + } } private void registerHealthCheck(WireMock wireMock, String url) { @@ -194,3 +225,17 @@ public class WireMockHttpServerStub implements HttpServerStub { WireMock.get(WireMock.urlEqualTo(url)).willReturn(WireMock.aResponse().withBody(body).withStatus(200))); } } + +class PortAndMappings { + final Integer port; + final List mappings; + + PortAndMappings(Integer port, List mappings) { + this.port = port; + this.mappings = mappings; + } + + @Override public String toString() { + return "PortAndMappings{" + "port=" + this.port + ", mappings=" + this.mappings.size() + '}'; + } +} \ No newline at end of file diff --git a/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories index dc3d4e026a..086dbdce76 100644 --- a/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories @@ -8,4 +8,8 @@ org.springframework.cloud.contract.stubrunner.messaging.integration.StubRunnerIn org.springframework.cloud.contract.stubrunner.messaging.camel.StubRunnerCamelConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.zookeeper.StubRunnerSpringCloudZookeeperAutoConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.eureka.StubRunnerSpringCloudEurekaAutoConfiguration,\ -org.springframework.cloud.contract.stubrunner.spring.cloud.consul.StubRunnerSpringCloudConsulAutoConfiguration \ No newline at end of file +org.springframework.cloud.contract.stubrunner.spring.cloud.consul.StubRunnerSpringCloudConsulAutoConfiguration +# +## Test Execution Listeners +org.springframework.test.context.TestExecutionListener=\ +org.springframework.cloud.contract.stubrunner.provider.wiremock.StubRunnerWireMockTestExecutionListener \ No newline at end of file diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy index 4dad71a21e..914959ecdd 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy @@ -27,7 +27,6 @@ import org.springframework.cloud.contract.stubrunner.StubFinder import org.springframework.cloud.contract.stubrunner.StubNotFoundException import org.springframework.context.annotation.Configuration import org.springframework.core.env.Environment -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -42,7 +41,6 @@ import spock.lang.Specification "stubrunner.camel.enabled=false", 'foo=${stubrunner.runningstubs.fraudDetectionServer.port}']) @AutoConfigureStubRunner(mappingsOutputFolder = "target/outputmappings/") -@DirtiesContext @ActiveProfiles("test") class StubRunnerConfigurationSpec extends Specification { diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy index 100e48e3e8..0c2fd35133 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy @@ -30,7 +30,6 @@ import org.springframework.cloud.zookeeper.ZookeeperAutoConfiguration import org.springframework.cloud.zookeeper.discovery.RibbonZookeeperAutoConfiguration import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.ContextConfiguration import org.springframework.web.client.RestTemplate @@ -48,7 +47,6 @@ import spock.lang.Specification "org.springframework.cloud.contract.verifier.stubs:bootService"], repositoryRoot = "classpath:m2repo/repository/") // end::autoconfigure[] -@DirtiesContext class StubRunnerSpringCloudAutoConfigurationSpec extends Specification { @Autowired StubFinder stubFinder diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy index c51b1496d8..7c8dbdd169 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy @@ -30,7 +30,6 @@ import org.springframework.context.annotation.Configuration import org.springframework.core.env.Environment import org.springframework.http.ResponseEntity import org.springframework.messaging.Message -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -43,7 +42,6 @@ import spock.lang.Specification @AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers", repositoryRoot = "classpath:m2repo/repository/", stubsPerConsumer = true) -@DirtiesContext class StubRunnerStubsPerConsumerSpec extends Specification { // end::test[] diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy index 8e451ff9e6..f8487d95f2 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy @@ -30,7 +30,6 @@ import org.springframework.context.annotation.Configuration import org.springframework.core.env.Environment import org.springframework.http.ResponseEntity import org.springframework.messaging.Message -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -44,7 +43,6 @@ import spock.lang.Specification repositoryRoot = "classpath:m2repo/repository/", consumerName = "foo-consumer", stubsPerConsumer = true) -@DirtiesContext class StubRunnerStubsPerConsumerWithConsumerNameSpec extends Specification { // end::test[] diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/consul/StubRunnerSpringCloudConsulAutoConfigurationSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/consul/StubRunnerSpringCloudConsulAutoConfigurationSpec.groovy index 236e96080c..36f1d8998a 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/consul/StubRunnerSpringCloudConsulAutoConfigurationSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/consul/StubRunnerSpringCloudConsulAutoConfigurationSpec.groovy @@ -31,7 +31,6 @@ import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -57,7 +56,6 @@ import static org.mockito.Mockito.mock "org.springframework.cloud.contract.verifier.stubs:fraudDetectionServer", "org.springframework.cloud.contract.verifier.stubs:bootService"], repositoryRoot = "classpath:m2repo/repository/") -@DirtiesContext class StubRunnerSpringCloudConsulAutoConfigurationSpec extends Specification { @Autowired ConsulClient client 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 cbc51c365c..457f058634 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 @@ -23,6 +23,8 @@ import java.util.List; import javax.annotation.PostConstruct; import com.github.tomakehurst.wiremock.common.Slf4jNotifier; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -33,12 +35,14 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.util.Assert; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.core.Options; +import org.springframework.web.client.RestTemplate; /** * Configuration and lifecycle for a Spring Application context that wants to run a @@ -55,6 +59,10 @@ import com.github.tomakehurst.wiremock.core.Options; @EnableConfigurationProperties(WireMockProperties.class) public class WireMockConfiguration implements SmartLifecycle { + private static final Log log = LogFactory.getLog(WireMockConfiguration.class); + + static final String WIREMOCK_SERVER_BEAN_NAME = "wireMockServer"; + private volatile boolean running; private WireMockServer server; @@ -91,10 +99,15 @@ public class WireMockConfiguration implements SmartLifecycle { this.customizer.customize(factory); } } - this.server = new WireMockServer(this.options); + if (this.server == null) { + this.server = new WireMockServer(this.options); + } registerStubs(); - if (!this.beanFactory.containsBean("wireMockServer")) { - this.beanFactory.registerSingleton("wireMockServer", this.server); + if (log.isDebugEnabled()) { + log.debug("WireMock server has [" + this.server.getStubMappings().size() + "] registered"); + } + if (!this.beanFactory.containsBean(WIREMOCK_SERVER_BEAN_NAME)) { + this.beanFactory.registerSingleton(WIREMOCK_SERVER_BEAN_NAME, this.server); } } @@ -118,6 +131,10 @@ public class WireMockConfiguration implements SmartLifecycle { } } + void reset() { + this.server.resetAll(); + } + private void registerFiles(com.github.tomakehurst.wiremock.core.WireMockConfiguration factory) throws IOException { List resources = new ArrayList<>(); for (String files : this.wireMock.getFiles()) { @@ -142,6 +159,11 @@ public class WireMockConfiguration implements SmartLifecycle { this.server.start(); WireMock.configureFor("localhost", this.server.port()); this.running = true; + if (log.isDebugEnabled()) { + log.debug("Started WireMock at port [" + this.server.port() + "]. It has [" + this.server.getStubMappings().size() + "] mappings registered"); + } + Assert.isTrue(new RestTemplate().getForEntity("http://localhost:" + this.server.port() + "/__admin/mappings", String.class) + .getStatusCode().is2xxSuccessful(), "__admin/mappings endpoint wasn't accessible"); } @Override @@ -149,6 +171,9 @@ public class WireMockConfiguration implements SmartLifecycle { if (this.running) { this.server.stop(); this.running = false; + if (log.isDebugEnabled()) { + log.debug("Stopped WireMock instance"); + } } } diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockTestExecutionListener.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockTestExecutionListener.java new file mode 100644 index 0000000000..77947f65bf --- /dev/null +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockTestExecutionListener.java @@ -0,0 +1,73 @@ +package org.springframework.cloud.contract.wiremock; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.support.AbstractTestExecutionListener; + +/** + * Stops the WireMock server after each test class and restarts it before every class + * + * @author Marcin Grzejszczak + * @since 1.2.6 + */ +public final class WireMockTestExecutionListener extends AbstractTestExecutionListener { + + private static final Log log = LogFactory.getLog(WireMockTestExecutionListener.class); + + @Override public void beforeTestClass(TestContext testContext) { + try { + if (wireMockConfigMissing(testContext)) { + return; + } + WireMockConfiguration wireMockConfiguration = wireMockConfiguration(testContext); + if (log.isDebugEnabled()) { + log.debug("WireMock configuration is running [" + wireMockConfiguration.isRunning() + "]"); + } + if (!wireMockConfiguration.isRunning()) { + wireMockConfiguration.reset(); + wireMockConfiguration.init(); + wireMockConfiguration.start(); + } + } catch (Exception e) { + if (log.isDebugEnabled()) { + log.debug("Exception occurred while trying to init WireMock configuration", e); + } + } + } + + private boolean wireMockConfigMissing(TestContext testContext) { + boolean missing = !testContext.getApplicationContext().containsBean(WireMockConfiguration.class.getName()); + if (log.isDebugEnabled()) { + log.debug("WireMockConfig is missing [" + missing + "]"); + } + return missing; + } + + @Override public void afterTestClass(TestContext testContext) { + try { + if (wireMockConfigMissing(testContext)) { + return; + } + stopWireMockConfiguration(testContext); + } catch (Exception e) { + if (log.isDebugEnabled()) { + log.debug("Exception occurred while trying to init WireMock configuration", e); + } + } + } + + private void stopWireMockConfiguration(TestContext testContext) { + WireMockConfiguration wireMockConfiguration = wireMockConfiguration(testContext); + if (wireMockConfiguration.isRunning()) { + if (log.isDebugEnabled()) { + log.debug("WireMock is running, will stop it"); + } + wireMockConfiguration.stop(); + } + } + + private WireMockConfiguration wireMockConfiguration(TestContext testContext) { + return testContext.getApplicationContext().getBean(WireMockConfiguration.class); + } +} diff --git a/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories index 9ac5aa6677..2f458f9e92 100644 --- a/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories @@ -5,3 +5,7 @@ org.springframework.cloud.contract.wiremock.WireMockApplicationListener # RestDocs Auto Configuration org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs=\ org.springframework.cloud.contract.wiremock.restdocs.WireMockRestDocsConfiguration + +# Test Execution Listeners +org.springframework.test.context.TestExecutionListener=\ +org.springframework.cloud.contract.wiremock.WireMockTestExecutionListener \ No newline at end of file diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java index b7df3fdf09..e884b39ab9 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java @@ -6,6 +6,7 @@ import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static org.assertj.core.api.Assertions.assertThat; +import com.github.tomakehurst.wiremock.WireMockServer; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -13,11 +14,11 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.client.RestTemplate; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext -@AutoConfigureWireMock(port = 5432) +@AutoConfigureWireMock(port = 12345) public class AutoConfigureWireMockApplicationTests { @Autowired diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java index ad0b1200d1..8007b897ef 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0) // Default stubs work at classpath:/mappings public class AutoConfigureWireMockAutoStubsApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java index b79c65f012..1ab19f1d8a 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java @@ -18,7 +18,6 @@ import static org.assertj.core.api.Assertions.assertThat; AutoConfigureWireMockConfigurationCustomizerTests.Config.class}, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, stubs="file:src/test/resources/io.stubs/mappings") public class AutoConfigureWireMockConfigurationCustomizerTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java index 0ef3869b08..c3fea3d63a 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, files="classpath:/root/") public class AutoConfigureWireMockFilesApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java index c1508f1d77..6f3f662a04 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java @@ -12,7 +12,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, files="classpath:root") public class AutoConfigureWireMockFilesApplicationWithoutSlashTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java index de9f4e4ec2..d365408fa2 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java @@ -16,7 +16,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes = WiremockTestsApplication.class, properties = "app.baseUrl=https://localhost:${wiremock.server.https-port}", webEnvironment = WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(httpsPort = 9999, port=0) public class AutoConfigureWireMockHttpsPortApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java index 63e49e3d2b..6c0282faba 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java @@ -16,7 +16,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes = WiremockTestsApplication.class, properties = "app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment = WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port = 9999) public class AutoConfigureWireMockPortApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortApplicationTests.java index aa0dbde681..dd45cc315f 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortApplicationTests.java @@ -1,22 +1,20 @@ package org.springframework.cloud.contract.wiremock; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.junit4.SpringRunner; + import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; import static com.github.tomakehurst.wiremock.client.WireMock.get; import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit4.SpringRunner; - @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0) public class AutoConfigureWireMockRandomPortApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java index c36d7e1996..97eb739c5e 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java @@ -16,7 +16,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=https://localhost:${wiremock.server.https-port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, httpsPort=0) public class AutoConfigureWireMockRandomPortHttpsApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java new file mode 100644 index 0000000000..19add19d03 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java @@ -0,0 +1,33 @@ +package org.springframework.cloud.contract.wiremock; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = WiremockTestsApplication.class, properties = "app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment = WebEnvironment.NONE) +@AutoConfigureWireMock(port = 9999) +// Should manage to register +public class AutoConfigureWireMockSamePortApplicationTests { + + @Autowired + private Service service; + + @Test + public void contextLoads() throws Exception { + stubFor(get(urlEqualTo("/test2")).willReturn(aResponse() + .withHeader("Content-Type", "text/plain").withBody("Hello World2!"))); + assertThat(this.service.go2()).isEqualTo("Hello World2!"); + } + +} diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java index 28f96987ab..cba4c7de6f 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, files="classpath:/root/", stubs="file:src/test/resources/io.stubs/mappings") public class AutoConfigureWireMockStubsAndFilesApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java index 79a0ad2314..02389a3fbe 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, files={"classpath:/", "classpath:/root/", "classpath:/nonexistent/"}, stubs="file:src/test/resources/io.stubs/mappings") public class AutoConfigureWireMockStubsAndMultipleFilesApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java index c286aec9be..1d7039f02e 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, stubs="file:src/test/resources/io.stubs/mappings") public class AutoConfigureWireMockStubsApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java index cd24d33aa0..8f565d2f22 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java @@ -12,7 +12,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, stubs="file:src/test/resources/io.stubs/mappings/") public class AutoConfigureWireMockStubsApplicationWithSlashTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java index 15d73ade30..05ecaa821b 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java @@ -18,7 +18,6 @@ import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=https://localhost:8443") -@DirtiesContext public class WiremockHttpsServerApplicationTests { @ClassRule diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java index 062a7e9012..5a3da0fbbb 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java @@ -20,7 +20,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:5435", webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockServerApplicationTests { @ClassRule diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java index 78d0256327..719076c4a1 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java @@ -27,7 +27,6 @@ import wiremock.org.eclipse.jetty.http.HttpStatus; @SpringBootTest(classes = TestConfiguration.class) @AutoConfigureRestDocs(outputDir = "target/snippets") @AutoConfigureMockMvc -@DirtiesContext public class WiremockServerRestDocsApplicationTests { @Autowired private MockMvc mockMvc; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java index 3017ce6dc6..67aa1252aa 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java @@ -30,7 +30,6 @@ import com.github.tomakehurst.wiremock.client.WireMock; @SpringBootTest(classes = TestConfiguration.class) @AutoConfigureRestDocs(outputDir = "target/snippets") @AutoConfigureMockMvc -@DirtiesContext public class WiremockServerRestDocsMatcherApplicationTests { @Autowired diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java index df1a184074..a9fd7f55c2 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java @@ -46,7 +46,7 @@ class Controller { class Service { @Value("${app.baseUrl:http://example.org}") - private String base; + String base; private RestTemplate restTemplate; @@ -58,6 +58,10 @@ class Service { return this.restTemplate.getForEntity(this.base + "/test", String.class).getBody(); } + public String go2() { + return this.restTemplate.getForEntity(this.base + "/test2", String.class).getBody(); + } + public void setBase(String base) { this.base = base; } diff --git a/spring-cloud-contract-wiremock/src/test/resources/application.yml b/spring-cloud-contract-wiremock/src/test/resources/application.yml new file mode 100644 index 0000000000..95382003b1 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/test/resources/application.yml @@ -0,0 +1,3 @@ +logging: + level: + org.springframework.cloud.contract: debug \ No newline at end of file diff --git a/tests/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy b/tests/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy index 2d43631044..2785036d98 100644 --- a/tests/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy +++ b/tests/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy @@ -27,7 +27,6 @@ import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.verifier.messaging.MessageVerifier import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -41,7 +40,6 @@ import com.toomuchcoding.jsonassert.JsonAssertion */ // Context configuration would end up in base class @ContextConfiguration(classes = [CamelMessagingApplication], loader = SpringBootContextLoader) -@DirtiesContext @AutoConfigureMessageVerifier class CamelMessagingApplicationSpec extends Specification { diff --git a/tests/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy b/tests/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy index a50b850083..b3a5ec34e3 100644 --- a/tests/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy +++ b/tests/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy @@ -25,7 +25,6 @@ import org.springframework.cloud.contract.verifier.messaging.MessageVerifier import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; import org.springframework.messaging.Message -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -35,9 +34,8 @@ import com.jayway.jsonpath.JsonPath import com.toomuchcoding.jsonassert.JsonAssertion // Context configuration would end up in base class @ContextConfiguration(classes = [IntegrationMessagingApplication], loader = SpringBootContextLoader) -@DirtiesContext @AutoConfigureMessageVerifier -public class IntegrationMessagingApplicationSpec extends Specification { +class IntegrationMessagingApplicationSpec extends Specification { // ALL CASES @Inject MessageVerifier> contractVerifierMessaging diff --git a/tests/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy b/tests/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy index fcb16bc994..402fd0e8dd 100644 --- a/tests/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy +++ b/tests/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy @@ -25,8 +25,7 @@ import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.verifier.messaging.MessageVerifier import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; -import org.springframework.messaging.Message; -import org.springframework.test.annotation.DirtiesContext +import org.springframework.messaging.Message import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -40,9 +39,8 @@ import com.toomuchcoding.jsonassert.JsonAssertion */ // Context configuration would end up in base class @ContextConfiguration(classes = [SpringMessagingApplication], loader = SpringBootContextLoader) -@DirtiesContext @AutoConfigureMessageVerifier -public class SpringApplicationSpec extends Specification { +class SpringApplicationSpec extends Specification { // ALL CASES @Inject MessageVerifier> contractVerifierMessaging diff --git a/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy b/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy index abcf7f3a9b..ca305ee7ee 100644 --- a/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy +++ b/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy @@ -27,7 +27,6 @@ import org.springframework.cloud.contract.verifier.messaging.MessageVerifier import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper import org.springframework.messaging.Message -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -37,7 +36,6 @@ import javax.inject.Inject */ // Context configuration would end up in base class @ContextConfiguration(classes = [StreamMessagingApplication], loader = SpringBootContextLoader) -@DirtiesContext @SpringBootTest(properties = "debug=true") @AutoConfigureMessageVerifier class StreamMessagingApplicationSpec extends Specification { diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfigurationSpec.groovy b/tests/spring-cloud-contract-stub-runner-boot-eureka/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfigurationSpec.groovy index 6d44662c31..386831ffdc 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfigurationSpec.groovy +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfigurationSpec.groovy @@ -31,7 +31,6 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.http.HttpMethod import org.springframework.http.client.ClientHttpResponse -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import org.springframework.web.client.* import spock.lang.AutoCleanup @@ -56,7 +55,6 @@ import spock.util.concurrent.PollingConditions "org.springframework.cloud.contract.verifier.stubs:fraudDetectionServer", "org.springframework.cloud.contract.verifier.stubs:bootService"], repositoryRoot = "classpath:m2repo/repository/") -@DirtiesContext class StubRunnerSpringCloudEurekaAutoConfigurationSpec extends Specification { @Autowired StubFinder stubFinder diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/zookeeper/StubRunnerSpringCloudZookeeperAutoConfigurationSpec.groovy b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/zookeeper/StubRunnerSpringCloudZookeeperAutoConfigurationSpec.groovy index d68ebd4a8f..64551dbefa 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/zookeeper/StubRunnerSpringCloudZookeeperAutoConfigurationSpec.groovy +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/zookeeper/StubRunnerSpringCloudZookeeperAutoConfigurationSpec.groovy @@ -31,7 +31,6 @@ import org.springframework.cloud.zookeeper.ZookeeperProperties import org.springframework.cloud.zookeeper.discovery.ZookeeperServiceDiscovery import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import org.springframework.util.SocketUtils import org.springframework.web.client.RestTemplate @@ -50,7 +49,6 @@ import spock.lang.Specification "org.springframework.cloud.contract.verifier.stubs:fraudDetectionServer", "org.springframework.cloud.contract.verifier.stubs:bootService"], repositoryRoot = "classpath:m2repo/repository/") -@DirtiesContext class StubRunnerSpringCloudZookeeperAutoConfigurationSpec extends Specification { @Autowired StubFinder stubFinder diff --git a/tests/spring-cloud-contract-stub-runner-context-path/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/tests/spring-cloud-contract-stub-runner-context-path/src/test/java/com/example/loan/LoanApplicationServiceTests.java index 5910bd9dcd..4e3b3597c9 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/tests/spring-cloud-contract-stub-runner-context-path/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -9,7 +9,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.StubFinder; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.client.RestTemplate; @@ -25,7 +24,6 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) @AutoConfigureStubRunner(repositoryRoot = "classpath:m2repo/repository/", ids = { "org.springframework.cloud.contract.verifier.stubs:contextPathFraudDetectionServer" }) -@DirtiesContext public class LoanApplicationServiceTests { // end::autoconfigure_stubrunner[] diff --git a/tests/spring-cloud-contract-stub-runner-moco/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/moco/MocoHttpServerStubSpec.groovy b/tests/spring-cloud-contract-stub-runner-moco/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/moco/MocoHttpServerStubSpec.groovy index 5cbf274f11..24cab08b46 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/moco/MocoHttpServerStubSpec.groovy +++ b/tests/spring-cloud-contract-stub-runner-moco/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/moco/MocoHttpServerStubSpec.groovy @@ -28,7 +28,6 @@ import org.springframework.cloud.stream.messaging.Sink import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.stereotype.Component -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -43,7 +42,6 @@ import spock.lang.Specification // @AutoConfigureStubRunner @AutoConfigureStubRunner( ids = ["com.example:fraudDetectionServerMoco"]) // end::[classpath_stub_runner] -@DirtiesContext @ActiveProfiles("test") class MocoHttpServerStubSpec extends Specification { From 6d1cb05a77355cd5f5b9b79312126343ca85e9ea Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 8 Aug 2018 18:04:20 +0200 Subject: [PATCH 56/84] Removed missing DirtiesContext --- .../src/test/java/com/example/fraud/StubGeneratorTests.java | 2 -- .../src/test/java/com/example/fraud/XmlStubGeneratorTests.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java b/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java index 8e8a1462bf..182979b8ec 100644 --- a/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java +++ b/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java @@ -12,7 +12,6 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMock import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.json.JacksonTester; import org.springframework.http.MediaType; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -28,7 +27,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @AutoConfigureRestDocs(outputDir = "target/snippets") @AutoConfigureMockMvc @AutoConfigureJsonTesters -@DirtiesContext public class StubGeneratorTests { @Autowired diff --git a/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/XmlStubGeneratorTests.java b/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/XmlStubGeneratorTests.java index b36e22bad5..1180334a06 100644 --- a/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/XmlStubGeneratorTests.java +++ b/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/XmlStubGeneratorTests.java @@ -15,7 +15,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.json.JacksonTester; import org.springframework.http.MediaType; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -31,7 +30,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @SpringBootTest(classes = Application.class) @AutoConfigureRestDocs(outputDir = "target/snippets") @AutoConfigureMockMvc -@DirtiesContext public class XmlStubGeneratorTests { @Autowired From e5b0a9dabcb40ec4b51ff3b70f3269e5182ac4e1 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 8 Aug 2018 18:09:27 +0200 Subject: [PATCH 57/84] Added better exception for null collection elements; fixes gh-703 --- .../verifier/assertion/CollectionAssert.java | 9 ++++++++- .../assertion/CollectionAssertTests.java | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/CollectionAssert.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/CollectionAssert.java index 5d6b746318..d5a44bb4b3 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/CollectionAssert.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/CollectionAssert.java @@ -30,14 +30,21 @@ public class CollectionAssert extends IterableAssert { isNotNull(); isNotEmpty(); for (Object anActual : this.actual) { + if (anActual == null) { + failWithMessageRelatedToRegex(regex, anActual); + } String value = anActual.toString(); if (!value.matches(regex)) { - failWithMessage("The value <%s> doesn't match the regex <%s>", value, regex); + failWithMessageRelatedToRegex(regex, value); } } return this; } + private void failWithMessageRelatedToRegex(String regex, Object value) { + failWithMessage("The value <%s> doesn't match the regex <%s>", value, regex); + } + /** * Flattens the collection and checks whether size is greater than or equal to the provided value * @param size - the flattened collection should have size greater than or equal to this value diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/assertion/CollectionAssertTests.java b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/assertion/CollectionAssertTests.java index ef6b74ad09..5e2fa07a94 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/assertion/CollectionAssertTests.java +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/assertion/CollectionAssertTests.java @@ -33,6 +33,18 @@ public class CollectionAssertTests { } } + @Test + public void should_throw_an_exception_when_element_is_null() { + Collection collection = collectionWithNulls(); + + try { + SpringCloudContractAssertions.assertThat(collection).allElementsMatch("[0-9]"); + Assertions.fail("should throw exception"); + } catch (AssertionError e) { + Assertions.assertThat(e).hasMessageContaining("The value doesn't match the regex <[0-9]>"); + } + } + @Test public void should_throw_an_exception_when_collection_is_null() { Collection collection = null; @@ -265,6 +277,12 @@ public class CollectionAssertTests { return list; } + private Collection collectionWithNulls() { + List list = new ArrayList<>(); + list.add(null); + return list; + } + private Collection nestedCollection() { List list = new ArrayList<>(); List list1 = new ArrayList<>(); From ac2b89d68c34503b3d78687fd650d2cb9c8109ca Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 8 Aug 2018 18:10:30 +0200 Subject: [PATCH 58/84] Fixed checkstyle issues --- .../contract/wiremock/WireMockConfiguration.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) 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 466069cc1b..1d71732a52 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 @@ -16,18 +16,16 @@ package org.springframework.cloud.contract.wiremock; -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.Options; - import java.io.IOException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import javax.annotation.PostConstruct; +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.Options; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -43,10 +41,6 @@ import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.util.Assert; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; - -import com.github.tomakehurst.wiremock.WireMockServer; -import com.github.tomakehurst.wiremock.client.WireMock; -import com.github.tomakehurst.wiremock.core.Options; import org.springframework.web.client.RestTemplate; /** From cb31ca7bf1d26b78b4a76a226268b5d1e78cf084 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 8 Aug 2018 21:58:04 +0200 Subject: [PATCH 59/84] Removed DirtiesContext --- .../LoanApplicationServiceContextPathTests.java | 5 ++--- .../example/loan/LoanApplicationServiceTests.java | 14 +++++++------- .../java/com/example/fraud/StubGeneratorTests.java | 1 - .../com/example/WiremockForDocsClassRuleTests.java | 1 - .../WiremockForDocsMockServerApplicationTests.java | 1 - .../java/com/example/WiremockForDocsTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../example/WiremockImportApplicationTests.java | 1 - .../WiremockMockServerApplicationTests.java | 1 - .../example/WiremockServerApplicationTests.java | 1 - .../example/WiremockServerApplicationTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../example/WiremockImportApplicationTests.java | 1 - .../WiremockImportContextPathApplicationTests.java | 1 - .../WiremockMockServerApplicationTests.java | 1 - .../example/WiremockServerApplicationTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../example/WiremockImportApplicationTests.java | 1 - .../WiremockMockServerApplicationTests.java | 1 - .../example/WiremockServerApplicationTests.java | 1 - .../contract/stubrunner/StubRunnerSliceTests.java | 1 - .../AutoConfigureWireMockApplicationTests.java | 1 - ...ConfigureWireMockAutoStubsApplicationTests.java | 1 - ...figureWireMockConfigurationCustomizerTests.java | 1 - ...AutoConfigureWireMockFilesApplicationTests.java | 1 - ...eWireMockFilesApplicationWithoutSlashTests.java | 1 - ...ConfigureWireMockHttpsPortApplicationTests.java | 1 - .../AutoConfigureWireMockPortApplicationTests.java | 1 - ...ureWireMockRandomPortHttpsApplicationTests.java | 1 - ...oConfigureWireMockSamePortApplicationTests.java | 1 - ...igureWireMockStubsAndFilesApplicationTests.java | 1 - ...eMockStubsAndMultipleFilesApplicationTests.java | 1 - ...AutoConfigureWireMockStubsApplicationTests.java | 1 - ...gureWireMockStubsApplicationWithSlashTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../wiremock/WiremockServerApplicationTests.java | 1 - .../WiremockServerRestDocsApplicationTests.java | 1 - ...emockServerRestDocsMatcherApplicationTests.java | 1 - ...iremockServerWebTestClientApplicationTests.java | 1 - 39 files changed, 9 insertions(+), 47 deletions(-) diff --git a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java index ceaef58294..1eb7e0a364 100644 --- a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java +++ b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java @@ -1,7 +1,5 @@ package com.example.loan; -import static org.assertj.core.api.Assertions.assertThat; - import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -9,7 +7,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.example.loan.model.Client; @@ -17,6 +14,8 @@ import com.example.loan.model.LoanApplication; import com.example.loan.model.LoanApplicationResult; import com.example.loan.model.LoanApplicationStatus; +import static org.assertj.core.api.Assertions.assertThat; + @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE, properties="server.context-path=/app") @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"}, diff --git a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java index d64ff07751..ab8eeff9a8 100644 --- a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -1,11 +1,5 @@ package com.example.loan; -import com.example.loan.model.Client; -import com.example.loan.model.LoanApplication; -import com.example.loan.model.LoanApplicationResult; -import com.example.loan.model.LoanApplicationStatus; -import com.jayway.jsonpath.DocumentContext; -import com.jayway.jsonpath.JsonPath; import io.restassured.RestAssured; import io.restassured.response.ResponseOptions; import io.restassured.specification.RequestSpecification; @@ -16,9 +10,15 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; +import com.example.loan.model.Client; +import com.example.loan.model.LoanApplication; +import com.example.loan.model.LoanApplicationResult; +import com.example.loan.model.LoanApplicationStatus; +import com.jayway.jsonpath.DocumentContext; +import com.jayway.jsonpath.JsonPath; + import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson; import static org.assertj.core.api.Assertions.assertThat; diff --git a/samples/standalone/webclient/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java b/samples/standalone/webclient/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java index 2c655c3f96..01367f7c04 100644 --- a/samples/standalone/webclient/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java +++ b/samples/standalone/webclient/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java @@ -16,7 +16,6 @@ import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWeb import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.json.JacksonTester; import org.springframework.http.MediaType; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.web.reactive.function.BodyInserters; diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java index 8633d32cdb..be39bc68f2 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java @@ -13,7 +13,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.WireMockSpring; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java index b46bfc3c80..ff698af3a0 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java @@ -8,7 +8,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.WireMockRestServiceServer; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestTemplate; diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java index fda739e6e9..60e5a7d37d 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java @@ -8,7 +8,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; import org.springframework.core.env.Environment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java index 8e3fc669a5..f720c6faed 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java @@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.contract.wiremock.AutoConfigureHttpClient; import org.springframework.cloud.contract.wiremock.WireMockSpring; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java index 761c7344c6..acc0215f92 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java index ac7d44c007..f06509d3da 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java @@ -8,7 +8,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.WireMockRestServiceServer; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestTemplate; diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java index cdb6c9e950..2a3f475fdd 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java @@ -16,7 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.WireMockSpring; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; diff --git a/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java index 6c532787db..46caa3a55f 100644 --- a/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java @@ -12,7 +12,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.github.tomakehurst.wiremock.junit.WireMockClassRule; diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java index 05e370b069..0eed2de134 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java @@ -13,7 +13,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.contract.wiremock.AutoConfigureHttpClient; import org.springframework.cloud.contract.wiremock.WireMockSpring; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.github.tomakehurst.wiremock.junit.WireMockClassRule; diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java index 1b4f3916ef..5d6e1081ef 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java index dc091a4653..d0205aa2f2 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java index ec44e4a947..c719a6de49 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java @@ -8,7 +8,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.WireMockRestServiceServer; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestTemplate; diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java index b47123d10e..fd10183cd3 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java @@ -17,7 +17,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.WireMockSpring; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; diff --git a/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java b/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java index 4fe5fe2426..4064803f9f 100644 --- a/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java +++ b/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java @@ -12,7 +12,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.contract.wiremock.WireMockSpring; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.SocketUtils; diff --git a/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java b/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java index 12440cbce8..9c6501404f 100644 --- a/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java +++ b/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; diff --git a/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java b/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java index ae6055a12b..3cc15b627d 100644 --- a/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java +++ b/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java @@ -8,7 +8,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.WireMockRestServiceServer; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestTemplate; diff --git a/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java index 1dc0c5d538..e669ff19fc 100644 --- a/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java @@ -13,7 +13,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.wiremock.WireMockSpring; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.github.tomakehurst.wiremock.junit.WireMockClassRule; diff --git a/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/StubRunnerSliceTests.java b/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/StubRunnerSliceTests.java index 8fa3004be3..a250d83608 100644 --- a/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/StubRunnerSliceTests.java +++ b/spring-cloud-contract-stub-runner/src/test/java/org/springframework/cloud/contract/stubrunner/StubRunnerSliceTests.java @@ -24,7 +24,6 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java index e884b39ab9..762f7f43f7 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java @@ -12,7 +12,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.client.RestTemplate; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java index 8007b897ef..879c93a7b5 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java @@ -7,7 +7,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java index 1ab19f1d8a..5cb2e2b58e 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java @@ -8,7 +8,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java index c3fea3d63a..8f5f4a07a9 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java @@ -7,7 +7,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java index 6f3f662a04..78e4edb01e 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java @@ -5,7 +5,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java index d365408fa2..eecc74ec66 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java @@ -11,7 +11,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java index 6c0282faba..f55540e9ec 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java @@ -11,7 +11,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java index 97eb739c5e..e4dc0bae8e 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java @@ -11,7 +11,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java index 19add19d03..f186e1f066 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java @@ -5,7 +5,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java index cba4c7de6f..01ac819f7b 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java @@ -7,7 +7,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java index 02389a3fbe..022347237e 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java @@ -7,7 +7,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java index 1d7039f02e..f522cdd078 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java @@ -7,7 +7,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java index 8f565d2f22..07034419a5 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java @@ -5,7 +5,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java index 05ecaa821b..74077d8527 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java @@ -11,7 +11,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.github.tomakehurst.wiremock.junit.WireMockClassRule; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java index 5a3da0fbbb..7caa048411 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java @@ -9,7 +9,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java index 4405cd49f7..8fb23892d4 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java @@ -18,7 +18,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.contract.wiremock.WiremockServerRestDocsApplicationTests.TestConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.http.ResponseEntity; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java index 67aa1252aa..fb0d5a4459 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java @@ -13,7 +13,6 @@ import org.springframework.cloud.contract.wiremock.WiremockServerRestDocsMatcher import org.springframework.cloud.contract.wiremock.restdocs.WireMockRestDocs; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerWebTestClientApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerWebTestClientApplicationTests.java index d69f682e0f..b22d29e6fa 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerWebTestClientApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerWebTestClientApplicationTests.java @@ -10,7 +10,6 @@ import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; import org.springframework.cloud.contract.wiremock.WiremockServerWebTestClientApplicationTests.TestConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.http.ResponseEntity; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; From e0afcd523bfe2d0163e8942a39e8652eba158491 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 9 Aug 2018 14:11:59 +0200 Subject: [PATCH 60/84] Added debug info for stubs per consumer --- .../cloud/contract/stubrunner/StubRepository.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java index e2b973415a..6e54d0fb82 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java @@ -190,7 +190,13 @@ class StubRepository { return true; } String consumerName = this.options.getConsumerName(); - return file.getAbsolutePath().contains(File.separator + consumerName + File.separator); + String searchedConsumerName = File.separator + consumerName + File.separator; + String absolutePath = file.getAbsolutePath(); + boolean stubPerConsumerMatching = absolutePath.contains(searchedConsumerName); + if (log.isDebugEnabled()) { + log.debug("Absolute path [" + absolutePath + "] contains [" + searchedConsumerName + "] in its path [" + stubPerConsumerMatching + "]"); + } + return stubPerConsumerMatching; } private static boolean isContractDescriptor(File file) { From 1603627ed3b20fe63cd1301a7fb01d3401cf80b4 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 9 Aug 2018 14:11:59 +0200 Subject: [PATCH 61/84] Added debug info for stubs per consumer --- .../cloud/contract/stubrunner/StubRepository.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java index 2065033d15..4e9ea34d64 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java @@ -190,7 +190,13 @@ class StubRepository { return true; } String consumerName = this.options.getConsumerName(); - return file.getAbsolutePath().contains(File.separator + consumerName + File.separator); + String searchedConsumerName = File.separator + consumerName + File.separator; + String absolutePath = file.getAbsolutePath(); + boolean stubPerConsumerMatching = absolutePath.contains(searchedConsumerName); + if (log.isDebugEnabled()) { + log.debug("Absolute path [" + absolutePath + "] contains [" + searchedConsumerName + "] in its path [" + stubPerConsumerMatching + "]"); + } + return stubPerConsumerMatching; } private static boolean isContractDescriptor(File file) { From 7956970eb18e659a28235de3ba758ce4ad342435 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 9 Aug 2018 14:11:59 +0200 Subject: [PATCH 62/84] Added debug info for stubs per consumer --- .../cloud/contract/stubrunner/StubRepository.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java index 2065033d15..4e9ea34d64 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRepository.java @@ -190,7 +190,13 @@ class StubRepository { return true; } String consumerName = this.options.getConsumerName(); - return file.getAbsolutePath().contains(File.separator + consumerName + File.separator); + String searchedConsumerName = File.separator + consumerName + File.separator; + String absolutePath = file.getAbsolutePath(); + boolean stubPerConsumerMatching = absolutePath.contains(searchedConsumerName); + if (log.isDebugEnabled()) { + log.debug("Absolute path [" + absolutePath + "] contains [" + searchedConsumerName + "] in its path [" + stubPerConsumerMatching + "]"); + } + return stubPerConsumerMatching; } private static boolean isContractDescriptor(File file) { From 0b79a5b36002e4ccde0e88a40abcda49794f4fde Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 9 Aug 2018 15:04:46 +0200 Subject: [PATCH 63/84] Moar debug --- .../cloud/contract/stubrunner/ClasspathStubProvider.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java index 7cd47a15ea..8d8817c708 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java @@ -81,10 +81,16 @@ public class ClasspathStubProvider implements StubDownloaderBuilder { for (Resource resource : resources) { try { String relativePath = relativePathPicker(resource, groupAndArtifactPattern); + if (log.isDebugEnabled()) { + log.debug("Relative path for resource is [" + relativePath + "]"); + } int lastIndexOf = relativePath.lastIndexOf(File.separator); String relativePathWithoutFile = lastIndexOf > -1 ? relativePath.substring(0, lastIndexOf) : relativePath; + if (log.isDebugEnabled()) { + log.debug("Relative path without file name is [" + relativePathWithoutFile + "]"); + } Path directory = Files.createDirectories( new File(tmp, relativePathWithoutFile).toPath()); File newFile = new File(directory.toFile(), resource.getFilename()); From e60eb56f2b224f6ef79b30f814db576055d309cd Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 9 Aug 2018 15:45:02 +0200 Subject: [PATCH 64/84] Removed unnecessary file separator from classpath stub provider --- .../cloud/contract/stubrunner/ClasspathStubProvider.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java index 8d8817c708..7121983b7c 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java @@ -132,11 +132,11 @@ public class ClasspathStubProvider implements StubDownloaderBuilder { if (groupAndArtifactMatcher.matches()) { MatchResult groupAndArtifactResult = groupAndArtifactMatcher .toMatchResult(); - return groupAndArtifactResult.group(2) + File.separator + return groupAndArtifactResult.group(2) + groupAndArtifactResult.group(3); } else { - throw new IllegalArgumentException("Illegal uri [${uri}]"); + throw new IllegalArgumentException("Illegal uri [" + uri + "]"); } } }; From 6d630482ea25a3a09f4dfec80b17e03f890b61e0 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 9 Aug 2018 15:51:28 +0200 Subject: [PATCH 65/84] Using / for relative paths; should fix gh-697 --- .../cloud/contract/stubrunner/ClasspathStubProvider.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java index 7121983b7c..e114b4b93f 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ClasspathStubProvider.java @@ -84,7 +84,8 @@ public class ClasspathStubProvider implements StubDownloaderBuilder { if (log.isDebugEnabled()) { log.debug("Relative path for resource is [" + relativePath + "]"); } - int lastIndexOf = relativePath.lastIndexOf(File.separator); + // the relative path is OS agnostic and contains / only + int lastIndexOf = relativePath.lastIndexOf("/"); String relativePathWithoutFile = lastIndexOf > -1 ? relativePath.substring(0, lastIndexOf) : relativePath; From d2f0f6322ed189003f5c23d90eefd39eb227e3a0 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 10 Aug 2018 14:35:52 +0200 Subject: [PATCH 66/84] Added comments related to the workaround with Java HTTP client; thanks to @tomakehurst --- .../wiremock/StubRunnerWireMockTestExecutionListener.java | 8 ++++++++ .../cloud/contract/wiremock/WireMockConfiguration.java | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java index b29e451bf7..7bd3005ffa 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java @@ -45,6 +45,14 @@ public final class StubRunnerWireMockTestExecutionListener extends AbstractTestE } entry.getKey().start(entry.getValue().port); entry.getKey().registerDescriptors(mappings); + /* + Thanks to Tom Akehurst: + I looked at tcpdump while running the failing test. HttpUrlConnection is doing something weird - it's creating a connection in a + previous test case, which works fine, then the usual fin -> fin ack etc. etc. ending handshake happens. But it seems it + isn't discarded, but reused after that. Because the server thinks (rightly) that the connection is closed, it just sends a RST packet. + Calling the admin endpoint just happened to remove the dead connection from the pool. + This also fixes the problem (which using the Java HTTP client): System.setProperty("http.keepAlive", "false"); + */ Assert.isTrue(new RestTemplate().getForEntity("http://localhost:" + entry.getValue().port + "/__admin/mappings", String.class) .getStatusCode().is2xxSuccessful(), "__admin/mappings endpoint wasn't accessible"); } 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 457f058634..25a5f2454f 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 @@ -162,6 +162,14 @@ public class WireMockConfiguration implements SmartLifecycle { if (log.isDebugEnabled()) { log.debug("Started WireMock at port [" + this.server.port() + "]. It has [" + this.server.getStubMappings().size() + "] mappings registered"); } + /* + Thanks to Tom Akehurst: + I looked at tcpdump while running the failing test. HttpUrlConnection is doing something weird - it's creating a connection in a + previous test case, which works fine, then the usual fin -> fin ack etc. etc. ending handshake happens. But it seems it + isn't discarded, but reused after that. Because the server thinks (rightly) that the connection is closed, it just sends a RST packet. + Calling the admin endpoint just happened to remove the dead connection from the pool. + This also fixes the problem (which using the Java HTTP client): System.setProperty("http.keepAlive", "false"); + */ Assert.isTrue(new RestTemplate().getForEntity("http://localhost:" + this.server.port() + "/__admin/mappings", String.class) .getStatusCode().is2xxSuccessful(), "__admin/mappings endpoint wasn't accessible"); } From b5351bd6c8a41d58101696d0c12cdcd531b112ed Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 20 Aug 2018 14:05:37 +0200 Subject: [PATCH 67/84] Updated the link to stub runner fat jar --- spring-cloud-contract-stub-runner/README.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-contract-stub-runner/README.adoc b/spring-cloud-contract-stub-runner/README.adoc index cbd8e6ad91..c2b1b3fe70 100644 --- a/spring-cloud-contract-stub-runner/README.adoc +++ b/spring-cloud-contract-stub-runner/README.adoc @@ -490,11 +490,11 @@ For the properties check the *Stub Runner Spring* section. ===== Stub Runner Server Fat Jar -You can download a standalone JAR from Maven (for example, for version 1.2.3.RELEASE), as follows: +You can download a standalone JAR from Maven (e.g. for version 2.0.1.RELEASE), as follows: [source,bash,indent=0] ---- -$ wget -O stub-runner.jar 'https://search.maven.org/remote_content?g=org.springframework.cloud&a=spring-cloud-contract-stub-runner-boot&v=1.2.3.RELEASE' +$ wget -O stub-runner.jar 'https://search.maven.org/remotecontent?filepath=org/springframework/cloud/spring-cloud-contract-stub-runner-boot/2.0.1.RELEASE/spring-cloud-contract-stub-runner-boot-2.0.1.RELEASE.jar' $ java -jar stub-runner.jar --stubrunner.ids=... --stubrunner.repositoryRoot=... ---- From f9ff03f24df4940ba8052214330d75e85e2c9e39 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 21 Aug 2018 11:56:59 +0200 Subject: [PATCH 68/84] Updated Gradle to 4.9 --- docker/spring-cloud-contract-docker/project/build.gradle | 2 +- .../project/gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/spring-cloud-contract-docker/project/build.gradle b/docker/spring-cloud-contract-docker/project/build.gradle index 12a7e0b935..c54b421bf7 100644 --- a/docker/spring-cloud-contract-docker/project/build.gradle +++ b/docker/spring-cloud-contract-docker/project/build.gradle @@ -83,7 +83,7 @@ contracts { } task wrapper(type: Wrapper) { - gradleVersion = '4.4.1' + gradleVersion = '4.9' } task cleanOutput(type: Delete) { diff --git a/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties b/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties index 2c2bbe5f9a..949819d28a 100644 --- a/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties +++ b/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip From 3d42ab9d35037c27d092d9ab94a3ae0fe28dca77 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 21 Aug 2018 11:58:18 +0200 Subject: [PATCH 69/84] Bumped dependency management plugin --- docker/spring-cloud-contract-docker/project/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/spring-cloud-contract-docker/project/build.gradle b/docker/spring-cloud-contract-docker/project/build.gradle index c54b421bf7..e7975be1ed 100644 --- a/docker/spring-cloud-contract-docker/project/build.gradle +++ b/docker/spring-cloud-contract-docker/project/build.gradle @@ -10,7 +10,7 @@ buildscript { } dependencies { - classpath "io.spring.gradle:dependency-management-plugin:1.0.4.RELEASE" + classpath "io.spring.gradle:dependency-management-plugin:1.0.6.RELEASE" classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${verifierVersion}" } } From 814dd06cea7c86c46c70dd6c75160a8d8e31726d Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 22 Aug 2018 16:16:16 +0200 Subject: [PATCH 70/84] Fixed broken links; fixes gh-710 --- README.adoc | 6 +++--- docs/src/main/asciidoc/README.adoc | 2 +- docs/src/main/asciidoc/spring-cloud-contract.adoc | 2 +- docs/src/main/asciidoc/verifier_contract.adoc | 1 + docs/src/main/asciidoc/verifier_faq.adoc | 2 +- docs/src/main/asciidoc/verifier_introduction.adoc | 2 +- docs/src/main/asciidoc/verifier_setup.adoc | 2 +- docs/src/main/asciidoc/verifier_stubrunner_msg.adoc | 1 + .../README.adoc | 2 +- 9 files changed, 11 insertions(+), 9 deletions(-) diff --git a/README.adoc b/README.adoc index b41cd390cb..bf075d806d 100644 --- a/README.adoc +++ b/README.adoc @@ -1,6 +1,6 @@ // Do not edit this file (e.g. go instead to src/main/asciidoc) -:branch: master +:branch: 2.0.x image::https://badges.gitter.im/Join%20Chat.svg[Gitter, link="https://gitter.im/spring-cloud/spring-cloud-contract?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"] image::https://codecov.io/gh/spring-cloud/spring-cloud-contract/branch/{branch}/graph/badge.svg["codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-contract"] image::https://circleci.com/gh/spring-cloud/spring-cloud-contract.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-contract"] @@ -1032,7 +1032,7 @@ of an identifier or a timestamp, you need not hardcode a value. You want to allo different ranges of values. To enable ranges of values, you can set regular expressions matching those values for the consumer side. You can provide the body by means of either a map notation or String with interpolations. -Consult the <> section for more information. We highly recommend using the map notation! +Consult the <> section for more information. We highly recommend using the map notation! TIP: You must understand the map notation in order to set up contracts. Please read the http://groovy-lang.org/json.html[Groovy docs regarding JSON]. @@ -1146,7 +1146,7 @@ Add the `Spring Cloud Contract` BOM: org.springframework.cloud spring-cloud-dependencies - ${spring-cloud-release.version} + ${spring-cloud-release-train.version} pom import diff --git a/docs/src/main/asciidoc/README.adoc b/docs/src/main/asciidoc/README.adoc index c091616c79..cebcc2184f 100644 --- a/docs/src/main/asciidoc/README.adoc +++ b/docs/src/main/asciidoc/README.adoc @@ -1,4 +1,4 @@ -:branch: master +:branch: 2.0.x image::https://badges.gitter.im/Join%20Chat.svg[Gitter, link="https://gitter.im/spring-cloud/spring-cloud-contract?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"] image::https://codecov.io/gh/spring-cloud/spring-cloud-contract/branch/{branch}/graph/badge.svg["codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-contract"] image::https://circleci.com/gh/spring-cloud/spring-cloud-contract.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-contract"] diff --git a/docs/src/main/asciidoc/spring-cloud-contract.adoc b/docs/src/main/asciidoc/spring-cloud-contract.adoc index a0b79b8813..b6c600d7fe 100644 --- a/docs/src/main/asciidoc/spring-cloud-contract.adoc +++ b/docs/src/main/asciidoc/spring-cloud-contract.adoc @@ -5,7 +5,7 @@ :numbered: :icons: font :sectlinks: true -:branch: master +:branch: 2.0.x = Spring Cloud Contract diff --git a/docs/src/main/asciidoc/verifier_contract.adoc b/docs/src/main/asciidoc/verifier_contract.adoc index 9c23c7837f..cd2ddf4068 100644 --- a/docs/src/main/asciidoc/verifier_contract.adoc +++ b/docs/src/main/asciidoc/verifier_contract.adoc @@ -1,3 +1,4 @@ +[[contract-dsl]] == Contract DSL Spring Cloud Contract supports out of the box 2 types of DSL. One written in diff --git a/docs/src/main/asciidoc/verifier_faq.adoc b/docs/src/main/asciidoc/verifier_faq.adoc index aaa23793b6..ac77fc1309 100644 --- a/docs/src/main/asciidoc/verifier_faq.adoc +++ b/docs/src/main/asciidoc/verifier_faq.adoc @@ -1,5 +1,5 @@ :introduction_url: https://raw.githubusercontent.com/spring-cloud/spring-cloud-contract/{branch} -:samples_branch: 2.0.x +:samples_branch: master == Spring Cloud Contract FAQ diff --git a/docs/src/main/asciidoc/verifier_introduction.adoc b/docs/src/main/asciidoc/verifier_introduction.adoc index a77b3b1957..e48f8fb619 100644 --- a/docs/src/main/asciidoc/verifier_introduction.adoc +++ b/docs/src/main/asciidoc/verifier_introduction.adoc @@ -696,7 +696,7 @@ of an identifier or a timestamp, you need not hardcode a value. You want to allo different ranges of values. To enable ranges of values, you can set regular expressions matching those values for the consumer side. You can provide the body by means of either a map notation or String with interpolations. -Consult the <> section for more information. We highly recommend using the map notation! +Consult the <> section for more information. We highly recommend using the map notation! TIP: You must understand the map notation in order to set up contracts. Please read the http://groovy-lang.org/json.html[Groovy docs regarding JSON]. diff --git a/docs/src/main/asciidoc/verifier_setup.adoc b/docs/src/main/asciidoc/verifier_setup.adoc index 5b91f9dc64..96839b406d 100644 --- a/docs/src/main/asciidoc/verifier_setup.adoc +++ b/docs/src/main/asciidoc/verifier_setup.adoc @@ -989,7 +989,7 @@ name of `scenario1` and the three following steps: . logout marked as `Step2` which will close the scenario. More details about WireMock scenarios can be found at -http://wiremock.org/stateful-behaviour.html[http://wiremock.org/stateful-behaviour.html] +http://wiremock.org/docs/stateful-behaviour/[http://wiremock.org/docs/stateful-behaviour/] Spring Cloud Contract Verifier also generates tests with a guaranteed order of execution. diff --git a/docs/src/main/asciidoc/verifier_stubrunner_msg.adoc b/docs/src/main/asciidoc/verifier_stubrunner_msg.adoc index 5402d775ec..725c4e8db9 100644 --- a/docs/src/main/asciidoc/verifier_stubrunner_msg.adoc +++ b/docs/src/main/asciidoc/verifier_stubrunner_msg.adoc @@ -1,3 +1,4 @@ +[[stub-runner-for-messaging]] == Stub Runner for Messaging Stub Runner can run the published stubs in memory. It can integrate with the following diff --git a/tests/spring-cloud-contract-stub-runner-integration/README.adoc b/tests/spring-cloud-contract-stub-runner-integration/README.adoc index baba7e3ab3..ccae044b9a 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/README.adoc +++ b/tests/spring-cloud-contract-stub-runner-integration/README.adoc @@ -102,7 +102,7 @@ The received message would pass the following assertions: include::src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy[tags=client_trigger_message,indent=0] ---- -[[integration-scenario-1]] +[[integration-scenario-2]] ===== Scenario 2 (output triggered by input) Since the route is set for you, you can send a message to the `{output_name}` From 9ed08fb31bc8c6202851e753fc09a12dc7d0699d Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 22 Aug 2018 16:17:00 +0200 Subject: [PATCH 71/84] Updated branches --- README.adoc | 2 +- docs/src/main/asciidoc/README.adoc | 2 +- docs/src/main/asciidoc/spring-cloud-contract.adoc | 2 +- docs/src/main/asciidoc/verifier_faq.adoc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.adoc b/README.adoc index a46b696049..ed626744c5 100644 --- a/README.adoc +++ b/README.adoc @@ -1,6 +1,6 @@ // Do not edit this file (e.g. go instead to src/main/asciidoc) -:branch: 2.0.x +:branch: master image::https://badges.gitter.im/Join%20Chat.svg[Gitter, link="https://gitter.im/spring-cloud/spring-cloud-contract?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"] image::https://codecov.io/gh/spring-cloud/spring-cloud-contract/branch/{branch}/graph/badge.svg["codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-contract"] image::https://circleci.com/gh/spring-cloud/spring-cloud-contract.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-contract"] diff --git a/docs/src/main/asciidoc/README.adoc b/docs/src/main/asciidoc/README.adoc index cebcc2184f..c091616c79 100644 --- a/docs/src/main/asciidoc/README.adoc +++ b/docs/src/main/asciidoc/README.adoc @@ -1,4 +1,4 @@ -:branch: 2.0.x +:branch: master image::https://badges.gitter.im/Join%20Chat.svg[Gitter, link="https://gitter.im/spring-cloud/spring-cloud-contract?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"] image::https://codecov.io/gh/spring-cloud/spring-cloud-contract/branch/{branch}/graph/badge.svg["codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-contract"] image::https://circleci.com/gh/spring-cloud/spring-cloud-contract.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-contract"] diff --git a/docs/src/main/asciidoc/spring-cloud-contract.adoc b/docs/src/main/asciidoc/spring-cloud-contract.adoc index b6c600d7fe..a0b79b8813 100644 --- a/docs/src/main/asciidoc/spring-cloud-contract.adoc +++ b/docs/src/main/asciidoc/spring-cloud-contract.adoc @@ -5,7 +5,7 @@ :numbered: :icons: font :sectlinks: true -:branch: 2.0.x +:branch: master = Spring Cloud Contract diff --git a/docs/src/main/asciidoc/verifier_faq.adoc b/docs/src/main/asciidoc/verifier_faq.adoc index b368552a18..974c25c768 100644 --- a/docs/src/main/asciidoc/verifier_faq.adoc +++ b/docs/src/main/asciidoc/verifier_faq.adoc @@ -1,5 +1,5 @@ :introduction_url: https://raw.githubusercontent.com/spring-cloud/spring-cloud-contract/{branch} -:samples_branch: master +:samples_branch: 2.1.x == Spring Cloud Contract FAQ From 9eeb40e2134ad986fbea00849e44988f232b40f2 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 22 Aug 2018 16:35:45 +0200 Subject: [PATCH 72/84] Throws exception when contract can't be serialized fixes gh-704 --- .../verifier/file/ContractFileScanner.groovy | 18 ++++++++---------- .../file/ContractFileScannerSpec.groovy | 8 ++++---- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy index 34d7591a6a..aab6ebeb06 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy @@ -31,6 +31,7 @@ import java.nio.file.FileSystems import java.nio.file.Path import java.nio.file.PathMatcher import java.util.regex.Pattern + /** * Scans the provided file path for the DSLs. There's a possibility to provide * inclusion and exclusion filters. @@ -55,7 +56,7 @@ class ContractFileScanner { private final Set includeMatchers private final String includeMatcher - ContractFileScanner(File baseDir, Set excluded, Set ignored, + ContractFileScanner(File baseDir, Set excluded, Set ignored, Set included = [], String includeMatcher = "") { this.baseDir = baseDir @@ -106,8 +107,8 @@ class ContractFileScanner { boolean excluded = matchesPattern(file, excludeMatchers) if (!excluded) { boolean contractFile = isContractFile(file) - boolean included = includeMatcher ? file.absolutePath.matches(includeMatcher) : true - included = includeMatchers ? matchesPattern(file, includeMatchers) : included + boolean included = includeMatcher ? file.absolutePath.matches(includeMatcher) : true + included = includeMatchers ? matchesPattern(file, includeMatchers) : included if (contractFile && included) { addContractToTestGeneration(result, files, file, i, ContractVerifierDslConverter.convertAsCollection(baseDir, file)) } else if (!contractFile && included) { @@ -131,7 +132,7 @@ class ContractFileScanner { } private void addContractToTestGeneration(List converters, ListMultimap result, - File[] files, File file, int index) { + File[] files, File file, int index) { boolean converted = false if (!file.isDirectory()) { for (ContractConverter converter : converters) { @@ -159,15 +160,12 @@ class ContractFileScanner { try { return converter.convertFrom(file) } catch (Exception e) { - if (log.isDebugEnabled()) { - log.debug("Exception occurred while trying to convert the file", e) - } - return null + throw new IllegalStateException("Failed to convert file [" + file + "]", e) } } private void addContractToTestGeneration(ListMultimap result, File[] files, File file, - int index, Collection convertedContract) { + int index, Collection convertedContract) { Path path = file.toPath() Integer order = null if (hasScenarioFilenamePattern(path)) { @@ -202,7 +200,7 @@ class ContractFileScanner { private boolean isContractFile(File file) { return file.isFile() && getFilenameExtension(file.toString())?.equalsIgnoreCase("groovy") } - + private static String getFilenameExtension(String path) { if (path == null) { return null diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy index 2f0e59df49..2d09bbc5d9 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScannerSpec.groovy @@ -102,11 +102,11 @@ class ContractFileScannerSpec extends Specification { } } when: - ListMultimap result = scanner.findContracts() + scanner.findContracts() then: - result.keySet().size() == 1 - result.entries().every { it.value.convertedContract } - result.entries().find { it.value.convertedContract.any { it.request.method.clientValue == "PUT" } } + IllegalStateException e = thrown(IllegalStateException) + e.cause.message == "boom" + e.message.matches(".*Failed to convert file .*invalid.json.*") } def "should prefer custom yaml converter over standard yaml converter"() { From a0bc2eb1c4218cf960b1ff895aa86e5c9804bf5c Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 23 Aug 2018 13:30:56 +0200 Subject: [PATCH 73/84] Deprecating skipSnapshotCheck and providing fake m2 for Aether without this change Aether, when having both local and remote JARs, always picks the local one, even though we don't want it to. There seems to be no way to change it via an API. We had a check in Spring Cloud Contract to throw an exception when we wanted a remote JAR but the local one was fetched. You could have changed it by providing a system property or a plugin property called `skipSnapshotCheck` or `contractsSkipSnapshotCheck` with this change we're deprecating that flag since we're moving this logic to the internals of how we integrate with Aether. If the problem was that there was both the local and the remote JAR, what we could do is get rid of the local JAR. Obviously we don't want to remove it so what we're doing is when someone provides the REMOTE stub mode, we're creating a temporary directory and we're temporarily pointing Aether to that directory as our local m2. Since it's empty, Aether will not assume that we have any stubs stored locally. Thus, we will never have conflicts of remote vs local jars. fixes gh-643 additional links: - http://maven.40175.n5.nabble.com/Resolving-an-Artifact-from-Remote-Repository-instead-of-Local-td5875134.html - https://stackoverflow.com/questions/9123004/maven-is-it-possible-to-override-location-of-local-repository-via-the-use-of-co --- .../gradle/wrapper/gradle-wrapper.properties | 2 +- docs/src/main/asciidoc/verifier_setup.adoc | 25 ---- .../contract/stubrunner/AetherFactories.java | 52 ++++++-- .../stubrunner/AetherStubDownloader.java | 41 ++---- .../stubrunner/StubRunnerOptions.java | 19 +-- .../stubrunner/StubRunnerOptionsBuilder.java | 13 +- .../stubrunner/junit/StubRunnerRule.java | 5 - .../junit/StubRunnerRuleOptions.java | 6 - .../spring/AutoConfigureStubRunner.java | 6 - .../spring/StubRunnerConfiguration.java | 1 - .../spring/StubRunnerProperties.java | 15 --- .../AetherStubDownloaderSpec.groovy | 120 +++--------------- .../StubRunnerOptionsBuilderSpec.groovy | 7 +- .../plugin/ContractVerifierExtension.groovy | 3 + .../plugin/GradleContractsDownloader.groovy | 1 - .../contract/maven/verifier/ConvertMojo.java | 5 +- .../maven/verifier/GenerateTestsMojo.java | 5 +- .../verifier/MavenContractsDownloader.java | 7 +- 18 files changed, 92 insertions(+), 241 deletions(-) diff --git a/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties b/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties index 949819d28a..2c2bbe5f9a 100644 --- a/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties +++ b/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip diff --git a/docs/src/main/asciidoc/verifier_setup.adoc b/docs/src/main/asciidoc/verifier_setup.adoc index ec5394fcad..d755b539ee 100644 --- a/docs/src/main/asciidoc/verifier_setup.adoc +++ b/docs/src/main/asciidoc/verifier_setup.adoc @@ -261,8 +261,6 @@ closure to set it up. separated. Otherwise, it scans contracts under the provided directory. * *contractsMode*: Specifies the mode of downloading contracts (whether the JAR is available offline, remotely etc.) -* *contractsSnapshotCheckSkip*: If set to `true` will not assert whether the -downloaded stubs / contract JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact). * *deleteStubsAfterTest*: If set to `false` will not remove any downloaded contracts from temporary directories @@ -610,8 +608,6 @@ the following options: * *contractsPath*: The path to the concrete contracts in the JAR with packaged contracts. Defaults to `groupid/artifactid` where `gropuid` is slash separated. * *contractsMode*: Picks the mode in which stubs will be found and registered -* *contractsSnapshotCheckSkip*: If `true` then will not assert whether a stub / contract -JAR was downloaded from local or remote location * *deleteStubsAfterTest*: If set to `false` will not remove any downloaded contracts from temporary directories * *contractsRepositoryUrl*: URL to a repo with the artifacts that have contracts. If it is not provided, @@ -945,27 +941,6 @@ For example, you might decide to have no dependencies at all. As a consumer, if you add the stub dependency to your classpath, you can explicitly exclude the unwanted dependencies. -=== CI Server setup - -When fetching stubs / contracts in a CI, shared environment, what might happen is that -both the producer and the consumer reuse the same local Maven repository. Due to this, -the framework, responsible for downloading a stub JAR from remote location, -can't decide which JAR should be picked, local or remote one. That caused -the `"The artifact was found in the local repository but you have explicitly -stated that it should be downloaded from a remote one"` exception -and failed the build. - -For such cases we're introducing the property and plugin setup mechanism: - -- via `stubrunner.snapshot-check-skip` system property -- via `STUBRUNNER_SNAPSHOT_CHECK_SKIP` environment variable - -if either of these values is set to `true`, then the stub downloader will not -verify the origin of the downloaded JAR. - -For the plugins you need to set the `contractsSnapshotCheckSkip` property -to `true`. - === Scenarios You can handle scenarios with Spring Cloud Contract Verifier. All you need to do is to diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/AetherFactories.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/AetherFactories.java index aa9245c334..39f5707026 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/AetherFactories.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/AetherFactories.java @@ -17,7 +17,12 @@ package org.springframework.cloud.contract.stubrunner; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Random; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.RepositorySystemSession; @@ -41,10 +46,14 @@ import shaded.org.eclipse.aether.transport.http.HttpTransporterFactory; class AetherFactories { + private static final Log log = LogFactory.getLog(AetherFactories.class); + private static final String MAVEN_LOCAL_REPOSITORY_LOCATION = "maven.repo.local"; private static final String MAVEN_USER_SETTINGS_LOCATION = "org.apache.maven.user-settings"; private static final String MAVEN_GLOBAL_SETTINGS_LOCATION = "org.apache.maven.global-settings"; + private static final Random RANDOM = new Random(); + public static RepositorySystem newRepositorySystem() { DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); @@ -60,14 +69,34 @@ class AetherFactories { session.setUpdatePolicy(RepositoryPolicy.UPDATE_POLICY_ALWAYS); } session.setChecksumPolicy(RepositoryPolicy.CHECKSUM_POLICY_WARN); - LocalRepository localRepo = new LocalRepository(localRepositoryDirectory()); + String localRepositoryDirectory = localRepositoryDirectory(workOffline); + if (log.isDebugEnabled()) { + log.debug("Local Repository Directory set to [" + localRepositoryDirectory + "]. Work offline: [" + workOffline + "]"); + } + LocalRepository localRepo = new LocalRepository(localRepositoryDirectory); session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo)); return session; } - private static String localRepositoryDirectory() { + protected static String localRepositoryDirectory(boolean workOffline) { String localRepoLocationFromSettings = settings().getLocalRepository(); - return readPropertyFromSystemProps(localRepoLocationFromSettings); + String currentLocalRepo = readPropertyFromSystemProps(localRepoLocationFromSettings); + if (workOffline) { + return currentLocalRepo; + } + return temporaryDirectory(); + } + + private static String temporaryDirectory() { + try { + return Files.createTempDirectory("aether-local").toString(); + } + catch (IOException e) { + if (log.isDebugEnabled()) { + log.debug("Failed to create a new temporary directory, will generate a new one under temp dir"); + } + return System.getProperty("java.io.tmpdir") + File.separator + RANDOM.nextInt(); + } } private static String readPropertyFromSystemProps( @@ -87,16 +116,19 @@ class AetherFactories { return System.getenv(prop); } + private static File userSettings() { + String user = fromSystemPropOrEnv(MAVEN_USER_SETTINGS_LOCATION); + if (user == null) { + return new File(new File(System.getProperty("user.home")).getAbsoluteFile(), + File.separator + ".m2" + File.separator + "settings.xml"); + } + return new File(user); + } + private static Settings settings() { SettingsBuilder builder = new DefaultSettingsBuilderFactory().newInstance(); SettingsBuildingRequest request = new DefaultSettingsBuildingRequest(); - String user = fromSystemPropOrEnv(MAVEN_USER_SETTINGS_LOCATION); - if (user == null) { - request.setUserSettingsFile(new File(new File(System.getProperty("user.home")).getAbsoluteFile(), - File.separator + ".m2" + File.separator + "settings.xml")); - } else { - request.setUserSettingsFile(new File(user)); - } + request.setUserSettingsFile(userSettings()); String global = fromSystemPropOrEnv(MAVEN_GLOBAL_SETTINGS_LOCATION); if (global != null) { request.setGlobalSettingsFile(new File(global)); diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/AetherStubDownloader.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/AetherStubDownloader.java index 2206af6d9b..fef67e6742 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/AetherStubDownloader.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/AetherStubDownloader.java @@ -57,7 +57,6 @@ public class AetherStubDownloader implements StubDownloader { private static final String ARTIFACT_EXTENSION = "jar"; private static final String LATEST_ARTIFACT_VERSION = "(,]"; private static final String LATEST_VERSION_IN_IVY = "+"; - private static final String STUBRUNNER_SNAPSHOT_CHECK_SKIP_SYSTEM_PROP = "stubrunner.snapshot-check-skip"; // Preloading class for the shutdown hook not to throw ClassNotFound private static final Class CLAZZ = TemporaryFileStorage.class; @@ -65,7 +64,6 @@ public class AetherStubDownloader implements StubDownloader { private final RepositorySystem repositorySystem; private final RepositorySystemSession session; private final boolean workOffline; - private final boolean snapshotCheckSkip; private final boolean deleteStubsAfterTest; public AetherStubDownloader(StubRunnerOptions stubRunnerOptions) { @@ -92,8 +90,6 @@ public class AetherStubDownloader implements StubDownloader { this.repositorySystem = newRepositorySystem(); this.workOffline = stubRunnerOptions.stubsMode == StubRunnerProperties.StubsMode.LOCAL; this.session = newSession(this.repositorySystem, this.workOffline); - this.snapshotCheckSkip = - stubRunnerOptions.isSnapshotCheckSkip() || skipSnapshotCheck(); registerShutdownHook(); } @@ -118,7 +114,6 @@ public class AetherStubDownloader implements StubDownloader { log.error("Remote repositories for stubs are not specified and work offline flag wasn't passed"); } this.workOffline = false; - this.snapshotCheckSkip = skipSnapshotCheck(); registerShutdownHook(); } @@ -150,28 +145,24 @@ public class AetherStubDownloader implements StubDownloader { private File unpackedJar(String resolvedVersion, String stubsGroup, String stubsModule, String classifier) { - log.info("Resolved version is [" + resolvedVersion + "]"); - if (StringUtils.isEmpty(resolvedVersion)) { - log.warn("Stub for group [" + stubsGroup + "] module [" + stubsModule - + "] and classifier [" + classifier + "] not found in " - + this.remoteRepos); - return null; - } - Artifact artifact = new DefaultArtifact(stubsGroup, stubsModule, classifier, - ARTIFACT_EXTENSION, resolvedVersion); - ArtifactRequest request = new ArtifactRequest(artifact, this.remoteRepos, null); - if (log.isDebugEnabled()) { - log.debug("Resolving artifact [" + artifact - + "] using remote repositories " + this.remoteRepos); - } try { + log.info("Resolved version is [" + resolvedVersion + "]"); + if (StringUtils.isEmpty(resolvedVersion)) { + log.warn("Stub for group [" + stubsGroup + "] module [" + stubsModule + + "] and classifier [" + classifier + "] not found in " + + this.remoteRepos); + return null; + } + Artifact artifact = new DefaultArtifact(stubsGroup, stubsModule, classifier, + ARTIFACT_EXTENSION, resolvedVersion); + ArtifactRequest request = new ArtifactRequest(artifact, this.remoteRepos, null); + if (log.isDebugEnabled()) { + log.debug("Resolving artifact [" + artifact + + "] using remote repositories " + this.remoteRepos); + } ArtifactResult result = this.repositorySystem.resolveArtifact(this.session, request); log.info("Resolved artifact [" + artifact + "] to " + result.getArtifact().getFile()); - if (!this.snapshotCheckSkip && resolvedFromLocalRepo(result) && shouldDownloadFromRemote()) { - throw new IllegalStateException("The artifact was found in the local repository " - + "but you have explicitly stated that it should be downloaded from a remote one"); - } File temporaryFile = unpackStubJarToATemporaryFolder( result.getArtifact().getFile().toURI()); log.info("Unpacked file to [" + temporaryFile + "]"); @@ -189,10 +180,6 @@ public class AetherStubDownloader implements StubDownloader { } } - private boolean skipSnapshotCheck() { - return StubRunnerPropertyUtils.isPropertySet(STUBRUNNER_SNAPSHOT_CHECK_SKIP_SYSTEM_PROP); - } - private boolean resolvedFromLocalRepo(ArtifactResult result) { return result.getRepository() instanceof LocalRepository; } diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerOptions.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerOptions.java index eb8511445f..b7569140f5 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerOptions.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerOptions.java @@ -101,12 +101,6 @@ public class StubRunnerOptions { final StubRunnerProperties.StubsMode stubsMode; - /** - * If set to {@code true} will not assert whether the downloaded stubs / contract - * JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact) - */ - private boolean snapshotCheckSkip; - /** * If set to {@code false} will NOT delete stubs from a temporary * folder after running tests @@ -118,13 +112,12 @@ public class StubRunnerOptions { */ private Map properties = new HashMap<>(); - StubRunnerOptions(Integer minPortValue, Integer maxPortValue, Resource stubRepositoryRoot, StubRunnerProperties.StubsMode stubsMode, String stubsClassifier, Collection dependencies, Map stubIdsToPortMapping, String username, String password, final StubRunnerProxyOptions stubRunnerProxyOptions, - boolean stubsPerConsumer, String consumerName, String mappingsOutputFolder, boolean snapshotCheckSkip, + boolean stubsPerConsumer, String consumerName, String mappingsOutputFolder, boolean deleteStubsAfterTest, Map properties) { this.minPortValue = minPortValue; this.maxPortValue = maxPortValue; @@ -139,7 +132,6 @@ public class StubRunnerOptions { this.stubsPerConsumer = stubsPerConsumer; this.consumerName = consumerName; this.mappingsOutputFolder = mappingsOutputFolder; - this.snapshotCheckSkip = snapshotCheckSkip; this.deleteStubsAfterTest = deleteStubsAfterTest; this.properties = properties; } @@ -167,7 +159,6 @@ public class StubRunnerOptions { .withStubPerConsumer(Boolean.parseBoolean(System.getProperty("stubrunner.stubs-per-consumer", "false"))) .withConsumerName(System.getProperty("stubrunner.consumer-name")) .withMappingsOutputFolder(System.getProperty("stubrunner.mappings-output-folder")) - .withSnapshotCheckSkip(Boolean.parseBoolean(System.getProperty("stubrunner.snapshot-check-skip", "false"))) .withDeleteStubsAfterTest(Boolean.parseBoolean(System.getProperty("stubrunner.delete-stubs-after-test", "true"))) .withProperties(stubRunnerProps()); String proxyHost = System.getProperty("stubrunner.proxy.host"); @@ -277,14 +268,6 @@ public class StubRunnerOptions { this.mappingsOutputFolder = mappingsOutputFolder; } - public boolean isSnapshotCheckSkip() { - return this.snapshotCheckSkip; - } - - public void setSnapshotCheckSkip(boolean snapshotCheckSkip) { - this.snapshotCheckSkip = snapshotCheckSkip; - } - public boolean isDeleteStubsAfterTest() { return this.deleteStubsAfterTest; } diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerOptionsBuilder.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerOptionsBuilder.java index 8c03973b01..5d60221106 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerOptionsBuilder.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerOptionsBuilder.java @@ -48,7 +48,6 @@ public class StubRunnerOptionsBuilder { private String consumerName; private String mappingsOutputFolder; private StubRunnerProperties.StubsMode stubsMode; - private boolean snapshotCheckSkip = false; private boolean deleteStubsAfterTest = true; private Map properties = new HashMap<>(); @@ -133,10 +132,9 @@ public class StubRunnerOptionsBuilder { this.consumerName = options.getConsumerName(); this.mappingsOutputFolder = options.getMappingsOutputFolder(); this.stubConfigurations = options.dependencies != null ? - options.dependencies : new ArrayList(); + options.dependencies : new ArrayList<>(); this.stubIdsToPortMapping = options.stubIdsToPortMapping != null ? - options.stubIdsToPortMapping : new LinkedHashMap(); - this.snapshotCheckSkip = options.isSnapshotCheckSkip(); + options.stubIdsToPortMapping : new LinkedHashMap<>(); this.deleteStubsAfterTest = options.isDeleteStubsAfterTest(); this.properties = options.getProperties(); return this; @@ -147,11 +145,6 @@ public class StubRunnerOptionsBuilder { return this; } - public StubRunnerOptionsBuilder withSnapshotCheckSkip(boolean snapshotCheckSkip) { - this.snapshotCheckSkip = snapshotCheckSkip; - return this; - } - public StubRunnerOptionsBuilder withDeleteStubsAfterTest(boolean deleteStubsAfterTest) { this.deleteStubsAfterTest = deleteStubsAfterTest; return this; @@ -166,7 +159,7 @@ public class StubRunnerOptionsBuilder { return new StubRunnerOptions(this.minPortValue, this.maxPortValue, this.stubRepositoryRoot, this.stubsMode, this.stubsClassifier, buildDependencies(), this.stubIdsToPortMapping, this.username, this.password, this.stubRunnerProxyOptions, this.stubsPerConsumer, this.consumerName, - this.mappingsOutputFolder, this.snapshotCheckSkip, this.deleteStubsAfterTest, this.properties); + this.mappingsOutputFolder, this.deleteStubsAfterTest, this.properties); } private Collection buildDependencies() { diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/junit/StubRunnerRule.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/junit/StubRunnerRule.java index eb62e0bcde..6e440b3537 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/junit/StubRunnerRule.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/junit/StubRunnerRule.java @@ -154,11 +154,6 @@ public class StubRunnerRule implements TestRule, StubFinder, StubRunnerRuleOptio return this.delegate; } - @Override public StubRunnerRule withSnapshotCheckSkip(boolean snapshotCheckSkip) { - builder().withSnapshotCheckSkip(snapshotCheckSkip); - return this.delegate; - } - @Override public StubRunnerRule withDeleteStubsAfterTest( boolean deleteStubsAfterTest) { builder().withDeleteStubsAfterTest(deleteStubsAfterTest); diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/junit/StubRunnerRuleOptions.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/junit/StubRunnerRuleOptions.java index 90bc1fecc7..4981ca334d 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/junit/StubRunnerRuleOptions.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/junit/StubRunnerRuleOptions.java @@ -95,12 +95,6 @@ interface StubRunnerRuleOptions { */ StubRunnerRule withMappingsOutputFolder(String mappingsOutputFolder); - /** - * If set to {@code true} will not assert whether the downloaded stubs / contract - * JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact) - */ - StubRunnerRule withSnapshotCheckSkip(boolean snapshotCheckSkip); - /** * If set to {@code false} will NOT delete stubs from a temporary * folder after running tests diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/AutoConfigureStubRunner.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/AutoConfigureStubRunner.java index 6ea080971e..c5aba14dd0 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/AutoConfigureStubRunner.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/AutoConfigureStubRunner.java @@ -109,12 +109,6 @@ public @interface AutoConfigureStubRunner { */ StubRunnerProperties.StubsMode stubsMode() default StubRunnerProperties.StubsMode.CLASSPATH; - /** - * If set to {@code true} will not assert whether the downloaded stubs / contract - * JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact) - */ - boolean snapshotCheckSkip() default false; - /** * Properties in form {@literal key=value} * @return the properties to add diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfiguration.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfiguration.java index 0fe7249658..af6db728e1 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfiguration.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfiguration.java @@ -94,7 +94,6 @@ public class StubRunnerConfiguration { .withStubPerConsumer(this.props.isStubsPerConsumer()) .withConsumerName(consumerName()) .withMappingsOutputFolder(this.props.getMappingsOutputFolder()) - .withSnapshotCheckSkip(this.props.isSnapshotCheckSkip()) .withDeleteStubsAfterTest(this.props.isDeleteStubsAfterTest()) .withProperties(this.props.getProperties()); } diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerProperties.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerProperties.java index 9b6fcc6146..926ad8486a 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerProperties.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerProperties.java @@ -99,12 +99,6 @@ public class StubRunnerProperties { */ private StubsMode stubsMode; - /** - * If set to {@code true} will not assert whether the downloaded stubs / contract - * JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact) - */ - private boolean snapshotCheckSkip; - /** * If set to {@code false} will NOT delete stubs from a temporary * folder after running tests @@ -241,14 +235,6 @@ public class StubRunnerProperties { this.stubsMode = stubsMode; } - public boolean isSnapshotCheckSkip() { - return this.snapshotCheckSkip; - } - - public void setSnapshotCheckSkip(boolean snapshotCheckSkip) { - this.snapshotCheckSkip = snapshotCheckSkip; - } - public boolean isDeleteStubsAfterTest() { return this.deleteStubsAfterTest; } @@ -278,7 +264,6 @@ public class StubRunnerProperties { + ", ids=" + Arrays.toString(this.ids) + ", classifier='" + this.classifier + '\'' + ", setStubsPerConsumer='" + this.stubsPerConsumer + "', consumerName='" + this.consumerName + '\'' + ", stubsMode='" + this.stubsMode + '\'' - + ", snapshotCheckSkip='" + this.snapshotCheckSkip + '\'' + ", size of properties=" + this.properties.size() + '}'; } diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/AetherStubDownloaderSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/AetherStubDownloaderSpec.groovy index f98d130ac9..ccd7e8707d 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/AetherStubDownloaderSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/AetherStubDownloaderSpec.groovy @@ -3,6 +3,8 @@ package org.springframework.cloud.contract.stubrunner import io.specto.hoverfly.junit.HoverflyRule import org.eclipse.aether.RepositorySystemSession import org.junit.Rule +import org.junit.rules.TemporaryFolder + import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties import org.springframework.util.ResourceUtils import spock.lang.Specification @@ -13,7 +15,10 @@ class AetherStubDownloaderSpec extends Specification { @Rule HoverflyRule hoverflyRule = HoverflyRule.inSimulationMode("simulation.json") - def 'Should throw an exception when artifact not found'() { + @Rule + TemporaryFolder folder = new TemporaryFolder() + + def 'should throw an exception when artifact not found in local m2'() { given: StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder() .withStubsMode(StubRunnerProperties.StubsMode.LOCAL) @@ -22,126 +27,33 @@ class AetherStubDownloaderSpec extends Specification { AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions) when: - def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("non.existing.group", "missing-artifact-id", "1.0-SNAPSHOT")) + aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("non.existing.group", "missing-artifact-id", "1.0-SNAPSHOT")) then: IllegalStateException e = thrown(IllegalStateException) e.message.contains("Exception occurred while trying to download a stub for group") } - def 'Should throw an exception when a jar is in local m2 and not in remote repo'() { + def 'should throw an exception when local m2 gets replaced with a temp dir and a jar is not found in remote'() { given: StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder() .withStubsMode(StubRunnerProperties.StubsMode.REMOTE) - .withStubRepositoryRoot("https://test.jfrog.io/test/libs-snapshot-local") + .withStubRepositoryRoot("file://" + folder.newFolder().absolutePath) .build() - - AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions) - - when: - def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", "")) - - then: - IllegalStateException e = thrown(IllegalStateException) - e.message.contains("The artifact was found in the local repository but you have explicitly stated that it should be downloaded from a remote one") - } - - @RestoreSystemProperties - def 'Should not throw an exception when a jar is in local m2 and not in remote repo and system property disabled snapshot check'() { - given: - StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder() - .withStubsMode(StubRunnerProperties.StubsMode.REMOTE) - .withStubRepositoryRoot("https://test.jfrog.io/test/libs-snapshot-local") - .build() - System.properties.setProperty("stubrunner.snapshot-check-skip", "true") + and: + String localRepo = AetherFactories.localRepositoryDirectory(true) + new File(localRepo, "org/springframework/cloud/spring-cloud-contract-spec" + .replaceAll("/", File.separator)).list().size() > 0 and: AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions) when: - def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", "")) + aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", "")) then: - jar != null - } - - @RestoreSystemProperties - def 'Should throw an exception when a jar is in local m2 and not in remote repo and system property disabled takes precedence over env'() { - given: - StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder() - .withStubsMode(StubRunnerProperties.StubsMode.REMOTE) - .withStubRepositoryRoot("https://test.jfrog.io/test/libs-snapshot-local") - .build() - System.properties.setProperty("stubrunner.snapshot-check-skip", "false") - - and: - StubRunnerPropertyUtils.FETCHER = new PropertyFetcher() { - @Override - String systemProp(String prop) { - return super.systemProp(prop) - } - - @Override - String envVar(String prop) { - return "true" - } - } - AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions) - - when: - def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", "")) - - then: - IllegalStateException e = thrown(IllegalStateException) - e.message.contains("The artifact was found in the local repository but you have explicitly stated that it should be downloaded from a remote one") - } - - def 'Should not throw an exception when a jar is in local m2 and not in remote repo and env property disabled snapshot check'() { - given: - StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder() - .withStubsMode(StubRunnerProperties.StubsMode.REMOTE) - .withStubRepositoryRoot("https://test.jfrog.io/test/libs-snapshot-local") - .build() - - and: - StubRunnerPropertyUtils.FETCHER = new PropertyFetcher() { - @Override - String systemProp(String prop) { - return super.systemProp(prop) - } - - @Override - String envVar(String prop) { - return "true" - } - } - AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions) - - when: - def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", "")) - - then: - jar != null - - cleanup: - StubRunnerPropertyUtils.FETCHER = new PropertyFetcher() - } - - def 'Should not throw an exception when a jar is in local m2 and not in remote repo and option disabled snapshot check'() { - given: - StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder() - .withStubsMode(StubRunnerProperties.StubsMode.REMOTE) - .withStubRepositoryRoot("https://test.jfrog.io/test/libs-snapshot-local") - .withSnapshotCheckSkip(true) - .build() - - AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions) - - when: - def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", "")) - - then: - jar != null + IllegalArgumentException e = thrown(IllegalArgumentException) + e.message.contains("Could not find metadata org.springframework.cloud:spring-cloud-contract-spec/maven-metadata.xml in remote0") } @RestoreSystemProperties diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/StubRunnerOptionsBuilderSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/StubRunnerOptionsBuilderSpec.groovy index 63493ca351..bc5f79f859 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/StubRunnerOptionsBuilderSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/StubRunnerOptionsBuilderSpec.groovy @@ -231,7 +231,7 @@ class StubRunnerOptionsBuilderSpec extends Specification { given: StubRunnerOptionsBuilder builder = builder.withOptions(new StubRunnerOptions(1, 2, new FileSystemResource("root"), StubRunnerProperties.StubsMode.LOCAL, "classifier", [new StubConfiguration("a:b:c")], [(new StubConfiguration("a:b:c")): 3], "foo", "bar", - new StubRunnerOptions.StubRunnerProxyOptions("host", 4), true, "consumer", "folder", true, false, [foo: "bar"])) + new StubRunnerOptions.StubRunnerProxyOptions("host", 4), true, "consumer", "folder", false, [foo: "bar"])) builder.withStubs("foo:bar:baz") when: StubRunnerOptions options = builder.build() @@ -250,7 +250,6 @@ class StubRunnerOptionsBuilderSpec extends Specification { options.stubsPerConsumer == true options.consumerName == "consumer" options.mappingsOutputFolder == "folder" - options.snapshotCheckSkip == true options.deleteStubsAfterTest == false options.properties == [foo: "bar"] } @@ -260,7 +259,7 @@ class StubRunnerOptionsBuilderSpec extends Specification { StubRunnerOptionsBuilder builder = builder.withOptions(new StubRunnerOptions(1, 2, new FileSystemResource("root"), StubRunnerProperties.StubsMode.CLASSPATH, "classifier", [new StubConfiguration("a:b:c")], [(new StubConfiguration("a:b:c")): 3], "username123", "password123", - new StubRunnerOptions.StubRunnerProxyOptions("host", 4), true, "consumer", "folder", true, false, [:])) + new StubRunnerOptions.StubRunnerProxyOptions("host", 4), true, "consumer", "folder", false, [:])) builder.withStubs("foo:bar:baz") when: String options = builder.build().toString() @@ -287,7 +286,6 @@ class StubRunnerOptionsBuilderSpec extends Specification { System.setProperty("stubrunner.proxy.host", "host") System.setProperty("stubrunner.proxy.port", "4") System.setProperty("stubrunner.mappings-output-folder", "folder") - System.setProperty("stubrunner.snapshot-check-skip", "true") System.setProperty("stubrunner.properties.foo-bar", "bar") System.setProperty("stubrunner.properties.foo-baz", "baz") System.setProperty("stubrunner.properties.bar.bar", "foo") @@ -307,7 +305,6 @@ class StubRunnerOptionsBuilderSpec extends Specification { options.stubsPerConsumer == true options.consumerName == "consumer" options.mappingsOutputFolder == "folder" - options.snapshotCheckSkip == true options.properties == ["foo-bar": "bar", "foo-baz": "baz", "bar.bar": "foo"] } } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/ContractVerifierExtension.groovy b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/ContractVerifierExtension.groovy index 5cabf8516e..3554305263 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/ContractVerifierExtension.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/ContractVerifierExtension.groovy @@ -175,7 +175,10 @@ class ContractVerifierExtension { /** * If set to {@code true} will not assert whether the downloaded stubs / contract * JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact) + * + * @deprecated - with 2.1.0 this option is redundant */ + @Deprecated boolean contractsSnapshotCheckSkip = false /** diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/GradleContractsDownloader.groovy b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/GradleContractsDownloader.groovy index 527f5ece93..29c3efc7a9 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/GradleContractsDownloader.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/GradleContractsDownloader.groovy @@ -86,7 +86,6 @@ class GradleContractsDownloader { .withStubsMode(extension.contractsMode) .withUsername(extension.contractRepository.username) .withPassword(extension.contractRepository.password) - .withSnapshotCheckSkip(extension.contractsSnapshotCheckSkip) .withDeleteStubsAfterTest(extension.deleteStubsAfterTest) .withProperties(extension.contractsProperties) if (extension.contractRepository.proxyPort) { diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/ConvertMojo.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/ConvertMojo.java index 639953ba16..1328801a79 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/ConvertMojo.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/ConvertMojo.java @@ -145,8 +145,11 @@ public class ConvertMojo extends AbstractMojo { /** * If {@code true} then will not assert whether a stub / contract * JAR was downloaded from local or remote location + * + * @deprecated - with 2.1.0 this option is redundant */ @Parameter(property = "contractsSnapshotCheckSkip", defaultValue = "false") + @Deprecated private boolean contractsSnapshotCheckSkip; @@ -230,7 +233,7 @@ public class ConvertMojo extends AbstractMojo { this.contractsPath, this.contractsRepositoryUrl, this.contractsMode, getLog(), this.contractsRepositoryUsername, this.contractsRepositoryPassword, this.contractsRepositoryProxyHost, this.contractsRepositoryProxyPort, - this.contractsSnapshotCheckSkip, this.deleteStubsAfterTest, this.contractsProperties) + this.deleteStubsAfterTest, this.contractsProperties) .downloadAndUnpackContractsIfRequired(config, this.contractsDirectory); } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java index 306bb604aa..99cd483dbc 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateTestsMojo.java @@ -207,8 +207,11 @@ public class GenerateTestsMojo extends AbstractMojo { /** * If {@code true} then will not assert whether a stub / contract * JAR was downloaded from local or remote location + * + * @deprecated - with 2.1.0 this option is redundant */ @Parameter(property = "contractsSnapshotCheckSkip", defaultValue = "false") + @Deprecated private boolean contractsSnapshotCheckSkip; /** @@ -246,7 +249,7 @@ public class GenerateTestsMojo extends AbstractMojo { this.contractsPath, this.contractsRepositoryUrl, this.contractsMode, getLog(), this.contractsRepositoryUsername, this.contractsRepositoryPassword, this.contractsRepositoryProxyHost, this.contractsRepositoryProxyPort, - this.contractsSnapshotCheckSkip, this.deleteStubsAfterTest, this.contractsProperties).downloadAndUnpackContractsIfRequired(config, this.contractsDirectory); + this.deleteStubsAfterTest, this.contractsProperties).downloadAndUnpackContractsIfRequired(config, this.contractsDirectory); getLog().info("Directory with contract is present at [" + contractsDirectory + "]"); setupConfig(config, contractsDirectory); this.project.addTestCompileSourceRoot(this.generatedTestSourcesDir.getAbsolutePath()); diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/MavenContractsDownloader.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/MavenContractsDownloader.java index 338ba8b5ab..bd1027495a 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/MavenContractsDownloader.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/MavenContractsDownloader.java @@ -54,7 +54,6 @@ class MavenContractsDownloader { private final String repositoryPassword; private final String repositoryProxyHost; private final Integer repositoryProxyPort; - private final boolean contractsSnapshotCheckSkip; private final boolean deleteStubsAfterTest; private final Map contractsProperties; @@ -62,8 +61,8 @@ class MavenContractsDownloader { String contractsPath, String contractsRepositoryUrl, StubRunnerProperties.StubsMode stubsMode, Log log, String repositoryUsername, String repositoryPassword, String repositoryProxyHost, - Integer repositoryProxyPort, boolean contractsSnapshotCheckSkip, - boolean deleteStubsAfterTest, Map contractsProperties) { + Integer repositoryProxyPort, boolean deleteStubsAfterTest, + Map contractsProperties) { this.project = project; this.contractDependency = contractDependency; this.contractsPath = contractsPath; @@ -75,7 +74,6 @@ class MavenContractsDownloader { this.repositoryProxyHost = repositoryProxyHost; this.repositoryProxyPort = repositoryProxyPort; this.stubDownloaderBuilderProvider = new StubDownloaderBuilderProvider(); - this.contractsSnapshotCheckSkip = contractsSnapshotCheckSkip; this.deleteStubsAfterTest = deleteStubsAfterTest; this.contractsProperties = contractsProperties; } @@ -122,7 +120,6 @@ class MavenContractsDownloader { .withStubsMode(this.stubsMode) .withUsername(this.repositoryUsername) .withPassword(this.repositoryPassword) - .withSnapshotCheckSkip(this.contractsSnapshotCheckSkip) .withDeleteStubsAfterTest(this.deleteStubsAfterTest) .withProperties(this.contractsProperties); if (StringUtils.hasText(this.contractsRepositoryUrl)) { From debea6edfdf2a30d73f168f2a06ce01bd90e582b Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 24 Aug 2018 15:10:55 +0200 Subject: [PATCH 74/84] Migrated to default WireMock helper methods; fixes gh-540 --- .../contract/spec/ContractTemplate.groovy | 89 -------- .../cloud/contract/spec/ContractTemplate.java | 204 ++++++++++++++++++ .../internal/CompositeContractTemplate.groovy | 155 +++++++++++++ .../CustomHandlebarsContractTemplate.groovy | 94 ++++++++ .../contract/spec/internal/FromRequest.groovy | 97 ++++++++- .../HandlebarsContractTemplate.groovy | 65 +++++- .../verifier/builder/MethodBodyBuilder.groovy | 12 +- .../TestSideRequestTemplateModel.groovy | 15 +- .../handlebars/HandlebarsEscapeHelper.groovy | 2 +- .../HandlebarsJsonPathHelper.groovy | 48 ++++- .../wiremock/BaseWireMockStubStrategy.groovy | 5 +- .../HandlebarsTemplateProcessor.groovy | 56 +++-- .../template/TemplateProcessor.groovy | 4 +- .../MockMvcMethodBodyBuilderSpec.groovy | 29 ++- .../verifier/dsl/WireMockGroovyDslSpec.groovy | 114 ++++++++-- 15 files changed, 827 insertions(+), 162 deletions(-) delete mode 100644 spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/ContractTemplate.groovy create mode 100644 spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/ContractTemplate.java create mode 100644 spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/CompositeContractTemplate.groovy create mode 100644 spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/CustomHandlebarsContractTemplate.groovy diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/ContractTemplate.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/ContractTemplate.groovy deleted file mode 100644 index 47aa1c269c..0000000000 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/ContractTemplate.groovy +++ /dev/null @@ -1,89 +0,0 @@ -package org.springframework.cloud.contract.spec - -/** - * Contract for defining templated responses. - * - * If no implementation is provided then Handlebars will be picked as a default implementation. - * - * @author Marcin Grzejszczak - * @since 1.1.0 - */ -interface ContractTemplate { - - /** - * Handlebars is using the Mustache template thus it looks like this - * {{{ Mustache }}}. In this case the opening template would return {{{ - */ - String openingTemplate() - - /** - * Handlebars is using the Mustache template thus it looks like this - * {{{ Mustache }}}. In this case the closing template would return }}} - */ - String closingTemplate() - - /** - * Returns the template for retrieving a URL path and query from request - */ - String url() - - /** - * Returns the template for retrieving first value of a query parameter e.g. {{{ request.query.search }}} - * @param key - */ - String query(String key) - - /** - * Returns the template for retrieving nth value of a query parameter (zero indexed) e.g. {{{ request.query.search.[5] }}} - * @param key - * @param index - */ - String query(String key, int index) - - /** - * Returns the template for retrieving a URL path - */ - String path() - - /** - * Returns the template for retrieving nth value of a URL path (zero indexed) e.g. {{{ request.path.[2] }}} - * @param index - */ - String path(int index) - - /** - * Returns the template for retrieving the first value of a request header e.g. {{{ request.headers.X-Request-Id }}} - * @param key - */ - String header(String key) - - /** - * Returns the template for retrieving the nth value of a request header (zero indexed) e.g. {{{ request.headers.X-Request-Id.[5] }}} - * @param key - * @param index - */ - String header(String key, int index) - - /** - * Retruns the tempalte for retrieving the first value of a cookie with certain key - * @param key - */ - String cookie(String key) - - /** - * Request body text (avoid for non-text bodies) e.g. {{{ request.body }}} . The body will not be escaped - * so you won't be able to directly embed it in a JSON for example. - */ - String body() - - /** - * Request body text (avoid for non-text bodies) e.g. {{{ escapejsonbody }}} . The body will not be escaped - * so you will be able to embed it - */ - String escapedBody() - - /** - * Request body text for the given JsonPath. e.g. {{{ jsonpath this '$.a.b.c' }}} - */ - String body(String jsonPath) -} \ No newline at end of file diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/ContractTemplate.java b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/ContractTemplate.java new file mode 100644 index 0000000000..bafcec195b --- /dev/null +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/ContractTemplate.java @@ -0,0 +1,204 @@ +package org.springframework.cloud.contract.spec; + +/** + * Contract for defining templated responses. + *

+ * If no implementation is provided then Handlebars will be picked as a default implementation. + * + * @author Marcin Grzejszczak + * @since 1.1.0 + */ +public interface ContractTemplate { + /** + * Asserts whether the given text starts with proper opening template + */ + default boolean startsWithTemplate(String text) { + return text.startsWith(openingTemplate()); + } + + /** + * Asserts whether the given text starts with proper opening template for escaped value + */ + default boolean startsWithEscapedTemplate(String text) { + return text.startsWith(escapedOpeningTemplate()); + } + + /** + * Handlebars is using the Mustache template thus it looks like this + * {{ Mustache }}. In this case the opening template would return {{ + */ + String openingTemplate(); + + /** + * Handlebars is using the Mustache template thus it looks like this + * {{ Mustache }}. In this case the closing template would return }} + */ + String closingTemplate(); + + /** + * Handlebars is using the Mustache template thus it looks like this + * {{{ Mustache }}}. In this case the opening template would return {{{ + */ + default String escapedOpeningTemplate() { + return openingTemplate(); + } + + /** + * Handlebars is using the Mustache template thus it looks like this + * {{{ Mustache }}}. In this case the closing template would return }}} + */ + default String escapedClosingTemplate() { + return closingTemplate(); + } + + /** + * Returns the template for retrieving a URL path and query from request + */ + String url(); + + /** + * Returns the template for retrieving first value of a query parameter e.g. {{ request.query.search }} + * + * @param key + */ + String query(String key); + + /** + * Returns the template for retrieving nth value of a query parameter (zero indexed) e.g. {{ request.query.search.[5] }} + * + * @param key + * @param index + */ + String query(String key, int index); + + /** + * Returns the template for retrieving a URL path + */ + String path(); + + /** + * Returns the template for retrieving nth value of a URL path (zero indexed) e.g. {{ request.path.[2] }} + * + * @param index + */ + String path(int index); + + /** + * Returns the template for retrieving the first value of a request header e.g. {{ request.headers.X-Request-Id }} + * + * @param key + */ + String header(String key); + + /** + * Returns the template for retrieving the nth value of a request header (zero indexed) e.g. {{ request.headers.X-Request-Id.[5] }} + * + * @param key + * @param index + */ + String header(String key, int index); + + /** + * Retruns the template for retrieving the first value of a cookie with certain key + * + * @param key + */ + String cookie(String key); + + /** + * Request body text (avoid for non-text bodies) e.g. {{ request.body }} . The body will not be escaped + * so you won't be able to directly embed it in a JSON for example. + */ + String body(); + + /** + * Request body text for the given JsonPath. e.g. {{ jsonPath request.body '$.a.b.c' }} + */ + String body(String jsonPath); + + /** + * Returns the template for retrieving a escaped URL path and query from request + */ + default String escapedUrl() { + return url(); + } + + /** + * Returns the template for retrieving escaped first value of a query parameter e.g. {{{ request.query.search }}} + * + * @param key + */ + default String escapedQuery(String key) { + return query(key); + } + + /** + * Returns the template for retrieving esacped nth value of a query parameter (zero indexed) e.g. {{{ request.query.search.[5] }}} + * + * @param key + * @param index + */ + default String escapedQuery(String key, int index) { + return query(key, index); + } + + /** + * Returns the template for retrieving a escaped URL path + */ + default String escapedPath() { + return path(); + } + + /** + * Returns the template for retrieving escaped nth value of a URL path (zero indexed) e.g. {{{ request.path.[2] }}} + * + * @param index + */ + default String escapedPath(int index) { + return path(index); + } + + /** + * Returns the template for retrieving the escaped first value of a request header e.g. {{{ request.headers.X-Request-Id }}} + * + * @param key + */ + default String escapedHeader(String key) { + return header(key); + } + + /** + * Returns the template for retrieving the esacaped nth value of a request header (zero indexed) e.g. {{{ request.headers.X-Request-Id.[5] }}} + * + * @param key + * @param index + */ + default String escapedHeader(String key, int index) { + return header(key, index); + } + + /** + * Retruns the template for retrieving the escaped first value of a cookie with certain key + * + * @param key + */ + default String escapedCookie(String key) { + return cookie(key); + } + + /** + * Request body text (avoid for non-text bodies) e.g. {{{ request.body }}} . The body will not be escaped + * so you won't be able to directly embed it in a JSON for example. + */ + default String escapedBody() { + return body(); + } + + /** + * Request body text for the given JsonPath. e.g. {{{ jsonPath request.body '$.a.b.c' }}} + */ + default String escapedBody(String jsonPath) { + return body(jsonPath); + } + +} diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/CompositeContractTemplate.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/CompositeContractTemplate.groovy new file mode 100644 index 0000000000..08397e4438 --- /dev/null +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/CompositeContractTemplate.groovy @@ -0,0 +1,155 @@ +package org.springframework.cloud.contract.spec.internal + +import groovy.transform.CompileStatic + +import org.springframework.cloud.contract.spec.ContractTemplate + +/** + * For backward compatibility when assertions take place, + * first checks the custom setup. Writes in a new format, can read + * the old format. + * + * @author Marcin Grzejszczak + * @since 2.1.0 + */ +@CompileStatic +class CompositeContractTemplate implements ContractTemplate { + + private final CustomHandlebarsContractTemplate custom = new CustomHandlebarsContractTemplate() + private final HandlebarsContractTemplate template = new HandlebarsContractTemplate() + + @Override + boolean startsWithTemplate(String text) { + if (this.custom.startsWithTemplate(text)) { + return true + } + return template.startsWithTemplate(text) + } + + @Override + boolean startsWithEscapedTemplate(String text) { + return this.template.startsWithEscapedTemplate(text) + } + + @Override + String openingTemplate() { + return this.template.openingTemplate() + } + + @Override + String closingTemplate() { + return this.template.closingTemplate() + } + + @Override + String escapedOpeningTemplate() { + return this.template.escapedOpeningTemplate() + } + + @Override + String escapedClosingTemplate() { + return this.template.escapedClosingTemplate() + } + + @Override + String url() { + return this.template.url() + } + + @Override + String query(String key) { + return this.template.query(key) + } + + @Override + String query(String key, int index) { + return this.template.query(key, index) + } + + @Override + String path() { + return this.template.path() + } + + @Override + String path(int index) { + return this.template.path(index) + } + + @Override + String header(String key) { + return this.template.header(key) + } + + @Override + String header(String key, int index) { + return this.template.header(key, index) + } + + @Override + String cookie(String key) { + return this.template.cookie(key) + } + + @Override + String body() { + return this.template.body() + } + + @Override + String escapedBody() { + // WireMock doesn't support proper escaping of JSON body + // that's why we need to use our custom handlebars extension + return this.custom.escapedBody() + } + + @Override + String escapedBody(String jsonPath) { + return this.template.escapedBody(jsonPath) + } + + @Override + String body(String jsonPath) { + return this.template.body(jsonPath) + } + + @Override + String escapedUrl() { + return this.template.escapedUrl() + } + + @Override + String escapedQuery(String key) { + return this.template.escapedQuery(key) + } + + @Override + String escapedQuery(String key, int index) { + return this.template.escapedQuery(key, index) + } + + @Override + String escapedPath() { + return this.template.escapedPath() + } + + @Override + String escapedPath(int index) { + return this.template.escapedPath(index) + } + + @Override + String escapedHeader(String key) { + return this.template.escapedHeader(key) + } + + @Override + String escapedHeader(String key, int index) { + return this.template.escapedHeader(key, index) + } + + @Override + String escapedCookie(String key) { + return this.template.escapedCookie(key) + } +} diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/CustomHandlebarsContractTemplate.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/CustomHandlebarsContractTemplate.groovy new file mode 100644 index 0000000000..2598aace44 --- /dev/null +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/CustomHandlebarsContractTemplate.groovy @@ -0,0 +1,94 @@ +package org.springframework.cloud.contract.spec.internal + +import groovy.transform.CompileStatic +import groovy.transform.PackageScope + +import org.springframework.cloud.contract.spec.ContractTemplate + +/** + * Represents the structure of templates using Handlebars compatible with + * WireMock template model requirements. + * + * @author Marcin Grzejszczak + * @since 1.1.0 + * + * @deprecated use {@link HandlebarsContractTemplate} + */ +@CompileStatic +@PackageScope +class CustomHandlebarsContractTemplate implements ContractTemplate { + + @Override + String openingTemplate() { + return "{{{" + } + + @Override + String closingTemplate() { + return "}}}" + } + + @Override + String url() { + return wrapped("request.url") + } + + @Override + String query(String key) { + return query(key, 0) + } + + @Override + String query(String key, int index) { + return wrapped("request.query.${key}.[${index}]") + } + + @Override + String path() { + return wrapped("request.path") + } + + @Override + String path(int index) { + return wrapped("request.path.[${index}]") + } + + @Override + String header(String key) { + return header(key, 0) + } + + @Override + String header(String key, int index) { + return wrapped("request.headers.${key}.[${index}]") + } + + @Override + String cookie(String key) { + return wrapped("request.cookies.${key}") + } + + @Override + String body() { + return wrapped("request.body") + } + + @Override + String escapedBody() { + return wrapped("escapejsonbody") + } + + @Override + String escapedBody(String jsonPath) { + return body(jsonPath) + } + + @Override + String body(String jsonPath) { + return wrapped("jsonpath this '${jsonPath}'") + } + + private String wrapped(String text) { + return openingTemplate() + text + closingTemplate() + } +} diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/FromRequest.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/FromRequest.groovy index b56add4ee6..289e1f8d1c 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/FromRequest.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/FromRequest.groovy @@ -19,14 +19,14 @@ class FromRequest { } private ContractTemplate template() { - return new HandlebarsContractTemplate() + return new CompositeContractTemplate() } /** * URL path and query */ DslProperty url() { - return new DslProperty(template.url()) + return new DslProperty(template.escapedUrl()) } /** @@ -34,7 +34,7 @@ class FromRequest { * @param key */ DslProperty query(String key) { - return new DslProperty(template.query(key)) + return new DslProperty(template.escapedQuery(key)) } /** @@ -43,14 +43,14 @@ class FromRequest { * @param index */ DslProperty query(String key, int index) { - return new DslProperty(template.query(key, index)) + return new DslProperty(template.escapedQuery(key, index)) } /** * URL path */ DslProperty path() { - return new DslProperty(template.path()) + return new DslProperty(template.escapedPath()) } /** @@ -58,7 +58,7 @@ class FromRequest { * @param index */ DslProperty path(int index) { - return new DslProperty(template.path(index)) + return new DslProperty(template.escapedPath(index)) } /** @@ -66,7 +66,7 @@ class FromRequest { * @param key */ DslProperty header(String key) { - return new DslProperty(template.header(key)) + return new DslProperty(template.escapedHeader(key)) } /** @@ -74,7 +74,7 @@ class FromRequest { * @param key */ DslProperty header(String key, int index) { - return new DslProperty(template.header(key, index)) + return new DslProperty(template.escapedHeader(key, index)) } /** @@ -82,20 +82,97 @@ class FromRequest { * @param key */ DslProperty cookie(String key) { - return new DslProperty(template.cookie(key)) + return new DslProperty(template.escapedCookie(key)) } /** * Request body text (avoid for non-text bodies) */ DslProperty body() { - return new DslProperty(template.body()) + return new DslProperty(template.escapedBody()) } /** * Request body text for the given JsonPath */ DslProperty body(String jsonPath) { + return new DslProperty(template.escapedBody(jsonPath)) + } + + /** + * Unescaped URL path and query + */ + DslProperty rawUrl() { + return new DslProperty(template.url()) + } + + /** + * Unescaped First value of a query parameter e.g. request.query.search + * @param key + */ + DslProperty rawQuery(String key) { + return new DslProperty(template.query(key)) + } + + /** + * Unescaped nth value of a query parameter (zero indexed) e.g. request.query.search.[5] + * @param key + * @param index + */ + DslProperty rawQuery(String key, int index) { + return new DslProperty(template.query(key, index)) + } + + /** + * Unescaped URL path + */ + DslProperty rawPath() { + return new DslProperty(template.path()) + } + + /** + * Unescaped nth value of a URL path (zero indexed) e.g. {{{ request.path.[2] }}} + * @param index + */ + DslProperty rawPath(int index) { + return new DslProperty(template.path(index)) + } + + /** + * Unescaped First value of a request header e.g. request.headers.X-Request-Id + * @param key + */ + DslProperty rawHeader(String key) { + return new DslProperty(template.header(key)) + } + + /** + * Unescaped nth value of a request header (zero indexed) e.g. request.headers.X-Request-Id + * @param key + */ + DslProperty rawHeader(String key, int index) { + return new DslProperty(template.header(key, index)) + } + + /** + * Unescaped Retruns the tempalte for retrieving the first value of a cookie with certain key + * @param key + */ + DslProperty rawCookie(String key) { + return new DslProperty(template.cookie(key)) + } + + /** + * Unescaped Request body text (avoid for non-text bodies) + */ + DslProperty rawBody() { + return new DslProperty(template.body()) + } + + /** + * Unescaped Request body text for the given JsonPath + */ + DslProperty rawBody(String jsonPath) { return new DslProperty(template.body(jsonPath)) } diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/HandlebarsContractTemplate.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/HandlebarsContractTemplate.groovy index 9a5acb6614..73b5270e2a 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/HandlebarsContractTemplate.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/HandlebarsContractTemplate.groovy @@ -15,11 +15,21 @@ class HandlebarsContractTemplate implements ContractTemplate { @Override String openingTemplate() { - return "{{{" + return "{{" } @Override String closingTemplate() { + return "}}" + } + + @Override + String escapedOpeningTemplate() { + return "{{{" + } + + @Override + String escapedClosingTemplate() { return "}}}" } @@ -70,15 +80,64 @@ class HandlebarsContractTemplate implements ContractTemplate { @Override String escapedBody() { - return wrapped("escapejsonbody") + return escapedWrapped("request.body") + } + + @Override + String escapedBody(String jsonPath) { + return escapedWrapped("jsonPath request.body '${jsonPath}'") } @Override String body(String jsonPath) { - return wrapped("jsonpath this '${jsonPath}'") + return wrapped("jsonPath request.body '${jsonPath}'") + } + + @Override + String escapedUrl() { + return escapedWrapped("request.url") + } + + @Override + String escapedQuery(String key) { + return escapedQuery(key, 0) + } + + @Override + String escapedQuery(String key, int index) { + return escapedWrapped("request.query.${key}.[${index}]") + } + + @Override + String escapedPath() { + return escapedWrapped("request.path") + } + + @Override + String escapedPath(int index) { + return escapedWrapped("request.path.[${index}]") + } + + @Override + String escapedHeader(String key) { + return escapedHeader(key, 0) + } + + @Override + String escapedHeader(String key, int index) { + return escapedWrapped("request.headers.${key}.[${index}]") + } + + @Override + String escapedCookie(String key) { + return escapedWrapped("request.cookies.${key}") } private String wrapped(String text) { return openingTemplate() + text + closingTemplate() } + + private String escapedWrapped(String text) { + return escapedOpeningTemplate() + text + escapedClosingTemplate() + } } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy index 439fda17e0..3539b23cb3 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy @@ -69,7 +69,7 @@ abstract class MethodBodyBuilder { private static final Closure GET_SERVER_VALUE = { it instanceof DslProperty ? it.serverValue : it } private static final String FROM_REQUEST_PREFIX = "request." - private static final String FROM_REQUEST_BODY = "body" + private static final String FROM_REQUEST_BODY = "escapejsonbody" private static final String FROM_REQUEST_PATH = "path" protected final ContractVerifierConfigProperties configProperties @@ -422,11 +422,15 @@ abstract class MethodBodyBuilder { String entryAsString = (String) entry if (templateProcessor.containsTemplateEntry(entryAsString) && !templateProcessor.containsJsonPathTemplateEntry(entryAsString)) { - String justEntry = entryAsString - contractTemplate.openingTemplate() - + // TODO: HANDLEBARS LEAKING VIA request. + String justEntry = entryAsString - contractTemplate.escapedOpeningTemplate() - + contractTemplate.openingTemplate() - + contractTemplate.escapedClosingTemplate() - contractTemplate.closingTemplate() - FROM_REQUEST_PREFIX if (justEntry == FROM_REQUEST_BODY) { // the body should be transformed by standard mechanism - return entry + return contractTemplate.escapedOpeningTemplate() + FROM_REQUEST_PREFIX + + "escapedBody" + contractTemplate.escapedClosingTemplate() } try { Object result = new PropertyUtilsBean().getProperty(templateModel, justEntry) @@ -451,6 +455,8 @@ abstract class MethodBodyBuilder { Object object = parsedRequestBody.read(jsonPathEntry) if (!(object instanceof String)) { return method + .replace('"' + contractTemplate.escapedOpeningTemplate(), contractTemplate.escapedOpeningTemplate()) + .replace(contractTemplate.escapedClosingTemplate() + '"', contractTemplate.escapedClosingTemplate()) .replace('"' + contractTemplate.openingTemplate(), contractTemplate.openingTemplate()) .replace(contractTemplate.closingTemplate() + '"', contractTemplate.closingTemplate()) } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/TestSideRequestTemplateModel.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/TestSideRequestTemplateModel.groovy index fcc7b5c37a..841d97d243 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/TestSideRequestTemplateModel.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/TestSideRequestTemplateModel.groovy @@ -41,14 +41,14 @@ class TestSideRequestTemplateModel { final Map> headers /** - * Escaped request body that can be put into test + * Request body as it would be sent to the controller */ final String body /** - * Request body as it would be sent to the controller + * Escaped request body that can be put into test */ - final String rawBody + final String escapedBody static TestSideRequestTemplateModel from(final Request request) { String url = MapConverter.getTestSideValues(request.url ?: request.urlPath) @@ -65,9 +65,9 @@ class TestSideRequestTemplateModel { }?.collectEntries { [(it.key): it.value.collect { MapConverter.getTestSideValues(it) }] }) - String body = trimmedAndEscapedBody(request.body) - String rawBody = getBodyAsRawJson(request.body) - return new TestSideRequestTemplateModel(fullUrl, query, paths, headers, body, rawBody) + String escapedBody = trimmedAndEscapedBody(request.body) + String body = getBodyAsRawJson(request.body) + return new TestSideRequestTemplateModel(fullUrl, query, paths, headers, body, escapedBody) } private static List buildPathsFromUrl(String url) { @@ -86,6 +86,9 @@ class TestSideRequestTemplateModel { private static String getBodyAsRawJson(Object body) { Object bodyValue = extractServerValueFromBody(body) + if (bodyValue instanceof GString || bodyValue instanceof String) { + return bodyValue.toString() + } return bodyValue != null ? new JsonOutput().toJson(bodyValue) : bodyValue } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsEscapeHelper.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsEscapeHelper.groovy index 72c6007c23..b2bec99730 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsEscapeHelper.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsEscapeHelper.groovy @@ -34,7 +34,7 @@ class HandlebarsEscapeHelper implements Helper> { } private Object returnObjectForTest(Object model) { - return ((TestSideRequestTemplateModel) model).rawBody + return ((TestSideRequestTemplateModel) model).escapedBody } } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy index 35ac89d92e..351a5c73e3 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy @@ -1,5 +1,7 @@ package org.springframework.cloud.contract.verifier.builder.handlebars +import com.github.tomakehurst.wiremock.extension.responsetemplating.helpers.WireMockHelpers +import org.apache.commons.text.StringEscapeUtils import wiremock.com.github.jknack.handlebars.Helper import wiremock.com.github.jknack.handlebars.Options import com.github.tomakehurst.wiremock.extension.responsetemplating.RequestTemplateModel @@ -15,21 +17,41 @@ import org.springframework.cloud.contract.verifier.builder.TestSideRequestTempla * @since 1.1.0 */ @CompileStatic -class HandlebarsJsonPathHelper implements Helper> { +class HandlebarsJsonPathHelper implements Helper { public static final String NAME = "jsonpath" public static final String REQUEST_MODEL_NAME = "request" @Override - Object apply(Map context, Options options) throws IOException { - String jsonPath = options.param(0) - Object model = context.get(REQUEST_MODEL_NAME) - if (model instanceof TestSideRequestTemplateModel) { - return returnObjectForTest(model, jsonPath) - } else if (model instanceof RequestTemplateModel) { - return returnObjectForStub(model, jsonPath) + Object apply(Object context, Options options) throws IOException { + if (context instanceof Map) { + // legacy + Map oldContext = (Map) context + String jsonPath = options.param(0) + Object model = oldContext.get(REQUEST_MODEL_NAME) + if (model instanceof TestSideRequestTemplateModel) { + return returnObjectForTest(model, jsonPath) + } else if (model instanceof RequestTemplateModel) { + return returnObjectForStub(model, jsonPath) + } + throw new IllegalArgumentException("Unsupported model") + } else if (context instanceof String) { + Object value = WireMockHelpers.jsonPath.apply(context, options) + if (testSideModel(options)) { + return processTestResponseValue(value) + } + return value } - throw new IllegalArgumentException("Unsupported model") + throw new IllegalArgumentException("Unsupported context") + } + + private boolean testSideModel(Options options) { + Object model = options.context.model() + if (!(model instanceof Map)) { + return false + } + Map map = (Map) model + return map.values().any { it instanceof TestSideRequestTemplateModel } } private Object returnObjectForStub(Object model, String jsonPath) { @@ -37,10 +59,14 @@ class HandlebarsJsonPathHelper implements Helper> { return documentContext.read(jsonPath) } - private Object returnObjectForTest(Object model, String jsonPath) { - String body = removeSurroundingQuotes(((TestSideRequestTemplateModel) model).rawBody).replace('\\"', '"') + private Object returnObjectForTest(TestSideRequestTemplateModel model, String jsonPath) { + String body = removeSurroundingQuotes(model.escapedBody).replace('\\"', '"') DocumentContext documentContext = JsonPath.parse(body) Object value = documentContext.read(jsonPath) + return processTestResponseValue(value) + } + + private Object processTestResponseValue(Object value) { if (value instanceof Long) { return String.valueOf(value) + "L" } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/BaseWireMockStubStrategy.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/BaseWireMockStubStrategy.groovy index 0ab11f66db..6f9422bc19 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/BaseWireMockStubStrategy.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/BaseWireMockStubStrategy.groovy @@ -117,7 +117,7 @@ abstract class BaseWireMockStubStrategy { return processEntriesForTemplating(transformedMap, context) } - private Object processEntriesForTemplating(transformedMap, DocumentContext context) { + private Object processEntriesForTemplating(Object transformedMap, DocumentContext context) { return transformValues(transformedMap, { if (it instanceof String && processor.containsJsonPathTemplateEntry(it)) { String jsonPath = processor.jsonPathFromTemplateEntry(it) @@ -129,7 +129,8 @@ abstract class BaseWireMockStubStrategy { return it } return "${WRAPPER}${it}${WRAPPER}" - } else if (it instanceof String && processor.containsTemplateEntry(it) && template.body() == it) { + } else if (it instanceof String && processor.containsTemplateEntry(it) && + template.escapedBody() == it) { return template.escapedBody() } return it diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy index fa9c5d575a..f7c0192526 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy @@ -1,16 +1,19 @@ package org.springframework.cloud.contract.verifier.template -import wiremock.com.github.jknack.handlebars.Handlebars -import wiremock.com.github.jknack.handlebars.Template -import groovy.transform.CompileStatic -import org.springframework.cloud.contract.spec.ContractTemplate -import org.springframework.cloud.contract.spec.internal.HandlebarsContractTemplate -import org.springframework.cloud.contract.spec.internal.Request -import org.springframework.cloud.contract.verifier.builder.handlebars.HandlebarsJsonPathHelper -import org.springframework.cloud.contract.verifier.builder.TestSideRequestTemplateModel - import java.util.regex.Matcher import java.util.regex.Pattern + +import com.github.tomakehurst.wiremock.extension.responsetemplating.helpers.WireMockHelpers +import groovy.transform.CompileStatic +import wiremock.com.github.jknack.handlebars.Handlebars +import wiremock.com.github.jknack.handlebars.Template + +import org.springframework.cloud.contract.spec.ContractTemplate +import org.springframework.cloud.contract.spec.internal.CompositeContractTemplate +import org.springframework.cloud.contract.spec.internal.Request +import org.springframework.cloud.contract.verifier.builder.TestSideRequestTemplateModel +import org.springframework.cloud.contract.verifier.builder.handlebars.HandlebarsJsonPathHelper + /** * Default Handlebars template processor * @@ -20,10 +23,17 @@ import java.util.regex.Pattern @CompileStatic class HandlebarsTemplateProcessor implements TemplateProcessor, ContractTemplate { - private static final Pattern JSON_PATH_PATTERN = Pattern.compile("^.*\\{\\{\\{jsonpath this '(.*)'}}}.*\$") + private static final Pattern ESCAPED_LEGACY_JSON_PATH_PATTERN = Pattern.compile("^.*\\{\\{\\{jsonpath this '(.*)'}}}.*\$") + private static final Pattern ESCAPED_JSON_PATH_PATTERN = Pattern.compile("^.*\\{\\{\\{jsonPath request.body '(.*)'}}}.*\$") + private static final Pattern LEGACY_JSON_PATH_PATTERN = Pattern.compile("^.*\\{\\{jsonpath this '(.*)'}}.*\$") + private static final Pattern JSON_PATH_PATTERN = Pattern.compile("^.*\\{\\{jsonPath request.body '(.*)'}}.*\$") + private static final List PATTERNS = [ESCAPED_LEGACY_JSON_PATH_PATTERN, + ESCAPED_JSON_PATH_PATTERN, LEGACY_JSON_PATH_PATTERN, JSON_PATH_PATTERN] + private static final String LEGACY_JSON_PATH_TEMPLATE_NAME = HandlebarsJsonPathHelper.NAME + private static final String JSON_PATH_TEMPLATE_NAME = WireMockHelpers.jsonPath.name() @Delegate - private final ContractTemplate contractTemplate = new HandlebarsContractTemplate() + private final ContractTemplate contractTemplate = new CompositeContractTemplate() @Override String transform(Request request, String testContents) { @@ -35,12 +45,16 @@ class HandlebarsTemplateProcessor implements TemplateProcessor, ContractTemplate @Override boolean containsTemplateEntry(String line) { - return line.matches('^.*\\{\\{\\{.*}}}.*$') + return (line.contains(contractTemplate.openingTemplate()) && line.contains(contractTemplate.closingTemplate())) || + (line.contains(contractTemplate.escapedOpeningTemplate()) && line.contains(contractTemplate.escapedClosingTemplate())) } @Override boolean containsJsonPathTemplateEntry(String line) { - return line.contains(openingTemplate() + HandlebarsJsonPathHelper.NAME) + return line.contains(openingTemplate() + LEGACY_JSON_PATH_TEMPLATE_NAME) || + line.contains(openingTemplate() + JSON_PATH_TEMPLATE_NAME) || + line.contains(escapedOpeningTemplate() + LEGACY_JSON_PATH_TEMPLATE_NAME) || + line.contains(escapedOpeningTemplate() + JSON_PATH_TEMPLATE_NAME) } @Override @@ -48,11 +62,13 @@ class HandlebarsTemplateProcessor implements TemplateProcessor, ContractTemplate if (!containsJsonPathTemplateEntry(line)) { return "" } - Matcher matcher = JSON_PATH_PATTERN.matcher(line) - if (!matcher.matches()) { - return "" + for (Pattern pattern : PATTERNS) { + Matcher matcher = pattern.matcher(line) + if (matcher.matches()) { + return matcher.group(1) + } } - return matcher.group(1) + return "" } private String templatedResponseBody(Map< String, TestSideRequestTemplateModel> model, Template bodyTemplate) { @@ -71,6 +87,12 @@ class HandlebarsTemplateProcessor implements TemplateProcessor, ContractTemplate try { Handlebars handlebars = new Handlebars() handlebars.registerHelper(HandlebarsJsonPathHelper.NAME, new HandlebarsJsonPathHelper()) + handlebars.registerHelper(WireMockHelpers.jsonPath.name(), new HandlebarsJsonPathHelper()) + WireMockHelpers.values() + .findAll { it != WireMockHelpers.jsonPath} + .each { WireMockHelpers helper -> + handlebars.registerHelper(helper.name(), helper) + } return handlebars.compileInline(content) } catch (IOException e) { throw new RuntimeException(e) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/TemplateProcessor.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/TemplateProcessor.groovy index 0d768437fc..94c38f24c9 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/TemplateProcessor.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/TemplateProcessor.groovy @@ -26,14 +26,14 @@ interface TemplateProcessor { /** * Returns {@code true} if the current line contains template related entry for json path processing. - * E.g. for Handlebars if a line contains {{{jsonpath ...}}} then + * E.g. for Handlebars if a line contains {{{jsonpath ...}}} or {{{jsonPath ...}}} then * it's considered to contain template related entry for json path processing */ boolean containsJsonPathTemplateEntry(String line) /** * Returns the json path entry from the current line that contains template related entry for json path processing. - * E.g. for Handlebars if a line contains {{{jsonpath this '$.a.b.c'}}} then + * E.g. for Handlebars if a line contains {{{jsonpath this '$.a.b.c'}}} or {{{jsonPath request.body ...}}} then * the te method would return {@code $.a.b.c}. Returns empty string if there's no matching * json path entry */ diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy index 1b96f457be..c9348237c8 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy @@ -1515,8 +1515,7 @@ World.'''""" method "GET" urlPath('/auth/oauth/check_token') { queryParameters { - parameter 'token': - value( + parameter 'token': value( consumer(regex('^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}')), producer('6973b31d-7140-402a-bca6-1cdb954e03a7') ) @@ -1551,8 +1550,7 @@ World.'''""" method "GET" urlPath('/auth/oauth/check_token') { queryParameters { - parameter 'token': - value( + parameter 'token': value( consumer(regex('^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}')), producer('6973b31d-7140-402a-bca6-1cdb954e03a7') ) @@ -2594,7 +2592,17 @@ DocumentContext parsedJson = JsonPath.parse(json); fullBody: fromRequest().body(), responseFoo: fromRequest().body('$.foo'), responseBaz: fromRequest().body('$.baz'), - responseBaz2: "Bla bla ${fromRequest().body('$.foo')} bla bla" + responseBaz2: "Bla bla ${fromRequest().body('$.foo')} bla bla", + rawUrl: fromRequest().rawUrl(), + rawPath: fromRequest().rawPath(), + rawPathIndex: fromRequest().rawPath(1), + rawParam: fromRequest().rawQuery("foo"), + rawParamIndex: fromRequest().rawQuery("foo", 1), + rawAuthorization: fromRequest().rawHeader("Authorization"), + rawAuthorization2: fromRequest().rawHeader("Authorization", 1), + rawResponseFoo: fromRequest().rawBody('$.foo'), + rawResponseBaz: fromRequest().rawBody('$.baz'), + rawResponseBaz2: "Bla bla ${fromRequest().rawBody('$.foo')} bla bla" ) } } @@ -2608,6 +2616,7 @@ DocumentContext parsedJson = JsonPath.parse(json); SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, test) then: !test.contains('''DslProperty''') + !test.contains('''ERROR: ''') test.contains('''assertThatJson(parsedJson).field("['url']").isEqualTo("/api/v1/xxxx?foo=bar&foo=bar2")''') test.contains('''assertThatJson(parsedJson).field("['path']").isEqualTo("/api/v1/xxxx")''') test.contains('''assertThatJson(parsedJson).field("['pathIndex']").isEqualTo("v1")''') @@ -2619,6 +2628,16 @@ DocumentContext parsedJson = JsonPath.parse(json); test.contains('''assertThatJson(parsedJson).field("['responseBaz']").isEqualTo(5)''') test.contains('''assertThatJson(parsedJson).field("['responseBaz2']").isEqualTo("Bla bla bar bla bla")''') test.contains('''assertThatJson(parsedJson).field("['param']").isEqualTo("bar")''') + test.contains('''assertThatJson(parsedJson).field("['rawUrl']").isEqualTo("/api/v1/xxxx?foo=bar&foo=bar2")''') + test.contains('''assertThatJson(parsedJson).field("['rawPath']").isEqualTo("/api/v1/xxxx")''') + test.contains('''assertThatJson(parsedJson).field("['rawPathIndex']").isEqualTo("v1")''') + test.contains('''assertThatJson(parsedJson).field("['rawParamIndex']").isEqualTo("bar2")''') + test.contains('''assertThatJson(parsedJson).field("['rawResponseFoo']").isEqualTo("bar")''') + test.contains('''assertThatJson(parsedJson).field("['rawAuthorization']").isEqualTo("secret")''') + test.contains('''assertThatJson(parsedJson).field("['rawAuthorization2']").isEqualTo("secret2")''') + test.contains('''assertThatJson(parsedJson).field("['rawResponseBaz']").isEqualTo(5)''') + test.contains('''assertThatJson(parsedJson).field("['rawResponseBaz2']").isEqualTo("Bla bla bar bla bla")''') + test.contains('''assertThatJson(parsedJson).field("['rawParam']").isEqualTo("bar")''') responseAssertion(test) where: methodBuilderName | methodBuilder | responseAssertion diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy index 96b20b540b..565336dedd 100755 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy @@ -1736,7 +1736,73 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie } @Issue('#237') - def "should generate a stub with response template"() { + def "should work with legacy mappings"() { + given: + def oldJsonMapping = ''' + { + "request" : { + "urlPath" : "/api/v1/xxxx", + "method" : "POST", + "headers" : { + "Authorization" : { + "equalTo" : "secret2" + } + }, + "cookies" : { + "foo" : { + "equalTo" : "bar" + } + }, + "queryParameters" : { + "foo" : { + "equalTo" : "bar2" + } + }, + "bodyPatterns" : [ { + "matchesJsonPath" : "$[?(@.['baz'] == 5)]" + }, { + "matchesJsonPath" : "$[?(@.['foo'] == 'bar')]" + } ] + }, + "response" : { + "status" : 200, + "body" : "{\\"authorization\\":\\"{{{request.headers.Authorization.[0]}}}\\",\\"path\\":\\"{{{request.path}}}\\",\\"responseBaz\\":{{{jsonpath this '$.baz'}}} ,\\"param\\":\\"{{{request.query.foo.[0]}}}\\",\\"pathIndex\\":\\"{{{request.path.[1]}}}\\",\\"responseBaz2\\":\\"Bla bla {{{jsonpath this '$.foo'}}} bla bla\\",\\"responseFoo\\":\\"{{{jsonpath this '$.foo'}}}\\",\\"authorization2\\":\\"{{{request.headers.Authorization.[1]}}}\\",\\"fullBody\\":\\"{{{escapejsonbody}}}\\",\\"url\\":\\"{{{request.url}}}\\",\\"paramIndex\\":\\"{{{request.query.foo.[1]}}}\\"}", + "headers" : { + "Authorization" : "{{{request.headers.Authorization.[0]}}};foo" + }, + "transformers" : [ "response-template", "foo-transformer" ] + } + } + ''' + and: + int port = SocketUtils.findAvailableTcpPort() + WireMockServer server = new WireMockServer(config().port(port)) + server.start() + and: + server.addStubMapping(WireMockStubMapping.buildFrom(oldJsonMapping)) + when: + ResponseEntity entity = call(port) + then: + entity.headers.find { it.key == "Authorization" && it.value.contains("secret;foo") } + AssertionUtil.assertThatJsonsAreEqual((''' + { + "url" : "/api/v1/xxxx?foo=bar&foo=bar2", + "param" : "bar", + "paramIndex" : "bar2", + "authorization" : "secret", + "authorization2" : "secret2", + "fullBody" : "{\\"foo\\":\\"bar\\",\\"baz\\":5}", + "responseFoo" : "bar", + "responseBaz" : 5, + "responseBaz2" : "Bla bla bar bla bla" + } + '''), entity.body) + cleanup: + server?.shutdown() + } + + @Issue('#540') + def "should generate a stub with standard WireMock request template"() { given: org.springframework.cloud.contract.spec.Contract groovyDsl = org.springframework.cloud.contract.spec.Contract.make { request { @@ -1772,7 +1838,17 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie fullBody: fromRequest().body(), responseFoo: fromRequest().body('$.foo'), responseBaz: fromRequest().body('$.baz'), - responseBaz2: "Bla bla ${fromRequest().body('$.foo')} bla bla" + responseBaz2: "Bla bla ${fromRequest().body('$.foo')} bla bla", + rawUrl: fromRequest().rawUrl(), + rawPath: fromRequest().rawPath(), + rawPathIndex: fromRequest().rawPath(1), + rawParam: fromRequest().rawQuery("foo"), + rawParamIndex: fromRequest().rawQuery("foo", 1), + rawAuthorization: fromRequest().rawHeader("Authorization"), + rawAuthorization2: fromRequest().rawHeader("Authorization", 1), + rawResponseFoo: fromRequest().rawBody('$.foo'), + rawResponseBaz: fromRequest().rawBody('$.baz'), + rawResponseBaz2: "Bla bla ${fromRequest().rawBody('$.foo')} bla bla" ) } } @@ -1807,7 +1883,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie }, "response" : { "status" : 200, - "body" : "{\\"authorization\\":\\"{{{request.headers.Authorization.[0]}}}\\",\\"path\\":\\"{{{request.path}}}\\",\\"responseBaz\\":{{{jsonpath this '$.baz'}}} ,\\"param\\":\\"{{{request.query.foo.[0]}}}\\",\\"pathIndex\\":\\"{{{request.path.[1]}}}\\",\\"responseBaz2\\":\\"Bla bla {{{jsonpath this '$.foo'}}} bla bla\\",\\"responseFoo\\":\\"{{{jsonpath this '$.foo'}}}\\",\\"authorization2\\":\\"{{{request.headers.Authorization.[1]}}}\\",\\"fullBody\\":\\"{{{escapejsonbody}}}\\",\\"url\\":\\"{{{request.url}}}\\",\\"paramIndex\\":\\"{{{request.query.foo.[1]}}}\\"}", + "body" : "{\\"rawAuthorization2\\":\\"{{request.headers.Authorization.[1]}}\\",\\"responseBaz\\":{{{jsonPath request.body '$.baz'}}} ,\\"pathIndex\\":\\"{{{request.path.[1]}}}\\",\\"rawAuthorization\\":\\"{{request.headers.Authorization.[0]}}\\",\\"authorization2\\":\\"{{{request.headers.Authorization.[1]}}}\\",\\"rawParam\\":\\"{{request.query.foo.[0]}}\\",\\"url\\":\\"{{{request.url}}}\\",\\"paramIndex\\":\\"{{{request.query.foo.[1]}}}\\",\\"authorization\\":\\"{{{request.headers.Authorization.[0]}}}\\",\\"path\\":\\"{{{request.path}}}\\",\\"rawUrl\\":\\"{{request.url}}\\",\\"rawPath\\":\\"{{request.path}}\\",\\"rawResponseBaz2\\":\\"Bla bla {{jsonPath request.body '$.foo'}} bla bla\\",\\"param\\":\\"{{{request.query.foo.[0]}}}\\",\\"rawResponseBaz\\":{{jsonPath request.body '$.baz'}} ,\\"responseBaz2\\":\\"Bla bla {{{jsonPath request.body '$.foo'}}} bla bla\\",\\"rawResponseFoo\\":\\"{{jsonPath request.body '$.foo'}}\\",\\"responseFoo\\":\\"{{{jsonPath request.body '$.foo'}}}\\",\\"rawPathIndex\\":\\"{{request.path.[1]}}\\",\\"fullBody\\":\\"{{{escapejsonbody}}}\\",\\"rawParamIndex\\":\\"{{request.query.foo.[1]}}\\"}", "headers" : { "Authorization" : "{{{request.headers.Authorization.[0]}}};foo" }, @@ -1827,16 +1903,28 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie entity.headers.find { it.key == "Authorization" && it.value.contains("secret;foo") } and: AssertionUtil.assertThatJsonsAreEqual((''' - { - "url" : "/api/v1/xxxx?foo=bar&foo=bar2", - "param" : "bar", - "paramIndex" : "bar2", - "authorization" : "secret", - "authorization2" : "secret2", - "fullBody" : "{\\"foo\\":\\"bar\\",\\"baz\\":5}", - "responseFoo" : "bar", - "responseBaz" : 5, - "responseBaz2" : "Bla bla bar bla bla" + { + "rawAuthorization2":"secret2", + "responseBaz":5, + "pathIndex":"v1", + "rawAuthorization":"secret", + "authorization2":"secret2", + "rawParam":"bar", + "url":"/api/v1/xxxx?foo=bar&foo=bar2", + "paramIndex":"bar2", + "authorization":"secret", + "path":"/api/v1/xxxx", + "rawUrl":"/api/v1/xxxx?foo=bar&foo=bar2", + "rawPath":"/api/v1/xxxx", + "rawResponseBaz2":"Bla bla bar bla bla", + "param":"bar", + "rawResponseBaz":5, + "responseBaz2":"Bla bla bar bla bla", + "rawResponseFoo":"bar", + "responseFoo":"bar", + "rawPathIndex":"v1", + "fullBody":"{\\"foo\\":\\"bar\\",\\"baz\\":5}", + "rawParamIndex":"bar2" } '''), entity.body) cleanup: From 58f3f429eb40ef7a9c221914fd146f95360805ae Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 27 Aug 2018 18:33:10 +0200 Subject: [PATCH 75/84] Upgraded to Greenwhich --- docker/spring-cloud-contract-docker/pom.xml | 2 +- pom.xml | 42 ++- samples/wiremock-jetty/pom.xml | 2 +- samples/wiremock-native/pom.xml | 2 +- samples/wiremock-tomcat/pom.xml | 2 +- samples/wiremock-undertow-ssl/pom.xml | 2 +- samples/wiremock-undertow/pom.xml | 2 +- .../cloud/contract/spec/internal/Url.groovy | 2 +- .../server/EnableStubRunnerServer.java | 2 +- .../server/StreamConfiguration.java | 29 -- .../stubrunner/server/StubRunnerBoot.java | 3 + .../main/resources/META-INF/spring.factories | 1 - .../StubRunnerStubsPerConsumerSpec.groovy | 3 +- ...tubsPerConsumerWithConsumerNameSpec.groovy | 3 +- .../build.gradle | 2 +- .../functionalTest/bootSimple/build.gradle | 4 +- .../sampleJerseyProject/build.gradle | 8 +- .../functionalTest/sampleProject/build.gradle | 8 +- .../scenarioProject/build.gradle | 8 +- .../TestSideRequestTemplateModel.groovy | 18 +- .../verifier/file/ContractFileScanner.groovy | 10 +- .../restdocs/ContractResultHandler.java | 327 +++++++++++++++++- .../restdocs/WireMockVerifyHelper.java | 4 +- ...ServerRestDocsMatcherApplicationTests.java | 2 +- 24 files changed, 404 insertions(+), 84 deletions(-) delete mode 100644 spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StreamConfiguration.java diff --git a/docker/spring-cloud-contract-docker/pom.xml b/docker/spring-cloud-contract-docker/pom.xml index 4c958eb3bb..06db33b9d1 100644 --- a/docker/spring-cloud-contract-docker/pom.xml +++ b/docker/spring-cloud-contract-docker/pom.xml @@ -20,7 +20,7 @@ org.codehaus.groovy - groovy-all + groovy compile diff --git a/pom.xml b/pom.xml index 0640634c13..9ad5a9e448 100644 --- a/pom.xml +++ b/pom.xml @@ -26,17 +26,17 @@ 2.17 3.5.13 0.0.9 - 2.0.4.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT - Elmhurst.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT - 2.0.0.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT + Fishtown.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT 5.0.3 3.2.4 1.0-groovy-2.4 0.5.1 - 2.0.0.RELEASE + 2.1.0.M2 0.2.2 1.1 4.0.6 @@ -83,11 +83,31 @@ org.spockframework spock-spring ${spock-spring.version} + + + org.codehaus.groovy + groovy-all + + + org.codehaus.groovy + groovy + + org.spockframework spock-core ${spock-spring.version} + + + org.codehaus.groovy + groovy-all + + + org.codehaus.groovy + groovy + + info.solidsoft.spock @@ -118,6 +138,10 @@ org.codehaus.groovy groovy-all + + org.codehaus.groovy + groovy + @@ -129,6 +153,10 @@ org.codehaus.groovy groovy-all + + org.codehaus.groovy + groovy + diff --git a/samples/wiremock-jetty/pom.xml b/samples/wiremock-jetty/pom.xml index a974ca7a58..11ac98b3be 100644 --- a/samples/wiremock-jetty/pom.xml +++ b/samples/wiremock-jetty/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M1 diff --git a/samples/wiremock-native/pom.xml b/samples/wiremock-native/pom.xml index a2de7fa4e6..caab291dcf 100644 --- a/samples/wiremock-native/pom.xml +++ b/samples/wiremock-native/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M1 diff --git a/samples/wiremock-tomcat/pom.xml b/samples/wiremock-tomcat/pom.xml index 5e80b32c10..bbbba762b9 100644 --- a/samples/wiremock-tomcat/pom.xml +++ b/samples/wiremock-tomcat/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M1 diff --git a/samples/wiremock-undertow-ssl/pom.xml b/samples/wiremock-undertow-ssl/pom.xml index c2a2e1152c..c7871b2402 100644 --- a/samples/wiremock-undertow-ssl/pom.xml +++ b/samples/wiremock-undertow-ssl/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M1 diff --git a/samples/wiremock-undertow/pom.xml b/samples/wiremock-undertow/pom.xml index f69418867c..b801ff7b97 100644 --- a/samples/wiremock-undertow/pom.xml +++ b/samples/wiremock-undertow/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M1 diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Url.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Url.groovy index be464280a2..d28d952aa7 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Url.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Url.groovy @@ -58,7 +58,7 @@ class Url extends DslProperty { url.values.collect { it instanceof Pattern ? new Xeger(it.pattern()).generate() : it } as String[], - url.strings.clone() as String[] + Arrays.copyOf(url.strings, url.strings.length) as String[] ).toString() return new Url(newUrl) } diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/EnableStubRunnerServer.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/EnableStubRunnerServer.java index fc7713d8f3..c50223e419 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/EnableStubRunnerServer.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/EnableStubRunnerServer.java @@ -34,7 +34,7 @@ import org.springframework.context.annotation.Import; @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited -@Import({HttpStubsController.class, TriggerController.class, StreamConfiguration.class, StubRunnerConfiguration.class}) +@Import({HttpStubsController.class, TriggerController.class, StubRunnerConfiguration.class}) public @interface EnableStubRunnerServer { } diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StreamConfiguration.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StreamConfiguration.java deleted file mode 100644 index 3d337159c4..0000000000 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StreamConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.springframework.cloud.contract.stubrunner.server; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.cloud.stream.test.binder.MessageCollector; -import org.springframework.cloud.stream.test.binder.TestSupportBinder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; - -/** - * Configuration required to make Stub Runner server be executed at compile time - * - * @author Marcin Grzejszczak - * - * @since 1.0.0 - */ -@Configuration -class StreamConfiguration { - - @Bean - @Primary - @ConditionalOnClass(name = "org.springframework.cloud.stream.test.binder.TestSupportBinder") - @ConditionalOnMissingBean - public MessageCollector messageCollector() { - return new TestSupportBinder().messageCollector(); - } - -} diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StubRunnerBoot.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StubRunnerBoot.java index d68dd87906..a250d2de6c 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StubRunnerBoot.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StubRunnerBoot.java @@ -17,13 +17,16 @@ package org.springframework.cloud.contract.stubrunner.server; import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.config.BindingServiceConfiguration; /** * @author Marcin Grzejszczak */ @SpringBootApplication @EnableStubRunnerServer +@AutoConfigureBefore(BindingServiceConfiguration.class) public class StubRunnerBoot { public static void main(String[] args) { diff --git a/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories index a6042d7383..1556b08c2f 100644 --- a/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories @@ -3,7 +3,6 @@ org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner=\ org.springframework.cloud.contract.stubrunner.spring.StubRunnerConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.StubRunnerSpringCloudAutoConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.ribbon.StubRunnerRibbonAutoConfiguration,\ -org.springframework.cloud.contract.stubrunner.messaging.stream.StubRunnerStreamConfiguration,\ org.springframework.cloud.contract.stubrunner.messaging.integration.StubRunnerIntegrationConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.zookeeper.StubRunnerSpringCloudZookeeperAutoConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.eureka.StubRunnerSpringCloudEurekaAutoConfiguration,\ diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy index eba68535f0..21ca1a3efb 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy @@ -29,6 +29,7 @@ import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties import org.springframework.cloud.contract.verifier.messaging.MessageVerifier import org.springframework.cloud.stream.annotation.EnableBinding import org.springframework.cloud.stream.messaging.Sink +import org.springframework.cloud.stream.messaging.Source import org.springframework.context.annotation.Configuration import org.springframework.core.env.Environment import org.springframework.http.ResponseEntity @@ -86,6 +87,6 @@ class StubRunnerStubsPerConsumerSpec extends Specification { @Configuration @EnableAutoConfiguration - @EnableBinding(Sink) + @EnableBinding([Sink, Source]) static class Config {} } \ No newline at end of file diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy index 1e3ed7fed1..e9b9c47604 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy @@ -29,6 +29,7 @@ import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties import org.springframework.cloud.contract.verifier.messaging.MessageVerifier import org.springframework.cloud.stream.annotation.EnableBinding import org.springframework.cloud.stream.messaging.Sink +import org.springframework.cloud.stream.messaging.Source import org.springframework.context.annotation.Configuration import org.springframework.core.env.Environment import org.springframework.http.ResponseEntity @@ -87,6 +88,6 @@ class StubRunnerStubsPerConsumerWithConsumerNameSpec extends Specification { @Configuration @EnableAutoConfiguration - @EnableBinding(Sink) + @EnableBinding([Sink, Source]) static class Config {} } \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/build.gradle index d289534e48..2d843a0ecc 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/build.gradle @@ -23,7 +23,7 @@ ext { ] } -project.version = findProperty('verifierVersion') ?: '2.0.0.BUILD-SNAPSHOT' +project.version = findProperty('verifierVersion') ?: '2.1.0.BUILD-SNAPSHOT' apply plugin: 'groovy' apply from: "$rootDir/gradle/release.gradle" apply plugin: 'eclipse' diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/build.gradle index 2495415709..401ee34d3c 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/build.gradle @@ -36,7 +36,9 @@ dependencies { testCompile "com.github.tomakehurst:wiremock:${wiremockVersion}" testCompile "com.toomuchcoding.jsonassert:jsonassert:${jsonAssertVersion}" - testCompile "org.spockframework:spock-spring:1.0-groovy-2.4" + testCompile("org.spockframework:spock-spring:1.0-groovy-2.4") { + exclude(group: 'org.codehaus.groovy') + } testCompile "io.restassured:rest-assured:$restAssuredVersion" testCompile "io.restassured:spring-mock-mvc:$restAssuredVersion" testCompile "ch.qos.logback:logback-classic:1.1.2" 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 3f1c06b451..de113ce1f2 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 @@ -52,7 +52,9 @@ subprojects { dependencies { testCompile 'org.codehaus.groovy:groovy-all:2.5.0-beta-1' - testCompile "org.spockframework:spock-core:$spockVersion" + testCompile("org.spockframework:spock-core:$spockVersion") { + exclude(group: 'org.codehaus.groovy') + } testCompile 'junit:junit:4.12' testCompile "com.github.tomakehurst:wiremock:${wiremockVersion}" testCompile "com.toomuchcoding.jsonassert:jsonassert:${jsonAssertVersion}" @@ -81,7 +83,9 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService') compile 'org.springframework.boot:spring-boot-starter-jersey' compile 'org.springframework.boot:spring-boot-starter-jetty' - testRuntime "org.spockframework:spock-spring:$spockVersion" + testRuntime("org.spockframework:spock-spring:$spockVersion") { + exclude(group: 'org.codehaus.groovy') + } testCompile "org.mockito:mockito-core" testCompile "org.springframework:spring-test" diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/build.gradle index 62f4407ffe..497a687518 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/build.gradle @@ -48,7 +48,9 @@ subprojects { } dependencies { - testCompile "org.codehaus.groovy:groovy-all:2.5.0-beta-1" + testCompile("org.codehaus.groovy:groovy-all:2.5.0-beta-1") { + exclude(group: 'org.codehaus.groovy') + } testCompile "org.spockframework:spock-core:$spockVersion" testCompile("junit:junit:4.12") testCompile "com.github.tomakehurst:wiremock:${wiremockVersion}" @@ -89,7 +91,9 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService') compile("org.springframework.boot:spring-boot-starter-jetty") compile("org.springframework.boot:spring-boot-starter-actuator") - testRuntime "org.spockframework:spock-spring:$spockVersion" + testRuntime("org.spockframework:spock-spring:$spockVersion") { + exclude(group: 'org.codehaus.groovy') + } testCompile "org.mockito:mockito-core" testCompile "org.springframework:spring-test" testCompile "org.springframework.boot:spring-boot-test" diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/build.gradle index f54d7b18b0..52611a7a90 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/build.gradle @@ -50,7 +50,9 @@ subprojects { dependencies { testCompile "org.codehaus.groovy:groovy-all:2.5.0-beta-1" - testCompile "org.spockframework:spock-core:$spockVersion" + testCompile("org.spockframework:spock-core:$spockVersion") { + exclude(group: 'org.codehaus.groovy') + } testCompile "junit:junit:4.12" testCompile "com.github.tomakehurst:wiremock:${wiremockVersion}" testCompile "com.toomuchcoding.jsonassert:jsonassert:${jsonAssertVersion}" @@ -113,7 +115,9 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService') compile("org.springframework.boot:spring-boot-starter-jetty") compile("org.springframework.boot:spring-boot-starter-actuator") - testRuntime "org.spockframework:spock-spring:$spockVersion" + testRuntime("org.spockframework:spock-spring:$spockVersion") { + exclude(group: 'org.codehaus.groovy') + } testCompile "org.mockito:mockito-core" testCompile "org.springframework:spring-test" testCompile "org.springframework.boot:spring-boot-test" diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/TestSideRequestTemplateModel.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/TestSideRequestTemplateModel.groovy index 841d97d243..e66bff6ecd 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/TestSideRequestTemplateModel.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/TestSideRequestTemplateModel.groovy @@ -17,7 +17,6 @@ import org.springframework.cloud.contract.verifier.util.MapConverter * @author Marcin Grzejszczak * @since 1.1.0 */ -@Immutable @CompileStatic class TestSideRequestTemplateModel { /** @@ -50,6 +49,15 @@ class TestSideRequestTemplateModel { */ final String escapedBody + private TestSideRequestTemplateModel(String url, Map> query, Path path, Map> headers, String body, String escapedBody) { + this.url = url + this.query = query + this.path = path + this.headers = headers + this.body = body + this.escapedBody = escapedBody + } + static TestSideRequestTemplateModel from(final Request request) { String url = MapConverter.getTestSideValues(request.url ?: request.urlPath) Path paths = new Path(buildPathsFromUrl(url)) @@ -63,7 +71,11 @@ class TestSideRequestTemplateModel { Map> headers = (Map>) (request.headers?.entries?.groupBy { it.name }?.collectEntries { - [(it.key): it.value.collect { MapConverter.getTestSideValues(it) }] + List headerValues = [] + for (Object value : it.value) { + headerValues.add(MapConverter.getTestSideValues(value)) + } + [(it.key): headerValues] }) String escapedBody = trimmedAndEscapedBody(request.body) String body = getBodyAsRawJson(request.body) @@ -94,7 +106,7 @@ class TestSideRequestTemplateModel { protected static Object extractServerValueFromBody(bodyValue) { if (bodyValue instanceof GString) { - bodyValue = ContentUtils.extractValue(bodyValue, { DslProperty dslProperty -> dslProperty.serverValue }) + bodyValue = ContentUtils.extractValue(bodyValue, { DslProperty dslProperty -> dslProperty.serverValue } as Closure) } else { bodyValue = MapConverter.transformValues(bodyValue, { it instanceof DslProperty ? it.serverValue : it diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy index aab6ebeb06..2ebd11a740 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/file/ContractFileScanner.groovy @@ -68,14 +68,16 @@ class ContractFileScanner { private Set processPatterns(Set patterns) { FileSystem fileSystem = FileSystems.getDefault() - return patterns.collect({ - String syntaxAndPattern = MATCH_PREFIX + '**' + File.separator + it + Set pathMatchers = new HashSet() + for (String pattern : patterns) { + String syntaxAndPattern = MATCH_PREFIX + '**' + File.separator + pattern // FIXME: This looks strange, need to be checked on windows if (IS_OS_WINDOWS) { syntaxAndPattern = syntaxAndPattern.replace("\\", "\\\\") } - fileSystem.getPathMatcher(syntaxAndPattern) - }) as Set + pathMatchers.add(fileSystem.getPathMatcher(syntaxAndPattern)) + } + return pathMatchers } /** diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractResultHandler.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractResultHandler.java index db1f8cbb4b..d161a7abd4 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractResultHandler.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractResultHandler.java @@ -16,35 +16,73 @@ package org.springframework.cloud.contract.wiremock.restdocs; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; +import java.util.Set; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; +import com.github.tomakehurst.wiremock.common.Gzip; +import com.github.tomakehurst.wiremock.http.ContentTypeHeader; +import com.github.tomakehurst.wiremock.http.Cookie; +import com.github.tomakehurst.wiremock.http.HttpHeader; +import com.github.tomakehurst.wiremock.http.HttpHeaders; +import com.github.tomakehurst.wiremock.http.QueryParameter; import com.github.tomakehurst.wiremock.http.Request; -import com.github.tomakehurst.wiremock.servlet.WireMockHttpServletRequestAdapter; - +import com.github.tomakehurst.wiremock.http.RequestMethod; +import com.github.tomakehurst.wiremock.servlet.WireMockHttpServletMultipartAdapter; import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultHandler; import org.springframework.util.StreamUtils; +import wiremock.com.google.common.base.Function; +import wiremock.com.google.common.base.Joiner; +import wiremock.com.google.common.base.Optional; +import wiremock.com.google.common.collect.FluentIterable; +import wiremock.com.google.common.collect.ImmutableList; +import wiremock.com.google.common.collect.ImmutableMultimap; +import wiremock.com.google.common.collect.Maps; +import wiremock.org.eclipse.jetty.util.MultiPartInputStreamParser; -public class ContractResultHandler extends - WireMockVerifyHelper implements ResultHandler { +import static com.github.tomakehurst.wiremock.common.Encoding.encodeBase64; +import static com.github.tomakehurst.wiremock.common.Exceptions.throwUnchecked; +import static com.github.tomakehurst.wiremock.common.Strings.stringFromBytes; +import static com.github.tomakehurst.wiremock.common.Urls.splitQuery; +import static java.util.Collections.list; +import static wiremock.com.google.common.base.Charsets.UTF_8; +import static wiremock.com.google.common.base.MoreObjects.firstNonNull; +import static wiremock.com.google.common.base.Strings.isNullOrEmpty; +import static wiremock.com.google.common.collect.FluentIterable.from; +import static wiremock.com.google.common.collect.Lists.newArrayList; +import static wiremock.com.google.common.io.ByteStreams.toByteArray; + +public class ContractResultHandler + extends WireMockVerifyHelper + implements ResultHandler { static final String ATTRIBUTE_NAME_CONFIGURATION = "org.springframework.restdocs.configuration"; - @Override - public void handle(MvcResult result) throws Exception { + @Override public void handle(MvcResult result) throws Exception { configure(result); MockMvcRestDocumentation.document(getName()).handle(result); } - @Override - protected ResponseDefinitionBuilder getResponseDefinition(MvcResult result) { + @Override protected ResponseDefinitionBuilder getResponseDefinition( + MvcResult result) { MockHttpServletResponse response = result.getResponse(); ResponseDefinitionBuilder definition; try { @@ -66,11 +104,9 @@ public class ContractResultHandler extends } } - @Override - protected Map getConfiguration(MvcResult result) { - @SuppressWarnings("unchecked") - Map map = (Map) result.getRequest() - .getAttribute(ATTRIBUTE_NAME_CONFIGURATION); + @Override protected Map getConfiguration(MvcResult result) { + @SuppressWarnings("unchecked") Map map = (Map) result + .getRequest().getAttribute(ATTRIBUTE_NAME_CONFIGURATION); if (map == null) { map = new HashMap<>(); result.getRequest().setAttribute(ATTRIBUTE_NAME_CONFIGURATION, map); @@ -78,18 +114,15 @@ public class ContractResultHandler extends return map; } - @Override - protected Request getWireMockRequest(MvcResult result) { + @Override protected Request getWireMockRequest(MvcResult result) { return new WireMockHttpServletRequestAdapter(result.getRequest()); } - @Override - protected MediaType getContentType(MvcResult result) { + @Override protected MediaType getContentType(MvcResult result) { return MediaType.valueOf(result.getRequest().getContentType()); } - @Override - protected byte[] getRequestBodyContent(MvcResult result) { + @Override protected byte[] getRequestBodyContent(MvcResult result) { try { return StreamUtils.copyToByteArray(result.getRequest().getInputStream()); } @@ -99,3 +132,259 @@ public class ContractResultHandler extends } } + +// COPIED FROM WIREMOCK +class WireMockHttpServletRequestAdapter implements Request { + + private static final String ORIGINAL_REQUEST_KEY = "wiremock.ORIGINAL_REQUEST"; + + private final HttpServletRequest request; + private byte[] cachedBody; + private Collection cachedMultiparts; + + WireMockHttpServletRequestAdapter(HttpServletRequest request) { + this.request = request; + } + + @Override public String getUrl() { + String url = this.request.getRequestURI(); + String contextPath = this.request.getContextPath(); + if (!isNullOrEmpty(contextPath) && url.startsWith(contextPath)) { + url = url.substring(contextPath.length()); + } + return withQueryStringIfPresent(url); + } + + @Override public String getAbsoluteUrl() { + return withQueryStringIfPresent(this.request.getRequestURL().toString()); + } + + private String withQueryStringIfPresent(String url) { + return url + (isNullOrEmpty(this.request.getQueryString()) ? + "" : + "?" + this.request.getQueryString()); + } + + @Override public RequestMethod getMethod() { + return RequestMethod.fromString(this.request.getMethod().toUpperCase()); + } + + @Override public String getScheme() { + return this.request.getScheme(); + } + + @Override public String getHost() { + return this.request.getServerName(); + } + + @Override public int getPort() { + return this.request.getServerPort(); + } + + @Override public String getClientIp() { + String forwardedForHeader = this.getHeader("X-Forwarded-For"); + + if (forwardedForHeader != null && forwardedForHeader.length() > 0) { + return forwardedForHeader; + } + + return this.request.getRemoteAddr(); + } + + // Something's wrong with reading the body from request + @Override public byte[] getBody() { + if (this.cachedBody == null || this.cachedBody.length == 0) { + try { + if (this.request instanceof MockHttpServletRequest) { + this.cachedBody = ((MockHttpServletRequest) this.request).getContentAsByteArray(); + return this.cachedBody; + } + byte[] body = toByteArray(this.request.getInputStream()); + boolean isGzipped = hasGzipEncoding() || Gzip.isGzipped(body); + this.cachedBody = isGzipped ? Gzip.unGzip(body) : body; + } + catch (IOException ioe) { + throw new RuntimeException(ioe); + } + } + return this.cachedBody; + } + + private Charset encodingFromContentTypeHeaderOrUtf8() { + ContentTypeHeader contentTypeHeader = contentTypeHeader(); + if (contentTypeHeader != null) { + return contentTypeHeader.charset(); + } + return UTF_8; + } + + private boolean hasGzipEncoding() { + String encodingHeader = this.request.getHeader("Content-Encoding"); + return encodingHeader != null && encodingHeader.contains("gzip"); + } + + @Override public String getBodyAsString() { + return stringFromBytes(getBody(), encodingFromContentTypeHeaderOrUtf8()); + } + + @Override public String getBodyAsBase64() { + return encodeBase64(getBody()); + } + + @SuppressWarnings("unchecked") @Override public String getHeader(String key) { + List headerNames = list(this.request.getHeaderNames()); + for (String currentKey : headerNames) { + if (currentKey.toLowerCase().equals(key.toLowerCase())) { + return this.request.getHeader(currentKey); + } + } + return null; + } + + @Override @SuppressWarnings("unchecked") public HttpHeader header(String key) { + List headerNames = list(this.request.getHeaderNames()); + for (String currentKey : headerNames) { + if (currentKey.toLowerCase().equals(key.toLowerCase())) { + List valueList = list(this.request.getHeaders(currentKey)); + if (valueList.isEmpty()) { + return HttpHeader.empty(key); + } + return new HttpHeader(key, valueList); + } + } + + return HttpHeader.absent(key); + } + + @Override public ContentTypeHeader contentTypeHeader() { + return getHeaders().getContentTypeHeader(); + } + + @Override public boolean containsHeader(String key) { + return header(key).isPresent(); + } + + @Override public HttpHeaders getHeaders() { + List headerList = newArrayList(); + for (String key : getAllHeaderKeys()) { + headerList.add(header(key)); + } + + return new HttpHeaders(headerList); + } + + @SuppressWarnings("unchecked") @Override public Set getAllHeaderKeys() { + LinkedHashSet headerKeys = new LinkedHashSet<>(); + for (Enumeration headerNames = this.request.getHeaderNames(); headerNames + .hasMoreElements(); ) { + headerKeys.add(headerNames.nextElement()); + } + + return headerKeys; + } + + @Override public Map getCookies() { + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + javax.servlet.http.Cookie[] cookies = firstNonNull(this.request.getCookies(), + new javax.servlet.http.Cookie[0]); + for (javax.servlet.http.Cookie cookie : cookies) { + builder.put(cookie.getName(), cookie.getValue()); + } + return Maps.transformValues(builder.build().asMap(), + input -> new Cookie(null, ImmutableList.copyOf(input))); + } + + @Override public QueryParameter queryParameter(String key) { + return firstNonNull((splitQuery(this.request.getQueryString()).get(key)), + QueryParameter.absent(key)); + } + + @Override public boolean isBrowserProxyRequest() { + if (!isJetty()) { + return false; + } + return false; + } + + @Override @SuppressWarnings("unchecked") public Collection getParts() { + if (!isMultipart()) { + return null; + } + if (this.cachedMultiparts == null) { + try { + String contentTypeHeaderValue = FluentIterable + .from(contentTypeHeader().values()).join(Joiner.on(" ")); + InputStream inputStream = new ByteArrayInputStream(getBody()); + MultiPartInputStreamParser inputStreamParser = new MultiPartInputStreamParser( + inputStream, contentTypeHeaderValue, null, null); + this.cachedMultiparts = from(safelyGetRequestParts()) + .transform( + (Function) WireMockHttpServletMultipartAdapter::from).toList(); + } + catch (IOException | ServletException exception) { + return throwUnchecked(exception, Collection.class); + } + } + return (this.cachedMultiparts.size() > 0) ? this.cachedMultiparts : null; + } + + private Collection safelyGetRequestParts() + throws IOException, ServletException { + try { + return this.request.getParts(); + } + catch (IOException ioe) { + if (ioe.getMessage().contains("Missing content for multipart")) { + return Collections.emptyList(); + } + + throw ioe; + } + } + + @Override public boolean isMultipart() { + String header = getHeader("Content-Type"); + return (header != null && header.contains("multipart")); + } + + @Override public Part getPart(final String name) { + if (name == null || name.length() == 0) { + return null; + } + if (this.cachedMultiparts == null) { + if (getParts() == null) { + return null; + } + } + return from(this.cachedMultiparts).firstMatch( + input -> name.equals(input.getName())).get(); + } + + @Override public Optional getOriginalRequest() { + Request originalRequest = (Request) this.request.getAttribute(ORIGINAL_REQUEST_KEY); + return Optional.fromNullable(originalRequest); + } + + private boolean isJetty() { + try { + getClass("org.eclipse.jetty.server.Request"); + return true; + } + catch (Exception e) { + } + return false; + } + + private void getClass(String type) throws ClassNotFoundException { + ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); + ClassLoader loader = contextCL == null ? + com.github.tomakehurst.wiremock.servlet.WireMockHttpServletRequestAdapter.class + .getClassLoader() : + contextCL; + Class.forName(type, false, loader); + } + + @Override public String toString() { + return this.request.toString() + getBodyAsString(); + } +} diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockVerifyHelper.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockVerifyHelper.java index 9caee5b0b7..1e39534f70 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockVerifyHelper.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockVerifyHelper.java @@ -70,8 +70,8 @@ public abstract class WireMockVerifyHelper Date: Tue, 28 Aug 2018 16:28:55 +0200 Subject: [PATCH 76/84] Samples still failing --- .../main/resources/META-INF/spring.factories | 1 + ...ockConnectionFactoryAutoConfiguration.java | 13 +- .../amqp/SpringAmqpStubMessages.java | 15 +- .../stream/StreamStubRunnerSpec.groovy | 188 +++++++++--------- 4 files changed, 119 insertions(+), 98 deletions(-) diff --git a/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories index 1556b08c2f..0f3c598395 100644 --- a/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories @@ -4,6 +4,7 @@ org.springframework.cloud.contract.stubrunner.spring.StubRunnerConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.StubRunnerSpringCloudAutoConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.ribbon.StubRunnerRibbonAutoConfiguration,\ org.springframework.cloud.contract.stubrunner.messaging.integration.StubRunnerIntegrationConfiguration,\ +org.springframework.cloud.contract.stubrunner.messaging.stream.StubRunnerStreamConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.zookeeper.StubRunnerSpringCloudZookeeperAutoConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.eureka.StubRunnerSpringCloudEurekaAutoConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.consul.StubRunnerSpringCloudConsulAutoConfiguration,\ diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/RabbitMockConnectionFactoryAutoConfiguration.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/RabbitMockConnectionFactoryAutoConfiguration.java index e92f02bbf6..e7ef0691fc 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/RabbitMockConnectionFactoryAutoConfiguration.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/RabbitMockConnectionFactoryAutoConfiguration.java @@ -1,5 +1,6 @@ package org.springframework.cloud.contract.verifier.messaging.amqp; +import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; @@ -32,7 +33,7 @@ public class RabbitMockConnectionFactoryAutoConfiguration { @Bean public ConnectionFactory connectionFactory() { final Connection mockConnection = mock(Connection.class); - final Channel mockChannel = mock(Channel.class); + final AMQP.Queue.DeclareOk mockDeclareOk = mock(AMQP.Queue.DeclareOk.class); com.rabbitmq.client.ConnectionFactory mockConnectionFactory = mock(com.rabbitmq.client.ConnectionFactory.class, new Answer() { @Override public Object answer(InvocationOnMock invocationOnMock) throws Throwable { @@ -44,12 +45,20 @@ public class RabbitMockConnectionFactoryAutoConfiguration { } }); try { + final Channel mockChannel = mock(Channel.class, invocationOnMock -> { + if ("queueDeclare".equals(invocationOnMock.getMethod().getName())) { + return mockDeclareOk; + } + return Mockito.RETURNS_DEFAULTS.answer(invocationOnMock); + }); when(mockConnection.isOpen()).thenReturn(true); when(mockConnection.createChannel()).thenReturn(mockChannel); when(mockConnection.createChannel(Mockito.anyInt())).thenReturn(mockChannel); } catch (Exception e) { throw new RuntimeException(e); } - return new CachingConnectionFactory(mockConnectionFactory); + return new CachingConnectionFactory(mockConnectionFactory) { + + }; } } diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessages.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessages.java index bf2834f225..8c923121c7 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessages.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessages.java @@ -29,6 +29,7 @@ import org.springframework.amqp.core.MessageListener; import org.springframework.amqp.core.MessagePropertiesBuilder; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; +import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener; import org.springframework.amqp.support.AmqpHeaders; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.contract.verifier.messaging.MessageVerifier; @@ -97,8 +98,18 @@ public class SpringAmqpStubMessages implements throw new IllegalStateException("no listeners found for destination " + destination); } for (SimpleMessageListenerContainer listenerContainer : listenerContainers) { - MessageListener messageListener = (MessageListener) listenerContainer.getMessageListener(); - messageListener.onMessage(message); + Object messageListener = listenerContainer.getMessageListener(); + if (messageListener instanceof ChannelAwareMessageListener && listenerContainer.getConnectionFactory() != null) { + try { + ((ChannelAwareMessageListener) messageListener).onMessage(message, + listenerContainer.getConnectionFactory().createConnection().createChannel(true)); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } else { + ((MessageListener) messageListener).onMessage(message); + } } } diff --git a/tests/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy b/tests/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy index 2ee278ee21..32a71d28db 100644 --- a/tests/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy +++ b/tests/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy @@ -58,107 +58,107 @@ class StreamStubRunnerSpec extends Specification { def 'should download the stub and register a route for it'() { when: - // tag::client_send[] - messaging.send(new BookReturned('foo'), [sample: 'header'], 'bookStorage') - // end::client_send[] + // tag::client_send[] + messaging.send(new BookReturned('foo'), [sample: 'header'], 'bookStorage') + // end::client_send[] then: - // tag::client_receive[] - Message receivedMessage = messaging.receive('returnBook') - // end::client_receive[] + // tag::client_receive[] + Message receivedMessage = messaging.receive('returnBook') + // end::client_receive[] and: - // tag::client_receive_message[] - receivedMessage != null - assertJsons(receivedMessage.payload) - receivedMessage.headers.get('BOOK-NAME') == 'foo' - // end::client_receive_message[] + // tag::client_receive_message[] + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + // end::client_receive_message[] } def 'should trigger a message by label'() { when: - // tag::client_trigger[] - stubFinder.trigger('return_book_1') - // end::client_trigger[] + // tag::client_trigger[] + stubFinder.trigger('return_book_1') + // end::client_trigger[] then: - // tag::client_trigger_receive[] - Message receivedMessage = messaging.receive('returnBook') - // end::client_trigger_receive[] + // tag::client_trigger_receive[] + Message receivedMessage = messaging.receive('returnBook') + // end::client_trigger_receive[] and: - // tag::client_trigger_message[] - receivedMessage != null - assertJsons(receivedMessage.payload) - receivedMessage.headers.get('BOOK-NAME') == 'foo' - // end::client_trigger_message[] + // tag::client_trigger_message[] + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + // end::client_trigger_message[] } def 'should trigger a label for the existing groupId:artifactId'() { when: - // tag::trigger_group_artifact[] - stubFinder.trigger('org.springframework.cloud.contract.verifier.stubs:streamService', 'return_book_1') - // end::trigger_group_artifact[] + // tag::trigger_group_artifact[] + stubFinder.trigger('org.springframework.cloud.contract.verifier.stubs:streamService', 'return_book_1') + // end::trigger_group_artifact[] then: - Message receivedMessage = messaging.receive('returnBook') + Message receivedMessage = messaging.receive('returnBook') and: - receivedMessage != null - assertJsons(receivedMessage.payload) - receivedMessage.headers.get('BOOK-NAME') == 'foo' + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' } def 'should trigger a label for the existing artifactId'() { when: - // tag::trigger_artifact[] - stubFinder.trigger('streamService', 'return_book_1') - // end::trigger_artifact[] + // tag::trigger_artifact[] + stubFinder.trigger('streamService', 'return_book_1') + // end::trigger_artifact[] then: - Message receivedMessage = messaging.receive('returnBook') + Message receivedMessage = messaging.receive('returnBook') and: - receivedMessage != null - assertJsons(receivedMessage.payload) - receivedMessage.headers.get('BOOK-NAME') == 'foo' + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' } def 'should throw exception when missing label is passed'() { when: - stubFinder.trigger('missing label') + stubFinder.trigger('missing label') then: - thrown(IllegalArgumentException) + thrown(IllegalArgumentException) } def 'should throw exception when missing label and artifactid is passed'() { when: - stubFinder.trigger('some:service', 'return_book_1') + stubFinder.trigger('some:service', 'return_book_1') then: - thrown(IllegalArgumentException) + thrown(IllegalArgumentException) } def 'should trigger messages by running all triggers'() { when: - // tag::trigger_all[] - stubFinder.trigger() - // end::trigger_all[] + // tag::trigger_all[] + stubFinder.trigger() + // end::trigger_all[] then: - Message receivedMessage = messaging.receive('returnBook') + Message receivedMessage = messaging.receive('returnBook') and: - receivedMessage != null - assertJsons(receivedMessage.payload) - receivedMessage.headers.get('BOOK-NAME') == 'foo' + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' } def 'should trigger a label with no output message'() { when: - // tag::trigger_no_output[] - messaging.send(new BookReturned('foo'), [sample: 'header'], 'delete') - // end::trigger_no_output[] + // tag::trigger_no_output[] + messaging.send(new BookReturned('foo'), [sample: 'header'], 'delete') + // end::trigger_no_output[] then: - noExceptionThrown() + noExceptionThrown() } def 'should not trigger a message that does not match input'() { when: - messaging.send(new BookReturned('not_matching'), [wrong: 'header_value'], 'bookStorage') + messaging.send(new BookReturned('not_matching'), [wrong: 'header_value'], 'bookStorage') then: - Message receivedMessage = messaging.receive('returnBook', 100, TimeUnit.MILLISECONDS) + Message receivedMessage = messaging.receive('returnBook', 100, TimeUnit.MILLISECONDS) and: - receivedMessage == null + receivedMessage == null } private boolean assertJsons(Object payload) { @@ -170,52 +170,52 @@ class StreamStubRunnerSpec extends Specification { } Contract dsl = - // tag::sample_dsl[] - Contract.make { - label 'return_book_1' - input { triggeredBy('bookReturnedTriggered()') } - outputMessage { - sentTo('returnBook') - body('''{ "bookName" : "foo" }''') - headers { header('BOOK-NAME', 'foo') } - } - } + // tag::sample_dsl[] + Contract.make { + label 'return_book_1' + input { triggeredBy('bookReturnedTriggered()') } + outputMessage { + sentTo('returnBook') + body('''{ "bookName" : "foo" }''') + headers { header('BOOK-NAME', 'foo') } + } + } // end::sample_dsl[] Contract dsl2 = - // tag::sample_dsl_2[] - Contract.make { - label 'return_book_2' - input { - messageFrom('bookStorage') - messageBody([ - bookName: 'foo' - ]) - messageHeaders { header('sample', 'header') } - } - outputMessage { - sentTo('returnBook') - body([ - bookName: 'foo' - ]) - headers { header('BOOK-NAME', 'foo') } - } - } + // tag::sample_dsl_2[] + Contract.make { + label 'return_book_2' + input { + messageFrom('bookStorage') + messageBody([ + bookName: 'foo' + ]) + messageHeaders { header('sample', 'header') } + } + outputMessage { + sentTo('returnBook') + body([ + bookName: 'foo' + ]) + headers { header('BOOK-NAME', 'foo') } + } + } // end::sample_dsl_2[] Contract dsl3 = - // tag::sample_dsl_3[] - Contract.make { - label 'delete_book' - input { - messageFrom('delete') - messageBody([ - bookName: 'foo' - ]) - messageHeaders { header('sample', 'header') } - assertThat('bookWasDeleted()') - } - } + // tag::sample_dsl_3[] + Contract.make { + label 'delete_book' + input { + messageFrom('delete') + messageBody([ + bookName: 'foo' + ]) + messageHeaders { header('sample', 'header') } + assertThat('bookWasDeleted()') + } + } // end::sample_dsl_3[] From 096790e04d6fae6cc1871413ddb3b605b0a75c76 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 29 Aug 2018 14:04:28 +0200 Subject: [PATCH 77/84] Upgraded to Greenwhich --- .gitignore | 1 + .../get_dependencies.sh | 2 +- .../project/gradle/wrapper/gradle-wrapper.jar | Bin 54333 -> 56172 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- pom.xml | 93 +++ .../contracts/com/example/server/pom.xml | 4 +- .../standalone/dsl/http-client/build.gradle | 2 +- .../dsl/http-client/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54712 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- samples/standalone/dsl/http-client/gradlew | 6 +- samples/standalone/dsl/http-client/pom.xml | 2 +- .../standalone/dsl/http-server/build.gradle | 2 +- .../dsl/http-server/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54712 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- samples/standalone/dsl/http-server/gradlew | 6 +- samples/standalone/dsl/http-server/pom.xml | 4 +- .../messaging/stream-sink/build.gradle | 2 +- .../messaging/stream-sink/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54712 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../standalone/messaging/stream-sink/gradlew | 6 +- .../standalone/messaging/stream-sink/pom.xml | 4 +- .../messaging/stream-source/build.gradle | 12 +- .../messaging/stream-source/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54712 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../messaging/stream-source/gradlew | 6 +- .../messaging/stream-source/pom.xml | 25 +- .../example/source/SensorSourceTestBase.java | 2 +- .../pact/pact-http-client/build.gradle | 2 +- .../pact/pact-http-client/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54712 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../standalone/pact/pact-http-client/gradlew | 6 +- .../standalone/pact/pact-http-client/pom.xml | 2 +- .../pact/pact-http-server/build.gradle | 2 +- .../pact/pact-http-server/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54712 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../standalone/pact/pact-http-server/gradlew | 6 +- .../standalone/pact/pact-http-server/pom.xml | 4 +- .../restdocs/http-client/build.gradle | 2 +- .../restdocs/http-client/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54712 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../standalone/restdocs/http-client/gradlew | 6 +- .../standalone/restdocs/http-client/pom.xml | 2 +- .../loan/LoanApplicationServiceTests.java | 4 +- .../restdocs/http-server/build.gradle | 4 +- .../restdocs/http-server/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54712 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../standalone/restdocs/http-server/gradlew | 6 +- .../standalone/restdocs/http-server/pom.xml | 4 +- .../restdocs/http-server/settings.gradle | 2 +- .../http-server/src/assembly/stub.xml | 7 + .../com/example/fraud/StubGeneratorTests.java | 2 +- .../webclient/http-client/build.gradle | 2 +- .../webclient/http-client/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54712 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../standalone/webclient/http-client/gradlew | 6 +- .../standalone/webclient/http-client/pom.xml | 2 +- .../webclient/http-server/build.gradle | 2 +- .../webclient/http-server/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54712 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../standalone/webclient/http-server/gradlew | 6 +- .../standalone/webclient/http-server/pom.xml | 2 +- .../standalone/yml/http-client/build.gradle | 4 +- .../yml/http-client/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- samples/standalone/yml/http-client/pom.xml | 2 +- .../standalone/yml/http-server/build.gradle | 4 +- .../yml/http-server/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- samples/standalone/yml/http-server/pom.xml | 4 +- .../pom.xml | 4 + .../gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54712 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../gradlew | 6 +- .../pact/MessagingSCContractCreator.groovy | 89 +++ .../spec/pact/PactContractConverter.groovy | 4 +- .../RequestResponseSCContractCreator.groovy | 187 ++++++ .../converter/YamlContractConverter.groovy | 536 +++++++++--------- .../restdocs/ContractResultHandler.java | 8 +- 88 files changed, 779 insertions(+), 403 deletions(-) diff --git a/.gitignore b/.gitignore index 0f74b6cf02..5eed16c58b 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ hs_err_pid* .gradle/ target/ build/ +out/ hs_err_pid* .DS_Store diff --git a/docker/spring-cloud-contract-docker/get_dependencies.sh b/docker/spring-cloud-contract-docker/get_dependencies.sh index 520e770abb..3da068eb59 100755 --- a/docker/spring-cloud-contract-docker/get_dependencies.sh +++ b/docker/spring-cloud-contract-docker/get_dependencies.sh @@ -2,7 +2,7 @@ set -e -WRAPPER_VERSION="4.4.1" +WRAPPER_VERSION="4.10" GRADLE_BIN_DIR="gradle-${WRAPPER_VERSION}-bin" GRADLE_WRAPPER_DIR="${HOME}/.gradle/wrapper/dists/${GRADLE_BIN_DIR}" CURRENT_DIR="$( pwd )" diff --git a/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.jar b/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.jar index 99340b4ad18d3c7e764794d300ffd35017036793..28861d273a5d270fd8f65dd74570c17c9c507736 100644 GIT binary patch delta 49550 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�+Gx{*kf_AxL(aqM6p4&auN#{EZ{ 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 delta 47688 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 W1@bohS90hB3#`$>jr9Hg?f(FY?$dw( diff --git a/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties b/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties index 2c2bbe5f9a..115e6ac0aa 100644 --- a/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties +++ b/docker/spring-cloud-contract-docker/project/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip diff --git a/pom.xml b/pom.xml index 9ad5a9e448..cf35a25857 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,8 @@ 4.0.6 4.6.0.201612231935-r 1 + + 2.4.15 @@ -228,6 +230,97 @@ pom import + + + org.codehaus.groovy + groovy + ${groovy.version} + + + org.codehaus.groovy + groovy-ant + ${groovy.version} + + + org.codehaus.groovy + groovy-bsf + ${groovy.version} + + + org.codehaus.groovy + groovy-console + ${groovy.version} + + + org.codehaus.groovy + groovy-docgenerator + ${groovy.version} + + + org.codehaus.groovy + groovy-groovydoc + ${groovy.version} + + + org.codehaus.groovy + groovy-groovysh + ${groovy.version} + + + org.codehaus.groovy + groovy-jmx + ${groovy.version} + + + org.codehaus.groovy + groovy-json + ${groovy.version} + + + org.codehaus.groovy + groovy-jsr223 + ${groovy.version} + + + org.codehaus.groovy + groovy-nio + ${groovy.version} + + + org.codehaus.groovy + groovy-servlet + ${groovy.version} + + + org.codehaus.groovy + groovy-sql + ${groovy.version} + + + org.codehaus.groovy + groovy-swing + ${groovy.version} + + + org.codehaus.groovy + groovy-templates + ${groovy.version} + + + org.codehaus.groovy + groovy-test + ${groovy.version} + + + org.codehaus.groovy + groovy-testng + ${groovy.version} + + + org.codehaus.groovy + groovy-xml + ${groovy.version} + diff --git a/samples/standalone/contracts/com/example/server/pom.xml b/samples/standalone/contracts/com/example/server/pom.xml index 2d9d8c745d..46e83e1cb4 100644 --- a/samples/standalone/contracts/com/example/server/pom.xml +++ b/samples/standalone/contracts/com/example/server/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M2 @@ -21,7 +21,7 @@ UTF-8 1.8 2.1.0.BUILD-SNAPSHOT - Finchley.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT true diff --git a/samples/standalone/dsl/http-client/build.gradle b/samples/standalone/dsl/http-client/build.gradle index d94f4e1306..632fc1e96d 100644 --- a/samples/standalone/dsl/http-client/build.gradle +++ b/samples/standalone/dsl/http-client/build.gradle @@ -7,7 +7,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" } } diff --git a/samples/standalone/dsl/http-client/gradle.properties b/samples/standalone/dsl/http-client/gradle.properties index 57ed1c5339..3e2eb84942 100644 --- a/samples/standalone/dsl/http-client/gradle.properties +++ b/samples/standalone/dsl/http-client/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file +BOM_VERSION=Greenwich.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/dsl/http-client/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/dsl/http-client/gradle/wrapper/gradle-wrapper.jar index 96d36c23c86687e8c46a94a1eb0be9628b80422e..1e5e33908bcc211c3abbb13f57ca54c2a8d78bd0 100644 GIT binary patch delta 19272 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 Xaz!Elx%ZeF)`&F{4BOz`Bz^Zk5`*rv delta 18746 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 UTF-8 1.8 - Finchley.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT diff --git a/samples/standalone/dsl/http-server/build.gradle b/samples/standalone/dsl/http-server/build.gradle index 596cdefcc2..cb9fdbcf70 100644 --- a/samples/standalone/dsl/http-server/build.gradle +++ b/samples/standalone/dsl/http-server/build.gradle @@ -10,7 +10,7 @@ buildscript { // end::repos[] dependencies { classpath 'org.codehaus.groovy:groovy-all:2.5.0-beta-1' - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${findProperty('verifierVersion') ?: verifierVersion}" } } diff --git a/samples/standalone/dsl/http-server/gradle.properties b/samples/standalone/dsl/http-server/gradle.properties index 558d820385..88a97742d7 100644 --- a/samples/standalone/dsl/http-server/gradle.properties +++ b/samples/standalone/dsl/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false verifierVersion=2.1.0.BUILD-SNAPSHOT -BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file +BOM_VERSION=Greenwich.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/dsl/http-server/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/dsl/http-server/gradle/wrapper/gradle-wrapper.jar index 96d36c23c86687e8c46a94a1eb0be9628b80422e..258e37c4e6ab98b78a9af1bc01e829bbe5a41815 100644 GIT binary patch delta 19272 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 delta 18746 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 org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M2 @@ -21,7 +21,7 @@ UTF-8 1.8 2.1.0.BUILD-SNAPSHOT - Finchley.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT diff --git a/samples/standalone/messaging/stream-sink/build.gradle b/samples/standalone/messaging/stream-sink/build.gradle index 434697f360..4ed306b40d 100644 --- a/samples/standalone/messaging/stream-sink/build.gradle +++ b/samples/standalone/messaging/stream-sink/build.gradle @@ -7,7 +7,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" } } diff --git a/samples/standalone/messaging/stream-sink/gradle.properties b/samples/standalone/messaging/stream-sink/gradle.properties index 558d820385..88a97742d7 100644 --- a/samples/standalone/messaging/stream-sink/gradle.properties +++ b/samples/standalone/messaging/stream-sink/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false verifierVersion=2.1.0.BUILD-SNAPSHOT -BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file +BOM_VERSION=Greenwich.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/messaging/stream-sink/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/messaging/stream-sink/gradle/wrapper/gradle-wrapper.jar index 96d36c23c86687e8c46a94a1eb0be9628b80422e..3fc01f47421d3b3e927d14e9bee8b82ba161c7f0 100644 GIT binary patch delta 19272 zcmZ6yb8u!+vppQ!oOoi}wr$(C@k}zw6DJefwylY6+qRv2^LyW0_0_$9oa(M!y-(Gt zT4(j{?zR7xfVWnFBPq#(Ltub_z`%fjfCz)cA(12gKMP|>%Od=5MI%l~87KV&=LF~0 z<<|K2PNGUmwRnm~Xj0;cbnV2no$ zU<-k*T)p~Z{O2xG&TkHT-D(f{MiS>5L|p`S(LdGqINSA_-_zphxW-WsB=L4d0*xCF z$pvc(t<~C;01wuVqSkIhm!sKfT>`@!ejV$IX&~n{uO^38>^_7as3p$<*{`yRJb1pf z8>r;?A}oa3!hpxOvOmW8?#xuY9*|NCARv#0TFiEcRC-6OE;4a42+31w`sLXX#8uR; zMqg9p#foBJc&i{ubscgM8h9`{*#Jp{FixN6N!7)u?h1BqK2jUUxUhYXya6BbWRXCF zb;a__m|w8Pv&{r57C-5S%P|Vhh5o84;_V#geu+X}e%#*A5b<*77&_o!^HP=xU^wcd znKm)R7b)WA1pgbXqz#H%n~JwJ7P`1!6h8Jx#J6WELYiQC@vp@;bk@Sqa8P93t*hLM zL1NLljmY?c1#n=MpMOw(5>YcvNCPpDk~Qo*H9b2f4u;;=zPen-84YzD`^gqz6^H)G z_Q*%`C@P%&%@#kEF(Rx@+=opT(0D&G2jAEC#7ts168=-(*6+thSY#s)DVUxfF`g*Y zsSYO zNhhWrQE?U0E2mRhrK|xOq+U>Tg;|`!2h{&Y&7WJ;DL7;#5D*G{5D;RJ1mywD1U@_% z0E4NWv8!vAHoOtWvOB-x+9po41d)bRto<8p>$&@_ zfJPmAjFRTZBmXP^=WgHWuIui{ zlb6gu!vRL?7jtkZhaX;;JtjMvx8AEC>4mTEs~^C?_1kpd_QH)WRQk<2RNo5$cu(YZ z!gvp3hTzOCBsd^UFn*F~{3sHtJ6MqUrsRcn^}`!c++Tax@W+enM-s5+opnJ>p&T;Du5y+C(5>=50m6R^4*yfH9ep%SIuu1y@G;2a6Bw z_1gs1C|qm7QdF85P18ANW3Jk-lFQOR+xJu_X> zl&9C&C${?HRY~cUnXAkIVw4k4^o34is?!zHv^ME=UTgW{1?>%LT6SY^Y3?aSsE<`L z`7Uerq_X^ua*ORr=j{__hjf>$(*wDohH>TG34=|V@CPx2sK1j{ZT|S{*MvlP6W8f( z9mwRW&1=dHXs~5)%#E3eO42LVf~N=1)rM2Dp~!ma^~Z-KX?XAe7HER)Cwy9Qa~6Yg zyJh0~Ma#M7WnR-`V`)i6i{cV;k@BerWg<#eP7B%1b1w~@VWRph96)k6tx@^*q!cm4 ztFlU5w~ZIocnt+m;D`o4>L{Ke$pqHu|u zvaIg>Q)>#wik<~vmEdq`|284rs)$Udby|k9WUQ;HAm3G^oNm)h4s+P8mTfne^^%2K zPRH8!xf;|`X7_z*39hvaqbi!UImh%4Xb)H_I^;;4@qTiPm}_^nE#$Np*UMdW5q0!t z;1ckTk((QKxvJjZ`gK?oA79=UTn>`~wwsOC_ven3_gn_RrFMm<0)L?0@0B%HNViSM zn7*4lwxtzdVa_3G&g7rXYv9IDNZx733n>@aRE6oubg&V8NoF=xHHmnK<2X5|;>>VR z>=F~gzyg%8v zS$RF}IXMpC`^mmMfTY^E%N0+oxhIJ5}8%pD!O642irL~ z0Dap??GfIQ8UUv}TOzWgkT`_&yP8cjkwF@@!@NNf-7{m4aMpB>)N5z}-YX9H=ggC4 z+}5Oq`U>-1uFi17G6Fnb6Wzb~1RI*2*(gGEua+7RBQ=;EkF95~aswJEcRBhvyT(L0qp56mRy z+{7hSIp%+x$x`C*&B`eoRYs;J?CCMSN(m5E(MtLmQlzQ${unExtP-^gK$uQ5QOS0Z zA(JzXv_3)~T^Fw_s}@L#V`Dar(C(G9rYi#AQry;;atv}i3&dusJlTuKyy=y5pB}l5 zMbgM~rAwumDBM8w-X?_dz%pr0Fc#3(a;T4pfGKnPmYvV(mD{qMlC>l0bRRNKtjqPf z{c5*fns5adEYTsV5pxWDb+K+>HjoVP)DNViAnaJbYIcN*t>8v8V^2YN+lXIoi|6y$69?gi=x{IC|G?c`V(flf>sWY{)mDQY) z*4GEK$!}UIjS>zIqQ#J|^&XiCLV=0l{R8~30lr`AOhBk@e-l+Q~iFoZ5NOSWsNfW8k<5f56S}v=s<0A?1{_NnyCM0jF zMYzE<8)Ru~+XK5~AjrUO_~fP1MWORor}{)z+u?2qDsfA}j17O>c8GqG=fU2%4<6vh zyzng!8l~kIEF^x%@_V(FmMuab^R!q$TQTnJz*fI0we+<8wh>4y)$@rAF4lLPx*LyC z>Q%vv`BTz|MaF~x`tL|=_m?}}37fp{)GT5E)n?y!1rYcBohCPFmeQbT5a=(D+iu*HPl zK@_5DC73`aMZb+8vfYm1tX`X-LFSRKDDpzO3M}(bmbzwl#jTNuwRA9howIcApJ6+j-7C;IqZ_LWr2NJulZ@A zX`$TFUiMOFgGcjz%W`JxNm?ybw_(LuMt;rLh8w*-u=b;o6E8*gOdzBgg@@F~-Bljz zavE@+6%qP$9tGhj6bsRCa@HBxJVn=@GrW`y96L|fi)HKl2eP@RO@62JKQE0@>_(KpeOfOJ4R+8bBreZTp z1S~<6&iIN6XXspkImNaC*$X+OkG5g^@LbW1y9nJ;4KHwnxmeDAS+3iEae7;R!R&z= z_o-X~IN8gFX}zEWej#;%6Akf(t4E_T?nB=)h#Uflp)%{!uMkm9IB6y!Od z-l%}-1J>EE<|pwD{<&8gFvj3(>yk=3pKM?meosowHO#gz!TVn13Q;#>B)I*APS=OU ztfW{<32LZME87a6{Gl;{JYEsrGqX5dQRC;}%DQ1x*QZx9u#Dt+^QBaV6tb$tC0TJx z4;S^FihLl6();U+4hhLK7`mPdLqP8n2OltM;#5fLrxp_n$rYo?X-qY=nk`iFv)2iW zl)qQ%C)&Z8Q)fHBA77+0T2yBcy5yN# z^HJxp+MSme!K%@_Ms+vhxp%2UaUx;9W7JC|s`GJJ+i+ORa5$TF{`=|cW8n)|oB=@o ztm;Mi2`p1PmZ<;UZH+sfo%5NC;B)^4_Q@owHpfh{xS2BY$X_Kb9-HOx3!?z2mDm${ zz7(M+tVIAB!vZt5Q4Cy$>3UYCf7?l#D@ zK^MC0La#nS^dXNbGTDtPQt_>p(mtcq25RyBRb;{{Nin@u3g)Lrix_--(&}Vh=#@B+ z((hkLVp$OoZOSeZAv$dOWZv?dMr|fKCU}8$PbB3Ixs!z5#b}6atdNccsK^tLPlR=q z$Ds8Jn=M{qlV4!3!n@>bwhkGDCFZEa3r1_Jlc*V|uOdaafAkng^}PuG@3L}1fpIhM zU&~_b-^2X>SCvXGj+QRwuC8*{u5RWI<}UxOGTozl;ev!P#II@RZ7{{gpTuWo+RahP zMB)|#=0d6WMkZ3fm-3NM3P_@xHwSkekd7Y%_&_U}Zg#v+&?)N5BlSkP8s{`DToc6m zn2q`1S-ey7jcBJzKG&X)vHO_Rl4874j^t7u0B35-6=Ds{!Zvi+l_^!yT2xtKV&hzv z%C_3cm4kvIOm9bb6pTpAQKaW+Fa(XHp)(=#0uQ(zI|2Wv(-IKIglYf<0&)ls0>b*= zk8?sJ1E3${1PEx)t(~)TAaS7%v(JdJtOPv>(R7eW^s4=It#{rJ7Fn7L?ec1>sMh!; zt0*nIR%q`dvj%jT&p0BPPqUyvMVSuPYhvwkDCx;fX*-p-^ih8E>!^=IZbhGd;q4AR z_TN7C)dYNAOA>)|1+VjD_q8GMg~PJT*>Kg60%E8U4d>$qxSPC%tBTie^V1DgD6toA z+}ZWi`pFR)Tl!VTaR~USPTAC#ey%%f4{MNjV>a*{8C7J^@*M3p7UW;FUEc604|2M_ zl%B#UDGGhM6Zu!8YdXvKyCcHmc2m!&@?{BnTURRad06j#tZ3~*25#+Po|h-N(|L06 z0#IL?d3ot(lAbqojM{n=4;PArB#kr+HIavG!Sa9BmYs1c^dc4l7F`yMT?RZZcfy27 z^r_5>A@;m$JgRPsL^xvbwi^tN|@1GnR_r^65$jNS=Z!qnG!4>BaC|* z<$6p4^aiw$h>7yqiL3A5lDYb?kx_OAIs%UGVn@_c{N0DiT{0K|vS$0$wXI%s9IOheuL`% zeU1A2}Jim|E0-#7{|JaALY%%&I^23DmwT z!jx*TDI-fiBnL}N;onwkWMM>4vEGr4D_BO%{3{(uNhnSpm%etX`@DJ)Kng>A`#Y5jDh<_K87-Ye+VufrZOjQO9 z$KQ2!bCm7u$zlu&cPOy17F^sCg0C_(=ruAbR zmo9SX$sW-g_$ImWi85Hp~wY8$vKBAYh=w=Mj*`29CUq*dv9 zfi5O_SR-&1M>^FdrPE&x#gR;5wUfCyMCT)@DDM{^}#}_^40sv}-mYPC0KO z5|7{h^qfz$R?WEy&@Xc!g% z9_%32suE+O2S7Ch_n z4&t4(hltv2Js|NcZurB0MxLZOoIN=dqZRq4xDjTCvLw=j6aDm<=cx?WlPuq7 z{Go2?zoy&b?1idZ0`2>LwR5XSl4P|LuE&yO_Y)IN;Ki2);Elbm0*k~p>v7M}-1EMJ zZf;V$_=xnT#(=xB+7WsFNo$1P8oCL_%|8gv$|j|jClBU#^0VlhdbzDz?)Wovmc(kq z^6NWXQJm9tg`T4V#~c+s&8f$5a-y+(*|ri>DullrQV&=*VDTd!~pn@W62Wf$C7^D z+)swL79+*O*l~PC;PJ8Ogaq0AKuLw7lIl0zvDS;)S5$SN?+WD&!`|StH-3o`_NK(q z+aDN14SdGi4-!X)o7K(@lWx2cCmr!=F=`acZ|MJ>XCcabHub!!O;F+ zd;h%BCZQM(1cdDe2nfx8^V9SQRD%BqY683}BEasq9TN$HFbJbvNL=tr@IoEp4>LSF zQxho>q}N(;vaC3TC<}Ko0_luqH;PSGX-a9`)#!vjQ;nwz&s(&czOmmOyyNw5zW|?* zf}8JKEz9o)*&oyWv7jqIIm%Xm9qM)ivIlo6ZJlzx)|ljIdO<0)ULiy^5Busa&o-Df zy#W4zjq_n!%uWUIq=E9j^TS;{wN6w=l^Y98cBB`2n&$ng_~Z41JCC+b(Lw)K!(MQ> zt<&KSvXf1kl-UvxNuvK>{L<{fFwoFU7Pm&(G|Orjjk z8_3sJaqpKzzK?jbheRU7?c4p1_q5KV5n#1Z)Vh$sryjpQ0US58t_IGZ7j&!O`BZMT&;iLJoLPfBs{U<>lCvQA6K zNPj>s8YrpyCba>RBXzpJFG17U57@f$^x*fQlP>Us{eq*b7SytIginB!+iN{xkub9TyXdCUr83 zYJEY77aBE|Z*j+kBON3Q4-2JGL{C~rNl6ncJj{mUO?A|YY5Kt@w&o&n2RI4q{;B^r znZe~^T&vE@3yR^=&FiwDo_7-Bk}f)yG#xW^k%drs7Us-mp!{n~>Bo3THODIp)&h3k>%N?HnHB>< zJP>nhd3%yon0wq36k36t9`I>4_2X1VbK*~&%(|XUu{lQKo-=fB8FYC(%bW!TCi~j_ z0P{oe-~3F6&C%Pa!(YrXE3Anw}GQdrtY4!i;QT!QMQYbUDn&D5BF8JYxvUgR|WameY_h#wqb`4iFXoxw6!d@7MhEal8q0$ zMV9f)vU$Cj`srjz3*gIRPqw10igw+jcLKKH{nKzVJGr?v?iQ!kZC#6afUj65z-LA; zwBEd!UZ(jTb9Y`WoN6(+FAPpl9o@V&%l<$I$lD~5%a ztx2v9XE&*$04#;`1dfmNU$W;FZrX{QI+Nn^qOnSd)E#iYv{2<6pd+@%T&@;$F}V;} z0Non+*)GvF4IwHVX2V}k7Z(_0~0Xia`s#_FC1yK$Abe%^ZqSg7RsIKryogVQSBKR0C zqU;eNeYwTVD?L^p!5%|e**qRYBw=aBbv6vW8hAHtTxX@2N>z2Dhr$R#N zVLQG$0a0BHA*Vyv-aHk<>tGoD%|XRP4`axRs8e10-be0?D=rLA_>*w@Gbg?EH`$w` zYT@IzCF$H=yEwI6zb`fxRV#TZkIdV;I_VHAG*kNXl39lK+wo;otO@PPa#VkG4K=s7 z#m#+`<5-1ua^d4yXAM^TBFLS0+oG>1si2=+0Th`ml{pb34OVjr0{5X`$6SDn0y7b< zQz(%lVE!zxFxuYC<&3Dbq^ zuMvB|TV&3A~zCy8WOewFl@t`(7cEOh`U6UXU(v&{g`P9$?z03axLE z0N@=IW4kNDnSiC0uFADHLs8OnY;2(Eahrg%HM;gSdWX z@9rgs|Gam5H1q0N*;|O$@l~I@YyZK06q4)ramX@Nhv^b8hewA8zu6g+yfmwiSSn7MTmYLF_g`x~uej?w3asyuz??D{I zGPQh-Ndn3I1HivoM~f2ik@kM5C{a~p^&kKENNi4vZ9r(tDmEB)4!Y&C9!EXdYfLs-wClIl@*!@QI^k&r`WYb>s-_V`sCHXo|cu@ zsnolJ^#fDdz10;w;RILX z8dSF*g}?n5pk-HkW0A>gddPLenmb)T)v!BOzbeOqN%namM2f-T27sR;x2ZR)Cd+DH2a;BPtVPri0yb9#mJ zj@=qzKGT1#|5RhTD&d3mK~sQ;X$RRPSC%9<#x8e3;lnKlFzkJ4VGi_UcK2kpFKUWT zoEeB}`)%-Nvz%bM{~p#*`UF08Dk$~v;V=B9RgrUv?K2^7`04DBkT#a@m2h-I^Tx$w zzM&5Q4V;yG=b%iS4;F{coOt4(53b`EnJ2tw+eS<425kwGR54~EQ=oqcj=L&hicCtR z(X4bO_BZnXKJO-Q!X5or)uKa!0{tI#Ocs2b5E(iM$WsD9kQRV>*d$2#d^9yVSqmxB zT1kpFO6b8xg&Y5~j`*iB^Upmp&-kbf@~JFYv~vw24V}w;_ZCdg(js*=G&Y)M_vJO6 zs^+C7OI!cT3jZ3%Q{Ng#>T7_7gM&l7@ZWFG5FU4lt*VF zT=Dc=Ht)IMyBWZNY{A%ZD@xLxR|w@x*meMe7;!e0X+j}2%&l2AiM(-GiHmZW!@l)g zFlIJkJ~f}{(X^VE#vjX2FC<&I9JKsXKF)!XJHAuuR`O+J2H~_XC?T356&rX{2_jZw|ZH%uqkk<}36fZ)!#jx7o9 zoY>}&BLuK6+8Dhagb!PfdVmzy!W!GLf>Ff)d#B(nA)cDrcZ=fwH{J^Ebz?F`#*{h} zVOGK6&rotWb%-bR2710jTE>on_6%i&0oLC1{o$Q=Tclm)s z**)BAZfXC?fXDj7E!#3F<|kfu z?#8N2&w;AhXc^0zl+8qKg#qe2ZYMkXOaY)BW7{Gp;=DMM$HQeVV)B)dP3g8etxr~q zvQ|-3tC_}Cd$DojjJ~qaanYll#%qAf#N5?$)WOLEx@!;|=}tPl0_g+M3v`poF~7hz zf_k6SFpehCyc|ZQXo?JG_s>~;(pClxN%>ZH|4fGylUcOQCrJ2?v0QeaHT@;|r3G;G zz?Ih3@CciSXXV4)-=xNKL*xf4198CY%VLlMeWse#!prBb4r!a!;~%K=K|JW2m_K4Q zIMZUXRV78bYkXmz)=JwfV-A{CmH<~S=8BSr`YE&Btkm7wIxHG%`!>J-s+m+{8;N#p zDx4}0&wG!GjoEPG^Bv=LZAx_5i)F?cErejG&3EqpsVX;Ysq}`4w=cLnip6zCI7qd+ z)0voRbts`Tt%R4De_$GIEHvhP08?w$a_%x7oG?@Q6{UnLZ{JWWXTcN{fDOQtF#DY+ zxsjRLNE)7)1)AUQ+I%T@BN^8(RMLU?$~9hkUKMP%tWM2(rqY)!kua?A2h|i} zYS}!PqMQTs{z^)2 zQ%#{8EruLfhP!qeHgi7kKoKzBuaa6yraBb>>V1o8cO7Js3~Hsgb%gVRN}QMxVQ3+8 z%bi`9cp0Wg>Y(e7W60$(G-q>A2!#_z1}SOg@(W@LCC**@GyXU@kvhX)8LJNHMPp%x z)-;VePQ+~1qQrnF<0o#~Rzl2^$3MH7lJq;ZT!zmzp+${h$%sDZHwC~@jShQ`AaY8# z)(BKJ;W(MSu_w!oX6#h|=cI@=7Gi@ARb{8=FtJAVyMA#g4oRaFOqTauaD8Mpu});H z;(2SEdDs$Kp1L1$?0ZrtzVBjEShNi0zHnOWWg`P%cV@E@QdDy~T!jcA73)ks} zcxQUHCi%RYPqu;5DLCNGH|fnQiQOzekTlp0CjW?;fn6dN$hQEA{up25$vAi!) zJoi?-U7={xt*Wm>y*s(5^v=Cga+h&*I7PiX+fnJ2)(^b-*p!ytF%RXve9UmaMl{3@ z5p|N@)`nKOkjk%MjPsTgWpNd~-UL(Z1Tw@?;}xr0{c!!oBMET5!yBj5X$uu{t@4`j zL7#Me)J3!1|19I0Gxi(_gaeAl|niOW;ZlPONxH3+kTQ0^--!ZqKq`GJ|IJ)krP5t4Y z1o&x0hl^)x9ibCx3~nsil)1#OH(^ZxTOpBf@}Ac>UGV{SO%$=ltd2kRLHORtTYMM! z5ij*v&sGyvt5iIu`l`P5+eG+-xb9(XrZH|YeGE`D-ng1$P|KXONUky)hJH4>PZd_> z+LLz^tNsPs zQ+B8LN+0#uYMwjhct5Qc5V|dnc&7bc`oR0u*4Lx-$}c?3`1(mK8(TK3_J!#;(Svm{ zfe*Nhawm;wv0kO-_Lcg$32cSbogq3!4-r&*<@Adl>p5JH(~a$-%zYv_i~A$_*m829 zI4YX$zL9dsx-h0vkj%z0=K2L|0F!Gofa*&28BShQ;0RG1ou24El&!MoUA`1kf-@hJ z&<6S{w+steFyNtpg!2fbokck^cfj%h90BSr3l|l%xUYTaa!aOJnzEtMp;uSn*HuSe zoIBc)`lN$nTKAneHL1AvRT)^EjDT-30k<9}Ju~}820ob?e?|#U;ZI>=!;D5f^$^<+6Q)n?*bHkX78QF9Q%w_0(t zobP4P^xcLFv)F&thi-SiOO4q>Iv^%gKX!jy+TYuSk@S~GHNVWTUh6@|=v!V8BFPCV z*Zso&wrAj=*oj)nFuHT1i?U`}895;*h(b5S8U1klDiFW>C6%pMm4jllvF?#)I2}D` zdInPVC3RSX+mRANLxIX-P)S*%8P~gqYx3QRQAeJTP{t5l+EJ;mZnO=a2XJ5bhxMJDhvj>B1XpYK;8(F2G8!dZv@zkTE1x%2 z>CdPwcYAD# zlA1Hfzrpz@jd-J{t$3rCxny$2jfZa4%r4K8&fyoMP{z|y>~kU($9NB@A}6EAV1yCl50uy@0%}>?z#&cgOdVi2sy@W(u1GC!Zu~lt!Q)W z5E(lE9L;#7D`NL5@t(NZ{N^TcW58()RuOK=3`pPx}qlkkO_42 zP?AX}P_3SmUys{o<(W+VPzhJ4n+`=yi@U(O0UW_&3#pHU zTdNI7STHPn4f{|YgIRct;#2Q_Rub5#F#Q*-uPN_Nyqvb;NA4LepeQ$>H>>f-FRj)h zqqw~=gRQwU$>F`^rH!%VC7~6@@`VEd30Vk5+0RhxRi}w5_e>Ya9|q#DVZ+p6BTV_X zZZH6(ff@kxlcST#&tC$VbzYDVqmpENrQ)Re~~89Rc*-gs_%WV&S~c~KP$ z8D27#i%4@WMz3zLSFBgLgI)`4ngSgY*Sg8NVOFiNjbnWq;_QJ=xj7me!ZzYuH)L69 zqPiZ(V53B82=5lnqBj<$?(lxDv`I7eFz4&UH&p;PjsaY_8?@X{P)ey1C2oFM$=U#1 zr?1T4?Kn55&$r36edZXI^6$(rHhW!}QO_IMq9?C`rfWod*WNz8@+BVvtp|DEra#Z< z4kCX4R$I_9sCD@@WiUSZ+fBiC2dCWr5wkMr9PVs~>!qgK{1@)VM>Fm#Vm0rx0?$8@ zKTaWlok_#A*ZcE<+nJ5p8?u2XLqzN$(qs|6nW!<(vD4% z|4bS?a_@YAifxCjjJoD)^yzC{_g;6(_X`JrJZmE6k9brgGSNcZ=ZkWzN!nc_DR(VC zz!yffg3N>5zZJXp>8$mJVq%Ko#0U1X8+qpwsTOV913Z&IYzX_5TAx;_IP$8A<^Sf)i0C^ujZXp}w7rKO;U{ zzEiJ{X-EP4YL>TDimmKV><_oo5-z2;rJv*=w^vK3rr>U;Alg(QeF3L3KyYw?8T^Lo zyHzIqhng05{q@OYpIeF>R91`A&4{p7BLQCOA({KSH}DT~5kor?`>cCG^N1(&8=-vg zma&xpGLMGPc*BXP*+i_+sp-rcKlurA?t|}w@i&Z4PHy!pI+cHr-hg0yN8vqb&0L6H-$w%zY zp~dR?ETs{3_JO4Pte!!5dA@tvHv_Jr^63Hw|9i|AZ0(6SUx`GD>vz!8cHWbr(!vKe zTt|<{$@i2Hm>4SwmT2#1OxU2(EvaQn#{R{o07!Az*Xn2`4k{(o>2xmODq`gqcYdvk zMobkwmtG${RV8M z6ViKURPR<}tTDovu`+$A>*>7$)Rb_aE5KpDtQ76#8}xrS-5R18W5NF0bwkF1`X7%N zo(lTEYd!=U5dWDwPaqmd#Qhsazy8xk(f@buj4}Y-5cN+>@!v=qP*~XicnJcgy8m^u zOleX7-^}{Y$U`#UzrCuE{{&+R%3in$pL4hk13eO8|L!IUgY0?_G0FYgaSWHB;3Wpo z#8b!kQeZJQN_7b@#LUC|vk+W30AJK3J)5Y4hlni?X>EH!hSN7=MlmJF^Z~oAKkjL` zo}#QLtC{mj@P*`_BQ1qaF_%cLo$30N?f?3;WqF+@`2BT>402sSyo)A)bsHWWDRqAs z6Rf_GR15UY{7B5Xk{#J$h0P)5jdBOrA(*1;`n{T<7|PrbbB00pr~cKX$u%c53TayAQSRw=8njZQDqNrtChq0JDm&t};)rV)iyw)+iD%JI9- zM{Hkw_~+u9`VsaqTYKat_Hn6)i+8nWWN{}`S0?6_W0kU628=jg@!3&hef5fiJHYGG z@9C7oN1^ul9qPcw0Sjp%KP$>d8=>g?tlpq2i3i(&^IukXz*_Xhtx*P4_9z$}G@EsX zO9SiXJ^sm*ac~+^QE#K8Jmau$tD-1>Mst4^{>l$S1LQ}nBq$Gc!^jVTW=E8cl!~Mn z=Sp~fG)G+v$;0Ac+2Oe3-yQk_;q`CF!b}3ISK5xyLOyZRo@6|wiY8sU%FjIB$5=%B8jQymAi|nc?q~GXbih@jqZ*`Zmw!W=v zIb`xkKK8Bq@pmXuZp~gA4PN8XZmvI|nwC-v+m?!Em<4_tFifhAZ3EY8H=i#=eO%8N zWBq49vx2ft$=N!LpsoxhMC z*f)Bw*Yf-umNM*G87HdN3*-eifnRFA`(JY)6XI4&H3-8#+)o%kw$^t$+njyg(aztm z$+Ni9@76uI@E=Iq)qvhW!4}#XiUWLzrF|r*rG2poBq&b!%s?EDY64M<7gSrf*1tDk z-MW2+DEQ7y?f5W|0exPXBXy=x?{)XA#bI}$U`Rm;B2+*5oNpw~X9atPa^j$SBH!SO zFcPDg%uV9zZ-@_xzl=H^&OW3U6aFIe@}rqJM58i0$PUV4rrw*vwxGjb#QyOAIU;$==Q#E|Uq;={4 zT&$&ZIr(q+dS*QMf4v%uoBv@wp_sfG)|W=?Fb1_ zM&b8-)zZR_Y!t65tHPu=^pG`-3Ped7Fhe(yw|WZ*gx|7Qwf9IF>e&PA45p;N82LR( z;v6&JML`Y@pj=I4@w-|~U0gg98FqtN?F{^ii4Tn8QSr);Dd9m=mSFDNdU`r{z2 z3A6`_wYg0Fx$qM0t({G(_TtTY2mt_w-jT%N^d0|Zxn9Y-$NnC@=|cGN#KVWuj0eN{ zC$AH&YbNEYbzh#LZCZ5NlF5Di!XK8u&e!$O< zIovUd-vVI{3q!_jzP&ZAhfbb$lW~)WQiH|#*DQ(I>qTx`$ioOl0AW@$UzdwJr}Bs9uZ0=5#F$50sVehm`+OFk ztp%bmPL-~{J(V`nB(uK1^yreca`^owBin^6b>Z{`Y-1_k?<@e*9C(uzouaT^qtC`4 z9Q%u0_ZM~NuOf?W8dxs85*vb&nnBL%&CZnOt*m&G;C!m|g-9toePlp)u9 zH19uWo2dto+VmQe8WjvvppjoHUSa$`*?$9q0l~jV1ctIoEu$s$@@ROygs@&G6#oxy zkKzeo{tG|Fim(5H-%86h*ni+hCSIx1_78ql|I#z(f8d9b0G$xu`2%39IIr|0Kw)`S zndirT{serOs)kV_XpoYalSG3VXaWwJVDjuld^Nef(i)znz35qfU zBcbZJi|_idGv#S{F*XN8#*3CTnj7c$2lFp)Sa=pOy0Jpt_*yz+afyg~>Pi`{{hJiD zC2~8d8Jsr``eC@{A7}tb_Z(rmj!=qzrA3#CO^y4%4+6N*9MbjbEe!}4?XMxZ7BTCqk8eRQpSKlg#Lz>jQ4 zpVtflD$cU4BdVGAK6)e(S$@JijggY|Vp)XwTd3t5@^;(#Jq^I>S)8+pRr4-eqt1@D zf+(^(L>jdl)iYAegio%g>_SAaJXGUtojLVsCw*UvIPgP%2H}&vV)ut|1ySrHaUxwZA-WJ^O)R@ zcBL0Dy({C=Xax|1sLkQmu=i5DuN&xY;xU{ZB}|nnlx9p*ZG)d;O7;2t@axxj& zr6c(pUl41d9f%VwY()?XZ!`R3VM3_qks%KoSU2_3EYBTsg~s-!_9W7j(*6AR)aKc2 zODor^qn+FaGV%cnuMiP8-!m5`Fc#lgdykFBy6sOUe<1;B3(3z_F))< zN+pJL#6lRpze|Ky;D+P>{sS`Y^rlNdK|qSZLH@rkt^}-!D+n(sN)QASPGbTgXgF$- zQz#I%ih@N1IRq3-L{L!>6u|>9s2p-t%tNt)93r&^w4fD55e)&kNr--mSipmFc~r!r zrBeH{yO1pJ`}X^GXa6@dZ)Wyg-@ZZYrege>Q&bb)owsf4!zPrvli~e5_%Zm*0`K@n zfN|Z3H@vCveKGg?3BRI}CeIaQ69Yb*?MAZ@WDSKI1Iysst}!?2d9&8{I(DV&xL8}{ zPZnoHRB4^QV51k)d-9*&*uI)W*8=axe^xC_j8;)@+g$M>h!qheICgaP9ml1W7jLZX zW}k7()}39IT~-&K>{nYM;(FJtYBu-ux)RsBOONOBrNl0>$!gQsNZk{iT1m{~&_rib zuFGHfi7indR|ZyRrag9~)RH*`2L91ohJEQ2MSf(ijVPjPZXn%Wa>b#A9p-g2(XM0nPP~g3`I^2m8?$Xyt%iN@!f|h*)>c>j_*d?Un~L_m zE|}~d;k;d1a&^4sOkj>EyY}{e_v%HAY$xifwdFzW^%}{S;=kSK#4Ovx>{*dC;ytb= zm|RBQvX`Bzd~v?#<3mxGy3q-y5gY{ab)|4bb%$u zCVk+AHfP;e0k&t#w_Xk7TU(x35^#*iOxl+CNa0Pt$we3U802Q=-l69g#`hoZGhB0o zd+FfOv!mKSkE*Q+iyigd-P4pWIA`8L8GQ4)dZTEbZFd2;CMf5GjxtAFYwGC6oAYji z>X=3FKXwDWPm1s3sEd{*`Q)dPFGr`vD2Ikqy(rC$KMXQ8s(peZbB01r2|1FChiVj2 zOlpL9eMY}{<)}*A>IpORuK!wxQ|uc&yYq+HPZl=czP!!$hFOn7fJNp@h3%oslT#?m zQk+la33Z!Q;WCz+{d*|iWv(P#%fo5F0gqrMJnP4`(^tLlu6r`h9-mD(BwV6m9s7ae zhxoc{Zy^bPJ1<&{$2U1wgxvwPIyXhPB)S_2tg~fzT8XVl@Dz&@IX26`Nedpzfj>;Z zX9bcbBFi@dZq->46OMq1I-3pB^_R53uLUho54n;D?<4l@STd8D6f#u zhBgM|3u&ZR2q>!824bNKMyt3_Bk3uii71}mXJa&#MjFX)HkO>Ck4h5`$ z2x~d+2;!)OXR$BeS2|N*HR4GoAgI?w z>k^L!$=7|Vi`I>#GJ$D>D&G7i8YxX5rHh)_Cg$7kNgU{OF2ulqV-p6b*{ojlUfS;MVPf!KE00zcWB3zDyDa z>cP4&*9l?>FIl04fXHSG=FC`Emm%O?WC##6W2PtUR}er2A>hpWx`r%q}*s=5M>C;S~XDVYpTc}IdITyfxaNBnG%BnpKYH7j6?<~I8c3= zq!_Acq9i>4CtnzcaWHl9%no5yr}n@Iln@7d14sEf2qhk^R4g_^xf7O21fb7R6j&Ou z2n4j^UZ!-=NMpxQx<`jGW}pcXjii-<(h|xRfUpkC6;<~tqRv9KOJQJg2#j@3La+%? zzo`xM@GgTeTPA?#@KNwD609R4OgRWZ-O~_gKh4p(bNg#P6rTrIkwmL$<)9pmT6CGx zNRZ7R|f*8#7P1^Pw!r@szbbEF2+%%l;7YMB0=O;{X^RTbz@dqSJv z-35Blj?$RKB*#Jb)C<7b4rjEY`WK-u9B>f0Ux?@vD&`0Qz0P1dYRGUjln!6=;}ty4 YB3FilAnO53%@VOh0%03g)l1*~52%dp-T(jq delta 18746 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 org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M2 @@ -48,7 +48,7 @@ org.springframework.cloud spring-cloud-dependencies - Finchley.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT pom import diff --git a/samples/standalone/messaging/stream-source/build.gradle b/samples/standalone/messaging/stream-source/build.gradle index 99d89d5d6e..3bc8fbd40a 100644 --- a/samples/standalone/messaging/stream-source/build.gradle +++ b/samples/standalone/messaging/stream-source/build.gradle @@ -7,10 +7,11 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${findProperty('verifierVersion') ?: verifierVersion}" - classpath "com.jayway.restassured:rest-assured:2.9.0" - classpath "com.jayway.restassured:spring-mock-mvc:2.9.0" +// Example of using Rest Assured 3.x. If you don't add this section Rest Assured 2.9.0 will be used +// classpath "com.jayway.restassured:rest-assured:2.9.0" +// classpath "com.jayway.restassured:spring-mock-mvc:2.9.0" } } @@ -55,8 +56,9 @@ dependencies { testCompile 'org.springframework.cloud:spring-cloud-starter-contract-verifier' testCompile "org.springframework.cloud:spring-cloud-stream-test-support" - testCompile "com.jayway.restassured:rest-assured:2.9.0" - testCompile "com.jayway.restassured:spring-mock-mvc:2.9.0" + // Example of using Rest Assured 3.x. If you don't add this section Rest Assured 2.9.0 will be used + // testCompile "com.jayway.restassured:rest-assured:2.9.0" + // testCompile "com.jayway.restassured:spring-mock-mvc:2.9.0" } task stubsJar(type: Jar, dependsOn: "generateClientStubs") { diff --git a/samples/standalone/messaging/stream-source/gradle.properties b/samples/standalone/messaging/stream-source/gradle.properties index 558d820385..88a97742d7 100644 --- a/samples/standalone/messaging/stream-source/gradle.properties +++ b/samples/standalone/messaging/stream-source/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false verifierVersion=2.1.0.BUILD-SNAPSHOT -BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file +BOM_VERSION=Greenwich.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/messaging/stream-source/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/messaging/stream-source/gradle/wrapper/gradle-wrapper.jar index 96d36c23c86687e8c46a94a1eb0be9628b80422e..275158bd431a3f1985a182808093ae97118e815a 100644 GIT binary patch delta 19272 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 YqE)(OAmbs6?1VTWeAou>O7*+{0mUHh<^TWy delta 18746 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 org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M2 @@ -41,23 +41,12 @@ org.springframework.cloud - spring-cloud-contract-verifier - ${spring-cloud-contract.version} + spring-cloud-starter-contract-verifier test - - - io.rest-assured - rest-assured - - - io.rest-assured - spring-mock-mvc - - - + @@ -76,7 +65,7 @@ org.springframework.cloud spring-cloud-dependencies - Finchley.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT pom import @@ -104,7 +93,7 @@ - + diff --git a/samples/standalone/messaging/stream-source/src/test/java/com/example/source/SensorSourceTestBase.java b/samples/standalone/messaging/stream-source/src/test/java/com/example/source/SensorSourceTestBase.java index 7070d24c91..63d504e5f8 100644 --- a/samples/standalone/messaging/stream-source/src/test/java/com/example/source/SensorSourceTestBase.java +++ b/samples/standalone/messaging/stream-source/src/test/java/com/example/source/SensorSourceTestBase.java @@ -16,7 +16,7 @@ package com.example.source; -import com.jayway.restassured.module.mockmvc.RestAssuredMockMvc; +import io.restassured.module.mockmvc.RestAssuredMockMvc; import org.junit.Before; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/samples/standalone/pact/pact-http-client/build.gradle b/samples/standalone/pact/pact-http-client/build.gradle index edfc27350c..5f80e75981 100644 --- a/samples/standalone/pact/pact-http-client/build.gradle +++ b/samples/standalone/pact/pact-http-client/build.gradle @@ -7,7 +7,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" } } diff --git a/samples/standalone/pact/pact-http-client/gradle.properties b/samples/standalone/pact/pact-http-client/gradle.properties index 57ed1c5339..3e2eb84942 100644 --- a/samples/standalone/pact/pact-http-client/gradle.properties +++ b/samples/standalone/pact/pact-http-client/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file +BOM_VERSION=Greenwich.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/pact/pact-http-client/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/pact/pact-http-client/gradle/wrapper/gradle-wrapper.jar index 96d36c23c86687e8c46a94a1eb0be9628b80422e..a281a3f7d8e002259423b83c5fde7a9eba8e7260 100644 GIT binary patch delta 19272 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 UTF-8 1.8 - Finchley.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT diff --git a/samples/standalone/pact/pact-http-server/build.gradle b/samples/standalone/pact/pact-http-server/build.gradle index 28d2a09cba..77f0c962e7 100644 --- a/samples/standalone/pact/pact-http-server/build.gradle +++ b/samples/standalone/pact/pact-http-server/build.gradle @@ -7,7 +7,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${findProperty('verifierVersion') ?: verifierVersion}" //tag::pact_dependency[] classpath "org.springframework.cloud:spring-cloud-contract-pact:${findProperty('verifierVersion') ?: verifierVersion}" diff --git a/samples/standalone/pact/pact-http-server/gradle.properties b/samples/standalone/pact/pact-http-server/gradle.properties index 558d820385..88a97742d7 100644 --- a/samples/standalone/pact/pact-http-server/gradle.properties +++ b/samples/standalone/pact/pact-http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false verifierVersion=2.1.0.BUILD-SNAPSHOT -BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file +BOM_VERSION=Greenwich.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/pact/pact-http-server/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/pact/pact-http-server/gradle/wrapper/gradle-wrapper.jar index 96d36c23c86687e8c46a94a1eb0be9628b80422e..9689b2f157f789e424c1a0d9168cf2d0a8cb8335 100644 GIT binary patch delta 19272 zcmZ6yb8u!+vppQ!oOoi}wr$(C@k}zw6DJefwylY6+qRv2^LyW0_0_$9oa(M!y-(Gt zT4(j{?zR7xfVWnFBPq#(Ltub_z`%fjfCz)cA(12gKMP|>%Od=5MI%l~87KV&=LF~0 z<<|K2PNGUmwRnm~Xj0;cbnV2no$ zU<-k*T)p~Z{O2xG&TkHT-D(f{MiS>5L|p`S(LdGqINSA_-_zphxW-WsB=L4d0*xCF z$pvc(t<~C;01wuVqSkIhm!sKfT>`@!ejV$IX&~n{uO^38>^_7as3p$<*{`yRJb1pf z8>r;?A}oa3!hpxOvOmW8?#xuY9*|NCARv#0TFiEcRC-6OE;4a42+31w`sLXX#8uR; zMqg9p#foBJc&i{ubscgM8h9`{*#Jp{FixN6N!7)u?h1BqK2jUUxUhYXya6BbWRXCF zb;a__m|w8Pv&{r57C-5S%P|Vhh5o84;_V#geu+X}e%#*A5b<*77&_o!^HP=xU^wcd znKm)R7b)WA1pgbXqz#H%n~JwJ7P`1!6h8Jx#J6WELYiQC@vp@;bk@Sqa8P93t*hLM zL1NLljmY?c1#n=MpMOw(5>YcvNCPpDk~Qo*H9b2f4u;;=zPen-84YzD`^gqz6^H)G z_Q*%`C@P%&%@#kEF(Rx@+=opT(0D&G2jAEC#7ts168=-(*6+thSY#s)DVUxfF`g*Y zsSYO zNhhWrQE?U0E2mRhrK|xOq+U>Tg;|`!2h{&Y&7WJ;DL7;#5D*G{5D;RJ1mywD1U@_% z0E4NWv8!vAHoOtWvOB-x+9po41d)bRto<8p>$&@_ zfJPmAjFRTZBmXP^=WgHWuIui{ zlb6gu!vRL?7jtkZhaX;;JtjMvx8AEC>4mTEs~^C?_1kpd_QH)WRQk<2RNo5$cu(YZ z!gvp3hTzOCBsd^UFn*F~{3sHtJ6MqUrsRcn^}`!c++Tax@W+enM-s5+opnJ>p&T;Du5y+C(5>=50m6R^4*yfH9ep%SIuu1y@G;2a6Bw z_1gs1C|qm7QdF85P18ANW3Jk-lFQOR+xJu_X> zl&9C&C${?HRY~cUnXAkIVw4k4^o34is?!zHv^ME=UTgW{1?>%LT6SY^Y3?aSsE<`L z`7Uerq_X^ua*ORr=j{__hjf>$(*wDohH>TG34=|V@CPx2sK1j{ZT|S{*MvlP6W8f( z9mwRW&1=dHXs~5)%#E3eO42LVf~N=1)rM2Dp~!ma^~Z-KX?XAe7HER)Cwy9Qa~6Yg zyJh0~Ma#M7WnR-`V`)i6i{cV;k@BerWg<#eP7B%1b1w~@VWRph96)k6tx@^*q!cm4 ztFlU5w~ZIocnt+m;D`o4>L{Ke$pqHu|u zvaIg>Q)>#wik<~vmEdq`|284rs)$Udby|k9WUQ;HAm3G^oNm)h4s+P8mTfne^^%2K zPRH8!xf;|`X7_z*39hvaqbi!UImh%4Xb)H_I^;;4@qTiPm}_^nE#$Np*UMdW5q0!t z;1ckTk((QKxvJjZ`gK?oA79=UTn>`~wwsOC_ven3_gn_RrFMm<0)L?0@0B%HNViSM zn7*4lwxtzdVa_3G&g7rXYv9IDNZx733n>@aRE6oubg&V8NoF=xHHmnK<2X5|;>>VR z>=F~gzyg%8v zS$RF}IXMpC`^mmMfTY^E%N0+oxhIJ5}8%pD!O642irL~ z0Dap??GfIQ8UUv}TOzWgkT`_&yP8cjkwF@@!@NNf-7{m4aMpB>)N5z}-YX9H=ggC4 z+}5Oq`U>-1uFi17G6Fnb6Wzb~1RI*2*(gGEua+7RBQ=;EkF95~aswJEcRBhvyT(L0qp56mRy z+{7hSIp%+x$x`C*&B`eoRYs;J?CCMSN(m5E(MtLmQlzQ${unExtP-^gK$uQ5QOS0Z zA(JzXv_3)~T^Fw_s}@L#V`Dar(C(G9rYi#AQry;;atv}i3&dusJlTuKyy=y5pB}l5 zMbgM~rAwumDBM8w-X?_dz%pr0Fc#3(a;T4pfGKnPmYvV(mD{qMlC>l0bRRNKtjqPf z{c5*fns5adEYTsV5pxWDb+K+>HjoVP)DNViAnaJbYIcN*t>8v8V^2YN+lXIoi|6y$69?gi=x{IC|G?c`V(flf>sWY{)mDQY) z*4GEK$!}UIjS>zIqQ#J|^&XiCLV=0l{R8~30lr`AOhBk@e-l+Q~iFoZ5NOSWsNfW8k<5f56S}v=s<0A?1{_NnyCM0jF zMYzE<8)Ru~+XK5~AjrUO_~fP1MWORor}{)z+u?2qDsfA}j17O>c8GqG=fU2%4<6vh zyzng!8l~kIEF^x%@_V(FmMuab^R!q$TQTnJz*fI0we+<8wh>4y)$@rAF4lLPx*LyC z>Q%vv`BTz|MaF~x`tL|=_m?}}37fp{)GT5E)n?y!1rYcBohCPFmeQbT5a=(D+iu*HPl zK@_5DC73`aMZb+8vfYm1tX`X-LFSRKDDpzO3M}(bmbzwl#jTNuwRA9howIcApJ6+j-7C;IqZ_LWr2NJulZ@A zX`$TFUiMOFgGcjz%W`JxNm?ybw_(LuMt;rLh8w*-u=b;o6E8*gOdzBgg@@F~-Bljz zavE@+6%qP$9tGhj6bsRCa@HBxJVn=@GrW`y96L|fi)HKl2eP@RO@62JKQE0@>_(KpeOfOJ4R+8bBreZTp z1S~<6&iIN6XXspkImNaC*$X+OkG5g^@LbW1y9nJ;4KHwnxmeDAS+3iEae7;R!R&z= z_o-X~IN8gFX}zEWej#;%6Akf(t4E_T?nB=)h#Uflp)%{!uMkm9IB6y!Od z-l%}-1J>EE<|pwD{<&8gFvj3(>yk=3pKM?meosowHO#gz!TVn13Q;#>B)I*APS=OU ztfW{<32LZME87a6{Gl;{JYEsrGqX5dQRC;}%DQ1x*QZx9u#Dt+^QBaV6tb$tC0TJx z4;S^FihLl6();U+4hhLK7`mPdLqP8n2OltM;#5fLrxp_n$rYo?X-qY=nk`iFv)2iW zl)qQ%C)&Z8Q)fHBA77+0T2yBcy5yN# z^HJxp+MSme!K%@_Ms+vhxp%2UaUx;9W7JC|s`GJJ+i+ORa5$TF{`=|cW8n)|oB=@o ztm;Mi2`p1PmZ<;UZH+sfo%5NC;B)^4_Q@owHpfh{xS2BY$X_Kb9-HOx3!?z2mDm${ zz7(M+tVIAB!vZt5Q4Cy$>3UYCf7?l#D@ zK^MC0La#nS^dXNbGTDtPQt_>p(mtcq25RyBRb;{{Nin@u3g)Lrix_--(&}Vh=#@B+ z((hkLVp$OoZOSeZAv$dOWZv?dMr|fKCU}8$PbB3Ixs!z5#b}6atdNccsK^tLPlR=q z$Ds8Jn=M{qlV4!3!n@>bwhkGDCFZEa3r1_Jlc*V|uOdaafAkng^}PuG@3L}1fpIhM zU&~_b-^2X>SCvXGj+QRwuC8*{u5RWI<}UxOGTozl;ev!P#II@RZ7{{gpTuWo+RahP zMB)|#=0d6WMkZ3fm-3NM3P_@xHwSkekd7Y%_&_U}Zg#v+&?)N5BlSkP8s{`DToc6m zn2q`1S-ey7jcBJzKG&X)vHO_Rl4874j^t7u0B35-6=Ds{!Zvi+l_^!yT2xtKV&hzv z%C_3cm4kvIOm9bb6pTpAQKaW+Fa(XHp)(=#0uQ(zI|2Wv(-IKIglYf<0&)ls0>b*= zk8?sJ1E3${1PEx)t(~)TAaS7%v(JdJtOPv>(R7eW^s4=It#{rJ7Fn7L?ec1>sMh!; zt0*nIR%q`dvj%jT&p0BPPqUyvMVSuPYhvwkDCx;fX*-p-^ih8E>!^=IZbhGd;q4AR z_TN7C)dYNAOA>)|1+VjD_q8GMg~PJT*>Kg60%E8U4d>$qxSPC%tBTie^V1DgD6toA z+}ZWi`pFR)Tl!VTaR~USPTAC#ey%%f4{MNjV>a*{8C7J^@*M3p7UW;FUEc604|2M_ zl%B#UDGGhM6Zu!8YdXvKyCcHmc2m!&@?{BnTURRad06j#tZ3~*25#+Po|h-N(|L06 z0#IL?d3ot(lAbqojM{n=4;PArB#kr+HIavG!Sa9BmYs1c^dc4l7F`yMT?RZZcfy27 z^r_5>A@;m$JgRPsL^xvbwi^tN|@1GnR_r^65$jNS=Z!qnG!4>BaC|* z<$6p4^aiw$h>7yqiL3A5lDYb?kx_OAIs%UGVn@_c{N0DiT{0K|vS$0$wXI%s9IOheuL`% zeU1A2}Jim|E0-#7{|JaALY%%&I^23DmwT z!jx*TDI-fiBnL}N;onwkWMM>4vEGr4D_BO%{3{(uNhnSpm%etX`@DJ)Kng>A`#Y5jDh<_K87-Ye+VufrZOjQO9 z$KQ2!bCm7u$zlu&cPOy17F^sCg0C_(=ruAbR zmo9SX$sW-g_$ImWi85Hp~wY8$vKBAYh=w=Mj*`29CUq*dv9 zfi5O_SR-&1M>^FdrPE&x#gR;5wUfCyMCT)@DDM{^}#}_^40sv}-mYPC0KO z5|7{h^qfz$R?WEy&@Xc!g% z9_%32suE+O2S7Ch_n z4&t4(hltv2Js|NcZurB0MxLZOoIN=dqZRq4xDjTCvLw=j6aDm<=cx?WlPuq7 z{Go2?zoy&b?1idZ0`2>LwR5XSl4P|LuE&yO_Y)IN;Ki2);Elbm0*k~p>v7M}-1EMJ zZf;V$_=xnT#(=xB+7WsFNo$1P8oCL_%|8gv$|j|jClBU#^0VlhdbzDz?)Wovmc(kq z^6NWXQJm9tg`T4V#~c+s&8f$5a-y+(*|ri>DullrQV&=*VDTd!~pn@W62Wf$C7^D z+)swL79+*O*l~PC;PJ8Ogaq0AKuLw7lIl0zvDS;)S5$SN?+WD&!`|StH-3o`_NK(q z+aDN14SdGi4-!X)o7K(@lWx2cCmr!=F=`acZ|MJ>XCcabHub!!O;F+ zd;h%BCZQM(1cdDe2nfx8^V9SQRD%BqY683}BEasq9TN$HFbJbvNL=tr@IoEp4>LSF zQxho>q}N(;vaC3TC<}Ko0_luqH;PSGX-a9`)#!vjQ;nwz&s(&czOmmOyyNw5zW|?* zf}8JKEz9o)*&oyWv7jqIIm%Xm9qM)ivIlo6ZJlzx)|ljIdO<0)ULiy^5Busa&o-Df zy#W4zjq_n!%uWUIq=E9j^TS;{wN6w=l^Y98cBB`2n&$ng_~Z41JCC+b(Lw)K!(MQ> zt<&KSvXf1kl-UvxNuvK>{L<{fFwoFU7Pm&(G|Orjjk z8_3sJaqpKzzK?jbheRU7?c4p1_q5KV5n#1Z)Vh$sryjpQ0US58t_IGZ7j&!O`BZMT&;iLJoLPfBs{U<>lCvQA6K zNPj>s8YrpyCba>RBXzpJFG17U57@f$^x*fQlP>Us{eq*b7SytIginB!+iN{xkub9TyXdCUr83 zYJEY77aBE|Z*j+kBON3Q4-2JGL{C~rNl6ncJj{mUO?A|YY5Kt@w&o&n2RI4q{;B^r znZe~^T&vE@3yR^=&FiwDo_7-Bk}f)yG#xW^k%drs7Us-mp!{n~>Bo3THODIp)&h3k>%N?HnHB>< zJP>nhd3%yon0wq36k36t9`I>4_2X1VbK*~&%(|XUu{lQKo-=fB8FYC(%bW!TCi~j_ z0P{oe-~3F6&C%Pa!(YrXE3Anw}GQdrtY4!i;QT!QMQYbUDn&D5BF8JYxvUgR|WameY_h#wqb`4iFXoxw6!d@7MhEal8q0$ zMV9f)vU$Cj`srjz3*gIRPqw10igw+jcLKKH{nKzVJGr?v?iQ!kZC#6afUj65z-LA; zwBEd!UZ(jTb9Y`WoN6(+FAPpl9o@V&%l<$I$lD~5%a ztx2v9XE&*$04#;`1dfmNU$W;FZrX{QI+Nn^qOnSd)E#iYv{2<6pd+@%T&@;$F}V;} z0Non+*)GvF4IwHVX2V}k7Z(_0~0Xia`s#_FC1yK$Abe%^ZqSg7RsIKryogVQSBKR0C zqU;eNeYwTVD?L^p!5%|e**qRYBw=aBbv6vW8hAHtTxX@2N>z2Dhr$R#N zVLQG$0a0BHA*Vyv-aHk<>tGoD%|XRP4`axRs8e10-be0?D=rLA_>*w@Gbg?EH`$w` zYT@IzCF$H=yEwI6zb`fxRV#TZkIdV;I_VHAG*kNXl39lK+wo;otO@PPa#VkG4K=s7 z#m#+`<5-1ua^d4yXAM^TBFLS0+oG>1si2=+0Th`ml{pb34OVjr0{5X`$6SDn0y7b< zQz(%lVE!zxFxuYC<&3Dbq^ zuMvB|TV&3A~zCy8WOewFl@t`(7cEOh`U6UXU(v&{g`P9$?z03axLE z0N@=IW4kNDnSiC0uFADHLs8OnY;2(Eahrg%HM;gSdWX z@9rgs|Gam5H1q0N*;|O$@l~I@YyZK06q4)ramX@Nhv^b8hewA8zu6g+yfmwiSSn7MTmYLF_g`x~uej?w3asyuz??D{I zGPQh-Ndn3I1HivoM~f2ik@kM5C{a~p^&kKENNi4vZ9r(tDmEB)4!Y&C9!EXdYfLs-wClIl@*!@QI^k&r`WYb>s-_V`sCHXo|cu@ zsnolJ^#fDdz10;w;RILX z8dSF*g}?n5pk-HkW0A>gddPLenmb)T)v!BOzbeOqN%namM2f-T27sR;x2ZR)Cd+DH2a;BPtVPri0yb9#mJ zj@=qzKGT1#|5RhTD&d3mK~sQ;X$RRPSC%9<#x8e3;lnKlFzkJ4VGi_UcK2kpFKUWT zoEeB}`)%-Nvz%bM{~p#*`UF08Dk$~v;V=B9RgrUv?K2^7`04DBkT#a@m2h-I^Tx$w zzM&5Q4V;yG=b%iS4;F{coOt4(53b`EnJ2tw+eS<425kwGR54~EQ=oqcj=L&hicCtR z(X4bO_BZnXKJO-Q!X5or)uKa!0{tI#Ocs2b5E(iM$WsD9kQRV>*d$2#d^9yVSqmxB zT1kpFO6b8xg&Y5~j`*iB^Upmp&-kbf@~JFYv~vw24V}w;_ZCdg(js*=G&Y)M_vJO6 zs^+C7OI!cT3jZ3%Q{Ng#>T7_7gM&l7@ZWFG5FU4lt*VF zT=Dc=Ht)IMyBWZNY{A%ZD@xLxR|w@x*meMe7;!e0X+j}2%&l2AiM(-GiHmZW!@l)g zFlIJkJ~f}{(X^VE#vjX2FC<&I9JKsXKF)!XJHAuuR`O+J2H~_XC?T356&rX{2_jZw|ZH%uqkk<}36fZ)!#jx7o9 zoY>}&BLuK6+8Dhagb!PfdVmzy!W!GLf>Ff)d#B(nA)cDrcZ=fwH{J^Ebz?F`#*{h} zVOGK6&rotWb%-bR2710jTE>on_6%i&0oLC1{o$Q=Tclm)s z**)BAZfXC?fXDj7E!#3F<|kfu z?#8N2&w;AhXc^0zl+8qKg#qe2ZYMkXOaY)BW7{Gp;=DMM$HQeVV)B)dP3g8etxr~q zvQ|-3tC_}Cd$DojjJ~qaanYll#%qAf#N5?$)WOLEx@!;|=}tPl0_g+M3v`poF~7hz zf_k6SFpehCyc|ZQXo?JG_s>~;(pClxN%>ZH|4fGylUcOQCrJ2?v0QeaHT@;|r3G;G zz?Ih3@CciSXXV4)-=xNKL*xf4198CY%VLlMeWse#!prBb4r!a!;~%K=K|JW2m_K4Q zIMZUXRV78bYkXmz)=JwfV-A{CmH<~S=8BSr`YE&Btkm7wIxHG%`!>J-s+m+{8;N#p zDx4}0&wG!GjoEPG^Bv=LZAx_5i)F?cErejG&3EqpsVX;Ysq}`4w=cLnip6zCI7qd+ z)0voRbts`Tt%R4De_$GIEHvhP08?w$a_%x7oG?@Q6{UnLZ{JWWXTcN{fDOQtF#DY+ zxsjRLNE)7)1)AUQ+I%T@BN^8(RMLU?$~9hkUKMP%tWM2(rqY)!kua?A2h|i} zYS}!PqMQTs{z^)2 zQ%#{8EruLfhP!qeHgi7kKoKzBuaa6yraBb>>V1o8cO7Js3~Hsgb%gVRN}QMxVQ3+8 z%bi`9cp0Wg>Y(e7W60$(G-q>A2!#_z1}SOg@(W@LCC**@GyXU@kvhX)8LJNHMPp%x z)-;VePQ+~1qQrnF<0o#~Rzl2^$3MH7lJq;ZT!zmzp+${h$%sDZHwC~@jShQ`AaY8# z)(BKJ;W(MSu_w!oX6#h|=cI@=7Gi@ARb{8=FtJAVyMA#g4oRaFOqTauaD8Mpu});H z;(2SEdDs$Kp1L1$?0ZrtzVBjEShNi0zHnOWWg`P%cV@E@QdDy~T!jcA73)ks} zcxQUHCi%RYPqu;5DLCNGH|fnQiQOzekTlp0CjW?;fn6dN$hQEA{up25$vAi!) zJoi?-U7={xt*Wm>y*s(5^v=Cga+h&*I7PiX+fnJ2)(^b-*p!ytF%RXve9UmaMl{3@ z5p|N@)`nKOkjk%MjPsTgWpNd~-UL(Z1Tw@?;}xr0{c!!oBMET5!yBj5X$uu{t@4`j zL7#Me)J3!1|19I0Gxi(_gaeAl|niOW;ZlPONxH3+kTQ0^--!ZqKq`GJ|IJ)krP5t4Y z1o&x0hl^)x9ibCx3~nsil)1#OH(^ZxTOpBf@}Ac>UGV{SO%$=ltd2kRLHORtTYMM! z5ij*v&sGyvt5iIu`l`P5+eG+-xb9(XrZH|YeGE`D-ng1$P|KXONUky)hJH4>PZd_> z+LLz^tNsPs zQ+B8LN+0#uYMwjhct5Qc5V|dnc&7bc`oR0u*4Lx-$}c?3`1(mK8(TK3_J!#;(Svm{ zfe*Nhawm;wv0kO-_Lcg$32cSbogq3!4-r&*<@Adl>p5JH(~a$-%zYv_i~A$_*m829 zI4YX$zL9dsx-h0vkj%z0=K2L|0F!Gofa*&28BShQ;0RG1ou24El&!MoUA`1kf-@hJ z&<6S{w+steFyNtpg!2fbokck^cfj%h90BSr3l|l%xUYTaa!aOJnzEtMp;uSn*HuSe zoIBc)`lN$nTKAneHL1AvRT)^EjDT-30k<9}Ju~}820ob?e?|#U;ZI>=!;D5f^$^<+6Q)n?*bHkX78QF9Q%w_0(t zobP4P^xcLFv)F&thi-SiOO4q>Iv^%gKX!jy+TYuSk@S~GHNVWTUh6@|=v!V8BFPCV z*Zso&wrAj=*oj)nFuHT1i?U`}895;*h(b5S8U1klDiFW>C6%pMm4jllvF?#)I2}D` zdInPVC3RSX+mRANLxIX-P)S*%8P~gqYx3QRQAeJTP{t5l+EJ;mZnO=a2XJ5bhxMJDhvj>B1XpYK;8(F2G8!dZv@zkTE1x%2 z>CdPwcYAD# zlA1Hfzrpz@jd-J{t$3rCxny$2jfZa4%r4K8&fyoMP{z|y>~kU($9NB@A}6EAV1yCl50uy@0%}>?z#&cgOdVi2sy@W(u1GC!Zu~lt!Q)W z5E(lE9L;#7D`NL5@t(NZ{N^TcW58()RuOK=3`pPx}qlkkO_42 zP?AX}P_3SmUys{o<(W+VPzhJ4n+`=yi@U(O0UW_&3#pHU zTdNI7STHPn4f{|YgIRct;#2Q_Rub5#F#Q*-uPN_Nyqvb;NA4LepeQ$>H>>f-FRj)h zqqw~=gRQwU$>F`^rH!%VC7~6@@`VEd30Vk5+0RhxRi}w5_e>Ya9|q#DVZ+p6BTV_X zZZH6(ff@kxlcST#&tC$VbzYDVqmpENrQ)Re~~89Rc*-gs_%WV&S~c~KP$ z8D27#i%4@WMz3zLSFBgLgI)`4ngSgY*Sg8NVOFiNjbnWq;_QJ=xj7me!ZzYuH)L69 zqPiZ(V53B82=5lnqBj<$?(lxDv`I7eFz4&UH&p;PjsaY_8?@X{P)ey1C2oFM$=U#1 zr?1T4?Kn55&$r36edZXI^6$(rHhW!}QO_IMq9?C`rfWod*WNz8@+BVvtp|DEra#Z< z4kCX4R$I_9sCD@@WiUSZ+fBiC2dCWr5wkMr9PVs~>!qgK{1@)VM>Fm#Vm0rx0?$8@ zKTaWlok_#A*ZcE<+nJ5p8?u2XLqzN$(qs|6nW!<(vD4% z|4bS?a_@YAifxCjjJoD)^yzC{_g;6(_X`JrJZmE6k9brgGSNcZ=ZkWzN!nc_DR(VC zz!yffg3N>5zZJXp>8$mJVq%Ko#0U1X8+qpwsTOV913Z&IYzX_5TAx;_IP$8A<^Sf)i0C^ujZXp}w7rKO;U{ zzEiJ{X-EP4YL>TDimmKV><_oo5-z2;rJv*=w^vK3rr>U;Alg(QeF3L3KyYw?8T^Lo zyHzIqhng05{q@OYpIeF>R91`A&4{p7BLQCOA({KSH}DT~5kor?`>cCG^N1(&8=-vg zma&xpGLMGPc*BXP*+i_+sp-rcKlurA?t|}w@i&Z4PHy!pI+cHr-hg0yN8vqb&0L6H-$w%zY zp~dR?ETs{3_JO4Pte!!5dA@tvHv_Jr^63Hw|9i|AZ0(6SUx`GD>vz!8cHWbr(!vKe zTt|<{$@i2Hm>4SwmT2#1OxU2(EvaQn#{R{o07!Az*Xn2`4k{(o>2xmODq`gqcYdvk zMobkwmtG${RV8M z6ViKURPR<}tTDovu`+$A>*>7$)Rb_aE5KpDtQ76#8}xrS-5R18W5NF0bwkF1`X7%N zo(lTEYd!=U5dWDwPaqmd#Qhsazy8xk(f@buj4}Y-5cN+>@!v=qP*~XicnJcgy8m^u zOleX7-^}{Y$U`#UzrCuE{{&+R%3in$pL4hk13eO8|L!IUgY0?_G0FYgaSWHB;3Wpo z#8b!kQeZJQN_7b@#LUC|vk+W30AJK3J)5Y4hlni?X>EH!hSN7=MlmJF^Z~oAKkjL` zo}#QLtC{mj@P*`_BQ1qaF_%cLo$30N?f?3;WqF+@`2BT>402sSyo)A)bsHWWDRqAs z6Rf_GR15UY{7B5Xk{#J$h0P)5jdBOrA(*1;`n{T<7|PrbbB00pr~cKX$u%c53TayAQSRw=8njZQDqNrtChq0JDm&t};)rV)iyw)+iD%JI9- zM{Hkw_~+u9`VsaqTYKat_Hn6)i+8nWWN{}`S0?6_W0kU628=jg@!3&hef5fiJHYGG z@9C7oN1^ul9qPcw0Sjp%KP$>d8=>g?tlpq2i3i(&^IukXz*_Xhtx*P4_9z$}G@EsX zO9SiXJ^sm*ac~+^QE#K8Jmau$tD-1>Mst4^{>l$S1LQ}nBq$Gc!^jVTW=E8cl!~Mn z=Sp~fG)G+v$;0Ac+2Oe3-yQk_;q`CF!b}3ISK5xyLOyZRo@6|wiY8sU%FjIB$5=%B8jQymAi|nc?q~GXbih@jqZ*`Zmw!W=v zIb`xkKK8Bq@pmXuZp~gA4PN8XZmvI|nwC-v+m?!Em<4_tFifhAZ3EY8H=i#=eO%8N zWBq49vx2ft$=N!LpsoxhMC z*f)Bw*Yf-umNM*G87HdN3*-eifnRFA`(JY)6XI4&H3-8#+)o%kw$^t$+njyg(aztm z$+Ni9@76uI@E=Iq)qvhW!4}#XiUWLzrF|r*rG2poBq&b!%s?EDY64M<7gSrf*1tDk z-MW2+DEQ7y?f5W|0exPXBXy=x?{)XA#bI}$U`Rm;B2+*5oNpw~X9atPa^j$SBH!SO zFcPDg%uV9zZ-@_xzl=H^&OW3U6aFIe@}rqJM58i0$PUV4rrw*vwxGjb#QyOAIU;$==Q#E|Uq;={4 zT&$&ZIr(q+dS*QMf4v%uoBv@wp_sfG)|W=?Fb1_ zM&b8-)zZR_Y!t65tHPu=^pG`-3Ped7Fhe(yw|WZ*gx|7Qwf9IF>e&PA45p;N82LR( z;v6&JML`Y@pj=I4@w-|~U0gg98FqtN?F{^ii4Tn8QSr);Dd9m=mSFDNdU`r{z2 z3A6`_wYg0Fx$qM0t({G(_TtTY2mt_w-jT%N^d0|Zxn9Y-$NnC@=|cGN#KVWuj0eN{ zC$AH&YbNEYbzh#LZCZ5NlF5Di!XK8u&e!$O< zIovUd-vVI{3q!_jzP&ZAhfbb$lW~)WQiH|#*DQ(I>qTx`$ioOl0AW@$UzdwJr}Bs9uZ0=5#F$50sVehm`+OFk ztp%bmPL-~{J(V`nB(uK1^yreca`^owBin^6b>Z{`Y-1_k?<@e*9C(uzouaT^qtC`4 z9Q%u0_ZM~NuOf?W8dxs85*vb&nnBL%&CZnOt*m&G;C!m|g-9toePlp)u9 zH19uWo2dto+VmQe8WjvvppjoHUSa$`*?$9q0l~jV1ctIoEu$s$@@ROygs@&G6#oxy zkKzeo{tG|Fim(5H-%86h*ni+hCSIx1_78ql|I#z(f8d9b0G$xu`2%39IIr|0Kw)`S zndirT{serOs)kV_XpoYalSG3VXaWwJVDjuld^Nef(i)znz35qfU zBcbZJi|_idGv#S{F*XN8#*3CTnj7c$2lFp)Sa=pOy0Jpt_*yz+afyg~>Pi`{{hJiD zC2~8d8Jsr``eC@{A7}tb_Z(rmj!=qzrA3#CO^y4%4+6N*9MbjbEe!}4?XMxZ7BTCqk8eRQpSKlg#Lz>jQ4 zpVtflD$cU4BdVGAK6)e(S$@JijggY|Vp)XwTd3t5@^;(#Jq^I>S)8+pRr4-eqt1@D zf+(^(L>jdl)iYAegio%g>_SAaJXGUtojLVsCw*UvIPgP%2H}&vV)ut|1ySrHaUxwZA-WJ^O)R@ zcBL0Dy({C=Xax|1sLkQmu=i5DuN&xY;xU{ZB}|nnlx9p*ZG)d;O7;2t@axxj& zr6c(pUl41d9f%VwY()?XZ!`R3VM3_qks%KoSU2_3EYBTsg~s-!_9W7j(*6AR)aKc2 zODor^qn+FaGV%cnuMiP8-!m5`Fc#lgdykFBy6sOUe<1;B3(3z_F))< zN+pJL#6lRpze|Ky;D+P>{sS`Y^rlNdK|qSZLH@rkt_2>dG>Tud3VAi-*)+o#H6Gi_ zBe9rjqi7}a2&FZNN)aV`(Wty1n|#7X9?7%Ve=!sAjy3p-@9$9(cz&>ShCX-ljgg?o=(O6=ns~ zC23*R8s{!r>O}RO`KRxAf9=uh{`X=&D;32>Dk`*Zt9&283=80$I=Swy-O8#aR&7c(un%4`<;mCB;j9}o>KeDT_~2OK zbk7L;?aIo7YB{oLr-jTj>XeUR<0ybh=-E{Rz(H zBPVkwG=H8@Ss!wI!h2tDa{=$XX(xH`%~;JA!9uH^LQZW!PLh@aTUcjo=fYhuzFBF~ zEbt%e0q#fHchQuktKz*1lI5>NrbHg8Lg3j{UqO?aUWI{)?7-l_P(sJj@POF91sV1+Pv>B(F+z zJe$wgZc&2ESWedO!I@6VqEHPthXGqWg5~h6AJ@-a^T50A>1Z2#HenlknSyofhf5ye z>#hSuB>e5dNFg5I@_7R64ye?-$Zm_Lxd8uqD^{0<(1HX{vB=3E&+u*5fQNG64-@cN zhNO;2@{NGo^%lg0Bj8iL z8v_dXRMIE{iW@Y6kgtf*Dj!fuIx=V?iWd)97)`N>O7fYHC8ubjF~k~)bC{??0c#*) zg%o!Lv6I8ISm=S|E+rH!&T=71av_brpfHp20=#UZpkU(JC28=e)(lvMc#;Y58r0Fc z#G^sdb)RXYb;BtPVBDyLH@}%mO3_8>f@T)VfcWpWGy^jx4ix{%O-I3lV?GgO5c3RP zOld5l`waw}Vp2HJpb94NSreRKs(_*gm`!H?n=wKV$W5xyEphOCVA_m@9q@x5;5wli z{I*<4(gd4EDv9C@J;(&B7ioixMvQsD$KbDr;5>sW&MYFu8bM%07B{S5h+Pd00=5K{uk$rF`yfldc*xVps61!=UQFA9cR4Iqu928LR3>-NLolJ&#i>7f!|#S8s) zU|pE&1ks0=q>zI^c#9chZmg?H5b!QM2=H1k(-Zb92%y3saQ2=Bh;7F#A=$Y=5L*J! zcn<_F0<;cOhFI*7zVbUqICMF~pf)1_1tFj+m|PPz_4jzKGx2n|r~gk=%|=yehWmW3?^ zer>py$(>Zvid-uxlrvg7?^AVW34j~Yy?zq zX#yR*%OK2_3E%~pDEJo<))5h=90Z{DIS90w<>=V8Yb+Cr&xfl>qSZ8VP>u$z+6-|d zNaiMU_5An~3XJGtVh!ySQc0qGNYe+(U384*)9?0!=XrF~0l$$PsfzMvnY5SH{f9 zXs-h8D+5JPk_81r0|J7A0TPzA>Ww=X?D-40sd@2q+m92#5+O>23r)iE;wHNk(rD>c4SG^z_I7 z1x+;aRFMB&V!C>r=?nn`gaii!#QN_NIBYTit|j&_0qyzqizi}-eGTr~Bq4Ij)%+VH+$YYFK^pRJKry(g1}snhG$-QB?x{fn2Ss`dr>@q zeJ_Q<=vXotn};r)?%7z(rB8DA`$Qau$~|*-EgXvtWsQl*SOck?QU>dE+tIFAd>KDT zJN&eUd%cYI(Rp4wd-kn_5ep@p3GP;q#}xm$I3L)26H+=;vn zE(5CEE-rUtzpmSCA;Y^y_u+A#RNgc|4vgPM4leTPxUU0${ie~n3yw-YX?@kaEf}gh zurktVt#_=d6X=;?1D<<2UW-027el-hCQOEPpx1VlQbU>5pL@F^9@?)&_6w<_8Cu=x z=A#Xp9iC{&2aX!Es9eFcoQIl7(k4y+DvhLH&xb9I3*{S{hwWE?8(g%PFHlnfwo}r1 zLP;84L`u1eukaG9FE+v_gsnE=uaJM6ODLOruRBi&zRWz z)*>!l_d$KvQnMvn_gzPw^A%wTSi?aw$$Bxd5!z8A;ucHR7CVx=$X1%)B%~XuX)~(= z3EnU&b&ehAbvVO>5m$P5?!UGG_*2&O&9t?gV)1bt$ybKDiNotI+6WFYKFw-4+zS3V z7QBorZtUd0L(m(}Xole6gB9tunCa$*I)QAqspE~>+7{{FV-NDf zybmbO84x{~-0wYs3tXgt+ttB#3Z#cRoLAsq<$Lg;f&+2zXv_tBln}on^Pt^Q3%8AZ z(&W%5viwdcgp*Iqhr4XnfDhoi>-fl7eHJZtLyTNXL)+j!@f>ZvM*IG>*Y1@D8tz7i z>O%aAxTs#F7)HZ-*SZRhv*Xtkjg*%h%7SCX2-(bpxL zkkow+o+M&0z|}0Fx=y8b`$`opV~B_E&Ot74y5mj;TP;>V9eA(aD`V$H`%IhMXRN_o z=3$QC$T&bHe0j(pCa%nkxI5`_#&hYx)2sRn=|ZpEZ$xWaa4stolaI%6jv19bi>vR% zixp|z{w##lG`3j+Cay(j?fj?T3v2vPJOuFY25(D9YdZCQyVx`k{H3Wn)~PKkpMhv8 zh++z_pE3$Cd>DPJaS(;EHX~yCs}INXt~RsVsn`NP?Ys?7I&lZ($(n4fy7St!uc!h$f9=d^D#Z1?m%otLC^Pw z7h9SXd8QW~AWe=uODZJjNls^bJ|1c;ko0M9CJc!>eQOS?MN=Jv>Nq2UG%xwGU=MOAlB*AgLq@5}&4G9Iy z-gkUvhP8U#iWY4=%!f3ncyO6^TACJelz5#|;mG+CK)Xp(JBL#%ugwXr?N<8}hx-$P z^p##>u6P+`Z6zI_XkxZ)-*JHl9;p1V-b}~vh zv%d+LW9c~8^Mk6hr!CTg+_?#m6J2{Y!35&%?|89EoFCQ?4}7+wI*%x0z7n8Bdr2@&e)9!N#~u5 zRZkwvR`$%k-bI7lzIF;^HsYS#7vaB&4(dNy@jn@@iAWX#1nNKN#izP2NdZy>aOHp^ zjK&X|JZx_5tX{t?V{aQ$N%x8lKN4&tCl_w5VsG+p3xlfFv_(8fbfhik2k~W!EAIzH zIPL{mjv`Zj9oOM`&Hb|NYH0!Zet!lP!j7{iOK937vNWa-%;H#XNa(WwnHcFdH-&Ap z7fWcXx8Fk${mdYIf9DouGh8(VgfE$?GSMx4DRo`r6F@zM5`v*QUo`gr=CAc@B7`*U zyz+$JP`;VL35n64_18HX4GuMeidHes$zKyKJKHU4kIBD|e?+v~Px7JSrtcV?GHv4%LmGd7 zcp35VHQ$C8yaK|;;@^sFV6<|0nMHllv2N>+t`ItP@L0&Ex~Zh)_>ES_S174;-i)hM zxNuFpSbo38Rh*q+Ma(uX1CA>z(I}A{{ET}?;&bLqdM#=_&8O3~ih4%^-wMOib&DmN z#CYTAx{2uQ2ubflvZ3aiN5cB!+NG*kN&1G-8=1}G@hLT_ZR#&Q#dbOxQ0dy8S9pZ? zX&LYazxmX!7sNU)%kcuK^>EXCWjI)t2P|yIqM=ObM|At2jMvZO2?3yKW1WZO%6;Uk z?J^i=LyrGf8#QUDZG!zPaxfW?Apb>lz#QQJDj*Ap-G5y%QgI;vRX|(sJJeY4KtS8r zKtRO*Q9$@fy(18S94%-+v=#sF+~z;5I1t1bNOY_9t0PeOvL4pbSWqlDXxc3U z{0&F`L1W;{t~Th+u&axg!Te_l-uJi=<+sitEY7y25qm9`RsRS4KTJ;^B}^O)bN3tS zle}Z*_S@{Eyp;yc8z?)v&7iP(tB#$)e&y@Q|3_x^m=Q%XLKb|(NxJ(D_i5g7LVRNw zE+iyI^(FyCdKf%=YWHyGgB{2B#JNAa@p{O^94Gd8U0!S14hY>oivo%L6h~j&KZOPn z;V*|(dA_9uezX%mqq4uMz>ap{@J4zsUJ*fmB7WxYc5r@?wS7yD{+z!yglby7Mi3JP zGvH9Ev)Pd3N8~ezbk4FBTojJ=IUApvgfPgBqtgPcBdnH(Y4n>9SleA`8H6Y;yR~?-$cCu%hT^?$w$1kLJy~_e-j$M#rCgz ziVg-nXEWRT#sw%Z-ZYl;>RG)1D2q_l7kc^`#vumerSXo&%l>YuE(1e7W`dj8|sV zE&!gaXGECCR(314>>5X_iXA)efIR}^})9e=?#8kd5dIXh4FDYEeD-i*(_iH zhkSNzP1$R`D{+={HTAl${P>tcndNbTrgW~PgMTxXW8bi{k|)!Uh!w1+D_W5Y#ndZX)o{3Lx8&w=)iN0UbA$l=x` zO2uz8+iBlcU#k%Y@AP`b^b>kh=(QGv{W3mO&ai+=VhyH-T zz&h|{ z=k}iFGgqZ_!;R{WN>pXL8;TfSC+rg)m{g9~@u`R-Ez9ta=ZcTk{y3b?l&Z09t!hxN zo`ZW#L|b1x=^~JFgnMo)ws<_lLu+$(AwWltnj#yJ21f+(d}JU3nDyJ-NF@6>qY^NSzfdRCr>4B`Y?|2ZW$yLo$}5}s}&Jh@^>iCQ4|jB z!wd}@Xuierbr`ncd@(;E(pBC}vf%A!rPQG2EhcxoXW60{Q4H6Ors5D)ZJ1P>XWVhTso_kQ0qS)%6?J`WHs^7)vf-Ry@6REj6#~_4WY48p`o`J{RR^#_ zmlu=EeLV_}jA?~o1l^vanG?HZ9Uh@>5see7KE}-D3D2wvrB#3yGRFv~yw7xPqPGR} zB-yUJ-+?$|@z+|_tH70bQ!L@reMhz^ZfW6WmZf<(K^B%ufe)vx8grd#Nmpvd;ET-F zu~kK(^iB?Y2)V0VO8M%WNW~PZsu@t~1g=I)Z<%G?EyXV=4-HtLulhWKo;6fL(N>3Rd@*&r;iKE6ys_|Jl zRV0ySc_3Uv^!2u<2{?xjAL#7QCV2JVaHr%q)G0JmHP9re1FzZG}F{F-@ik zE%T2h&6Q83IPdW5GyXG>dUDFQmHWm$1^v86?@q<4%09p{6*=0@P@T2GIU+LCqP*oB znl#ZUdhO+S4OruL%b@I|eCLw`HKB4klDq;YaXr;mKF9vqx%M3Rw|$wf=a8))z@*iy zIWa^{q^G^szXa2h`j`27l;$@4QqE3!HQ2;d`FiOub%wv{bvKEzZy7t#ZXJ3S75Ak! z$35B;@=^e!Ch9+>G2F%FM=L-z+PX7aY$rik&)7yd#u1|>z%ie2`@d)oyc!XSFC!MK z=~eX(KFbf@hS#WU<6wHctnJ?>J#(54ymc{zGo(Rl*;&ipi#BJD&W?EReh9O=q{H*I zupOb7OHx&j+uwg;S_)vWtj)4874#zvPlzi-ZX;#X`x$>X~p zdOnLCYdl5Yz*l}ftr}bKV5+6d))_7=d$JRbmsk6N2bbb|PT!~L6(Fd%*D4hbXk?4y zfnWfFR>Q3)odjU>fvsz2)N5{pwLDI1{nnw>XcS;8-NJ#_33dgO$tVg?j09)X4^p1nmZRB~I9*k!;Z2rk`l~rl z(-Aixm$Vy}p%lb{iQ0 zO=pDPV1G475_tO_uF)4Nl^-Cb==AiQ`f|$ev*19A5`7A8CwFaQN@bnCUMJvH`;_%G(zl`?VGo^joI;{e(j$`kj5}+4E_Y@0q%{4 z#IE67s5Lb1vR?FrK-@!jdjXTUtC~!rI2RPxuL~m9*YtRgGB4}Za`6G}3Di7bhl{oM zBIpe@w1fh?WB-I8IBr5g>HMUkAKt;InFy#!o6E3c%$IcvzgwBwk^j6pyg3H%I*efP zBOZ3rR5x-Yhhsc&RUW>O8e;@3CPs3qbjY>;zQTuXH*dfAg5tyOY5Cm=v-(68>98r! z=@I&(H?n;Q;xq68v%0h05&-Il;S}$zITk(@44qz#Pc6bCPE?k$&N>;%hVM~JGmMzp z&!Yu#LG&xEk1gI8@t0=FYvGde^}T9M`sF@Q%U_mzrW=4Ra2uj~C?Yyw7WdlL4#iXB$z^%+xTeo5$1`f9 z!m86dN-RQ3TIQ9=d=xa3fGoJX7PuP)2#?_v-ieV*wYk45SUl-~)W+;Ax$se$qt6i*so4FKUtooP;vw%1u5@|-t z!~!X%ghi49F_jxBGF_1zyyn^=^3AWI#Cm`FDIfepz;18`5i*2n@~XY%?pPHbJ&szZ z3>4)ZM@W@)T(7=@KKW#{e^{psSlFGyG)S@&5MV?*-o>K1B{_cZi}~Xb@`XTuE%%598Zdqo;tyMA~n)v}#n z0{PegZ}a8%+zdkIdaA;7sqNhQ=Uw`dFqvo(C`nfU_?AZ!_B z6Q9^HGmj6|Kr_ej17+Y=I5W_X&5Eum3QwBKF!0swJw&vliLp9t|jU& z8lj0kSktF@HmLnwR9%e ztHl#%k8CIm$+nkDvg8)B4lFd~(<(wpedOyZo*qvvsIuOq%&gl26*{wet8Oqe{>G@e|AjR!izQNPP4q!*ZpnmrOG0bz=ayAtMJ2 zK-@bpq!wDV84L_xVBG@RNvKi!tr=swgoqb%sF^Y8+lkSw7snFtzxM;Z!Z6mVGeZ5! zc)B&(fM=$hj_7(K#EAU!2N&689hp!t7PM<|?3{C*tjgw6*w`n+M^n?d6*%|VO;DZ1 zC7-!e*QAqzB#i4hW1frs99aOQatHYL%v+Uf%>~e^k&R`|9=5P)boTNR859y?PodSq zA$7u@52p^L!<5bUo6J>x+Q`%Jp&7_FT9!)|Jxiwvj;knKbG~NUB6~Ca^jMct5=Pr} zfhWna#VW@b{J9R@aS`yJ?EOhO9BOQaH(zW`hY!;OJ zFMjLQFo`LB=EMyd?LUBt1b%e?r!Ak+>EKrj=`$^B#d3HM)d(Jg0QeRJ+6r+y#S`*< z=_b*(yX?A`r&Ih?f>y~-WJnby`a^^;JN52N>uK?LJ6wBCN3l3#qEVrw6&trY z3dhE~>Ivq^0hs`X)B!Q_gyt96zfp_;Nlr9YcOl<-j+H({*n&;7OBc|{8IPC}JITXy z=84Oh*MU~n)MX+{_VI8sYA%u_P%@`^v1RioSlg@;&guz;d?oyZxVn>M}UQ{+x6$$Lq?{4TlM3& z$9M%*nPU$dY_T@iq)lMG%MSiRwcg7gIprjZW+kW^E_abNamCE#LevEwV+ZL49lGX9 zg^=atyQI%CBsEXVsrNuDPA%*bp%cLHZ z1^|e9VYU~nMWWt@t`83@%u@hKA>4PYYL2_scq0Nx9^DMkY}%)3ON8aPir!7fXTjy* z;GqfBkZGXUf=cM0h_!qxwYAD3wp{qonOV;ftksKlhc4;sqcp*~u;Mg!vctv@WS;0a z%)maSJJU74i`KjK-nztVq=@La+u+%R6$7l`v7xa>(eU@u>*=7aDa2&WS&fD)(sT&U z*$(F7F&Zb$L@tlel$Hv$sQ%2u6_i%Or;y2*oHb)5x+sNaUq=t~sTGp}w3RrFD|%W6<|K@o6S}T&M0kGz^CNXc_<&3E6TCB| zRi_G3`HAtPcGUKUznEX!5+~Dpl1KgNnzDoL_8GJztLq~dQ+m(1XZoFDWC<9tvaH5c z?vkHU7+VwF4|^G=Uk&;eBc%Nd9Piz;RsW{n3ElMh`N4F+bNsq~K_5!1N$XxHHv|=MPST z!gn6sv#V8ddZ*Mg+wFsUvi~x{p9KU?^mko?aS|u#&123Z6Bzd&wyK-U&r+?SF4Iv1 zX7~CQF%=?q>FJYj6C+4jll*1V9fw!o3{%lkI6C&H!VYB8mh49ZZviO06K5_y)?ce{ z86PR*2N&lYTaLpEF42VA+oIH@b68gmP6Cha>(*-mL(v62_SL?6Pt-0+a@XXjBS%aH zkPNt{(b0eW-_51^Bb3$VFAt@zvWs(0>ueQ=NTp@dyl^_CpNm)m2>Dk@8fShkh^KC~ zJrZR(C+A2FkvlZ!KLBtWgR!G`=4Cy69cjoy8!H6nrVM)bF=C>fM!%tSu%`LGhF2TeSE>RT%cE*h?0VAo`}$gu1PDSvKMaF$qye-Nr|Xu`yZ=KD1m_Zlw+D!Qy=F zQXV|?jLgGKG~m!J&8re#qExpKUkaCs_X-x-6CU5m@v^S|YZKw;q5yy1BS$wqZ0xzj$}cvKEu7)|b$Z#omUQpd(f?fu>OoHY4#EEz>=H9BYxE2=cV-6Zppr+#F#b&{)BJ`N~6Y{TV?3sgFW{O*CvZg zZE@Y4ffOKF)^cv;j6w-|)}#~r`N_zhdrPEEwCQa20ihGM>3A0I9b((>QNH@w@ErC7~6{idRu@b}&(1xWJ-Wh;lv=Tcde&?9%MA1Y1=chf9c}MWa zbQtHj9ek96VNx^}%U@PO_;cK<#xHEiXTR6$f0O{feg|~8*9>xQekFj z({A%ve*#@OU4RzArwzn1M?usCK6?$~=L4u9;J||Lk(F4$z{Rrb#Sap9sds_rmx&A9 zJ~&mkrz^OR=|X(+Gck@>(GSH5ke6i40?O7q(1A z#fsP1cc|Cc_vCA;RZRIOW5DL7dd1Do@1^IM@*c@Bb!FZo$0Z>r2#XzLAbsnF?*M=< zcdSMO5dCRP?qr}648Q|fY&hnVJf;&k`vI|E9A=}^ttyJb*pd~Tx5-*nxP|6@ z_ZcXgmRkx@x8?Q~J{A=#O>AvYb54vQm60x(%kM!wz&gKpD^i4aP@74@S}&);6L;$H zo~P)tcIA~WEMAW>Xi9XEm)nGQbpfY%;VB5WD*0c(c%>*+!TCic8-CF^eOJeHp530k z+@{hFn4?w8zRe-p?008JzhvhQp1$?iuM_UxaQkdamwghn9~S(O5}n%}Mv986ZE7gD zyTngxPtc3HIb_{fSK2hYdiSClT|fKduv*Y$F};MLt;}>Twj3yAd7Y3!vfx;z8`+ zj@$iW)_P|$F@%I*#y!8{e$`oggjWSpDWZ4a}Urwu41+?4Z4 zG5DQkYfbqTZxEJ7IIu}L7dPj*`pb7P^jQ*n1|TNbz%LlFJ#>@P8VYcn)#Ye*J!GM6 zadsF^>-(j%7fb3kR#XhHBRtbDcZ$Bw7YiadGmn;UPoqSNBj-$2 z>{Z2PHZe95iK)?!l*aP*C?&ovj@qzuWABYmmZ<31ayBFa`b)Vf+bi z^D05Be-V68gzN5y1P<_sqSYO3PunILhN zU&|F@@<&$p&>Y*9zQ}Oxcs!x%d$HD&m`fVz62DMk?WPmY%w5)pgNz^7t0UPsItO8s zv`w|aN`;zG`IJS7Isb8rI1+T9-=1^?;;d1aMHvXJdp-r~9Re_h(oXrZzy#&Gty;VAqwCpv4z%fYmuaGv@FM?@&2@5XOacp+(@aAWkSPZO{$Y$brnqaiZU zbOvfRi70$VI{OYfd`2jIhFCuM4W&a^RQtwCJ zi_-;~5U%@f*!hk=15pe=&Ugq+g=_7W^#*j3nvfoQ-2&9cY3mE#!eo*2uM;sYe!)pHk5z;v1|NdHS!+>AA23#x*!!3rhn#kR4oh;FQh8(1}DqI_`~$5xy7Rd zMaK|jrga^z!*X)AHWf!Du8+Zgtw!i?WgJW&CvACKrt$`&PaDT&F|X!4J4Xw1(^Vch zG59Y}|KXN$ot~-T18)KT5&XY3wzdePi$WM6AR4TH22fJNC~lG!2?2mF9$q4t7-|<> z14}wwUJ8FBpdYj=oEVz>a1bNGO@fCxb1A`%%zk}7qgmc_!7Z^lWs3{?OfKu%?WTLa z`{lLwPZOPN*j=6A?%DQB&zJwrN6%=|kM}DxP}UFzIN}6LBxa(LHeo-{ojBVO;s`fpP~xuAdt{?qHBcASkZ#6$>CxyN~K6(oc!*Co{~! zSFykF8cmp&!j|`N@Bq_8B-l%Zn3ou4m>8XVe=w0ar}_C>8B`~&d!0J5^3^W-{cAAJ zvGNt8r)HP;m!BpIKymox4z%M_X*llI6kV`i5&ctc80Z&+Qd3o3OLx`5tr0+SXK$-} z3qQ>F1>WuX843W_8GATu(qO@#5p^}=A$Q6%;ak>l#metOD?w7xl-Q8h`Sg| z?vG>d@R2Z?bIQVwyNE!xz7)U>iV8iyNI&Mcd z|Kt-}cL7MaoQ4}@jGM}0azB^USkdu;rg`vmK~!8iuqyCInI4~(t38v{QMs*!6<0YC zfPbNSZz?KxnuRapBZWiq_4<9g%2e z>0zh1gIfi4X>j!g8;3xC@O&sz(tW9E81KKD$^mrWa^$fw)jQ|WS)EVy3GrTatd6G7PZqAu8?_ch?#b}isXomi{pLKqT54R@_OX?Aj= zaR5K+JjJ*RLz`S9#k04vpECV*|GdTYl21Da79O0H3+LIt3D)L^?(DtbdIM_FBL4eismj@Umx*u(E5l%k~Shf5QG?XdUnMC}^jdG8=Hk z4SGD7kyxCQRs&CuNyExm|m6p&s znEAcaZ*gcqH3U?oW)ZNh6xd}_MsVNvneyspea{Gh?C@p)5xnu4M%DfM&L9gD`Xw?%mjI z_>*nG&>Q4XF{SJr#4oxHT zWU?I;KxJ(r^P30Ttd!VfS(I4cB$!GJ%@4^m$jHE1o3x-|!fkMRo6dKPH~BS7=uOT( zrxW9n9~K6eR)MKYQA$vitXCD=ngD9F$|9Z$HFjC35`CKN5F66HU6`CrgI4lAJFTm0s`3;M=sEQL8DH=akB#Pd^(9ZJWC7g_5A)3Y zOPP4`qcOqm#7m8SM{-VVJedmjCN;EFe?mt7rfQlg;y<*ExYGS4Zi*t%ohvs!@)#~z zz^`&rQrhH}*gf}Vi^OB7j;4R|_T?5UsnO7W0&#z9XY-f}k%Xq1_~S*?+r+zMW7{vq zRJUfj9ysI8wKVYW zPjziLu}ZxOfT`339zed0yM!_d%)+!!XD9B=Kjbu|Ca7w9^h_!IRdBts$;gG?L_x?V30m0&?J5HVc|$?9Bhqx2$NLu< zB6GK3ky-x2h7jX{`E{qtuVI)FGVfvjz%7Em=i!>Moif1EWN!nh)#4i)JE*kCtTDm; z;jzIoqbQY^ssUi=B2i^Z^2x*4bYuAxf0Ih4zViVGWI--X)g5MoWDGVMzikH5QV}6# zOY4JdjgH7P9^G5aM+B%aT?HZ z>v82*70dL0%Rf$GUqWR)wE+A%uV2HwB(HY)2P_Y;zO;j& z#oow4?~w@OO|_)B5qBkq!dnO__N8V|IB(;m8HNv?phgpdMYL=11V(qunrr;BOUAC? zo_GS2qDQH9V}&?--+WvL@rdidKWj=T%anLGk;=1#zQ|6uaWEItK{K7DxY0q^l|v9Z z&C2W-Q2=4+4uvT7y|HT&75C(qFkOpNRVt0PZr{066SdRXmozP3AdT(h6NO8|RSoFV zMxa0TaBScM*m^91@^6=&uB%ICYj-Kvjep{5lYDL}29Duc&Fa~I%d)oH-F#79WDd0M zjX>);$FgLC(qr58V#<;;IhEWfUt$@o&I(3UQ2=hEU29otP}|?D>8lcZIyRTg$jyPi zg5i;Q0&L(|+!2@}YWJ@A)1M63MLlqH#ouKprkd{X2EOjqFVElEM74%?h|h7XCi49q z2T`e-p3a<-SH~8&mX@UCJ^p!aVO?G5HpVfn8(N(mEUJyM%sPTUhk2jAYMJrzn)01V z_yEu}&-Txc**`Nnp(pib?f70Aj^<81QogE-OigG3*`!NVrAOLkOvgOhryKMHDLWdk zUmFixn>Whf;!+hPq;3mun8(-*Kiv8aXd=IZP&5!(Q1jo4@Jdi`o~?J!DCoa85Gy72 z_xLJZkO{8f% zApas-pIZ=w|4fqjjOiqT0|8~gCjknHlH#Y}nxLJs!T&qQVyD?E0|EpD2A*Ues7(A% z?>MU;-L6SO>#O!~WGdsIl6MoL7#R~0G8>VF7hs6&q`g2?zzrR)94rK?Xu9vobjQgw zzvuHwo#PHL+btg`s3MEh8F?UocQU-1Tf0rZ!)`^Of2f%(Hw~9bcnU2g++8bgG90e{ z(O=I6X+xjULPu4y9e2n90p#5I4=OA~0h+u$VcplpgV*^x_55jb#@l38hd)WIdl7w4 zSd*~_Qg!yQfSt7D+s+FgQ`^gk0{WW38oB|6VAe%-L8zHD18aEmq<*Ym-p&z&4quw- z5OY{dyQze!BdHQm?rZIQy|RK2Z4kOx#EPZ@oER*v6PS;W?+QGysiSaz&oj-ZN~>`;rQcb1!uftGJ%6} z#b%EJOF}<8Dx_697Z`QM9~pBKR9%Q%=C02jWjE7EU*7D~>iu*io z$9MtofWv}3XlX3+I4FF|thyyeB;NJ6=%H!3kGr)X>N;e;5Hdy5K~|;?>_&}~4CJck zR%IyKBj+SO1y3et*f!*e?!rvZ!c0fxBEtBZS*5xaB?ge$3X?`6gARt=pgVlt=9BxG7F1FW8xJN*0df0&>3hJP8Q)}KfiBkk9-X; zVD0r}HS@mkzY*N?0*TD(OSA{}^`6%(ZyW(1+5WEwb%p>)CvZV2uCNV~RPyX${OxL~ z_9#X2YLcn4yt_GmXzXffteZ}LWp#O7)f)3673D_~&OdgikYs98V1Pj_X?_i! z&GPlk0@mm-(hUD2p@=l}ZnT;8($X|3_kj{0$rkjQY7FdBpK5JzRaBmg*2A7yr`)MZwhbH{^puRdD24!MO@u#t;3z!OBT!i}6G z$Kc}sR>sYSIbQ^S&O>OT@@e#HsLA!%D=d4O`8}?}YIKX{a zE8F->-Cz3*|97n;VMi0zgJd5=dHg)h+qHzZ=;~-6pg&-s$>?3_ga>$Tl9-|^_hio< zumWKE2W}+ZaZq4MD6Xg6F_fB58tDv~V&8}&C!{G0DUZ+@DmTy;4rxA%S+P9diHT`T zfOkTPN}%tIGxgW?(PMMiz{NWU+?Xvo|INC=o^~6iB@OcC2`r=0MSI3&x>~-TmB}d4 z5nsA`j<87orQcHEf(!U{I;~KgH}C*+FuJ6vJ}Yq&8u{LNNTKU=l0rn*mzbX^UEJ+-gt(5^ecl;85t?V!6B9)F2_H&tbf{Cjz+ z^NMc}@zi)JNBTu|wdcIB6m#i)gh8|(6W#ioY|-i?rry^xZx~=PTX`oc|LjF|<~Bpg zjde|qX>s~9%zYaNHR8zMax+V(z`rH`dYt$BO9T{=qT-2nfT*yu`g>2xg50-{&m>|{&mHK4ILM2^?St@2&5$m z%q_C#1eqibuOHyHpo1F73Nsg%unnc2&va$coPs!P}qG!UBj6qSJUR>St} z2D8EPu>T^zM<_XH6$%*@c4#1MNHp^H3aL>tI7+f!EF6G=RN@#t8{&kXX2oCx_d*4p zmhuhx4{*hV0`F-*KS1tO_fpuuIM7j4*B6NTR0%{V? zV*vg4%yKU*L-`j02NOX3i{|@h{&$Y0cqINW?zIc#e~74M5%S+S(&+F1rD8&VA+Uda zyVX~-Rqmi-dp@H;ge~q$;Q}YCkX2%`2Ot31XMtzp}0JS>XxXLZm zEIQ7%0|H37Y9CbP;9>KYQa3qZ^X|`}iaarmzJ4Tp$n6B8CM(W#b#|~jZBT96&fTGF zw_;nZlbQ7L0|c;TwVB-*xsKi)+bJ?|KJ=T)3mtw(QrR#I7z%@Sq_SHHZ~8n3p-YjG z{+Rhm2E@ppqARdaquXEGfNDM4W=;M^8{rDxLY%vo2~A%y?iAvZ6)dFGi;uVA#LnQ& zA0X_|XY)a1VbzGnC&tPtq4i@z^0v;9)l!v_o{dMFW!MS__N^rcX?z)?Kr;}YWFzJ5{Rb0T_c`j4fCM&%Mx@ zSQ{=l{l>4MRyY>#IsGjBBEKc}G5EFN^`K?{7_VoTS?eGfwuAl1A&f%RfYSU`l}gC7 z0(HVYP;wQ&7Yh?4mT)#Ia|%p<2JU=D*0J-wyV>eY<^RoGkV87HyXJb7OI+L1BjP*3 zfXs;GlfPu`m-j8&2asf*9F0FZNIydT`yh?>hNj_7LDszNfP<{EO;#$B$lESTK_MVv!;jSqi)}FxBj1`Sg1i0vspOh$Sk!Z^ZSTX+X|JSJa zADXuI)w`zuL(@u#B&1CGCcU`!|519&E)n>@M8>nlXqfsZVk3z-Q3znKxS)jg%VA|s znFq^J^%h(V4%g8C~psOFUqh_%H;JjjwE-3!?j*! zPt@0n4In}QUjGK^aP55j8;Oz{s)?YwAR6` zJG3}7E{XxGn>|+Qo;`qt%;n7=qQQ*t9L^toaNaX326XGK8b7@lyL^>>YI6ne_l;=D zsXx13=;U^T<*LS*1DWs{b^I)yYRR#ST-t~ftD)t2>=#ANGQG(;7 zG0ZFF56R)|8nxHX8ah zKC#A2QGqc;svR5$+x-a!50N=IzhL$@2HY!WN9e(!)ev6Y8nkKAyq73$K+H~SaolAe zGWm*9e(+n)uuI?T;BfD>*U4-;Y&df=drWUz|9S-Hoh-tzoNC@e=%Tb@Yuv1&2&Zmj z(c;?geyXBu(@+8S@ZFE5M40XVzcQ{hsHr0gZ*J4^L6GvO!Znl-z=HCS0*VHNXe)0e zV%2J}U<8d=s0fT&tRPx!s}su+9~7)gsffz7h*~IO$PX!}qtEMi^y(5^Rz0aWS7X`yt^%l%Z4#xQP^!A>G%8V~Gf zL%|6Nj^NkDf%$uCSfe8xC|Kko0Us>~-XPhqzg|GdveyU+wZ;;Gi;3A5662iV##PS1 z_#?C(h9VLd6~R0Mo2h8v3dtQ_T+G9}SZ1RuCCTjap^dIM?Q9spcFeLH+vs>H1uhC1 z2YsDR6g;wR<)IPuqMtyBAJ0>Y4+Sq4u;zBG-?=uu5*Wpys+Iq_xixTo1Z7E zmIM`8rcpt|HCKu8CKRPhe^`R#>&M?{S+ zPd~Co|lX)WQ~Rhok`xAZkBP$rk);jJ96F^>saRX%@BCV z2a-$eVP3xpn>fHSOfGC3h~{ttv>nWY!ps?9r{^477Quwbc#danfuGV`a7pZG1aky; zud~cZK6NhXpU#yn>Sr0h0xXll-hOVr3N^hf^J@vk-S73Lp#UN~l8>Y51;%m?&(ZTT zxN}8jR org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M2 @@ -21,7 +21,7 @@ UTF-8 1.8 2.1.0.BUILD-SNAPSHOT - Finchley.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT diff --git a/samples/standalone/restdocs/http-client/build.gradle b/samples/standalone/restdocs/http-client/build.gradle index bf8d56ccc5..843d6d68ae 100644 --- a/samples/standalone/restdocs/http-client/build.gradle +++ b/samples/standalone/restdocs/http-client/build.gradle @@ -7,7 +7,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" } } diff --git a/samples/standalone/restdocs/http-client/gradle.properties b/samples/standalone/restdocs/http-client/gradle.properties index 558d820385..88a97742d7 100644 --- a/samples/standalone/restdocs/http-client/gradle.properties +++ b/samples/standalone/restdocs/http-client/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false verifierVersion=2.1.0.BUILD-SNAPSHOT -BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file +BOM_VERSION=Greenwich.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.jar index 96d36c23c86687e8c46a94a1eb0be9628b80422e..64b0894d0ece38a5ab4831111800b66f0584f179 100644 GIT binary patch delta 19272 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 org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M2 diff --git a/samples/standalone/restdocs/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/restdocs/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java index fef4e71669..ab17861df9 100644 --- a/samples/standalone/restdocs/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/samples/standalone/restdocs/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -29,10 +29,10 @@ public class LoanApplicationServiceTests { @Autowired private LoanApplicationService service; - @Value("classpath:META-INF/com.example/http-server-restdocs/0.0.1-SNAPSHOT/mappings/markClientAsFraud.json") + @Value("classpath:META-INF/com.example/http-server-restdocs/0.0.1-SNAPSHOT/mappings/standalone/shouldMarkClientAsFraud.json") private Resource markClientAsFraud; - @Value("classpath:META-INF/com.example/http-server-restdocs/0.0.1-SNAPSHOT/mappings/markClientAsNotFraud.json") + @Value("classpath:META-INF/com.example/http-server-restdocs/0.0.1-SNAPSHOT/mappings/webapp/shouldMarkClientAsNotFraud.json") private Resource markClientAsNotFraud; @Autowired diff --git a/samples/standalone/restdocs/http-server/build.gradle b/samples/standalone/restdocs/http-server/build.gradle index 5797f5c1f7..61478d402d 100644 --- a/samples/standalone/restdocs/http-server/build.gradle +++ b/samples/standalone/restdocs/http-server/build.gradle @@ -10,7 +10,7 @@ buildscript { maven { url "http://repo.spring.io/plugins-staging-local/" } } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${project.findProperty('verifierVersion') ?: verifierVersion}" } } @@ -70,7 +70,7 @@ contracts { generateClientStubs.enabled = false task wrapper(type: Wrapper) { - gradleVersion = '4.0.2' + gradleVersion = '4.10' } task stubsJar(type: Jar, dependsOn: ['copySnippets', 'copySources', 'copyClasses']) { diff --git a/samples/standalone/restdocs/http-server/gradle.properties b/samples/standalone/restdocs/http-server/gradle.properties index 558d820385..88a97742d7 100644 --- a/samples/standalone/restdocs/http-server/gradle.properties +++ b/samples/standalone/restdocs/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false verifierVersion=2.1.0.BUILD-SNAPSHOT -BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file +BOM_VERSION=Greenwich.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.jar index 96d36c23c86687e8c46a94a1eb0be9628b80422e..b1d61a8bce2bb83267e1637d68df7f7cf3d22ce6 100644 GIT binary patch delta 19272 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 YqEuueka?e_ZHL$)JlF=8dilHm0b4ll5C8xG delta 18746 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 org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M2 @@ -21,7 +21,7 @@ UTF-8 1.8 2.1.0.BUILD-SNAPSHOT - true + true diff --git a/samples/standalone/restdocs/http-server/settings.gradle b/samples/standalone/restdocs/http-server/settings.gradle index a27eed8db1..06780ec1e9 100644 --- a/samples/standalone/restdocs/http-server/settings.gradle +++ b/samples/standalone/restdocs/http-server/settings.gradle @@ -1 +1 @@ -rootProject.name = 'http-server-restdocs-gradle' +rootProject.name = 'http-server-restdocs' diff --git a/samples/standalone/restdocs/http-server/src/assembly/stub.xml b/samples/standalone/restdocs/http-server/src/assembly/stub.xml index 914f265c70..b459d2a636 100644 --- a/samples/standalone/restdocs/http-server/src/assembly/stub.xml +++ b/samples/standalone/restdocs/http-server/src/assembly/stub.xml @@ -29,5 +29,12 @@ **/* + + ${project.build.directory}/stubs + / + + **/* + + \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java b/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java index 182979b8ec..60cb3ab6f5 100644 --- a/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java +++ b/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java @@ -24,7 +24,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) -@AutoConfigureRestDocs(outputDir = "target/snippets") +@AutoConfigureRestDocs @AutoConfigureMockMvc @AutoConfigureJsonTesters public class StubGeneratorTests { diff --git a/samples/standalone/webclient/http-client/build.gradle b/samples/standalone/webclient/http-client/build.gradle index 3bbcea3bea..69bcfe6ad2 100644 --- a/samples/standalone/webclient/http-client/build.gradle +++ b/samples/standalone/webclient/http-client/build.gradle @@ -7,7 +7,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" } } diff --git a/samples/standalone/webclient/http-client/gradle.properties b/samples/standalone/webclient/http-client/gradle.properties index 558d820385..88a97742d7 100644 --- a/samples/standalone/webclient/http-client/gradle.properties +++ b/samples/standalone/webclient/http-client/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false verifierVersion=2.1.0.BUILD-SNAPSHOT -BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file +BOM_VERSION=Greenwich.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/webclient/http-client/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/webclient/http-client/gradle/wrapper/gradle-wrapper.jar index 96d36c23c86687e8c46a94a1eb0be9628b80422e..36df4eded67eda3710e9b465d6628f137ac7d1b6 100644 GIT binary patch delta 19272 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 Yi&{}gK*n9Rt}SAV1i&`9)GMF;4}S6Q8UO$Q delta 18746 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 org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M2 diff --git a/samples/standalone/webclient/http-server/build.gradle b/samples/standalone/webclient/http-server/build.gradle index a033d304e7..f31960b114 100644 --- a/samples/standalone/webclient/http-server/build.gradle +++ b/samples/standalone/webclient/http-server/build.gradle @@ -10,7 +10,7 @@ buildscript { maven { url "http://repo.spring.io/plugins-staging-local/" } } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" } } diff --git a/samples/standalone/webclient/http-server/gradle.properties b/samples/standalone/webclient/http-server/gradle.properties index 558d820385..88a97742d7 100644 --- a/samples/standalone/webclient/http-server/gradle.properties +++ b/samples/standalone/webclient/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false verifierVersion=2.1.0.BUILD-SNAPSHOT -BOM_VERSION=Finchley.BUILD-SNAPSHOT \ No newline at end of file +BOM_VERSION=Greenwich.BUILD-SNAPSHOT \ No newline at end of file diff --git a/samples/standalone/webclient/http-server/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/webclient/http-server/gradle/wrapper/gradle-wrapper.jar index 96d36c23c86687e8c46a94a1eb0be9628b80422e..48cdc5951552a21fcf8393eebf9f3441c7e574e1 100644 GIT binary patch delta 19272 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 org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M2 diff --git a/samples/standalone/yml/http-client/build.gradle b/samples/standalone/yml/http-client/build.gradle index 42387d97af..0e035eaeee 100644 --- a/samples/standalone/yml/http-client/build.gradle +++ b/samples/standalone/yml/http-client/build.gradle @@ -7,7 +7,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" } } @@ -48,7 +48,7 @@ test { } task wrapper(type: Wrapper) { - gradleVersion = '2.14' + gradleVersion = '4.10' } task resolveDependencies { diff --git a/samples/standalone/yml/http-client/gradle.properties b/samples/standalone/yml/http-client/gradle.properties index d765e1c4aa..72d5eb58b7 100644 --- a/samples/standalone/yml/http-client/gradle.properties +++ b/samples/standalone/yml/http-client/gradle.properties @@ -1,2 +1,2 @@ org.gradle.daemon=false -BOM_VERSION=Finchley.BUILD-SNAPSHOT +BOM_VERSION=Greenwich.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-client/gradle/wrapper/gradle-wrapper.properties b/samples/standalone/yml/http-client/gradle/wrapper/gradle-wrapper.properties index 2c2bbe5f9a..c1714705ed 100644 --- a/samples/standalone/yml/http-client/gradle/wrapper/gradle-wrapper.properties +++ b/samples/standalone/yml/http-client/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip diff --git a/samples/standalone/yml/http-client/pom.xml b/samples/standalone/yml/http-client/pom.xml index 8a53b767b7..36cc7fd03a 100644 --- a/samples/standalone/yml/http-client/pom.xml +++ b/samples/standalone/yml/http-client/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.8 - Finchley.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-server/build.gradle b/samples/standalone/yml/http-server/build.gradle index 00149b07a1..49c98fa6cd 100644 --- a/samples/standalone/yml/http-server/build.gradle +++ b/samples/standalone/yml/http-server/build.gradle @@ -9,7 +9,7 @@ buildscript { } // end::repos[] dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" + classpath "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.M2" classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${findProperty('verifierVersion') ?: verifierVersion}" } } @@ -59,7 +59,7 @@ test { } task wrapper(type: Wrapper) { - gradleVersion = '4.4.1' + gradleVersion = '4.10' } clean.doFirst { diff --git a/samples/standalone/yml/http-server/gradle.properties b/samples/standalone/yml/http-server/gradle.properties index 711450aac9..c3a4cd72dc 100644 --- a/samples/standalone/yml/http-server/gradle.properties +++ b/samples/standalone/yml/http-server/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=false verifierVersion=2.1.0.BUILD-SNAPSHOT -BOM_VERSION=Finchley.BUILD-SNAPSHOT +BOM_VERSION=Greenwich.BUILD-SNAPSHOT diff --git a/samples/standalone/yml/http-server/gradle/wrapper/gradle-wrapper.properties b/samples/standalone/yml/http-server/gradle/wrapper/gradle-wrapper.properties index 2c2bbe5f9a..c1714705ed 100644 --- a/samples/standalone/yml/http-server/gradle/wrapper/gradle-wrapper.properties +++ b/samples/standalone/yml/http-server/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip diff --git a/samples/standalone/yml/http-server/pom.xml b/samples/standalone/yml/http-server/pom.xml index 1df451ee2d..6b982b9ef7 100644 --- a/samples/standalone/yml/http-server/pom.xml +++ b/samples/standalone/yml/http-server/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.0.M2 @@ -21,7 +21,7 @@ UTF-8 1.8 2.1.0.BUILD-SNAPSHOT - Finchley.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index e2df9aa5c6..58ef90bb12 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -37,6 +37,10 @@ org.springframework.boot spring-boot-starter-test + + org.springframework.boot + spring-boot-starter-web + diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle/wrapper/gradle-wrapper.jar b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle/wrapper/gradle-wrapper.jar index 96d36c23c86687e8c46a94a1eb0be9628b80422e..0ab4ff82ef0d75b48790afcfef8d94bad7af2407 100644 GIT binary patch delta 19272 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 a@HmTBQAt47JvP}1aY9018y3{5-~A8U((g0? delta 18746 zcmY(pW0Ypg(luJPZQHhO+qTVqs;bMjZQEUDmu=g&?>=XrF~0l$$PsfzMvnY5SH{f9 zXs-h8D+5JPk_81r0|J7A0TPzA>Ww=X?D-40sd@2q+m92#5+O>23r)iE;wHNk(rD>c4SG^z_I7 z1x+;aRFMB&V!C>r=?nn`gaii!#QN_NIBYTit|j&_0qyzqizi}-eGTr~Bq4Ij)%+VH+$YYFK^pRJKry(g1}snhG$-QB?x{fn2Ss`dr>@q zeJ_Q<=vXotn};r)?%7z(rB8DA`$Qau$~|*-EgXvtWsQl*SOck?QU>dE+tIFAd>KDT zJN&eUd%cYI(Rp4wd-kn_5ep@p3GP;q#}xm$I3L)26H+=;vn zE(5CEE-rUtzpmSCA;Y^y_u+A#RNgc|4vgPM4leTPxUU0${ie~n3yw-YX?@kaEf}gh zurktVt#_=d6X=;?1D<<2UW-027el-hCQOEPpx1VlQbU>5pL@F^9@?)&_6w<_8Cu=x z=A#Xp9iC{&2aX!Es9eFcoQIl7(k4y+DvhLH&xb9I3*{S{hwWE?8(g%PFHlnfwo}r1 zLP;84L`u1eukaG9FE+v_gsnE=uaJM6ODLOruRBi&zRWz z)*>!l_d$KvQnMvn_gzPw^A%wTSi?aw$$Bxd5!z8A;ucHR7CVx=$X1%)B%~XuX)~(= z3EnU&b&ehAbvVO>5m$P5?!UGG_*2&O&9t?gV)1bt$ybKDiNotI+6WFYKFw-4+zS3V z7QBorZtUd0L(m(}Xole6gB9tunCa$*I)QAqspE~>+7{{FV-NDf zybmbO84x{~-0wYs3tXgt+ttB#3Z#cRoLAsq<$Lg;f&+2zXv_tBln}on^Pt^Q3%8AZ z(&W%5viwdcgp*Iqhr4XnfDhoi>-fl7eHJZtLyTNXL)+j!@f>ZvM*IG>*Y1@D8tz7i z>O%aAxTs#F7)HZ-*SZRhv*Xtkjg*%h%7SCX2-(bpxL zkkow+o+M&0z|}0Fx=y8b`$`opV~B_E&Ot74y5mj;TP;>V9eA(aD`V$H`%IhMXRN_o z=3$QC$T&bHe0j(pCa%nkxI5`_#&hYx)2sRn=|ZpEZ$xWaa4stolaI%6jv19bi>vR% zixp|z{w##lG`3j+Cay(j?fj?T3v2vPJOuFY25(D9YdZCQyVx`k{H3Wn)~PKkpMhv8 zh++z_pE3$Cd>DPJaS(;EHX~yCs}INXt~RsVsn`NP?Ys?7I&lZ($(n4fy7St!uc!h$f9=d^D#Z1?m%otLC^Pw z7h9SXd8QW~AWe=uODZJjNls^bJ|1c;ko0M9CJc!>eQOS?MN=Jv>Nq2UG%xwGU=MOAlB*AgLq@5}&4G9Iy z-gkUvhP8U#iWY4=%!f3ncyO6^TACJelz5#|;mG+CK)Xp(JBL#%ugwXr?N<8}hx-$P z^p##>u6P+`Z6zI_XkxZ)-*JHl9;p1V-b}~vh zv%d+LW9c~8^Mk6hr!CTg+_?#m6J2{Y!35&%?|89EoFCQ?4}7+wI*%x0z7n8Bdr2@&e)9!N#~u5 zRZkwvR`$%k-bI7lzIF;^HsYS#7vaB&4(dNy@jn@@iAWX#1nNKN#izP2NdZy>aOHp^ zjK&X|JZx_5tX{t?V{aQ$N%x8lKN4&tCl_w5VsG+p3xlfFv_(8fbfhik2k~W!EAIzH zIPL{mjv`Zj9oOM`&Hb|NYH0!Zet!lP!j7{iOK937vNWa-%;H#XNa(WwnHcFdH-&Ap z7fWcXx8Fk${mdYIf9DouGh8(VgfE$?GSMx4DRo`r6F@zM5`v*QUo`gr=CAc@B7`*U zyz+$JP`;VL35n64_18HX4GuMeidHes$zKyKJKHU4kIBD|e?+v~Px7JSrtcV?GHv4%LmGd7 zcp35VHQ$C8yaK|;;@^sFV6<|0nMHllv2N>+t`ItP@L0&Ex~Zh)_>ES_S174;-i)hM zxNuFpSbo38Rh*q+Ma(uX1CA>z(I}A{{ET}?;&bLqdM#=_&8O3~ih4%^-wMOib&DmN z#CYTAx{2uQ2ubflvZ3aiN5cB!+NG*kN&1G-8=1}G@hLT_ZR#&Q#dbOxQ0dy8S9pZ? zX&LYazxmX!7sNU)%kcuK^>EXCWjI)t2P|yIqM=ObM|At2jMvZO2?3yKW1WZO%6;Uk z?J^i=LyrGf8#QUDZG!zPaxfW?Apb>lz#QQJDj*Ap-G5y%QgI;vRX|(sJJeY4KtS8r zKtRO*Q9$@fy(18S94%-+v=#sF+~z;5I1t1bNOY_9t0PeOvL4pbSWqlDXxc3U z{0&F`L1W;{t~Th+u&axg!Te_l-uJi=<+sitEY7y25qm9`RsRS4KTJ;^B}^O)bN3tS zle}Z*_S@{Eyp;yc8z?)v&7iP(tB#$)e&y@Q|3_x^m=Q%XLKb|(NxJ(D_i5g7LVRNw zE+iyI^(FyCdKf%=YWHyGgB{2B#JNAa@p{O^94Gd8U0!S14hY>oivo%L6h~j&KZOPn z;V*|(dA_9uezX%mqq4uMz>ap{@J4zsUJ*fmB7WxYc5r@?wS7yD{+z!yglby7Mi3JP zGvH9Ev)Pd3N8~ezbk4FBTojJ=IUApvgfPgBqtgPcBdnH(Y4n>9SleA`8H6Y;yR~?-$cCu%hT^?$w$1kLJy~_e-j$M#rCgz ziVg-nXEWRT#sw%Z-ZYl;>RG)1D2q_l7kc^`#vumerSXo&%l>YuE(1e7W`dj8|sV zE&!gaXGECCR(314>>5X_iXA)efIR}^})9e=?#8kd5dIXh4FDYEeD-i*(_iH zhkSNzP1$R`D{+={HTAl${P>tcndNbTrgW~PgMTxXW8bi{k|)!Uh!w1+D_W5Y#ndZX)o{3Lx8&w=)iN0UbA$l=x` zO2uz8+iBlcU#k%Y@AP`b^b>kh=(QGv{W3mO&ai+=VhyH-T zz&h|{ z=k}iFGgqZ_!;R{WN>pXL8;TfSC+rg)m{g9~@u`R-Ez9ta=ZcTk{y3b?l&Z09t!hxN zo`ZW#L|b1x=^~JFgnMo)ws<_lLu+$(AwWltnj#yJ21f+(d}JU3nDyJ-NF@6>qY^NSzfdRCr>4B`Y?|2ZW$yLo$}5}s}&Jh@^>iCQ4|jB z!wd}@Xuierbr`ncd@(;E(pBC}vf%A!rPQG2EhcxoXW60{Q4H6Ors5D)ZJ1P>XWVhTso_kQ0qS)%6?J`WHs^7)vf-Ry@6REj6#~_4WY48p`o`J{RR^#_ zmlu=EeLV_}jA?~o1l^vanG?HZ9Uh@>5see7KE}-D3D2wvrB#3yGRFv~yw7xPqPGR} zB-yUJ-+?$|@z+|_tH70bQ!L@reMhz^ZfW6WmZf<(K^B%ufe)vx8grd#Nmpvd;ET-F zu~kK(^iB?Y2)V0VO8M%WNW~PZsu@t~1g=I)Z<%G?EyXV=4-HtLulhWKo;6fL(N>3Rd@*&r;iKE6ys_|Jl zRV0ySc_3Uv^!2u<2{?xjAL#7QCV2JVaHr%q)G0JmHP9re1FzZG}F{F-@ik zE%T2h&6Q83IPdW5GyXG>dUDFQmHWm$1^v86?@q<4%09p{6*=0@P@T2GIU+LCqP*oB znl#ZUdhO+S4OruL%b@I|eCLw`HKB4klDq;YaXr;mKF9vqx%M3Rw|$wf=a8))z@*iy zIWa^{q^G^szXa2h`j`27l;$@4QqE3!HQ2;d`FiOub%wv{bvKEzZy7t#ZXJ3S75Ak! z$35B;@=^e!Ch9+>G2F%FM=L-z+PX7aY$rik&)7yd#u1|>z%ie2`@d)oyc!XSFC!MK z=~eX(KFbf@hS#WU<6wHctnJ?>J#(54ymc{zGo(Rl*;&ipi#BJD&W?EReh9O=q{H*I zupOb7OHx&j+uwg;S_)vWtj)4874#zvPlzi-ZX;#X`x$>X~p zdOnLCYdl5Yz*l}ftr}bKV5+6d))_7=d$JRbmsk6N2bbb|PT!~L6(Fd%*D4hbXk?4y zfnWfFR>Q3)odjU>fvsz2)N5{pwLDI1{nnw>XcS;8-NJ#_33dgO$tVg?j09)X4^p1nmZRB~I9*k!;Z2rk`l~rl z(-Aixm$Vy}p%lb{iQ0 zO=pDPV1G475_tO_uF)4Nl^-Cb==AiQ`f|$ev*19A5`7A8CwFaQN@bnCUMJvH`;_%G(zl`?VGo^joI;{e(j$`kj5}+4E_Y@0q%{4 z#IE67s5Lb1vR?FrK-@!jdjXTUtC~!rI2RPxuL~m9*YtRgGB4}Za`6G}3Di7bhl{oM zBIpe@w1fh?WB-I8IBr5g>HMUkAKt;InFy#!o6E3c%$IcvzgwBwk^j6pyg3H%I*efP zBOZ3rR5x-Yhhsc&RUW>O8e;@3CPs3qbjY>;zQTuXH*dfAg5tyOY5Cm=v-(68>98r! z=@I&(H?n;Q;xq68v%0h05&-Il;S}$zITk(@44qz#Pc6bCPE?k$&N>;%hVM~JGmMzp z&!Yu#LG&xEk1gI8@t0=FYvGde^}T9M`sF@Q%U_mzrW=4Ra2uj~C?Yyw7WdlL4#iXB$z^%+xTeo5$1`f9 z!m86dN-RQ3TIQ9=d=xa3fGoJX7PuP)2#?_v-ieV*wYk45SUl-~)W+;Ax$se$qt6i*so4FKUtooP;vw%1u5@|-t z!~!X%ghi49F_jxBGF_1zyyn^=^3AWI#Cm`FDIfepz;18`5i*2n@~XY%?pPHbJ&szZ z3>4)ZM@W@)T(7=@KKW#{e^{psSlFGyG)S@&5MV?*-o>K1B{_cZi}~Xb@`XTuE%%598Zdqo;tyMA~n)v}#n z0{PegZ}a8%+zdkIdaA;7sqNhQ=Uw`dFqvo(C`nfU_?AZ!_B z6Q9^HGmj6|Kr_ej17+Y=I5W_X&5Eum3QwBKF!0swJw&vliLp9t|jU& z8lj0kSktF@HmLnwR9%e ztHl#%k8CIm$+nkDvg8)B4lFd~(<(wpedOyZo*qvvsIuOq%&gl26*{wet8Oqe{>G@e|AjR!izQNPP4q!*ZpnmrOG0bz=ayAtMJ2 zK-@bpq!wDV84L_xVBG@RNvKi!tr=swgoqb%sF^Y8+lkSw7snFtzxM;Z!Z6mVGeZ5! zc)B&(fM=$hj_7(K#EAU!2N&689hp!t7PM<|?3{C*tjgw6*w`n+M^n?d6*%|VO;DZ1 zC7-!e*QAqzB#i4hW1frs99aOQatHYL%v+Uf%>~e^k&R`|9=5P)boTNR859y?PodSq zA$7u@52p^L!<5bUo6J>x+Q`%Jp&7_FT9!)|Jxiwvj;knKbG~NUB6~Ca^jMct5=Pr} zfhWna#VW@b{J9R@aS`yJ?EOhO9BOQaH(zW`hY!;OJ zFMjLQFo`LB=EMyd?LUBt1b%e?r!Ak+>EKrj=`$^B#d3HM)d(Jg0QeRJ+6r+y#S`*< z=_b*(yX?A`r&Ih?f>y~-WJnby`a^^;JN52N>uK?LJ6wBCN3l3#qEVrw6&trY z3dhE~>Ivq^0hs`X)B!Q_gyt96zfp_;Nlr9YcOl<-j+H({*n&;7OBc|{8IPC}JITXy z=84Oh*MU~n)MX+{_VI8sYA%u_P%@`^v1RioSlg@;&guz;d?oyZxVn>M}UQ{+x6$$Lq?{4TlM3& z$9M%*nPU$dY_T@iq)lMG%MSiRwcg7gIprjZW+kW^E_abNamCE#LevEwV+ZL49lGX9 zg^=atyQI%CBsEXVsrNuDPA%*bp%cLHZ z1^|e9VYU~nMWWt@t`83@%u@hKA>4PYYL2_scq0Nx9^DMkY}%)3ON8aPir!7fXTjy* z;GqfBkZGXUf=cM0h_!qxwYAD3wp{qonOV;ftksKlhc4;sqcp*~u;Mg!vctv@WS;0a z%)maSJJU74i`KjK-nztVq=@La+u+%R6$7l`v7xa>(eU@u>*=7aDa2&WS&fD)(sT&U z*$(F7F&Zb$L@tlel$Hv$sQ%2u6_i%Or;y2*oHb)5x+sNaUq=t~sTGp}w3RrFD|%W6<|K@o6S}T&M0kGz^CNXc_<&3E6TCB| zRi_G3`HAtPcGUKUznEX!5+~Dpl1KgNnzDoL_8GJztLq~dQ+m(1XZoFDWC<9tvaH5c z?vkHU7+VwF4|^G=Uk&;eBc%Nd9Piz;RsW{n3ElMh`N4F+bNsq~K_5!1N$XxHHv|=MPST z!gn6sv#V8ddZ*Mg+wFsUvi~x{p9KU?^mko?aS|u#&123Z6Bzd&wyK-U&r+?SF4Iv1 zX7~CQF%=?q>FJYj6C+4jll*1V9fw!o3{%lkI6C&H!VYB8mh49ZZviO06K5_y)?ce{ z86PR*2N&lYTaLpEF42VA+oIH@b68gmP6Cha>(*-mL(v62_SL?6Pt-0+a@XXjBS%aH zkPNt{(b0eW-_51^Bb3$VFAt@zvWs(0>ueQ=NTp@dyl^_CpNm)m2>Dk@8fShkh^KC~ zJrZR(C+A2FkvlZ!KLBtWgR!G`=4Cy69cjoy8!H6nrVM)bF=C>fM!%tSu%`LGhF2TeSE>RT%cE*h?0VAo`}$gu1PDSvKMaF$qye-Nr|Xu`yZ=KD1m_Zlw+D!Qy=F zQXV|?jLgGKG~m!J&8re#qExpKUkaCs_X-x-6CU5m@v^S|YZKw;q5yy1BS$wqZ0xzj$}cvKEu7)|b$Z#omUQpd(f?fu>OoHY4#EEz>=H9BYxE2=cV-6Zppr+#F#b&{)BJ`N~6Y{TV?3sgFW{O*CvZg zZE@Y4ffOKF)^cv;j6w-|)}#~r`N_zhdrPEEwCQa20ihGM>3A0I9b((>QNH@w@ErC7~6{idRu@b}&(1xWJ-Wh;lv=Tcde&?9%MA1Y1=chf9c}MWa zbQtHj9ek96VNx^}%U@PO_;cK<#xHEiXTR6$f0O{feg|~8*9>xQekFj z({A%ve*#@OU4RzArwzn1M?usCK6?$~=L4u9;J||Lk(F4$z{Rrb#Sap9sds_rmx&A9 zJ~&mkrz^OR=|X(+Gck@>(GSH5ke6i40?O7q(1A z#fsP1cc|Cc_vCA;RZRIOW5DL7dd1Do@1^IM@*c@Bb!FZo$0Z>r2#XzLAbsnF?*M=< zcdSMO5dCRP?qr}648Q|fY&hnVJf;&k`vI|E9A=}^ttyJb*pd~Tx5-*nxP|6@ z_ZcXgmRkx@x8?Q~J{A=#O>AvYb54vQm60x(%kM!wz&gKpD^i4aP@74@S}&);6L;$H zo~P)tcIA~WEMAW>Xi9XEm)nGQbpfY%;VB5WD*0c(c%>*+!TCic8-CF^eOJeHp530k z+@{hFn4?w8zRe-p?008JzhvhQp1$?iuM_UxaQkdamwghn9~S(O5}n%}Mv986ZE7gD zyTngxPtc3HIb_{fSK2hYdiSClT|fKduv*Y$F};MLt;}>Twj3yAd7Y3!vfx;z8`+ zj@$iW)_P|$F@%I*#y!8{e$`oggjWSpDWZ4a}Urwu41+?4Z4 zG5DQkYfbqTZxEJ7IIu}L7dPj*`pb7P^jQ*n1|TNbz%LlFJ#>@P8VYcn)#Ye*J!GM6 zadsF^>-(j%7fb3kR#XhHBRtbDcZ$Bw7YiadGmn;UPoqSNBj-$2 z>{Z2PHZe95iK)?!l*aP*C?&ovj@qzuWABYmmZ<31ayBFa`b)Vf+bi z^D05Be-V68gzN5y1P<_sqSYO3PunILhN zU&|F@@<&$p&>Y*9zQ}Oxcs!x%d$HD&m`fVz62DMk?WPmY%w5)pgNz^7t0UPsItO8s zv`w|aN`;zG`IJS7Isb8rI1+T9-=1^?;;d1aMHvXJdp-r~9Re_h(oXrZzy#&Gty;VAqwCpv4z%fYmuaGv@FM?@&2@5XOacp+(@aAWkSPZO{$Y$brnqaiZU zbOvfRi70$VI{OYfd`2jIhFCuM4W&a^RQtwCJ zi_-;~5U%@f*!hk=15pe=&Ugq+g=_7W^#*j3nvfoQ-2&9cY3mE#!eo*2uM;sYe!)pHk5z;v1|NdHS!+>AA23#x*!!3rhn#kR4oh;FQh8(1}DqI_`~$5xy7Rd zMaK|jrga^z!*X)AHWf!Du8+Zgtw!i?WgJW&CvACKrt$`&PaDT&F|X!4J4Xw1(^Vch zG59Y}|KXN$ot~-T18)KT5&XY3wzdePi$WM6AR4TH22fJNC~lG!2?2mF9$q4t7-|<> z14}wwUJ8FBpdYj=oEVz>a1bNGO@fCxb1A`%%zk}7qgmc_!7Z^lWs3{?OfKu%?WTLa z`{lLwPZOPN*j=6A?%DQB&zJwrN6%=|kM}DxP}UFzIN}6LBxa(LHeo-{ojBVO;s`fpP~xuAdt{?qHBcASkZ#6$>CxyN~K6(oc!*Co{~! zSFykF8cmp&!j|`N@Bq_8B-l%Zn3ou4m>8XVe=w0ar}_C>8B`~&d!0J5^3^W-{cAAJ zvGNt8r)HP;m!BpIKymox4z%M_X*llI6kV`i5&ctc80Z&+Qd3o3OLx`5tr0+SXK$-} z3qQ>F1>WuX843W_8GATu(qO@#5p^}=A$Q6%;ak>l#metOD?w7xl-Q8h`Sg| z?vG>d@R2Z?bIQVwyNE!xz7)U>iV8iyNI&Mcd z|Kt-}cL7MaoQ4}@jGM}0azB^USkdu;rg`vmK~!8iuqyCInI4~(t38v{QMs*!6<0YC zfPbNSZz?KxnuRapBZWiq_4<9g%2e z>0zh1gIfi4X>j!g8;3xC@O&sz(tW9E81KKD$^mrWa^$fw)jQ|WS)EVy3GrTatd6G7PZqAu8?_ch?#b}isXomi{pLKqT54R@_OX?Aj= zaR5K+JjJ*RLz`S9#k04vpECV*|GdTYl21Da79O0H3+LIt3D)L^?(DtbdIM_FBL4eismj@Umx*u(E5l%k~Shf5QG?XdUnMC}^jdG8=Hk z4SGD7kyxCQRs&CuNyExm|m6p&s znEAcaZ*gcqH3U?oW)ZNh6xd}_MsVNvneyspea{Gh?C@p)5xnu4M%DfM&L9gD`Xw?%mjI z_>*nG&>Q4XF{SJr#4oxHT zWU?I;KxJ(r^P30Ttd!VfS(I4cB$!GJ%@4^m$jHE1o3x-|!fkMRo6dKPH~BS7=uOT( zrxW9n9~K6eR)MKYQA$vitXCD=ngD9F$|9Z$HFjC35`CKN5F66HU6`CrgI4lAJFTm0s`3;M=sEQL8DH=akB#Pd^(9ZJWC7g_5A)3Y zOPP4`qcOqm#7m8SM{-VVJedmjCN;EFe?mt7rfQlg;y<*ExYGS4Zi*t%ohvs!@)#~z zz^`&rQrhH}*gf}Vi^OB7j;4R|_T?5UsnO7W0&#z9XY-f}k%Xq1_~S*?+r+zMW7{vq zRJUfj9ysI8wKVYW zPjziLu}ZxOfT`339zed0yM!_d%)+!!XD9B=Kjbu|Ca7w9^h_!IRdBts$;gG?L_x?V30m0&?J5HVc|$?9Bhqx2$NLu< zB6GK3ky-x2h7jX{`E{qtuVI)FGVfvjz%7Em=i!>Moif1EWN!nh)#4i)JE*kCtTDm; z;jzIoqbQY^ssUi=B2i^Z^2x*4bYuAxf0Ih4zViVGWI--X)g5MoWDGVMzikH5QV}6# zOY4JdjgH7P9^G5aM+B%aT?HZ z>v82*70dL0%Rf$GUqWR)wE+A%uV2HwB(HY)2P_Y;zO;j& z#oow4?~w@OO|_)B5qBkq!dnO__N8V|IB(;m8HNv?phgpdMYL=11V(qunrr;BOUAC? zo_GS2qDQH9V}&?--+WvL@rdidKWj=T%anLGk;=1#zQ|6uaWEItK{K7DxY0q^l|v9Z z&C2W-Q2=4+4uvT7y|HT&75C(qFkOpNRVt0PZr{066SdRXmozP3AdT(h6NO8|RSoFV zMxa0TaBScM*m^91@^6=&uB%ICYj-Kvjep{5lYDL}29Duc&Fa~I%d)oH-F#79WDd0M zjX>);$FgLC(qr58V#<;;IhEWfUt$@o&I(3UQ2=hEU29otP}|?D>8lcZIyRTg$jyPi zg5i;Q0&L(|+!2@}YWJ@A)1M63MLlqH#ouKprkd{X2EOjqFVElEM74%?h|h7XCi49q z2T`e-p3a<-SH~8&mX@UCJ^p!aVO?G5HpVfn8(N(mEUJyM%sPTUhk2jAYMJrzn)01V z_yEu}&-Txc**`Nnp(pib?f70Aj^<81QogE-OigG3*`!NVrAOLkOvgOhryKMHDLWdk zUmFixn>Whf;!+hPq;3mun8(-*Kiv8aXd=IZP&5!(Q1jo4@Jdi`o~?J!DCoa85Gy72 z_xLJZkO{8f% zApas-pIZ=w|4fqjjOiqT0|8~gCjknHlH#Y}nxLJs!T&qQVyD?E0|EpD2A*Ues7(A% z?>MU;-L6SO>#O!~WGdsIl6MoL7#R~0G8>VF7hs6&q`g2?zzrR)94rK?Xu9vobjQgw zzvuHwo#PHL+btg`s3MEh8F?UocQU-1Tf0rZ!)`^Of2f%(Hw~9bcnU2g++8bgG90e{ z(O=I6X+xjULPu4y9e2n90p#5I4=OA~0h+u$VcplpgV*^x_55jb#@l38hd)WIdl7w4 zSd*~_Qg!yQfSt7D+s+FgQ`^gk0{WW38oB|6VAe%-L8zHD18aEmq<*Ym-p&z&4quw- z5OY{dyQze!BdHQm?rZIQy|RK2Z4kOx#EPZ@oER*v6PS;W?+QGysiSaz&oj-ZN~>`;rQcb1!uftGJ%6} z#b%EJOF}<8Dx_697Z`QM9~pBKR9%Q%=C02jWjE7EU*7D~>iu*io z$9MtofWv}3XlX3+I4FF|thyyeB;NJ6=%H!3kGr)X>N;e;5Hdy5K~|;?>_&}~4CJck zR%IyKBj+SO1y3et*f!*e?!rvZ!c0fxBEtBZS*5xaB?ge$3X?`6gARt=pgVlt=9BxG7F1FW8xJN*0df0&>3hJP8Q)}KfiBkk9-X; zVD0r}HS@mkzY*N?0*TD(OSA{}^`6%(ZyW(1+5WEwb%p>)CvZV2uCNV~RPyX${OxL~ z_9#X2YLcn4yt_GmXzXffteZ}LWp#O7)f)3673D_~&OdgikYs98V1Pj_X?_i! z&GPlk0@mm-(hUD2p@=l}ZnT;8($X|3_kj{0$rkjQY7FdBpK5JzRaBmg*2A7yr`)MZwhbH{^puRdD24!MO@u#t;3z!OBT!i}6G z$Kc}sR>sYSIbQ^S&O>OT@@e#HsLA!%D=d4O`8}?}YIKX{a zE8F->-Cz3*|97n;VMi0zgJd5=dHg)h+qHzZ=;~-6pg&-s$>?3_ga>$Tl9-|^_hio< zumWKE2W}+ZaZq4MD6Xg6F_fB58tDv~V&8}&C!{G0DUZ+@DmTy;4rxA%S+P9diHT`T zfOkTPN}%tIGxgW?(PMMiz{NWU+?Xvo|INC=o^~6iB@OcC2`r=0MSI3&x>~-TmB}d4 z5nsA`j<87orQcHEf(!U{I;~KgH}C*+FuJ6vJ}Yq&8u{LNNTKU=l0rn*mzbX^UEJ+-gt(5^ecl;85t?V!6B9)F2_H&tbf{Cjz+ z^NMc}@zi)JNBTu|wdcIB6m#i)gh8|(6W#ioY|-i?rry^xZx~=PTX`oc|LjF|<~Bpg zjde|qX>s~9%zYaNHR8zMax+V(z`rH`dYt$BO9T{=qT-2nfT*yu`g>2xg50-{&m>|{&mHK4ILM2^?St@2&5$m z%q_C#1eqibuOHyHpo1F73Nsg%unnc2&va$coPs!P}qG!UBj6qSJUR>St} z2D8EPu>T^zM<_XH6$%*@c4#1MNHp^H3aL>tI7+f!EF6G=RN@#t8{&kXX2oCx_d*4p zmhuhx4{*hV0`F-*KS1tO_fpuuIM7j4*B6NTR0%{V? zV*vg4%yKU*L-`j02NOX3i{|@h{&$Y0cqINW?zIc#e~74M5%S+S(&+F1rD8&VA+Uda zyVX~-Rqmi-dp@H;ge~q$;Q}YCkX2%`2Ot31XMtzp}0JS>XxXLZm zEIQ7%0|H37Y9CbP;9>KYQa3qZ^X|`}iaarmzJ4Tp$n6B8CM(W#b#|~jZBT96&fTGF zw_;nZlbQ7L0|c;TwVB-*xsKi)+bJ?|KJ=T)3mtw(QrR#I7z%@Sq_SHHZ~8n3p-YjG z{+Rhm2E@ppqARdaquXEGfNDM4W=;M^8{rDxLY%vo2~A%y?iAvZ6)dFGi;uVA#LnQ& zA0X_|XY)a1VbzGnC&tPtq4i@z^0v;9)l!v_o{dMFW!MS__N^rcX?z)?Kr;}YWFzJ5{Rb0T_c`j4fCM&%Mx@ zSQ{=l{l>4MRyY>#IsGjBBEKc}G5EFN^`K?{7_VoTS?eGfwuAl1A&f%RfYSU`l}gC7 z0(HVYP;wQ&7Yh?4mT)#Ia|%p<2JU=D*0J-wyV>eY<^RoGkV87HyXJb7OI+L1BjP*3 zfXs;GlfPu`m-j8&2asf*9F0FZNIydT`yh?>hNj_7LDszNfP<{EO;#$B$lESTK_MVv!;jSqi)}FxBj1`Sg1i0vspOh$Sk!Z^ZSTX+X|JSJa zADXuI)w`zuL(@u#B&1CGCcU`!|519&E)n>@M8>nlXqfsZVk3z-Q3znKxS)jg%VA|s znFq^J^%h(V4%g8C~psOFUqh_%H;JjjwE-3!?j*! zPt@0n4In}QUjGK^aP55j8;Oz{s)?YwAR6` zJG3}7E{XxGn>|+Qo;`qt%;n7=qQQ*t9L^toaNaX326XGK8b7@lyL^>>YI6ne_l;=D zsXx13=;U^T<*LS*1DWs{b^I)yYRR#ST-t~ftD)t2>=#ANGQG(;7 zG0ZFF56R)|8nxHX8ah zKC#A2QGqc;svR5$+x-a!50N=IzhL$@2HY!WN9e(!)ev6Y8nkKAyq73$K+H~SaolAe zGWm*9e(+n)uuI?T;BfD>*U4-;Y&df=drWUz|9S-Hoh-tzoNC@e=%Tb@Yuv1&2&Zmj z(c;?geyXBu(@+8S@ZFE5M40XVzcQ{hsHr0gZ*J4^L6GvO!Znl-z=HCS0*VHNXe)0e zV%2J}U<8d=s0fT&tRPx!s}su+9~7)gsffz7h*~IO$PX!}qtEMi^y(5^Rz0aWS7X`yt^%l%Z4#xQP^!A>G%8V~Gf zL%|6Nj^NkDf%$uCSfe8xC|Kko0Us>~-XPhqzg|GdveyU+wZ;;Gi;3A5662iV##PS1 z_#?C(h9VLd6~R0Mo2h8v3dtQ_T+G9}SZ1RuCCTjap^dIM?Q9spcFeLH+vs>H1uhC1 z2YsDR6g;wR<)IPuqMtyBAJ0>Y4+Sq4u;zBG-?=uu5*Wpys+Iq_xixTo1Z7E zmIM`8rcpt|HCKu8CKRPhe^`R#>&M?{S+ zPd~Co|lX)WQ~Rhok`xAZkBP$rk);jJ96F^>saRX%@BCV z2a-$eVP3xpn>fHSOfGC3h~{ttv>nWY!ps?9r{^477Quwbc#danfuGV`a7pZG1aky; zud~cZK6NhXpU#yn>Sr0h0xXll-hOVr3N^hf^J@vk-S73Lp#UN~l8>Y51;%m?&(ZTT zxN}8jR process() { + return { Message message -> + Contract.make { + label("$message.description") + if (!message.providerStates.isEmpty()) { + input { + triggeredBy(getTriggeredBy(message)) + } + } + outputMessage { + if (message.contents.present) { + body(BodyConverter.toSCCBody(message)) + Category bodyRules = message.matchingRules.rulesForCategory('body') + if (bodyRules && !bodyRules.matchingRules.isEmpty()) { + bodyMatchers { + bodyRules.matchingRules.each { String key, MatchingRuleGroup ruleGroup -> + if (ruleGroup.ruleLogic != RuleLogic.AND) { + throw new UnsupportedOperationException("Currently only the AND combination rule logic is supported") + } + + if (FULL_BODY.equals(key)) { + JsonPaths jsonPaths = JsonToJsonPathsConverter.transformToJsonPathWithStubsSideValuesAndNoArraySizeCheck(message.contents.value) + jsonPaths.each { + jsonPath(it.keyBeforeChecking(), byType()) + } + } else { + ruleGroup.rules.each { MatchingRule rule -> + if (rule instanceof NullMatcher) { + jsonPath(key, byNull()) + } else if (rule instanceof RegexMatcher) { + jsonPath(key, byRegex(rule.regex)) + } else if (rule instanceof DateMatcher) { + jsonPath(key, byDate()) + } else if (rule instanceof TimeMatcher) { + jsonPath(key, byTime()) + } else if (rule instanceof TimestampMatcher) { + jsonPath(key, byTimestamp()) + } else if (rule instanceof MinTypeMatcher) { + jsonPath(key, byType() { + minOccurrence((rule as MinTypeMatcher).min) + }) + } else if (rule instanceof MinMaxTypeMatcher) { + jsonPath(key, byType() { + minOccurrence((rule as MinMaxTypeMatcher).min) + maxOccurrence((rule as MinMaxTypeMatcher).max) + }) + } else if (rule instanceof MaxTypeMatcher) { + jsonPath(key, byType() { + maxOccurrence((rule as MaxTypeMatcher).max) + }) + } else if (rule instanceof TypeMatcher) { + jsonPath(key, byType()) + } else if (rule instanceof NumberTypeMatcher) { + switch (rule.numberType) { + case NumberTypeMatcher.NumberType.NUMBER: + jsonPath(key, byRegex(number())) + break + case NumberTypeMatcher.NumberType.INTEGER: + jsonPath(key, byRegex(anInteger())) + break + case NumberTypeMatcher.NumberType.DECIMAL: + jsonPath(key, byRegex(aDouble())) + break + default: + throw new RuntimeException("Unsupported number type!") + } + } + } + } + } + } + } + } + if (!message.metaData.isEmpty()) { + headers { + message.metaData.each { String k, String v -> + if (k.equalsIgnoreCase("contentType")) { + messagingContentType(v) + } else { + header(k, v) + } + } + } + } + } + } + } + } + private String getTriggeredBy(Message message) { return message.providerStates.first().name .replace(':', ' ') diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/PactContractConverter.groovy b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/PactContractConverter.groovy index 8c2a5184e2..fb83d7a008 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/PactContractConverter.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/PactContractConverter.groovy @@ -64,14 +64,14 @@ class PactContractConverter implements ContractConverter> { @Override Collection convertTo(Collection contracts) { List pactContracts = new ArrayList<>() - contracts.collect({ Contract contract -> + for (Contract contract : contracts) { if (contract.request) { pactContracts.add(requestResponsePactCreator.createFromContract(contract)) } if (contract.input) { pactContracts.add(messagePactCreator.createFromContract(contract)) } - }) + } return pactContracts } } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy index 46f94491ab..62df3da3e2 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy @@ -246,6 +246,193 @@ class RequestResponseSCContractCreator { } } + protected Closure process() { + return { RequestResponseInteraction interaction -> + Contract.make { + description(buildDescription(interaction)) + request { + Request request = interaction.request + method(request.method) + if (request.query) { + url(request.path) { + queryParameters { + request.query.each { String key, List value -> + value.each { String singleValue -> + parameter(key, singleValue) + } + } + } + } + } else { + url(request.path) + } + if (request.headers) { + Category headerRules = request.matchingRules.rulesForCategory('header') + headers { + request.headers.each { k, v -> + if (headerRules.matchingRules.containsKey(k)) { + MatchingRuleGroup ruleGroup = headerRules.matchingRules.get(k) + if (ruleGroup.rules.size() > 1) { + throw new UnsupportedOperationException("Currently only 1 rule at a time for a header is supported") + } + MatchingRule rule = ruleGroup.rules[0] + if (rule instanceof RegexMatcher) { + header(k, new DslProperty((Object)Pattern.compile(rule.getRegex()), (Object)v)) + } else { + throw new UnsupportedOperationException("Currently only the header matcher of type regex is supported") + } + } else { + header(k, v) + } + } + } + } + if (request.body.state == OptionalBody.State.PRESENT) { + def parsedBody = BodyConverter.toSCCBody(request) + if (parsedBody instanceof Map) { + body(parsedBody as Map) + } else if (parsedBody instanceof List) { + body(parsedBody as List) + } else { + body(parsedBody.toString()) + } + } + Category bodyRules = request.matchingRules.rulesForCategory('body') + if (bodyRules && !bodyRules.matchingRules.isEmpty()) { + bodyMatchers { + bodyRules.matchingRules.each { String key, MatchingRuleGroup ruleGroup -> + if (ruleGroup.ruleLogic != RuleLogic.AND) { + throw new UnsupportedOperationException("Currently only the AND combination rule logic is supported") + } + + ruleGroup.rules.each { MatchingRule rule -> + if (rule instanceof RegexMatcher) { + jsonPath(key, byRegex(rule.regex)) + } else if (rule instanceof DateMatcher) { + jsonPath(key, byDate()) + } else if (rule instanceof TimeMatcher) { + jsonPath(key, byTime()) + } else if (rule instanceof TimestampMatcher) { + jsonPath(key, byTimestamp()) + } else if (rule instanceof NumberTypeMatcher) { + switch (rule.numberType) { + case NumberTypeMatcher.NumberType.NUMBER: + jsonPath(key, byRegex(regexPatterns.number())) + break + case NumberTypeMatcher.NumberType.INTEGER: + jsonPath(key, byRegex(regexPatterns.anInteger())) + break + case NumberTypeMatcher.NumberType.DECIMAL: + jsonPath(key, byRegex(regexPatterns.aDouble())) + break + default: + throw new RuntimeException("Unsupported number type!") + } + } + } + } + } + } + } + response { + Response response = interaction.response + status(response.status) + if (response.body.present) { + def parsedBody = BodyConverter.toSCCBody(response) + if (parsedBody instanceof Map) { + body(parsedBody as Map) + } else if (parsedBody instanceof List) { + body(parsedBody as List) + } else { + body(parsedBody.toString()) + } + } + Category bodyRules = response.matchingRules.rulesForCategory('body') + if (bodyRules && !bodyRules.matchingRules.isEmpty()) { + bodyMatchers { + bodyRules.matchingRules.each { String key, MatchingRuleGroup ruleGroup -> + if (ruleGroup.ruleLogic != RuleLogic.AND) { + throw new UnsupportedOperationException("Currently only the AND combination rule logic is supported") + } + + if (FULL_BODY.equals(key)) { + JsonPaths jsonPaths = JsonToJsonPathsConverter.transformToJsonPathWithStubsSideValuesAndNoArraySizeCheck(response.body.value) + jsonPaths.each { + jsonPath(it.keyBeforeChecking(), byType()) + } + } else { + ruleGroup.rules.each { MatchingRule rule -> + if (rule instanceof NullMatcher) { + jsonPath(key, byNull()) + } else if (rule instanceof RegexMatcher) { + jsonPath(key, byRegex(rule.regex)) + } else if (rule instanceof DateMatcher) { + jsonPath(key, byDate()) + } else if (rule instanceof TimeMatcher) { + jsonPath(key, byTime()) + } else if (rule instanceof TimestampMatcher) { + jsonPath(key, byTimestamp()) + } else if (rule instanceof MinTypeMatcher) { + jsonPath(key, byType() { + minOccurrence((rule as MinTypeMatcher).min) + }) + } else if (rule instanceof MinMaxTypeMatcher) { + jsonPath(key, byType() { + minOccurrence((rule as MinMaxTypeMatcher).min) + maxOccurrence((rule as MinMaxTypeMatcher).max) + }) + } else if (rule instanceof MaxTypeMatcher) { + jsonPath(key, byType() { + maxOccurrence((rule as MaxTypeMatcher).max) + }) + } else if (rule instanceof TypeMatcher) { + jsonPath(key, byType()) + } else if (rule instanceof NumberTypeMatcher) { + switch (rule.numberType) { + case NumberTypeMatcher.NumberType.NUMBER: + jsonPath(key, byRegex(regexPatterns.number())) + break + case NumberTypeMatcher.NumberType.INTEGER: + jsonPath(key, byRegex(regexPatterns.anInteger())) + break + case NumberTypeMatcher.NumberType.DECIMAL: + jsonPath(key, byRegex(regexPatterns.aDouble())) + break + default: + throw new UnsupportedOperationException("Unsupported number type!") + } + } + } + } + } + } + } + if (response.headers) { + Category headerRules = response.matchingRules.rulesForCategory('header') + headers { + response.headers.forEach({ String k, String v -> + if (headerRules.matchingRules.containsKey(k)) { + MatchingRuleGroup ruleGroup = headerRules.matchingRules.get(k) + if (ruleGroup.rules.size() > 1) { + throw new UnsupportedOperationException("Currently only 1 rule at a time for a header is supported") + } + MatchingRule rule = ruleGroup.rules[0] + if (rule instanceof RegexMatcher) { + header(k, new DslProperty(new DslProperty(v), new NotToEscapePattern(Pattern.compile(rule.getRegex())))) + } else { + throw new UnsupportedOperationException("Currently only the header matcher of type regex is supported") + } + } else { + header(k, v) + } + }) + } + } + } + } + } + } + private String buildDescription(RequestResponseInteraction interaction) { String description = "$interaction.description" interaction.providerStates.forEach({ ProviderState it -> diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/converter/YamlContractConverter.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/converter/YamlContractConverter.groovy index 042ff77db4..74abe2d6ee 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/converter/YamlContractConverter.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/converter/YamlContractConverter.groovy @@ -73,172 +73,295 @@ class YamlContractConverter implements ContractConverter> { ClassLoader classLoader = YamlContractConverter.getClassLoader() ObjectMapper mapper = new ObjectMapper() try { - return new Yaml().loadAll(Files.newInputStream(contractFile.toPath())).collect { - YamlContract yamlContract = mapper.convertValue(it, YamlContract.class); - Thread.currentThread().setContextClassLoader(updatedClassLoader(contractFile.getParentFile(), classLoader)) - return Contract.make { - if (yamlContract.description) description(yamlContract.description) - if (yamlContract.label) label(yamlContract.label) - if (yamlContract.name) name(yamlContract.name) - if (yamlContract.priority) priority(yamlContract.priority) - if (yamlContract.ignored) ignored() - if (yamlContract.request?.method) { - request { - method(yamlContract.request?.method) - if (yamlContract.request?.url) { - url(yamlContract.request?.url) { - if (yamlContract.request.queryParameters) { - queryParameters { - yamlContract.request.queryParameters.each { String key, Object value -> - if (value instanceof List) { - ((List) value).each { - parameter(key, it) - } - } else { - parameter(key, value) - } - } - } - } - } - } - if (yamlContract.request?.urlPath) { - urlPath(yamlContract.request?.urlPath) { - if (yamlContract.request.queryParameters) { - queryParameters { - yamlContract.request.queryParameters.each { String key, Object value -> - if (value instanceof List) { - ((List) value).each { - parameter(key, it) - } - } else { - parameter(key, value) - } - } - } - } - } - } - if (yamlContract.request?.headers) { - headers { - yamlContract.request?.headers?.each { String key, Object value -> - KeyValueMatcher matcher = yamlContract.request.matchers.headers.find { it.key == key } - if (value instanceof List) { - ((List) value).each { - Object clientValue = clientValue(it, matcher, key) - header(key, new DslProperty(clientValue, it)) - } - } else { - Object clientValue = clientValue(value, matcher, key) - header(key, new DslProperty(clientValue, value)) - } - } - } - } - if (yamlContract.request?.cookies) { - cookies { - yamlContract.request?.cookies?.each { String key, Object value -> - KeyValueMatcher matcher = yamlContract.request.matchers.cookies.find { it.key == key } - Object clientValue = clientValue(value, matcher, key) + Iterable iterables = new Yaml().loadAll(Files.newInputStream(contractFile.toPath())) + Collection contracts = [] + for (Object o : iterables) { + Closure processYaml = processYaml(mapper, classLoader, contractFile) + contracts.add(processYaml(o)) + } + return contracts + } + catch (FileNotFoundException e) { + throw new IllegalStateException(e) + } + catch (IllegalStateException ise) { + throw ise + } + catch (Exception e1) { + throw new IllegalStateException("Exception occurred while processing the file [" + contractFile + "]", e1) + } finally { + Thread.currentThread().setContextClassLoader(classLoader) + } + } - cookie(key, new DslProperty(clientValue, value)) - } - } - } - if (yamlContract.request.body) body(yamlContract.request.body) - if (yamlContract.request.bodyFromFile) body(file(yamlContract.request.bodyFromFile)) - if (yamlContract.request.multipart) { - Map multipartMap = [:] - Map multiPartParams = yamlContract.request.multipart.params.collectEntries { String paramKey, String paramValue -> - KeyValueMatcher matcher = yamlContract.request.matchers.multipart.params.find { - it.key == paramKey - } - Object value = paramValue - if (matcher) { - value = matcher.regex ? Pattern.compile(matcher.regex) : - predefinedToPattern(matcher.predefined) - } - return [(paramKey), new DslProperty<>(value, paramValue)] - } as Map - multipartMap.putAll(multiPartParams) - yamlContract.request.multipart.named.each { Named namedParam -> - YamlContract.MultipartNamedStubMatcher matcher = yamlContract.request.matchers.multipart.named.find { - it.paramName == namedParam.paramName - } - Object fileNameValue = namedParam.fileName - Object fileContentValue = namedParam.fileContent - if (matcher && matcher.fileName) { - fileNameValue = matcher.fileName.regex ? Pattern.compile(matcher.fileName.regex) : - predefinedToPattern(matcher.fileName.predefined) - } - if (matcher && matcher.fileContent) { - fileContentValue = matcher.fileContent.regex ? Pattern.compile(matcher.fileContent.regex) : - predefinedToPattern(matcher.fileContent.predefined) - } - multipartMap.put(namedParam.paramName, new NamedProperty(new DslProperty<>(fileNameValue, namedParam.fileName), - new DslProperty<>(fileContentValue, namedParam.fileContent))) - } - multipart(multipartMap) - } - bodyMatchers { - yamlContract.request.matchers?.body?.each { BodyStubMatcher matcher -> - MatchingTypeValue value = null - switch (matcher.type) { - case StubMatcherType.by_date: - value = byDate() - break - case StubMatcherType.by_time: - value = byTime() - break - case StubMatcherType.by_timestamp: - value = byTimestamp() - break - case StubMatcherType.by_regex: - String regex = matcher.value - if (matcher.predefined) { - regex = predefinedToPattern(matcher.predefined).pattern() + protected Closure processYaml(ObjectMapper mapper, ClassLoader classLoader, File contractFile) { + return { + YamlContract yamlContract = mapper.convertValue(it, YamlContract.class) + Thread.currentThread().setContextClassLoader(updatedClassLoader(contractFile.getParentFile(), classLoader)) + return Contract.make { + if (yamlContract.description) description(yamlContract.description) + if (yamlContract.label) label(yamlContract.label) + if (yamlContract.name) name(yamlContract.name) + if (yamlContract.priority) priority(yamlContract.priority) + if (yamlContract.ignored) ignored() + if (yamlContract.request?.method) { + request { + method(yamlContract.request?.method) + if (yamlContract.request?.url) { + url(yamlContract.request?.url) { + if (yamlContract.request.queryParameters) { + queryParameters { + yamlContract.request.queryParameters.each { String key, Object value -> + if (value instanceof List) { + ((List) value).each { + parameter(key, it) + } + } else { + parameter(key, value) } - value = byRegex(regex) - break - case StubMatcherType.by_equality: - value = byEquality() - break + } } - jsonPath(matcher.path, value) } } } - response { - status(yamlContract.response.status) + if (yamlContract.request?.urlPath) { + urlPath(yamlContract.request?.urlPath) { + if (yamlContract.request.queryParameters) { + queryParameters { + yamlContract.request.queryParameters.each { String key, Object value -> + if (value instanceof List) { + ((List) value).each { + parameter(key, it) + } + } else { + parameter(key, value) + } + } + } + } + } + } + if (yamlContract.request?.headers) { headers { - yamlContract.response?.headers?.each { String key, Object value -> - TestHeaderMatcher matcher = yamlContract.response.matchers.headers.find { it.key == key } + yamlContract.request?.headers?.each { String key, Object value -> + KeyValueMatcher matcher = yamlContract.request.matchers.headers.find { it.key == key } if (value instanceof List) { ((List) value).each { - Object serverValue = serverValue(it, matcher, key) - header(key, new DslProperty(it, serverValue)) + Object clientValue = clientValue(it, matcher, key) + header(key, new DslProperty(clientValue, it)) } } else { - Object serverValue = serverValue(value, matcher, key) - header(key, new DslProperty(value, serverValue)) + Object clientValue = clientValue(value, matcher, key) + header(key, new DslProperty(clientValue, value)) } } } - if (yamlContract.response?.cookies) { - cookies { - yamlContract.response?.cookies?.each { String key, Object value -> - TestCookieMatcher matcher = yamlContract.response.matchers.cookies.find { it.key == key } - Object serverValue = serverCookieValue(value, matcher, key) + } + if (yamlContract.request?.cookies) { + cookies { + yamlContract.request?.cookies?.each { String key, Object value -> + KeyValueMatcher matcher = yamlContract.request.matchers.cookies.find { it.key == key } + Object clientValue = clientValue(value, matcher, key) - cookie(key, new DslProperty(value, serverValue)) - } + cookie(key, new DslProperty(clientValue, value)) } } - if (yamlContract.response.body) body(yamlContract.response.body) - if (yamlContract.response.bodyFromFile) body(file(yamlContract.response.bodyFromFile)) - if (yamlContract.response.async) async() + } + if (yamlContract.request.body) body(yamlContract.request.body) + if (yamlContract.request.bodyFromFile) body(file(yamlContract.request.bodyFromFile)) + if (yamlContract.request.multipart) { + Map multipartMap = [:] + Map multiPartParams = yamlContract.request.multipart.params.collectEntries { String paramKey, String paramValue -> + KeyValueMatcher matcher = yamlContract.request.matchers.multipart.params.find { + it.key == paramKey + } + Object value = paramValue + if (matcher) { + value = matcher.regex ? Pattern.compile(matcher.regex) : + predefinedToPattern(matcher.predefined) + } + return [(paramKey), new DslProperty<>(value, paramValue)] + } as Map + multipartMap.putAll(multiPartParams) + yamlContract.request.multipart.named.each { Named namedParam -> + YamlContract.MultipartNamedStubMatcher matcher = yamlContract.request.matchers.multipart.named.find { + it.paramName == namedParam.paramName + } + Object fileNameValue = namedParam.fileName + Object fileContentValue = namedParam.fileContent + if (matcher && matcher.fileName) { + fileNameValue = matcher.fileName.regex ? Pattern.compile(matcher.fileName.regex) : + predefinedToPattern(matcher.fileName.predefined) + } + if (matcher && matcher.fileContent) { + fileContentValue = matcher.fileContent.regex ? Pattern.compile(matcher.fileContent.regex) : + predefinedToPattern(matcher.fileContent.predefined) + } + multipartMap.put(namedParam.paramName, new NamedProperty(new DslProperty<>(fileNameValue, namedParam.fileName), + new DslProperty<>(fileContentValue, namedParam.fileContent))) + } + multipart(multipartMap) + } + bodyMatchers { + yamlContract.request.matchers?.body?.each { BodyStubMatcher matcher -> + MatchingTypeValue value = null + switch (matcher.type) { + case StubMatcherType.by_date: + value = byDate() + break + case StubMatcherType.by_time: + value = byTime() + break + case StubMatcherType.by_timestamp: + value = byTimestamp() + break + case StubMatcherType.by_regex: + String regex = matcher.value + if (matcher.predefined) { + regex = predefinedToPattern(matcher.predefined).pattern() + } + value = byRegex(regex) + break + case StubMatcherType.by_equality: + value = byEquality() + break + } + jsonPath(matcher.path, value) + } + } + } + response { + status(yamlContract.response.status) + headers { + yamlContract.response?.headers?.each { String key, Object value -> + TestHeaderMatcher matcher = yamlContract.response.matchers.headers.find { it.key == key } + if (value instanceof List) { + ((List) value).each { + Object serverValue = serverValue(it, matcher, key) + header(key, new DslProperty(it, serverValue)) + } + } else { + Object serverValue = serverValue(value, matcher, key) + header(key, new DslProperty(value, serverValue)) + } + } + } + if (yamlContract.response?.cookies) { + cookies { + yamlContract.response?.cookies?.each { String key, Object value -> + TestCookieMatcher matcher = yamlContract.response.matchers.cookies.find { it.key == key } + Object serverValue = serverCookieValue(value, matcher, key) + + cookie(key, new DslProperty(value, serverValue)) + } + } + } + if (yamlContract.response.body) body(yamlContract.response.body) + if (yamlContract.response.bodyFromFile) body(file(yamlContract.response.bodyFromFile)) + if (yamlContract.response.async) async() + bodyMatchers { + yamlContract.response?.matchers?.body?.each { BodyTestMatcher testMatcher -> + MatchingTypeValue value = null + switch (testMatcher.type) { + case TestMatcherType.by_date: + value = byDate() + break + case TestMatcherType.by_time: + value = byTime() + break + case TestMatcherType.by_timestamp: + value = byTimestamp() + break + case TestMatcherType.by_regex: + String regex = testMatcher.value + if (testMatcher.predefined) { + regex = predefinedToPattern(testMatcher.predefined).pattern() + } + value = byRegex(regex) + break + case TestMatcherType.by_equality: + value = byEquality() + break + case TestMatcherType.by_type: + value = byType() { + if (testMatcher.minOccurrence != null) minOccurrence(testMatcher.minOccurrence) + if (testMatcher.maxOccurrence != null) maxOccurrence(testMatcher.maxOccurrence) + } + break + case TestMatcherType.by_command: + value = byCommand(testMatcher.value) + break + case TestMatcherType.by_null: + value = byNull() + break + } + jsonPath(testMatcher.path, value) + } + } + } + } + if (yamlContract.input) { + input { + if (yamlContract.input.messageFrom) messageFrom(yamlContract.input.messageFrom) + if (yamlContract.input.assertThat) assertThat(yamlContract.input.assertThat) + if (yamlContract.input.triggeredBy) triggeredBy(yamlContract.input.triggeredBy) + messageHeaders { + yamlContract.input?.messageHeaders?.each { String key, Object value -> + KeyValueMatcher matcher = yamlContract.input.matchers?.headers?.find { it.key == key } + Object clientValue = clientValue(value, matcher, key) + header(key, new DslProperty(clientValue, value)) + } + } + if (yamlContract.input.messageBody) messageBody(yamlContract.input.messageBody) + if (yamlContract.input.messageBodyFromFile) messageBody(file(yamlContract.input.messageBodyFromFile)) + bodyMatchers { + yamlContract.input.matchers.body?.each { BodyStubMatcher matcher -> + MatchingTypeValue value = null + switch (matcher.type) { + case StubMatcherType.by_date: + value = byDate() + break + case StubMatcherType.by_time: + value = byTime() + break + case StubMatcherType.by_timestamp: + value = byTimestamp() + break + case StubMatcherType.by_regex: + String regex = matcher.value + if (matcher.predefined) { + regex = predefinedToPattern(matcher.predefined).pattern() + } + value = byRegex(regex) + break + case StubMatcherType.by_equality: + value = byEquality() + break + default: + throw new UnsupportedOperationException("The type [" + matcher.type + "] is unsupported. Hint: If you're using remember to pass ") + } + jsonPath(matcher.path, value) + } + } + } + } + OutputMessage outputMsg = yamlContract.outputMessage + if (outputMsg) { + outputMessage { + if (outputMsg.assertThat) assertThat(outputMsg.assertThat) + if (outputMsg.sentTo) sentTo(outputMsg.sentTo) + headers { + outputMsg.headers?.each { String key, Object value -> + TestHeaderMatcher matcher = outputMsg.matchers?.headers?.find { it.key == key } + Object serverValue = serverValue(value, matcher, key) + header(key, new DslProperty(value, serverValue)) + } + } + if (outputMsg.body) body(outputMsg.body) + if (outputMsg.bodyFromFile) body(file(outputMsg.bodyFromFile)) + if (outputMsg.matchers) { bodyMatchers { - yamlContract.response?.matchers?.body?.each { BodyTestMatcher testMatcher -> + yamlContract.outputMessage?.matchers?.body?.each { BodyTestMatcher testMatcher -> MatchingTypeValue value = null switch (testMatcher.type) { case TestMatcherType.by_date: @@ -272,130 +395,17 @@ class YamlContractConverter implements ContractConverter> { case TestMatcherType.by_null: value = byNull() break + default: + throw new UnsupportedOperationException("The type [" + testMatcher.type + "] is unsupported. Hint: If you're using remember to pass ") } jsonPath(testMatcher.path, value) } } } } - if (yamlContract.input) { - input { - if (yamlContract.input.messageFrom) messageFrom(yamlContract.input.messageFrom) - if (yamlContract.input.assertThat) assertThat(yamlContract.input.assertThat) - if (yamlContract.input.triggeredBy) triggeredBy(yamlContract.input.triggeredBy) - messageHeaders { - yamlContract.input?.messageHeaders?.each { String key, Object value -> - KeyValueMatcher matcher = yamlContract.input.matchers?.headers?.find { it.key == key } - Object clientValue = clientValue(value, matcher, key) - header(key, new DslProperty(clientValue, value)) - } - } - if (yamlContract.input.messageBody) messageBody(yamlContract.input.messageBody) - if (yamlContract.input.messageBodyFromFile) messageBody(file(yamlContract.input.messageBodyFromFile)) - bodyMatchers { - yamlContract.input.matchers.body?.each { BodyStubMatcher matcher -> - MatchingTypeValue value = null - switch (matcher.type) { - case StubMatcherType.by_date: - value = byDate() - break - case StubMatcherType.by_time: - value = byTime() - break - case StubMatcherType.by_timestamp: - value = byTimestamp() - break - case StubMatcherType.by_regex: - String regex = matcher.value - if (matcher.predefined) { - regex = predefinedToPattern(matcher.predefined).pattern() - } - value = byRegex(regex) - break - case StubMatcherType.by_equality: - value = byEquality() - break - default: - throw new UnsupportedOperationException("The type [" + matcher.type + "] is unsupported. Hint: If you're using remember to pass ") - } - jsonPath(matcher.path, value) - } - } - } - } - OutputMessage outputMsg = yamlContract.outputMessage - if (outputMsg) { - outputMessage { - if (outputMsg.assertThat) assertThat(outputMsg.assertThat) - if (outputMsg.sentTo) sentTo(outputMsg.sentTo) - headers { - outputMsg.headers?.each { String key, Object value -> - TestHeaderMatcher matcher = outputMsg.matchers?.headers?.find { it.key == key } - Object serverValue = serverValue(value, matcher, key) - header(key, new DslProperty(value, serverValue)) - } - } - if (outputMsg.body) body(outputMsg.body) - if (outputMsg.bodyFromFile) body(file(outputMsg.bodyFromFile)) - if (outputMsg.matchers) { - bodyMatchers { - yamlContract.outputMessage?.matchers?.body?.each { BodyTestMatcher testMatcher -> - MatchingTypeValue value = null - switch (testMatcher.type) { - case TestMatcherType.by_date: - value = byDate() - break - case TestMatcherType.by_time: - value = byTime() - break - case TestMatcherType.by_timestamp: - value = byTimestamp() - break - case TestMatcherType.by_regex: - String regex = testMatcher.value - if (testMatcher.predefined) { - regex = predefinedToPattern(testMatcher.predefined).pattern() - } - value = byRegex(regex) - break - case TestMatcherType.by_equality: - value = byEquality() - break - case TestMatcherType.by_type: - value = byType() { - if (testMatcher.minOccurrence != null) minOccurrence(testMatcher.minOccurrence) - if (testMatcher.maxOccurrence != null) maxOccurrence(testMatcher.maxOccurrence) - } - break - case TestMatcherType.by_command: - value = byCommand(testMatcher.value) - break - case TestMatcherType.by_null: - value = byNull() - break - default: - throw new UnsupportedOperationException("The type [" + testMatcher.type + "] is unsupported. Hint: If you're using remember to pass ") - } - jsonPath(testMatcher.path, value) - } - } - } - } - } } } } - catch (FileNotFoundException e) { - throw new IllegalStateException(e) - } - catch (IllegalStateException ise) { - throw ise - } - catch (Exception e1) { - throw new IllegalStateException("Exception occurred while processing the file [" + contractFile + "]", e1) - } finally { - Thread.currentThread().setContextClassLoader(classLoader) - } } protected Object serverValue(Object value, TestHeaderMatcher matcher, String key) { diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractResultHandler.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractResultHandler.java index d161a7abd4..2c35665f58 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractResultHandler.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractResultHandler.java @@ -48,7 +48,6 @@ import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultHandler; -import org.springframework.util.StreamUtils; import wiremock.com.google.common.base.Function; import wiremock.com.google.common.base.Joiner; import wiremock.com.google.common.base.Optional; @@ -123,12 +122,7 @@ public class ContractResultHandler } @Override protected byte[] getRequestBodyContent(MvcResult result) { - try { - return StreamUtils.copyToByteArray(result.getRequest().getInputStream()); - } - catch (IOException e) { - throw new IllegalStateException("Cannot create request body", e); - } + return new WireMockHttpServletRequestAdapter(result.getRequest()).getBody(); } } From 9ef24e72407df444596300290265b5ac869b1a81 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 29 Aug 2018 14:25:08 +0200 Subject: [PATCH 78/84] Polish --- .../pact/MessagingSCContractCreator.groovy | 89 --------- .../RequestResponseSCContractCreator.groovy | 189 +----------------- 2 files changed, 1 insertion(+), 277 deletions(-) diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/MessagingSCContractCreator.groovy b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/MessagingSCContractCreator.groovy index 7278b1e598..447b4cfc74 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/MessagingSCContractCreator.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/MessagingSCContractCreator.groovy @@ -138,95 +138,6 @@ class MessagingSCContractCreator { }) } - protected Closure process() { - return { Message message -> - Contract.make { - label("$message.description") - if (!message.providerStates.isEmpty()) { - input { - triggeredBy(getTriggeredBy(message)) - } - } - outputMessage { - if (message.contents.present) { - body(BodyConverter.toSCCBody(message)) - Category bodyRules = message.matchingRules.rulesForCategory('body') - if (bodyRules && !bodyRules.matchingRules.isEmpty()) { - bodyMatchers { - bodyRules.matchingRules.each { String key, MatchingRuleGroup ruleGroup -> - if (ruleGroup.ruleLogic != RuleLogic.AND) { - throw new UnsupportedOperationException("Currently only the AND combination rule logic is supported") - } - - if (FULL_BODY.equals(key)) { - JsonPaths jsonPaths = JsonToJsonPathsConverter.transformToJsonPathWithStubsSideValuesAndNoArraySizeCheck(message.contents.value) - jsonPaths.each { - jsonPath(it.keyBeforeChecking(), byType()) - } - } else { - ruleGroup.rules.each { MatchingRule rule -> - if (rule instanceof NullMatcher) { - jsonPath(key, byNull()) - } else if (rule instanceof RegexMatcher) { - jsonPath(key, byRegex(rule.regex)) - } else if (rule instanceof DateMatcher) { - jsonPath(key, byDate()) - } else if (rule instanceof TimeMatcher) { - jsonPath(key, byTime()) - } else if (rule instanceof TimestampMatcher) { - jsonPath(key, byTimestamp()) - } else if (rule instanceof MinTypeMatcher) { - jsonPath(key, byType() { - minOccurrence((rule as MinTypeMatcher).min) - }) - } else if (rule instanceof MinMaxTypeMatcher) { - jsonPath(key, byType() { - minOccurrence((rule as MinMaxTypeMatcher).min) - maxOccurrence((rule as MinMaxTypeMatcher).max) - }) - } else if (rule instanceof MaxTypeMatcher) { - jsonPath(key, byType() { - maxOccurrence((rule as MaxTypeMatcher).max) - }) - } else if (rule instanceof TypeMatcher) { - jsonPath(key, byType()) - } else if (rule instanceof NumberTypeMatcher) { - switch (rule.numberType) { - case NumberTypeMatcher.NumberType.NUMBER: - jsonPath(key, byRegex(number())) - break - case NumberTypeMatcher.NumberType.INTEGER: - jsonPath(key, byRegex(anInteger())) - break - case NumberTypeMatcher.NumberType.DECIMAL: - jsonPath(key, byRegex(aDouble())) - break - default: - throw new RuntimeException("Unsupported number type!") - } - } - } - } - } - } - } - } - if (!message.metaData.isEmpty()) { - headers { - message.metaData.each { String k, String v -> - if (k.equalsIgnoreCase("contentType")) { - messagingContentType(v) - } else { - header(k, v) - } - } - } - } - } - } - } - } - private String getTriggeredBy(Message message) { return message.providerStates.first().name .replace(':', ' ') diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy index 62df3da3e2..5cebcd954f 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy @@ -245,194 +245,7 @@ class RequestResponseSCContractCreator { } } } - - protected Closure process() { - return { RequestResponseInteraction interaction -> - Contract.make { - description(buildDescription(interaction)) - request { - Request request = interaction.request - method(request.method) - if (request.query) { - url(request.path) { - queryParameters { - request.query.each { String key, List value -> - value.each { String singleValue -> - parameter(key, singleValue) - } - } - } - } - } else { - url(request.path) - } - if (request.headers) { - Category headerRules = request.matchingRules.rulesForCategory('header') - headers { - request.headers.each { k, v -> - if (headerRules.matchingRules.containsKey(k)) { - MatchingRuleGroup ruleGroup = headerRules.matchingRules.get(k) - if (ruleGroup.rules.size() > 1) { - throw new UnsupportedOperationException("Currently only 1 rule at a time for a header is supported") - } - MatchingRule rule = ruleGroup.rules[0] - if (rule instanceof RegexMatcher) { - header(k, new DslProperty((Object)Pattern.compile(rule.getRegex()), (Object)v)) - } else { - throw new UnsupportedOperationException("Currently only the header matcher of type regex is supported") - } - } else { - header(k, v) - } - } - } - } - if (request.body.state == OptionalBody.State.PRESENT) { - def parsedBody = BodyConverter.toSCCBody(request) - if (parsedBody instanceof Map) { - body(parsedBody as Map) - } else if (parsedBody instanceof List) { - body(parsedBody as List) - } else { - body(parsedBody.toString()) - } - } - Category bodyRules = request.matchingRules.rulesForCategory('body') - if (bodyRules && !bodyRules.matchingRules.isEmpty()) { - bodyMatchers { - bodyRules.matchingRules.each { String key, MatchingRuleGroup ruleGroup -> - if (ruleGroup.ruleLogic != RuleLogic.AND) { - throw new UnsupportedOperationException("Currently only the AND combination rule logic is supported") - } - - ruleGroup.rules.each { MatchingRule rule -> - if (rule instanceof RegexMatcher) { - jsonPath(key, byRegex(rule.regex)) - } else if (rule instanceof DateMatcher) { - jsonPath(key, byDate()) - } else if (rule instanceof TimeMatcher) { - jsonPath(key, byTime()) - } else if (rule instanceof TimestampMatcher) { - jsonPath(key, byTimestamp()) - } else if (rule instanceof NumberTypeMatcher) { - switch (rule.numberType) { - case NumberTypeMatcher.NumberType.NUMBER: - jsonPath(key, byRegex(regexPatterns.number())) - break - case NumberTypeMatcher.NumberType.INTEGER: - jsonPath(key, byRegex(regexPatterns.anInteger())) - break - case NumberTypeMatcher.NumberType.DECIMAL: - jsonPath(key, byRegex(regexPatterns.aDouble())) - break - default: - throw new RuntimeException("Unsupported number type!") - } - } - } - } - } - } - } - response { - Response response = interaction.response - status(response.status) - if (response.body.present) { - def parsedBody = BodyConverter.toSCCBody(response) - if (parsedBody instanceof Map) { - body(parsedBody as Map) - } else if (parsedBody instanceof List) { - body(parsedBody as List) - } else { - body(parsedBody.toString()) - } - } - Category bodyRules = response.matchingRules.rulesForCategory('body') - if (bodyRules && !bodyRules.matchingRules.isEmpty()) { - bodyMatchers { - bodyRules.matchingRules.each { String key, MatchingRuleGroup ruleGroup -> - if (ruleGroup.ruleLogic != RuleLogic.AND) { - throw new UnsupportedOperationException("Currently only the AND combination rule logic is supported") - } - - if (FULL_BODY.equals(key)) { - JsonPaths jsonPaths = JsonToJsonPathsConverter.transformToJsonPathWithStubsSideValuesAndNoArraySizeCheck(response.body.value) - jsonPaths.each { - jsonPath(it.keyBeforeChecking(), byType()) - } - } else { - ruleGroup.rules.each { MatchingRule rule -> - if (rule instanceof NullMatcher) { - jsonPath(key, byNull()) - } else if (rule instanceof RegexMatcher) { - jsonPath(key, byRegex(rule.regex)) - } else if (rule instanceof DateMatcher) { - jsonPath(key, byDate()) - } else if (rule instanceof TimeMatcher) { - jsonPath(key, byTime()) - } else if (rule instanceof TimestampMatcher) { - jsonPath(key, byTimestamp()) - } else if (rule instanceof MinTypeMatcher) { - jsonPath(key, byType() { - minOccurrence((rule as MinTypeMatcher).min) - }) - } else if (rule instanceof MinMaxTypeMatcher) { - jsonPath(key, byType() { - minOccurrence((rule as MinMaxTypeMatcher).min) - maxOccurrence((rule as MinMaxTypeMatcher).max) - }) - } else if (rule instanceof MaxTypeMatcher) { - jsonPath(key, byType() { - maxOccurrence((rule as MaxTypeMatcher).max) - }) - } else if (rule instanceof TypeMatcher) { - jsonPath(key, byType()) - } else if (rule instanceof NumberTypeMatcher) { - switch (rule.numberType) { - case NumberTypeMatcher.NumberType.NUMBER: - jsonPath(key, byRegex(regexPatterns.number())) - break - case NumberTypeMatcher.NumberType.INTEGER: - jsonPath(key, byRegex(regexPatterns.anInteger())) - break - case NumberTypeMatcher.NumberType.DECIMAL: - jsonPath(key, byRegex(regexPatterns.aDouble())) - break - default: - throw new UnsupportedOperationException("Unsupported number type!") - } - } - } - } - } - } - } - if (response.headers) { - Category headerRules = response.matchingRules.rulesForCategory('header') - headers { - response.headers.forEach({ String k, String v -> - if (headerRules.matchingRules.containsKey(k)) { - MatchingRuleGroup ruleGroup = headerRules.matchingRules.get(k) - if (ruleGroup.rules.size() > 1) { - throw new UnsupportedOperationException("Currently only 1 rule at a time for a header is supported") - } - MatchingRule rule = ruleGroup.rules[0] - if (rule instanceof RegexMatcher) { - header(k, new DslProperty(new DslProperty(v), new NotToEscapePattern(Pattern.compile(rule.getRegex())))) - } else { - throw new UnsupportedOperationException("Currently only the header matcher of type regex is supported") - } - } else { - header(k, v) - } - }) - } - } - } - } - } - } - + private String buildDescription(RequestResponseInteraction interaction) { String description = "$interaction.description" interaction.providerStates.forEach({ ProviderState it -> From cac0ce3e2760bb13b81176fdf06d7be07e1fa4b1 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 29 Aug 2018 15:06:15 +0200 Subject: [PATCH 79/84] Removed the web starter --- samples/standalone/messaging/stream-source/pom.xml | 4 ++++ .../spring-cloud-starter-contract-verifier/pom.xml | 4 ---- .../spec/pact/RequestResponseSCContractCreator.groovy | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/samples/standalone/messaging/stream-source/pom.xml b/samples/standalone/messaging/stream-source/pom.xml index c0977606a6..c45a710c42 100644 --- a/samples/standalone/messaging/stream-source/pom.xml +++ b/samples/standalone/messaging/stream-source/pom.xml @@ -25,6 +25,10 @@ + + org.springframework.boot + spring-boot-starter-web + org.springframework.cloud spring-cloud-starter-stream-rabbit diff --git a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml index 58ef90bb12..e2df9aa5c6 100644 --- a/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml +++ b/spring-cloud-contract-starters/spring-cloud-starter-contract-verifier/pom.xml @@ -37,10 +37,6 @@ org.springframework.boot spring-boot-starter-test - - org.springframework.boot - spring-boot-starter-web - diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy index 5cebcd954f..46f94491ab 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/RequestResponseSCContractCreator.groovy @@ -245,7 +245,7 @@ class RequestResponseSCContractCreator { } } } - + private String buildDescription(RequestResponseInteraction interaction) { String description = "$interaction.description" interaction.providerStates.forEach({ ProviderState it -> From 74b97648eebf7e55006722b1d9ceefbc8cefdee0 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 29 Aug 2018 15:37:09 +0200 Subject: [PATCH 80/84] Polish --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0f74b6cf02..5eed16c58b 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ hs_err_pid* .gradle/ target/ build/ +out/ hs_err_pid* .DS_Store From 9fe36dc7479589310aa45ddbf6fce31bfaca122d Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 29 Aug 2018 15:50:24 +0200 Subject: [PATCH 81/84] Added compatibility with WireMock helpers --- .../HandlebarsJsonPathHelper.groovy | 43 +++++++++++++++---- .../HandlebarsTemplateProcessor.groovy | 7 +++ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy index 35ac89d92e..dffc6c9f72 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy @@ -1,5 +1,6 @@ package org.springframework.cloud.contract.verifier.builder.handlebars +import com.github.tomakehurst.wiremock.extension.responsetemplating.helpers.WireMockHelpers import wiremock.com.github.jknack.handlebars.Helper import wiremock.com.github.jknack.handlebars.Options import com.github.tomakehurst.wiremock.extension.responsetemplating.RequestTemplateModel @@ -22,14 +23,34 @@ class HandlebarsJsonPathHelper implements Helper> { @Override Object apply(Map context, Options options) throws IOException { - String jsonPath = options.param(0) - Object model = context.get(REQUEST_MODEL_NAME) - if (model instanceof TestSideRequestTemplateModel) { - return returnObjectForTest(model, jsonPath) - } else if (model instanceof RequestTemplateModel) { - return returnObjectForStub(model, jsonPath) + if (context instanceof Map) { + // legacy + Map oldContext = (Map) context + String jsonPath = options.param(0) + Object model = oldContext.get(REQUEST_MODEL_NAME) + if (model instanceof TestSideRequestTemplateModel) { + return returnObjectForTest(model, jsonPath) + } else if (model instanceof RequestTemplateModel) { + return returnObjectForStub(model, jsonPath) + } + throw new IllegalArgumentException("Unsupported model") + } else if (context instanceof String) { + Object value = WireMockHelpers.jsonPath.apply(context, options) + if (testSideModel(options)) { + return processTestResponseValue(value) + } + return value } - throw new IllegalArgumentException("Unsupported model") + throw new IllegalArgumentException("Unsupported context") + } + + private boolean testSideModel(Options options) { + Object model = options.context.model() + if (!(model instanceof Map)) { + return false + } + Map map = (Map) model + return map.values().any { it instanceof TestSideRequestTemplateModel } } private Object returnObjectForStub(Object model, String jsonPath) { @@ -37,10 +58,14 @@ class HandlebarsJsonPathHelper implements Helper> { return documentContext.read(jsonPath) } - private Object returnObjectForTest(Object model, String jsonPath) { - String body = removeSurroundingQuotes(((TestSideRequestTemplateModel) model).rawBody).replace('\\"', '"') + private Object returnObjectForTest(TestSideRequestTemplateModel model, String jsonPath) { + String body = removeSurroundingQuotes(model.rawBody).replace('\\"', '"') DocumentContext documentContext = JsonPath.parse(body) Object value = documentContext.read(jsonPath) + return processTestResponseValue(value) + } + + private Object processTestResponseValue(Object value) { if (value instanceof Long) { return String.valueOf(value) + "L" } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy index fa9c5d575a..a2f4b4b533 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy @@ -1,5 +1,6 @@ package org.springframework.cloud.contract.verifier.template +import com.github.tomakehurst.wiremock.extension.responsetemplating.helpers.WireMockHelpers import wiremock.com.github.jknack.handlebars.Handlebars import wiremock.com.github.jknack.handlebars.Template import groovy.transform.CompileStatic @@ -71,6 +72,12 @@ class HandlebarsTemplateProcessor implements TemplateProcessor, ContractTemplate try { Handlebars handlebars = new Handlebars() handlebars.registerHelper(HandlebarsJsonPathHelper.NAME, new HandlebarsJsonPathHelper()) + handlebars.registerHelper(WireMockHelpers.jsonPath.name(), new HandlebarsJsonPathHelper()) + WireMockHelpers.values() + .findAll { it != WireMockHelpers.jsonPath} + .each { WireMockHelpers helper -> + handlebars.registerHelper(helper.name(), helper) + } return handlebars.compileInline(content) } catch (IOException e) { throw new RuntimeException(e) From cfc9d6fbb5af7523f409b783de891061821472eb Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 29 Aug 2018 15:51:27 +0200 Subject: [PATCH 82/84] Added NPE guard; fixes gh-717 --- .../contract/wiremock/restdocs/ContractExchangeHandler.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java index f1dc5e56f3..669f8b66f2 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java @@ -194,7 +194,11 @@ class WireMockHttpRequestAdapter implements Request { return null; } List values = new ArrayList<>(); - for (String name : StringUtils.split(query, "&")) { + String[] strings = StringUtils.split(query, "&"); + if (strings == null) { + return null; + } + for (String name : strings) { if (name.equals(key)) { values.add(""); } From b143d16f32d1f6bb9b8f381c855db457f5b85572 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 30 Aug 2018 12:21:14 +0200 Subject: [PATCH 83/84] Chaned the helper's bounds --- .../builder/handlebars/HandlebarsJsonPathHelper.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy index dffc6c9f72..efa9a6af10 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy @@ -16,13 +16,13 @@ import org.springframework.cloud.contract.verifier.builder.TestSideRequestTempla * @since 1.1.0 */ @CompileStatic -class HandlebarsJsonPathHelper implements Helper> { +class HandlebarsJsonPathHelper implements Helper { public static final String NAME = "jsonpath" public static final String REQUEST_MODEL_NAME = "request" @Override - Object apply(Map context, Options options) throws IOException { + Object apply(Object context, Options options) throws IOException { if (context instanceof Map) { // legacy Map oldContext = (Map) context From d23684d1c4f378bf5ad8ca2d6e224282286781d9 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 31 Aug 2018 12:05:22 +0200 Subject: [PATCH 84/84] Fixed backward compatibility of native WireMock helpers --- .../cloud/contract/spec/internal/Body.groovy | 4 ++ .../build.gradle | 8 +-- .../verifier/builder/MethodBodyBuilder.groovy | 21 ++++--- .../HandlebarsJsonPathHelper.groovy | 18 +++++- .../verifier/util/MapConverter.groovy | 2 + .../MockMvcMethodBodyBuilderSpec.groovy | 56 ++++++++++++++++++- 6 files changed, 95 insertions(+), 14 deletions(-) diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Body.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Body.groovy index 100210ca99..407a37500f 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Body.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Body.groovy @@ -53,6 +53,10 @@ class Body extends DslProperty { super(bodyAsValue) } + Body(String bodyAsValue) { + super(bodyAsValue, bodyAsValue) + } + Body(GString bodyAsValue) { super(bodyAsValue, bodyAsValue) } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/build.gradle index d289534e48..7790251c72 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/build.gradle @@ -23,7 +23,7 @@ ext { ] } -project.version = findProperty('verifierVersion') ?: '2.0.0.BUILD-SNAPSHOT' +project.version = findProperty('verifierVersion') apply plugin: 'groovy' apply from: "$rootDir/gradle/release.gradle" apply plugin: 'eclipse' @@ -32,8 +32,8 @@ apply plugin: 'checkstyle' group = 'org.springframework.cloud' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 repositories { mavenLocal() @@ -75,7 +75,7 @@ dependencies { } testCompile 'info.solidsoft.spock:spock-global-unroll:0.5.0' testCompile gradleTestKit() - checkstyle 'org.springframework.cloud:spring-cloud-build:1.0.2.RELEASE' + checkstyle 'org.springframework.cloud:spring-cloud-build:2.0.3.RELEASE' } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy index 439fda17e0..7c26e8626a 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy @@ -367,6 +367,14 @@ abstract class MethodBodyBuilder { private void addJsonResponseBodyCheck(BlockBuilder bb, convertedResponseBody, BodyMatchers bodyMatchers) { appendJsonPath(bb, getResponseAsString()) + DocumentContext parsedRequestBody + if (contract.request?.body) { + def testSideRequestBody = MapConverter.getTestSideValues(contract.request.body) + parsedRequestBody = JsonPath.parse(testSideRequestBody) + if (convertedResponseBody instanceof String && !textContainsJsonPathTemplate(convertedResponseBody)) { + convertedResponseBody = templateProcessor.transform(contract.request, convertedResponseBody.toString()) + } + } Object copiedBody = cloneBody(convertedResponseBody) convertedResponseBody = JsonToJsonPathsConverter.removeMatchingJsonPaths(convertedResponseBody, bodyMatchers) // remove quotes from fromRequest objects before picking json paths @@ -374,11 +382,6 @@ abstract class MethodBodyBuilder { TestSideRequestTemplateModel.from(contract.request) : null convertedResponseBody = MapConverter.transformValues(convertedResponseBody, returnReferencedEntries(templateModel)) JsonPaths jsonPaths = new JsonToJsonPathsConverter(configProperties).transformToJsonPathWithTestsSideValues(convertedResponseBody) - DocumentContext parsedRequestBody - if (contract.request?.body) { - def requestBody = MapConverter.getTestSideValues(contract.request.body) - parsedRequestBody = JsonPath.parse(requestBody) - } jsonPaths.each { String method = it.method() method = processIfTemplateIsPresent(method, parsedRequestBody) @@ -444,8 +447,7 @@ abstract class MethodBodyBuilder { } protected String processIfTemplateIsPresent(String method, DocumentContext parsedRequestBody) { - if (templateProcessor.containsTemplateEntry(method) && - templateProcessor.containsJsonPathTemplateEntry(method) && contract.request?.body) { + if (textContainsJsonPathTemplate(method) && contract.request?.body) { // Unquoting the values of non strings String jsonPathEntry = templateProcessor.jsonPathFromTemplateEntry(method) Object object = parsedRequestBody.read(jsonPathEntry) @@ -458,6 +460,11 @@ abstract class MethodBodyBuilder { return method } + protected boolean textContainsJsonPathTemplate(String method) { + return templateProcessor.containsTemplateEntry(method) && + templateProcessor.containsJsonPathTemplateEntry(method) + } + protected void methodForEqualityCheck(BodyMatcher bodyMatcher, BlockBuilder bb, Object copiedBody) { String path = quotedAndEscaped(bodyMatcher.path()) Object retrievedValue = value(copiedBody, bodyMatcher) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy index efa9a6af10..0a53494c6f 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy @@ -1,6 +1,8 @@ package org.springframework.cloud.contract.verifier.builder.handlebars import com.github.tomakehurst.wiremock.extension.responsetemplating.helpers.WireMockHelpers +import org.apache.commons.logging.Log +import org.apache.commons.logging.LogFactory import wiremock.com.github.jknack.handlebars.Helper import wiremock.com.github.jknack.handlebars.Options import com.github.tomakehurst.wiremock.extension.responsetemplating.RequestTemplateModel @@ -18,12 +20,17 @@ import org.springframework.cloud.contract.verifier.builder.TestSideRequestTempla @CompileStatic class HandlebarsJsonPathHelper implements Helper { + private static final Log log = LogFactory.getLog(HandlebarsJsonPathHelper) + public static final String NAME = "jsonpath" public static final String REQUEST_MODEL_NAME = "request" @Override Object apply(Object context, Options options) throws IOException { if (context instanceof Map) { + if (log.isTraceEnabled()) { + log.trace("Will apply the legacy [jsonpath this] handlebars function") + } // legacy Map oldContext = (Map) context String jsonPath = options.param(0) @@ -35,7 +42,10 @@ class HandlebarsJsonPathHelper implements Helper { } throw new IllegalArgumentException("Unsupported model") } else if (context instanceof String) { - Object value = WireMockHelpers.jsonPath.apply(context, options) + if (log.isTraceEnabled()) { + log.trace("Will apply the native WireMock [jsonPath request.body] handlebars function") + } + Object value = WireMockHelpers.jsonPath.apply(prepareForJsonPathCheck(context), options) if (testSideModel(options)) { return processTestResponseValue(value) } @@ -59,12 +69,16 @@ class HandlebarsJsonPathHelper implements Helper { } private Object returnObjectForTest(TestSideRequestTemplateModel model, String jsonPath) { - String body = removeSurroundingQuotes(model.rawBody).replace('\\"', '"') + String body = prepareForJsonPathCheck(model.rawBody) DocumentContext documentContext = JsonPath.parse(body) Object value = documentContext.read(jsonPath) return processTestResponseValue(value) } + protected String prepareForJsonPathCheck(String body) { + return removeSurroundingQuotes(body).replace('\\"', '"') + } + private Object processTestResponseValue(Object value) { if (value instanceof Long) { return String.valueOf(value) + "L" diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy index e5565a8f81..1bea23558a 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy @@ -69,6 +69,8 @@ class MapConverter { def json = new JsonSlurper().parseText(value) if (json instanceof Map) { return convert(json, closure) + } else if (json instanceof List) { + return transformValues(json, closure) } } catch (Exception ignore) { } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy index 1b96f457be..d324989607 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy @@ -447,7 +447,7 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub "MockMvcJUnitMethodBuilder" | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties) } } - def "should generate assertions for array inside response body element with #methodBuilderName"() { + def "should generate assertions for array inside response body element with #methodBuilderName"() { given: Contract contractDsl = Contract.make { request { @@ -2628,6 +2628,60 @@ DocumentContext parsedJson = JsonPath.parse(json); "JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } | { String body -> body.contains('assertThat(response.getHeaderString("Authorization")).isEqualTo("foo secret bar");') } } + @Issue("#230") + def "should manage to reference request in response via WireMock native entries [#methodBuilderName]"() { + given: + //tag::template_contract[] + Contract contractDsl = Contract.make { + request { + method 'GET' + url('/api/v1/xxxx') { + queryParameters { + parameter("foo", "bar") + parameter("foo", "bar2") + } + } + headers { + header(authorization(), "secret") + header(authorization(), "secret2") + } + body(foo: "bar", baz: 5) + } + response { + status OK() + headers { + contentType(applicationJson()) + } + body(''' + { + "responseFoo": "{{{ jsonPath request.body '$.foo' }}}", + "responseBaz": {{{ jsonPath request.body '$.baz' }}}, + "responseBaz2": "Bla bla {{{ jsonPath request.body '$.foo' }}} bla bla" + } + '''.toString()) + } + } + //end::template_contract[] + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + and: + builder.appendTo(blockBuilder) + String test = blockBuilder.toString() + when: + SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, test) + then: + !test.contains('''DslProperty''') + test.contains('''assertThatJson(parsedJson).field("['responseFoo']").isEqualTo("bar")''') + test.contains('''assertThatJson(parsedJson).field("['responseBaz']").isEqualTo(5)''') + test.contains('''assertThatJson(parsedJson).field("['responseBaz2']").isEqualTo("Bla bla bar bla bla")''') + where: + methodBuilderName | methodBuilder + "MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) } + "MockMvcJUnitMethodBuilder" | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties) } + "JaxRsClientSpockMethodRequestProcessingBodyBuilder" | { Contract dsl -> new JaxRsClientSpockMethodRequestProcessingBodyBuilder(dsl, properties) } + "JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } + } + def "should generate JUnit assertions with cookies"() { given: MethodBodyBuilder builder = new MockMvcJUnitMethodBodyBuilder(contractDslWithCookiesValue, properties)