From e4806b77976e6476736d700d6d6bde897e5f14b4 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 28 Aug 2017 14:08:03 +0200 Subject: [PATCH 1/2] Fixed wrong docs --- .../src/site/asciidoc/usage.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/site/asciidoc/usage.adoc b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/site/asciidoc/usage.adoc index 2f8635c8f2..9b3c68a039 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/site/asciidoc/usage.adoc +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/site/asciidoc/usage.adoc @@ -2,9 +2,9 @@ == Converting Spring Cloud Contract DSL into WireMock stub mappings - mvn org.springramework.cloud:spring-cloud-contract-maven-plugin:convert + mvn org.springframework.cloud:spring-cloud-contract-maven-plugin:convert -or shortly footnoteref:[prefix,Additional configuration inside `~/.m2/settings.xml` is required: ` org.springramework.cloud:spring-cloud-contract-maven-plugin`.] +or shortly footnoteref:[prefix,Additional configuration inside `~/.m2/settings.xml` is required: ` org.springframework.cloud:spring-cloud-contract-maven-plugin`.] mvn spring-cloud-contract-verifier:convert @@ -14,7 +14,7 @@ For more information please go to the Spring Cloud Contract Wiki or Plugin Docum Run stubs mappings from current directory: - mvn org.springramework.cloud:spring-cloud-contract-maven-plugin:run + mvn org.springframework.cloud:spring-cloud-contract-maven-plugin:run or shortly footnoteref:[prefix] From 7b144df594bff78315c73c9805595fdd84ce7ba9 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 28 Aug 2017 14:55:40 +0200 Subject: [PATCH 2/2] Cannot set fixed port in mvn stub runner (httpPort is ignored) without this change the value of `spring.cloud.contract.verifier.http.port` gets executed via the `httpPort` method in options builder. The problem is that this method applies the port to the previously started stub. In this case we're not providing any stubs explicitly thus things don't work as they should. with this change we reuse the min / max port mechanism to limit the range of port to the provided http port fixes #384 --- .../contract/maven/verifier/RunMojo.java | 22 +++++++++++++++++-- .../contract/maven/verifier/PluginIT.java | 16 ++++++++++++++ .../projects/generatedStubsOnly/.gitignore | 1 + .../target/stubs/Sample.json | 22 +++++++++++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/generatedStubsOnly/.gitignore create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/generatedStubsOnly/target/stubs/Sample.json diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/RunMojo.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/RunMojo.java index 013d53b9d0..cce6c5f9df 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/RunMojo.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/RunMojo.java @@ -54,7 +54,7 @@ public class RunMojo extends AbstractMojo { private File destination; /** - * HTTP port for WireMock server + * HTTP port for the WireMock server that serves stubs */ @Parameter(property = "spring.cloud.contract.verifier.http.port", defaultValue = "8080") private int httpPort; @@ -71,15 +71,30 @@ public class RunMojo extends AbstractMojo { @Parameter(property = "spring.cloud.contract.verifier.skipTestOnly", defaultValue = "false") private boolean skipTestOnly; + /** + * List of stubs to be downloaded and ran in a colon separated Ivy notation + */ @Parameter(property = "spring.cloud.contract.verifier.stubs") private String stubs; + /** + * Minimal port at which the stub should start + */ @Parameter(property = "spring.cloud.contract.verifier.http.minPort", defaultValue = "10000") private int minPort; + /** + * Maximal port at which the stub should start + */ @Parameter(property = "spring.cloud.contract.verifier.http.maxPort", defaultValue = "15000") private int maxPort; + /** + * Should the plugin wait for the user to press the key after starting the stubs + */ + @Parameter(property = "spring.cloud.contract.verifier.wait-for-key-pressed", defaultValue = "true") + private boolean waitForKeyPressed; + /** * Classifier used by stubs artifacts. */ @@ -109,7 +124,7 @@ public class RunMojo extends AbstractMojo { .withStubsClassifier(this.stubsClassifier); if (isNullOrEmpty(this.stubs)) { StubRunnerOptions options = optionsBuilder - .withPort(this.httpPort) + .withMinMaxPort(this.httpPort, this.httpPort) .build(); StubRunner stubRunner = this.localStubRunner.run(resolveStubsDirectory().getAbsolutePath(), options); batchStubRunner = new BatchStubRunner(Collections.singleton(stubRunner)); @@ -139,6 +154,9 @@ public class RunMojo extends AbstractMojo { } private void pressAnyKeyToContinue() { + if (!this.waitForKeyPressed) { + return; + } getLog().info("Press ENTER to continue..."); try { System.in.read(); 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 becdcda07e..dec0c8ee7f 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 @@ -29,6 +29,7 @@ import io.takari.maven.testing.TestResources; import io.takari.maven.testing.executor.MavenRuntime; import io.takari.maven.testing.executor.MavenVersions; import io.takari.maven.testing.executor.junit.MavenJUnitTestRunner; +import org.springframework.util.SocketUtils; @RunWith(MavenJUnitTestRunner.class) @MavenVersions({ "3.3.3" }) @@ -108,4 +109,19 @@ public class PluginIT { .assertLogText("Creating new stub") .assertErrorFreeLog(); } + + @Test + public void should_run_WireMock_Stubs_mappings() throws Exception { + int availableTcpPort = SocketUtils.findAvailableTcpPort(); + File basedir = this.resources.getBasedir("generatedStubsOnly"); + this.properties.getPluginVersion(); + this.maven.forProject(basedir) + .withCliOption("-X") + .withCliOption("-Dspring.cloud.contract.verifier.http.port=" + availableTcpPort) + .withCliOption("-Dspring.cloud.contract.verifier.wait-for-key-pressed=false") + .execute(String.format("org.springframework.cloud:spring-cloud-contract-maven-plugin:%s:run", + this.properties.getPluginVersion())) + .assertLogText("All stubs are now running RunningStubs [namesAndPorts={=" + availableTcpPort + "}]") + .assertErrorFreeLog(); + } } \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/generatedStubsOnly/.gitignore b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/generatedStubsOnly/.gitignore new file mode 100644 index 0000000000..8dc6c7308d --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/generatedStubsOnly/.gitignore @@ -0,0 +1 @@ +!target \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/generatedStubsOnly/target/stubs/Sample.json b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/generatedStubsOnly/target/stubs/Sample.json new file mode 100644 index 0000000000..6641a7d26f --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/generatedStubsOnly/target/stubs/Sample.json @@ -0,0 +1,22 @@ +{ + "request" : { + "url" : "/users", + "method" : "POST", + "bodyPatterns" : [ { + "matchesJsonPath" : "$[?(@.login == 'john')]" + }, { + "matchesJsonPath" : "$[?(@.name == 'John The Contract')]" + } ], + "headers" : { + "Content-Type" : { + "equalTo" : "application/json" + } + } + }, + "response" : { + "status" : 200, + "headers" : { + "Location" : "/users/john" + } + } +} \ No newline at end of file