diff --git a/README.adoc b/README.adoc index bef21750e4..fc263f9606 100644 --- a/README.adoc +++ b/README.adoc @@ -6,7 +6,7 @@ image::https://circleci.com/gh/spring-cloud/spring-cloud-contract.svg?style=svg[ == Spring Cloud Contract -What you always need it confidence in pushing new features into a new application or service in a distributed system. +What you always need is confidence in pushing new features into a new application or service in a distributed system. This project provides support for Consumer Driven Contracts and service schemas in Spring applications, covering a range of options for writing tests, publishing them as assets, asserting that a contract is kept by producers and consumers, for HTTP and message-based interactions. diff --git a/samples/pom.xml b/samples/pom.xml index 69922a976d..507af6b325 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -78,6 +78,43 @@ + + windows + + + + + org.apache.maven.plugins + maven-invoker-plugin + + src/it/settings.xml + standalone + ${skipTests} + true + + windows + + + */pom.xml + + + clean + install + + + + + integration + + run + + + + + + + diff --git a/samples/standalone/dsl/http-client/pom.xml b/samples/standalone/dsl/http-client/pom.xml index dd6e5965e2..61742a15ff 100644 --- a/samples/standalone/dsl/http-client/pom.xml +++ b/samples/standalone/dsl/http-client/pom.xml @@ -169,6 +169,35 @@ + + windows + + + + org.codehaus.mojo + exec-maven-plugin + + + gradle + test + + gradlew.bat + + clean + build + publishToMavenLocal + -PverifierVersion=${spring-cloud-contract.version} + + + + exec + + + + + + + diff --git a/samples/standalone/dsl/http-server/pom.xml b/samples/standalone/dsl/http-server/pom.xml index a7419f3812..9aad4af765 100644 --- a/samples/standalone/dsl/http-server/pom.xml +++ b/samples/standalone/dsl/http-server/pom.xml @@ -220,5 +220,34 @@ + + windows + + + + org.codehaus.mojo + exec-maven-plugin + + + gradle + test + + gradlew.bat + + clean + build + publishToMavenLocal + -PverifierVersion=${spring-cloud-contract.version} + + + + exec + + + + + + + diff --git a/samples/standalone/messaging/stream-sink/pom.xml b/samples/standalone/messaging/stream-sink/pom.xml index c76da9257a..bb2255e8ca 100644 --- a/samples/standalone/messaging/stream-sink/pom.xml +++ b/samples/standalone/messaging/stream-sink/pom.xml @@ -167,5 +167,34 @@ + + windows + + + + org.codehaus.mojo + exec-maven-plugin + + + gradle + test + + gradlew.bat + + clean + build + publishToMavenLocal + -PverifierVersion=${spring-cloud-contract.version} + + + + exec + + + + + + + diff --git a/samples/standalone/messaging/stream-source/pom.xml b/samples/standalone/messaging/stream-source/pom.xml index 2cbf8750fb..7f47493a30 100644 --- a/samples/standalone/messaging/stream-source/pom.xml +++ b/samples/standalone/messaging/stream-source/pom.xml @@ -216,5 +216,34 @@ + + windows + + + + org.codehaus.mojo + exec-maven-plugin + + + gradle + test + + gradlew.bat + + clean + build + publishToMavenLocal + -PverifierVersion=${spring-cloud-contract.version} + + + + exec + + + + + + + diff --git a/samples/standalone/restdocs/http-client/pom.xml b/samples/standalone/restdocs/http-client/pom.xml index d09efe1c65..058dbd32e4 100644 --- a/samples/standalone/restdocs/http-client/pom.xml +++ b/samples/standalone/restdocs/http-client/pom.xml @@ -181,6 +181,35 @@ + + windows + + + + org.codehaus.mojo + exec-maven-plugin + + + gradle + test + + ./gradlew + + clean + build + publishToMavenLocal + -PverifierVersion=${spring-cloud-contract.version} + + + + exec + + + + + + + diff --git a/samples/standalone/restdocs/http-server/pom.xml b/samples/standalone/restdocs/http-server/pom.xml index 5555f3d593..3eda7e2124 100644 --- a/samples/standalone/restdocs/http-server/pom.xml +++ b/samples/standalone/restdocs/http-server/pom.xml @@ -200,5 +200,35 @@ + + windows + + + + org.codehaus.mojo + exec-maven-plugin + + + gradle + test + + gradlew.bat + + clean + build + + install + -PverifierVersion=${spring-cloud-contract.version} + + + + exec + + + + + + + diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ContractDownloader.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ContractDownloader.java index e37b8c2ba4..d87ccfd456 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ContractDownloader.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/ContractDownloader.java @@ -61,7 +61,8 @@ public class ContractDownloader { } private String patternFromProperty(File contractsDirectory) { - return "^" + contractsDirectory.getAbsolutePath() + contractsPath() + ".*$"; + return ("^" + contractsDirectory.getAbsolutePath() + + contractsPath().replace("/", File.separator) + ".*$").replace("\\", "\\\\"); } private String contractsPath() { @@ -79,13 +80,13 @@ public class ContractDownloader { } private String groupArtifactToPattern(File contractsDirectory) { - return "^" + + return ("^" + contractsDirectory.getAbsolutePath() + File.separator + this.projectGroupId.replace(".", File.separator) + File.separator + this.projectArtifactId + File.separator + - ".*$"; + ".*$").replace("\\", "\\\\"); } } diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/ContractDownloaderSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/ContractDownloaderSpec.groovy index 9bd6958224..fd4434cf72 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/ContractDownloaderSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/ContractDownloaderSpec.groovy @@ -30,7 +30,7 @@ class ContractDownloaderSpec extends Specification { def 'should set inclusion pattern on config when path pattern was explicitly provided without a separator at the beginning'() { given: - String contractPath = fileSeparated('a/b/c/d') + String contractPath = File.separator + ['a','b','c','d'].join(File.separator) ContractDownloader contractDownloader = new ContractDownloader(stubDownloader, stubConfiguration, contractPath, '', '') ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties() @@ -45,6 +45,6 @@ class ContractDownloaderSpec extends Specification { } private static String fileSeparated(String string) { - return string.replace('/', File.separator) + return string.replace('/', File.separator).replace("\\", "\\\\") } } 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 761f06aa58..575b1d78e0 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 @@ -124,6 +124,38 @@ + + windows + + + windows + + + + + + org.codehaus.mojo + exec-maven-plugin + + + gradle + package + + gradlew.bat + + build + jacocoTestReport + + + + exec + + + + + + + fast diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginIT.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginIT.java index 9d38236b0a..d97171a33d 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginIT.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginIT.java @@ -18,6 +18,8 @@ package org.springframework.cloud.contract.maven.verifier; import java.io.File; +import org.junit.Assume; +import org.junit.Before; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; @@ -40,6 +42,15 @@ public class PluginIT { private final MavenRuntime maven; + @Before + public void doNotRunForWindows() { + Assume.assumeFalse(isWindows()); + } + + private boolean isWindows() { + return System.getProperty("os.name").startsWith("Windows"); + } + public PluginIT(MavenRuntime.MavenRuntimeBuilder mavenBuilder) throws Exception { this.maven = mavenBuilder.withCliOptions("-B", "-U").build(); } 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 141d1f12f7..31a9b2f906 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 @@ -19,6 +19,8 @@ package org.springframework.cloud.contract.maven.verifier; import java.io.File; import org.apache.commons.io.FileUtils; +import org.junit.Assume; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; 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 df267cfd87..8e8fc9108f 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 @@ -99,7 +99,7 @@ class RegexpBuilders { private final static Pattern SPECIAL_REGEX_CHARS = Pattern.compile('[{}()\\[\\].+*?^$\\\\|]') - private static String escapeSpecialRegexChars(String str) { + static String escapeSpecialRegexChars(String str) { return SPECIAL_REGEX_CHARS.matcher(str).replaceAll('\\\\\\\\$0') } diff --git a/tests/spring-cloud-contract-stub-runner-camel/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/CamelStubRunnerSpec.groovy b/tests/spring-cloud-contract-stub-runner-camel/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/CamelStubRunnerSpec.groovy index fa6a8a5922..840bb44471 100644 --- a/tests/spring-cloud-contract-stub-runner-camel/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/CamelStubRunnerSpec.groovy +++ b/tests/spring-cloud-contract-stub-runner-camel/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/CamelStubRunnerSpec.groovy @@ -36,7 +36,7 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.ComponentScan import org.springframework.context.annotation.Configuration import org.springframework.test.context.ContextConfiguration - +import spock.lang.IgnoreIf import spock.lang.Specification /** @@ -45,6 +45,7 @@ import spock.lang.Specification @ContextConfiguration(classes = Config, loader = SpringBootContextLoader) @IntegrationTest("debug=true") @AutoConfigureStubRunner +@IgnoreIf({ os.windows }) class CamelStubRunnerSpec extends Specification { @Autowired StubFinder stubFinder diff --git a/tests/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy b/tests/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy index 86a3e434d4..2d9e09d011 100644 --- a/tests/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy +++ b/tests/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy @@ -30,6 +30,7 @@ import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.ImportResource import org.springframework.messaging.Message import org.springframework.test.context.ContextConfiguration +import spock.lang.IgnoreIf import spock.lang.Specification import java.util.concurrent.TimeUnit @@ -39,6 +40,7 @@ import java.util.concurrent.TimeUnit @ContextConfiguration(classes = Config, loader = SpringBootContextLoader) @ImportResource("classpath*:integration-context.xml") @AutoConfigureStubRunner +@IgnoreIf({ os.windows }) class IntegrationStubRunnerSpec extends Specification { @Autowired StubFinder stubFinder 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 28564fa7be..733fd4a0ca 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 @@ -18,28 +18,25 @@ package org.springframework.cloud.contract.stubrunner.messaging.stream import groovy.json.JsonOutput import groovy.json.JsonSlurper - -import java.util.concurrent.TimeUnit - import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.EnableAutoConfiguration -import org.springframework.boot.test.IntegrationTest; +import org.springframework.boot.test.IntegrationTest import org.springframework.boot.test.context.SpringBootContextLoader import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.stubrunner.StubFinder import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner import org.springframework.cloud.contract.verifier.messaging.MessageVerifier -import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier; +import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier 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.ComponentScan import org.springframework.context.annotation.Configuration import org.springframework.messaging.Message import org.springframework.test.context.ContextConfiguration - +import spock.lang.IgnoreIf import spock.lang.Specification +import java.util.concurrent.TimeUnit /** * @author Marcin Grzejszczak */ @@ -47,6 +44,7 @@ import spock.lang.Specification @IntegrationTest("debug=true") @AutoConfigureStubRunner @AutoConfigureMessageVerifier +@IgnoreIf({ os.windows }) class StreamStubRunnerSpec extends Specification { @Autowired StubFinder stubFinder