Skip to content

Commit 7815799

Browse files
authored
feat: optionally turn off dirty context when using static port (refs #189) (#190)
1 parent 406aaeb commit 7815799

File tree

4 files changed

+39
-4
lines changed

4 files changed

+39
-4
lines changed

wiremock-spring-boot/src/main/java/org/wiremock/spring/ConfigureWireMock.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@
3535
*
3636
* <p>{@code 0} means WireMock will pick random available port.
3737
*
38-
* <p>{@code >0} means that static port will be used.
38+
* <p>{@code >0} means that static port will be used. A static port will, by default, make Spring
39+
* context dirty to avoid port collisions. Automatic dirty context can be turned off with {@link
40+
* #staticPortDirtySpringContext()}.
3941
*
4042
* @return WireMock server port
4143
*/
@@ -48,6 +50,14 @@
4850
*/
4951
int httpsPort() default -1;
5052

53+
/**
54+
* If you are having performance problems, you may want to set this to false. Making context dirty
55+
* is intended as a fix to avoid port collisions when using static port.
56+
*
57+
* @return true if a static port should make Spring context dirty.
58+
*/
59+
boolean staticPortDirtySpringContext() default true;
60+
5161
/**
5262
* The name of WireMock server.
5363
*

wiremock-spring-boot/src/main/java/org/wiremock/spring/internal/WireMockContextCustomizer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ public void customizeContext(
4646
for (final ConfigureWireMock configureWiremock : this.configuration) {
4747
this.resolveOrCreateWireMockServer(context, configureWiremock);
4848
}
49+
4950
WireMockPortResolver portResolver = new WireMockPortResolver(context.getEnvironment());
50-
boolean isDirty = portResolver.staticPortConfigured(this.configuration);
51+
boolean isDirty = portResolver.anyStaticPortWithDirtySpringContext(this.configuration);
5152
if (isDirty) {
5253
LOGGER.info("Will force dirty context because of static port");
5354
WireMockTestExecutionListener.markContextAsDirty();

wiremock-spring-boot/src/main/java/org/wiremock/spring/internal/WireMockPortResolver.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,12 @@ int getServerHttpsPortProperty(ConfigureWireMock options) {
5959
.orElse(options.httpsPort());
6060
}
6161

62-
public boolean staticPortConfigured(List<ConfigureWireMock> configureWireMocks) {
62+
public boolean anyStaticPortWithDirtySpringContext(List<ConfigureWireMock> configureWireMocks) {
6363
return configureWireMocks.stream()
6464
.anyMatch(
6565
it ->
66-
this.getServerHttpPortProperty(it) > 0 || this.getServerHttpsPortProperty(it) > 0);
66+
it.staticPortDirtySpringContext()
67+
&& (this.getServerHttpPortProperty(it) > 0
68+
|| this.getServerHttpsPortProperty(it) > 0));
6769
}
6870
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package usecases;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.junit.jupiter.api.Test;
6+
import org.springframework.beans.factory.annotation.Value;
7+
import org.springframework.boot.test.context.SpringBootTest;
8+
import org.wiremock.spring.ConfigureWireMock;
9+
import org.wiremock.spring.EnableWireMock;
10+
11+
@SpringBootTest
12+
@EnableWireMock({@ConfigureWireMock(port = 8123, staticPortDirtySpringContext = false)})
13+
class StaticPortNoDirtyContextTest {
14+
15+
@Value("${wiremock.server.port}")
16+
private int wiremockHttpPort;
17+
18+
@Test
19+
void testPort() {
20+
assertThat(this.wiremockHttpPort).isEqualTo(8123);
21+
}
22+
}

0 commit comments

Comments
 (0)