From 11965323ae947775927adb9564c072b4f848e28e Mon Sep 17 00:00:00 2001 From: boothen Date: Sun, 17 Feb 2019 16:22:00 +0000 Subject: [PATCH] #883: Wiremock: Fix for Spring context always being set to Dirty. (#884) * #883: Using boolean values in Wiremock.server so that it's possible to identify if dynamic ports have been configured. * #883: Triage feedback. Added @author. Updated license year. Changed test name. * #883: Fixed portIsFixed logic. Added test to check expect port status to applicable tests. @DirtiesContext to test so that context is cleared down to avoid conflict in the next test. * #883: Removed duplicate portIsFixed/portIsNotFixed unit tests. * #883: Checkstyle fixes. --- .../wiremock/WireMockApplicationListener.java | 14 ++++++++++++- .../wiremock/WireMockConfiguration.java | 21 +++++++++++++++++++ .../WireMockTestExecutionListener.java | 10 +++++---- ...AutoConfigureWireMockApplicationTests.java | 10 +++++++++ ...gureWireMockAutoStubsApplicationTests.java | 10 +++++++++ ...onfigureWireMockFilesApplicationTests.java | 1 - ...gureWireMockHttpsPortApplicationTests.java | 10 +++++++++ ...ureWireMockRandomPortApplicationTests.java | 3 ++- ...reMockRandomPortHttpsApplicationTests.java | 10 +++++++++ ...igureWireMockSamePortApplicationTests.java | 1 - ...StubsAndMultipleFilesApplicationTests.java | 1 - ...ireMockStubsApplicationWithSlashTests.java | 1 - 12 files changed, 82 insertions(+), 10 deletions(-) diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockApplicationListener.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockApplicationListener.java index fcf0385de8..ba35e0bb77 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockApplicationListener.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockApplicationListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2019 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. @@ -34,6 +34,7 @@ import org.springframework.util.SocketUtils; * initialized. For example, by finding free ports for the server to listen on. * * @author Dave Syer + * @author Matt Garner * */ @Order(Ordered.LOWEST_PRECEDENCE) @@ -53,6 +54,7 @@ public class WireMockApplicationListener .get("wiremock")).getSource(); source.put("wiremock.server.port", SocketUtils.findAvailableTcpPort(10000, 12500)); + source.put("wiremock.server.port-dynamic", true); } if (environment.getProperty("wiremock.server.https-port", Integer.class, 0) == 0) { @@ -62,7 +64,17 @@ public class WireMockApplicationListener .get("wiremock")).getSource(); source.put("wiremock.server.https-port", SocketUtils.findAvailableTcpPort(12500, 15000)); + source.put("wiremock.server.https-port-dynamic", true); } + else if (environment.getProperty("wiremock.server.https-port", Integer.class, + 0) != -1) { + MutablePropertySources propertySources = environment.getPropertySources(); + addPropertySource(propertySources); + Map source = ((MapPropertySource) propertySources + .get("wiremock")).getSource(); + source.put("wiremock.server.https-port-dynamic", false); + } + } private void addPropertySource(MutablePropertySources propertySources) { 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 37a011d841..411ac6f611 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 @@ -52,6 +52,7 @@ import org.springframework.util.StringUtils; * {@link WireMockSpring#options()}) to your test context. * * @author Dave Syer + * @author Matt Garner * */ @Configuration @@ -254,6 +255,10 @@ class WireMockProperties { private String[] files; + private boolean portDynamic = false; + + private boolean httpsPortDynamic = true; + public int getPort() { return this.port; } @@ -286,6 +291,22 @@ class WireMockProperties { this.files = files; } + public boolean isPortDynamic() { + return portDynamic; + } + + public void setPortDynamic(boolean portDynamic) { + this.portDynamic = portDynamic; + } + + public boolean isHttpsPortDynamic() { + return httpsPortDynamic; + } + + public void setHttpsPortDynamic(boolean httpsPortDynamic) { + this.httpsPortDynamic = httpsPortDynamic; + } + } } 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 index 0734206fbd..7d3684c671 100644 --- 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 @@ -28,6 +28,7 @@ import org.springframework.test.context.support.AbstractTestExecutionListener; * Dirties the test context if WireMock was running on a fixed port. * * @author Marcin Grzejszczak + * @author Matt Garner * @since 1.2.6 */ public final class WireMockTestExecutionListener extends AbstractTestExecutionListener { @@ -45,7 +46,7 @@ public final class WireMockTestExecutionListener extends AbstractTestExecutionLi if (log.isWarnEnabled()) { log.warn("You've used fixed ports for WireMock setup - " + "will mark context as dirty. Please use random ports, as much " - + "as possible. Your tests will be faster and more reliable and this" + + "as possible. Your tests will be faster and more reliable and this " + "warning will go away"); } testContext @@ -97,9 +98,10 @@ public final class WireMockTestExecutionListener extends AbstractTestExecutionLi private boolean portIsFixed(TestContext testContext) { WireMockConfiguration wireMockProperties = wireMockConfig(testContext); - int httpPort = wireMockProperties.wireMock.getServer().getPort(); - int httpsPort = wireMockProperties.wireMock.getServer().getHttpsPort(); - return (httpPort != 0 || httpsPort != -1) && httpsPort != 0; + boolean httpPortDynamic = wireMockProperties.wireMock.getServer().isPortDynamic(); + boolean httpsPortDynamic = wireMockProperties.wireMock.getServer() + .isHttpsPortDynamic(); + return !httpPortDynamic || !httpsPortDynamic; } } 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 4e8e16e419..f88de6aaee 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 @@ -38,6 +38,9 @@ public class AutoConfigureWireMockApplicationTests { @Autowired private Service service; + @Autowired + private WireMockProperties wireMockProperties; + @Test public void contextLoads() throws Exception { stubFor(get(urlEqualTo("/test")).willReturn(aResponse() @@ -45,4 +48,11 @@ public class AutoConfigureWireMockApplicationTests { assertThat(this.service.go()).isEqualTo("Hello World!"); } + @Test + public void portsAreFixed() { + boolean httpPortDynamic = wireMockProperties.getServer().isPortDynamic(); + boolean httpsPortDynamic = wireMockProperties.getServer().isHttpsPortDynamic(); + assertThat(!httpPortDynamic || !httpsPortDynamic).isTrue(); + } + } 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 b6932fe78e..e34e9d61c3 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 @@ -35,9 +35,19 @@ public class AutoConfigureWireMockAutoStubsApplicationTests { @Autowired private Service service; + @Autowired + private WireMockProperties wireMockProperties; + @Test public void contextLoads() throws Exception { assertThat(this.service.go()).isEqualTo("Hello World"); } + @Test + public void portsAreNotFixed() { + boolean httpPortDynamic = wireMockProperties.getServer().isPortDynamic(); + boolean httpsPortDynamic = wireMockProperties.getServer().isHttpsPortDynamic(); + assertThat(!httpPortDynamic || !httpsPortDynamic).isFalse(); + } + } 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 28a077fcf3..43200eeecd 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 @@ -39,5 +39,4 @@ public class AutoConfigureWireMockFilesApplicationTests { assertThat(this.service.go()) .isEqualToIgnoringWhitespace("{\"message\":\"Hello Root\"}"); } - } 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 befea17b58..5f1ba89979 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 @@ -38,6 +38,9 @@ public class AutoConfigureWireMockHttpsPortApplicationTests { @Autowired private Service service; + @Autowired + private WireMockProperties wireMockProperties; + @Test public void contextLoads() throws Exception { stubFor(get(urlEqualTo("/test")).willReturn(aResponse() @@ -45,4 +48,11 @@ public class AutoConfigureWireMockHttpsPortApplicationTests { assertThat(this.service.go()).isEqualTo("Hello World!"); } + @Test + public void portsAreFixed() { + boolean httpPortDynamic = wireMockProperties.getServer().isPortDynamic(); + boolean httpsPortDynamic = wireMockProperties.getServer().isHttpsPortDynamic(); + assertThat(!httpPortDynamic || !httpsPortDynamic).isTrue(); + } + } 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 f22371075b..230c00d66c 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 @@ -22,6 +22,7 @@ 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; @@ -30,6 +31,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; +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @RunWith(SpringRunner.class) @SpringBootTest(classes = WiremockTestsApplication.class, properties = "app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment = WebEnvironment.NONE) @AutoConfigureWireMock(port = 0) @@ -44,5 +46,4 @@ public class AutoConfigureWireMockRandomPortApplicationTests { .withHeader("Content-Type", "text/plain").withBody("Hello World!"))); assertThat(this.service.go()).isEqualTo("Hello World!"); } - } 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 6d29ca1cab..69019e8996 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 @@ -38,6 +38,9 @@ public class AutoConfigureWireMockRandomPortHttpsApplicationTests { @Autowired private Service service; + @Autowired + private WireMockProperties wireMockProperties; + @Test public void contextLoads() throws Exception { stubFor(get(urlEqualTo("/test")).willReturn(aResponse() @@ -45,4 +48,11 @@ public class AutoConfigureWireMockRandomPortHttpsApplicationTests { assertThat(this.service.go()).isEqualTo("Hello World!"); } + @Test + public void portsAreNotFixed() { + boolean httpPortDynamic = wireMockProperties.getServer().isPortDynamic(); + boolean httpsPortDynamic = wireMockProperties.getServer().isHttpsPortDynamic(); + assertThat(!httpPortDynamic || !httpsPortDynamic).isFalse(); + } + } 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 4f161391e7..6489b4a2cf 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 @@ -45,5 +45,4 @@ public class AutoConfigureWireMockSamePortApplicationTests { .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/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java index 05491aa535..daff95c235 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 @@ -40,5 +40,4 @@ public class AutoConfigureWireMockStubsAndMultipleFilesApplicationTests { assertThat(this.service.go()) .isEqualToIgnoringWhitespace("{\"message\":\"Hello Root\"}"); } - } 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 d844349575..ae54dad926 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 @@ -38,5 +38,4 @@ public class AutoConfigureWireMockStubsApplicationWithSlashTests { public void contextLoads() throws Exception { assertThat(this.service.go()).isEqualTo("Hello World"); } - }