Merge branch '2.7.x' into 3.0.x

Closes gh-36043
pull/37018/head
Andy Wilkinson 1 year ago
commit 2fae5de245

@ -73,7 +73,9 @@ public abstract class ArchitectureCheck extends DefaultTask {
.importPaths(this.classes.getFiles().stream().map(File::toPath).collect(Collectors.toList())); .importPaths(this.classes.getFiles().stream().map(File::toPath).collect(Collectors.toList()));
List<EvaluationResult> violations = Stream.of(allPackagesShouldBeFreeOfTangles(), List<EvaluationResult> violations = Stream.of(allPackagesShouldBeFreeOfTangles(),
allBeanPostProcessorBeanMethodsShouldBeStaticAndHaveParametersThatWillNotCausePrematureInitialization(), allBeanPostProcessorBeanMethodsShouldBeStaticAndHaveParametersThatWillNotCausePrematureInitialization(),
allBeanFactoryPostProcessorBeanMethodsShouldBeStaticAndHaveNoParameters()) allBeanFactoryPostProcessorBeanMethodsShouldBeStaticAndHaveNoParameters(),
noClassesShouldCallStepVerifierStepVerifyComplete(),
noClassesShouldConfigureDefaultStepVerifierTimeout())
.map((rule) -> rule.evaluate(javaClasses)) .map((rule) -> rule.evaluate(javaClasses))
.filter(EvaluationResult::hasViolation) .filter(EvaluationResult::hasViolation)
.collect(Collectors.toList()); .collect(Collectors.toList());
@ -162,6 +164,20 @@ public abstract class ArchitectureCheck extends DefaultTask {
}; };
} }
private ArchRule noClassesShouldCallStepVerifierStepVerifyComplete() {
return ArchRuleDefinition.noClasses()
.should()
.callMethod("reactor.test.StepVerifier$Step", "verifyComplete")
.because("it can block indefinitely and expectComplete().verify(Duration) should be used instead");
}
private ArchRule noClassesShouldConfigureDefaultStepVerifierTimeout() {
return ArchRuleDefinition.noClasses()
.should()
.callMethod("reactor.test.StepVerifier", "setDefaultTimeout", "java.time.Duration")
.because("expectComplete().verify(Duration) should be used instead");
}
public void setClasses(FileCollection classes) { public void setClasses(FileCollection classes) {
this.classes = classes; this.classes = classes;
} }

@ -16,6 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive; package org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive;
import java.time.Duration;
import java.util.Base64; import java.util.Base64;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
@ -67,7 +68,8 @@ class ReactiveCloudFoundrySecurityInterceptorTests {
.build()); .build());
StepVerifier.create(this.interceptor.preHandle(request, "/a")) StepVerifier.create(this.interceptor.preHandle(request, "/a"))
.consumeNextWith((response) -> assertThat(response.getStatus()).isEqualTo(HttpStatus.OK)) .consumeNextWith((response) -> assertThat(response.getStatus()).isEqualTo(HttpStatus.OK))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -76,7 +78,8 @@ class ReactiveCloudFoundrySecurityInterceptorTests {
StepVerifier.create(this.interceptor.preHandle(request, "/a")) StepVerifier.create(this.interceptor.preHandle(request, "/a"))
.consumeNextWith( .consumeNextWith(
(response) -> assertThat(response.getStatus()).isEqualTo(Reason.MISSING_AUTHORIZATION.getStatus())) (response) -> assertThat(response.getStatus()).isEqualTo(Reason.MISSING_AUTHORIZATION.getStatus()))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -86,7 +89,8 @@ class ReactiveCloudFoundrySecurityInterceptorTests {
StepVerifier.create(this.interceptor.preHandle(request, "/a")) StepVerifier.create(this.interceptor.preHandle(request, "/a"))
.consumeNextWith( .consumeNextWith(
(response) -> assertThat(response.getStatus()).isEqualTo(Reason.MISSING_AUTHORIZATION.getStatus())) (response) -> assertThat(response.getStatus()).isEqualTo(Reason.MISSING_AUTHORIZATION.getStatus()))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -122,7 +126,8 @@ class ReactiveCloudFoundrySecurityInterceptorTests {
.build()); .build());
StepVerifier.create(this.interceptor.preHandle(request, "/a")) StepVerifier.create(this.interceptor.preHandle(request, "/a"))
.consumeNextWith((response) -> assertThat(response.getStatus()).isEqualTo(Reason.ACCESS_DENIED.getStatus())) .consumeNextWith((response) -> assertThat(response.getStatus()).isEqualTo(Reason.ACCESS_DENIED.getStatus()))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -136,7 +141,7 @@ class ReactiveCloudFoundrySecurityInterceptorTests {
StepVerifier.create(this.interceptor.preHandle(exchange, "/a")).consumeNextWith((response) -> { StepVerifier.create(this.interceptor.preHandle(exchange, "/a")).consumeNextWith((response) -> {
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK); assertThat(response.getStatus()).isEqualTo(HttpStatus.OK);
assertThat((AccessLevel) exchange.getAttribute("cloudFoundryAccessLevel")).isEqualTo(AccessLevel.FULL); assertThat((AccessLevel) exchange.getAttribute("cloudFoundryAccessLevel")).isEqualTo(AccessLevel.FULL);
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -152,7 +157,7 @@ class ReactiveCloudFoundrySecurityInterceptorTests {
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK); assertThat(response.getStatus()).isEqualTo(HttpStatus.OK);
assertThat((AccessLevel) exchange.getAttribute("cloudFoundryAccessLevel")) assertThat((AccessLevel) exchange.getAttribute("cloudFoundryAccessLevel"))
.isEqualTo(AccessLevel.RESTRICTED); .isEqualTo(AccessLevel.RESTRICTED);
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
private String mockAccessToken() { private String mockAccessToken() {

@ -25,6 +25,7 @@ import java.security.PrivateKey;
import java.security.Signature; import java.security.Signature;
import java.security.spec.InvalidKeySpecException; import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.PKCS8EncodedKeySpec;
import java.time.Duration;
import java.util.Base64; import java.util.Base64;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
@ -125,7 +126,8 @@ class ReactiveTokenValidatorTests {
String claims = "{\"exp\": 2147483647, \"iss\": \"http://localhost:8080/uaa/oauth/token\", \"scope\": [\"actuator.read\"]}"; String claims = "{\"exp\": 2147483647, \"iss\": \"http://localhost:8080/uaa/oauth/token\", \"scope\": [\"actuator.read\"]}";
StepVerifier StepVerifier
.create(this.tokenValidator.validate(new Token(getSignedToken(header.getBytes(), claims.getBytes())))) .create(this.tokenValidator.validate(new Token(getSignedToken(header.getBytes(), claims.getBytes()))))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
assertThat(this.tokenValidator).hasFieldOrPropertyWithValue("cachedTokenKeys", VALID_KEYS); assertThat(this.tokenValidator).hasFieldOrPropertyWithValue("cachedTokenKeys", VALID_KEYS);
fetchTokenKeys.assertWasSubscribed(); fetchTokenKeys.assertWasSubscribed();
} }
@ -139,7 +141,8 @@ class ReactiveTokenValidatorTests {
String claims = "{\"exp\": 2147483647, \"iss\": \"http://localhost:8080/uaa/oauth/token\", \"scope\": [\"actuator.read\"]}"; String claims = "{\"exp\": 2147483647, \"iss\": \"http://localhost:8080/uaa/oauth/token\", \"scope\": [\"actuator.read\"]}";
StepVerifier StepVerifier
.create(this.tokenValidator.validate(new Token(getSignedToken(header.getBytes(), claims.getBytes())))) .create(this.tokenValidator.validate(new Token(getSignedToken(header.getBytes(), claims.getBytes()))))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
assertThat(this.tokenValidator).hasFieldOrPropertyWithValue("cachedTokenKeys", VALID_KEYS); assertThat(this.tokenValidator).hasFieldOrPropertyWithValue("cachedTokenKeys", VALID_KEYS);
fetchTokenKeys.assertWasSubscribed(); fetchTokenKeys.assertWasSubscribed();
} }
@ -171,7 +174,8 @@ class ReactiveTokenValidatorTests {
String claims = "{\"exp\": 2147483647, \"iss\": \"http://localhost:8080/uaa/oauth/token\", \"scope\": [\"actuator.read\"]}"; String claims = "{\"exp\": 2147483647, \"iss\": \"http://localhost:8080/uaa/oauth/token\", \"scope\": [\"actuator.read\"]}";
StepVerifier StepVerifier
.create(this.tokenValidator.validate(new Token(getSignedToken(header.getBytes(), claims.getBytes())))) .create(this.tokenValidator.validate(new Token(getSignedToken(header.getBytes(), claims.getBytes()))))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
fetchTokenKeys.assertWasNotSubscribed(); fetchTokenKeys.assertWasNotSubscribed();
} }

@ -16,6 +16,7 @@
package org.springframework.boot.actuate.cassandra; package org.springframework.boot.actuate.cassandra;
import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@ -61,7 +62,8 @@ class CassandraDriverReactiveHealthIndicatorTests {
Mono<Health> health = healthIndicator.health(); Mono<Health> health = healthIndicator.health();
StepVerifier.create(health) StepVerifier.create(health)
.consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.UP)) .consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.UP))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -71,7 +73,8 @@ class CassandraDriverReactiveHealthIndicatorTests {
Mono<Health> health = healthIndicator.health(); Mono<Health> health = healthIndicator.health();
StepVerifier.create(health) StepVerifier.create(health)
.consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.DOWN)) .consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.DOWN))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -81,7 +84,8 @@ class CassandraDriverReactiveHealthIndicatorTests {
Mono<Health> health = healthIndicator.health(); Mono<Health> health = healthIndicator.health();
StepVerifier.create(health) StepVerifier.create(health)
.consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.DOWN)) .consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.DOWN))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -91,7 +95,8 @@ class CassandraDriverReactiveHealthIndicatorTests {
Mono<Health> health = healthIndicator.health(); Mono<Health> health = healthIndicator.health();
StepVerifier.create(health) StepVerifier.create(health)
.consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.DOWN)) .consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.DOWN))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -101,7 +106,8 @@ class CassandraDriverReactiveHealthIndicatorTests {
Mono<Health> health = healthIndicator.health(); Mono<Health> health = healthIndicator.health();
StepVerifier.create(health) StepVerifier.create(health)
.consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.UP)) .consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.UP))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -111,7 +117,8 @@ class CassandraDriverReactiveHealthIndicatorTests {
Mono<Health> health = healthIndicator.health(); Mono<Health> health = healthIndicator.health();
StepVerifier.create(health) StepVerifier.create(health)
.consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.UP)) .consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.UP))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -121,7 +128,8 @@ class CassandraDriverReactiveHealthIndicatorTests {
Mono<Health> health = healthIndicator.health(); Mono<Health> health = healthIndicator.health();
StepVerifier.create(health) StepVerifier.create(health)
.consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.UP)) .consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.UP))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -139,7 +147,7 @@ class CassandraDriverReactiveHealthIndicatorTests {
assertThat(h.getStatus()).isEqualTo(Status.UP); assertThat(h.getStatus()).isEqualTo(Status.UP);
assertThat(h.getDetails()).containsOnlyKeys("version"); assertThat(h.getDetails()).containsOnlyKeys("version");
assertThat(h.getDetails()).containsEntry("version", Version.V4_0_0); assertThat(h.getDetails()).containsEntry("version", Version.V4_0_0);
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -150,7 +158,7 @@ class CassandraDriverReactiveHealthIndicatorTests {
StepVerifier.create(health).consumeNextWith((h) -> { StepVerifier.create(health).consumeNextWith((h) -> {
assertThat(h.getStatus()).isEqualTo(Status.UP); assertThat(h.getStatus()).isEqualTo(Status.UP);
assertThat(h.getDetails()).doesNotContainKey("version"); assertThat(h.getDetails()).doesNotContainKey("version");
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -165,7 +173,7 @@ class CassandraDriverReactiveHealthIndicatorTests {
assertThat(h.getDetails()).containsOnlyKeys("error"); assertThat(h.getDetails()).containsOnlyKeys("error");
assertThat(h.getDetails()).containsEntry("error", assertThat(h.getDetails()).containsEntry("error",
DriverTimeoutException.class.getName() + ": Test Exception"); DriverTimeoutException.class.getName() + ": Test Exception");
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
private CqlSession mockCqlSessionWithNodeState(NodeState... nodeStates) { private CqlSession mockCqlSessionWithNodeState(NodeState... nodeStates) {

@ -37,7 +37,7 @@ class HealthIndicatorReactiveAdapterTests {
HealthIndicatorReactiveAdapter adapter = new HealthIndicatorReactiveAdapter(delegate); HealthIndicatorReactiveAdapter adapter = new HealthIndicatorReactiveAdapter(delegate);
Health status = Health.up().build(); Health status = Health.up().build();
given(delegate.health()).willReturn(status); given(delegate.health()).willReturn(status);
StepVerifier.create(adapter.health()).expectNext(status).verifyComplete(); StepVerifier.create(adapter.health()).expectNext(status).expectComplete().verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -55,7 +55,10 @@ class HealthIndicatorReactiveAdapterTests {
.status(Thread.currentThread().getName().equals(currentThread) ? Status.DOWN : Status.UP) .status(Thread.currentThread().getName().equals(currentThread) ? Status.DOWN : Status.UP)
.build(); .build();
HealthIndicatorReactiveAdapter adapter = new HealthIndicatorReactiveAdapter(delegate); HealthIndicatorReactiveAdapter adapter = new HealthIndicatorReactiveAdapter(delegate);
StepVerifier.create(adapter.health()).expectNext(Health.status(Status.UP).build()).verifyComplete(); StepVerifier.create(adapter.health())
.expectNext(Health.status(Status.UP).build())
.expectComplete()
.verify(Duration.ofSeconds(30));
} }
} }

@ -16,6 +16,8 @@
package org.springframework.boot.actuate.health; package org.springframework.boot.actuate.health;
import java.time.Duration;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@ -40,7 +42,8 @@ class ReactiveHealthIndicatorImplementationTests {
void healthUp(CapturedOutput output) { void healthUp(CapturedOutput output) {
StepVerifier.create(new SimpleReactiveHealthIndicator().health()) StepVerifier.create(new SimpleReactiveHealthIndicator().health())
.consumeNextWith((health) -> assertThat(health).isEqualTo(Health.up().build())) .consumeNextWith((health) -> assertThat(health).isEqualTo(Health.up().build()))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
assertThat(output).doesNotContain("Health check failed for simple"); assertThat(output).doesNotContain("Health check failed for simple");
} }
@ -49,7 +52,8 @@ class ReactiveHealthIndicatorImplementationTests {
StepVerifier.create(new CustomErrorMessageReactiveHealthIndicator().health()) StepVerifier.create(new CustomErrorMessageReactiveHealthIndicator().health())
.consumeNextWith( .consumeNextWith(
(health) -> assertThat(health).isEqualTo(Health.down(new UnsupportedOperationException()).build())) (health) -> assertThat(health).isEqualTo(Health.down(new UnsupportedOperationException()).build()))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
assertThat(output).contains("Health check failed for custom"); assertThat(output).contains("Health check failed for custom");
} }
@ -57,7 +61,8 @@ class ReactiveHealthIndicatorImplementationTests {
void healthDownWithCustomErrorMessageFunction(CapturedOutput output) { void healthDownWithCustomErrorMessageFunction(CapturedOutput output) {
StepVerifier.create(new CustomErrorMessageFunctionReactiveHealthIndicator().health()) StepVerifier.create(new CustomErrorMessageFunctionReactiveHealthIndicator().health())
.consumeNextWith((health) -> assertThat(health).isEqualTo(Health.down(new RuntimeException()).build())) .consumeNextWith((health) -> assertThat(health).isEqualTo(Health.down(new RuntimeException()).build()))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
assertThat(output).contains("Health check failed with RuntimeException"); assertThat(output).contains("Health check failed with RuntimeException");
} }

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2021 the original author or authors. * Copyright 2012-2023 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,6 +16,7 @@
package org.springframework.boot.actuate.metrics.r2dbc; package org.springframework.boot.actuate.metrics.r2dbc;
import java.time.Duration;
import java.util.Collections; import java.util.Collections;
import java.util.UUID; import java.util.UUID;
@ -59,7 +60,7 @@ class ConnectionPoolMetricsTests {
@AfterEach @AfterEach
void close() { void close() {
if (this.connectionFactory != null) { if (this.connectionFactory != null) {
StepVerifier.create(this.connectionFactory.close()).verifyComplete(); StepVerifier.create(this.connectionFactory.close()).expectComplete().verify(Duration.ofSeconds(30));
} }
} }
@ -72,8 +73,16 @@ class ConnectionPoolMetricsTests {
Tags.of(testTag, regionTag)); Tags.of(testTag, regionTag));
metrics.bindTo(registry); metrics.bindTo(registry);
// acquire two connections // acquire two connections
connectionPool.create().as(StepVerifier::create).expectNextCount(1).verifyComplete(); connectionPool.create()
connectionPool.create().as(StepVerifier::create).expectNextCount(1).verifyComplete(); .as(StepVerifier::create)
.expectNextCount(1)
.expectComplete()
.verify(Duration.ofSeconds(30));
connectionPool.create()
.as(StepVerifier::create)
.expectNextCount(1)
.expectComplete()
.verify(Duration.ofSeconds(30));
assertGauge(registry, "r2dbc.pool.acquired", 2); assertGauge(registry, "r2dbc.pool.acquired", 2);
assertGauge(registry, "r2dbc.pool.allocated", 3); assertGauge(registry, "r2dbc.pool.allocated", 3);
assertGauge(registry, "r2dbc.pool.idle", 1); assertGauge(registry, "r2dbc.pool.idle", 1);

@ -16,6 +16,8 @@
package org.springframework.boot.actuate.mongo; package org.springframework.boot.actuate.mongo;
import java.time.Duration;
import com.mongodb.MongoException; import com.mongodb.MongoException;
import org.bson.Document; import org.bson.Document;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -51,7 +53,7 @@ class MongoReactiveHealthIndicatorTests {
assertThat(h.getStatus()).isEqualTo(Status.UP); assertThat(h.getStatus()).isEqualTo(Status.UP);
assertThat(h.getDetails()).containsOnlyKeys("maxWireVersion"); assertThat(h.getDetails()).containsOnlyKeys("maxWireVersion");
assertThat(h.getDetails()).containsEntry("maxWireVersion", 10); assertThat(h.getDetails()).containsEntry("maxWireVersion", 10);
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -66,7 +68,7 @@ class MongoReactiveHealthIndicatorTests {
assertThat(h.getStatus()).isEqualTo(Status.DOWN); assertThat(h.getStatus()).isEqualTo(Status.DOWN);
assertThat(h.getDetails()).containsOnlyKeys("error"); assertThat(h.getDetails()).containsOnlyKeys("error");
assertThat(h.getDetails()).containsEntry("error", MongoException.class.getName() + ": Connection failed"); assertThat(h.getDetails()).containsEntry("error", MongoException.class.getName() + ": Connection failed");
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
} }

@ -16,6 +16,7 @@
package org.springframework.boot.actuate.neo4j; package org.springframework.boot.actuate.neo4j;
import java.time.Duration;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -61,7 +62,7 @@ class Neo4jReactiveHealthIndicatorTests {
assertThat(health.getStatus()).isEqualTo(Status.UP); assertThat(health.getStatus()).isEqualTo(Status.UP);
assertThat(health.getDetails()).containsEntry("server", "4711@My Home"); assertThat(health.getDetails()).containsEntry("server", "4711@My Home");
assertThat(health.getDetails()).containsEntry("edition", "ultimate collectors edition"); assertThat(health.getDetails()).containsEntry("edition", "ultimate collectors edition");
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -83,7 +84,7 @@ class Neo4jReactiveHealthIndicatorTests {
assertThat(health.getStatus()).isEqualTo(Status.UP); assertThat(health.getStatus()).isEqualTo(Status.UP);
assertThat(health.getDetails()).containsEntry("server", "4711@My Home"); assertThat(health.getDetails()).containsEntry("server", "4711@My Home");
assertThat(health.getDetails()).containsEntry("edition", "some edition"); assertThat(health.getDetails()).containsEntry("edition", "some edition");
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
then(session).should(times(2)).close(); then(session).should(times(2)).close();
} }
@ -96,7 +97,7 @@ class Neo4jReactiveHealthIndicatorTests {
healthIndicator.health().as(StepVerifier::create).consumeNextWith((health) -> { healthIndicator.health().as(StepVerifier::create).consumeNextWith((health) -> {
assertThat(health.getStatus()).isEqualTo(Status.DOWN); assertThat(health.getStatus()).isEqualTo(Status.DOWN);
assertThat(health.getDetails()).containsKeys("error"); assertThat(health.getDetails()).containsKeys("error");
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
private ReactiveResult mockStatementResult(ResultSummary resultSummary, String version, String edition) { private ReactiveResult mockStatementResult(ResultSummary resultSummary, String version, String edition) {

@ -16,6 +16,7 @@
package org.springframework.boot.actuate.r2dbc; package org.springframework.boot.actuate.r2dbc;
import java.time.Duration;
import java.util.Collections; import java.util.Collections;
import java.util.UUID; import java.util.UUID;
@ -56,10 +57,10 @@ class ConnectionFactoryHealthIndicatorTests {
assertThat(actual.getStatus()).isEqualTo(Status.UP); assertThat(actual.getStatus()).isEqualTo(Status.UP);
assertThat(actual.getDetails()).containsOnly(entry("database", "H2"), assertThat(actual.getDetails()).containsOnly(entry("database", "H2"),
entry("validationQuery", "validate(REMOTE)")); entry("validationQuery", "validate(REMOTE)"));
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
finally { finally {
StepVerifier.create(connectionFactory.close()).verifyComplete(); StepVerifier.create(connectionFactory.close()).expectComplete().verify(Duration.ofSeconds(30));
} }
} }
@ -74,7 +75,7 @@ class ConnectionFactoryHealthIndicatorTests {
assertThat(actual.getStatus()).isEqualTo(Status.DOWN); assertThat(actual.getStatus()).isEqualTo(Status.DOWN);
assertThat(actual.getDetails()).containsOnly(entry("database", "mock"), assertThat(actual.getDetails()).containsOnly(entry("database", "mock"),
entry("validationQuery", "validate(REMOTE)"), entry("error", "java.lang.RuntimeException: test")); entry("validationQuery", "validate(REMOTE)"), entry("error", "java.lang.RuntimeException: test"));
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -90,7 +91,7 @@ class ConnectionFactoryHealthIndicatorTests {
assertThat(actual.getStatus()).isEqualTo(Status.DOWN); assertThat(actual.getStatus()).isEqualTo(Status.DOWN);
assertThat(actual.getDetails()).containsOnly(entry("database", "mock"), assertThat(actual.getDetails()).containsOnly(entry("database", "mock"),
entry("validationQuery", "validate(REMOTE)")); entry("validationQuery", "validate(REMOTE)"));
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -104,17 +105,18 @@ class ConnectionFactoryHealthIndicatorTests {
.flatMap(Result::getRowsUpdated) .flatMap(Result::getRowsUpdated)
.thenMany(it.close())) .thenMany(it.close()))
.as(StepVerifier::create) .as(StepVerifier::create)
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
ReactiveHealthIndicator healthIndicator = new ConnectionFactoryHealthIndicator(connectionFactory, ReactiveHealthIndicator healthIndicator = new ConnectionFactoryHealthIndicator(connectionFactory,
customValidationQuery); customValidationQuery);
healthIndicator.health().as(StepVerifier::create).assertNext((actual) -> { healthIndicator.health().as(StepVerifier::create).assertNext((actual) -> {
assertThat(actual.getStatus()).isEqualTo(Status.UP); assertThat(actual.getStatus()).isEqualTo(Status.UP);
assertThat(actual.getDetails()).containsOnly(entry("database", "H2"), entry("result", 0L), assertThat(actual.getDetails()).containsOnly(entry("database", "H2"), entry("result", 0L),
entry("validationQuery", customValidationQuery)); entry("validationQuery", customValidationQuery));
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
finally { finally {
StepVerifier.create(connectionFactory.close()).verifyComplete(); StepVerifier.create(connectionFactory.close()).expectComplete().verify(Duration.ofSeconds(30));
} }
} }
@ -131,10 +133,10 @@ class ConnectionFactoryHealthIndicatorTests {
assertThat(actual.getDetails()).contains(entry("database", "H2"), assertThat(actual.getDetails()).contains(entry("database", "H2"),
entry("validationQuery", invalidValidationQuery)); entry("validationQuery", invalidValidationQuery));
assertThat(actual.getDetails()).containsOnlyKeys("database", "error", "validationQuery"); assertThat(actual.getDetails()).containsOnlyKeys("database", "error", "validationQuery");
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
finally { finally {
StepVerifier.create(connectionFactory.close()).verifyComplete(); StepVerifier.create(connectionFactory.close()).expectComplete().verify(Duration.ofSeconds(30));
} }
} }

@ -16,6 +16,7 @@
package org.springframework.boot.actuate.redis; package org.springframework.boot.actuate.redis;
import java.time.Duration;
import java.util.Properties; import java.util.Properties;
import io.lettuce.core.RedisConnectionException; import io.lettuce.core.RedisConnectionException;
@ -63,7 +64,7 @@ class RedisReactiveHealthIndicatorTests {
assertThat(h.getStatus()).isEqualTo(Status.UP); assertThat(h.getStatus()).isEqualTo(Status.UP);
assertThat(h.getDetails()).containsOnlyKeys("version"); assertThat(h.getDetails()).containsOnlyKeys("version");
assertThat(h.getDetails()).containsEntry("version", "2.8.9"); assertThat(h.getDetails()).containsEntry("version", "2.8.9");
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
then(redisConnection).should().closeLater(); then(redisConnection).should().closeLater();
} }
@ -77,7 +78,7 @@ class RedisReactiveHealthIndicatorTests {
assertThat(h.getDetails()).containsEntry("cluster_size", 4L); assertThat(h.getDetails()).containsEntry("cluster_size", 4L);
assertThat(h.getDetails()).containsEntry("slots_up", 4L); assertThat(h.getDetails()).containsEntry("slots_up", 4L);
assertThat(h.getDetails()).containsEntry("slots_fail", 0L); assertThat(h.getDetails()).containsEntry("slots_fail", 0L);
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
then(redisConnectionFactory.getReactiveConnection()).should().closeLater(); then(redisConnectionFactory.getReactiveConnection()).should().closeLater();
} }
@ -91,7 +92,7 @@ class RedisReactiveHealthIndicatorTests {
assertThat(h.getDetails()).containsEntry("cluster_size", 4L); assertThat(h.getDetails()).containsEntry("cluster_size", 4L);
assertThat(h.getDetails()).containsEntry("slots_up", 4L); assertThat(h.getDetails()).containsEntry("slots_up", 4L);
assertThat(h.getDetails()).containsEntry("slots_fail", 0L); assertThat(h.getDetails()).containsEntry("slots_fail", 0L);
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -103,7 +104,7 @@ class RedisReactiveHealthIndicatorTests {
assertThat(h.getStatus()).isEqualTo(Status.DOWN); assertThat(h.getStatus()).isEqualTo(Status.DOWN);
assertThat(h.getDetails()).containsEntry("slots_up", 3L); assertThat(h.getDetails()).containsEntry("slots_up", 3L);
assertThat(h.getDetails()).containsEntry("slots_fail", 1L); assertThat(h.getDetails()).containsEntry("slots_fail", 1L);
}).verifyComplete(); }).expectComplete().verify(Duration.ofSeconds(30));
} }
@Test @Test
@ -116,7 +117,8 @@ class RedisReactiveHealthIndicatorTests {
Mono<Health> health = healthIndicator.health(); Mono<Health> health = healthIndicator.health();
StepVerifier.create(health) StepVerifier.create(health)
.consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.DOWN)) .consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.DOWN))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
then(redisConnection).should().closeLater(); then(redisConnection).should().closeLater();
} }
@ -129,7 +131,8 @@ class RedisReactiveHealthIndicatorTests {
Mono<Health> health = healthIndicator.health(); Mono<Health> health = healthIndicator.health();
StepVerifier.create(health) StepVerifier.create(health)
.consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.DOWN)) .consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.DOWN))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
private RedisReactiveHealthIndicator createHealthIndicator(ReactiveRedisConnection redisConnection, private RedisReactiveHealthIndicator createHealthIndicator(ReactiveRedisConnection redisConnection,

@ -17,6 +17,7 @@
package org.springframework.boot.actuate.web.exchanges.reactive; package org.springframework.boot.actuate.web.exchanges.reactive;
import java.security.Principal; import java.security.Principal;
import java.time.Duration;
import java.util.EnumSet; import java.util.EnumSet;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -102,7 +103,8 @@ class HttpExchangesWebFilterTests {
private void executeFilter(ServerWebExchange exchange, WebFilterChain chain) { private void executeFilter(ServerWebExchange exchange, WebFilterChain chain) {
StepVerifier StepVerifier
.create(this.filter.filter(exchange, chain).then(Mono.defer(() -> exchange.getResponse().setComplete()))) .create(this.filter.filter(exchange, chain).then(Mono.defer(() -> exchange.getResponse().setComplete())))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
} }

@ -16,6 +16,8 @@
package org.springframework.boot.autoconfigure.data.r2dbc; package org.springframework.boot.autoconfigure.data.r2dbc;
import java.time.Duration;
import io.r2dbc.spi.ConnectionFactory; import io.r2dbc.spi.ConnectionFactory;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import reactor.test.StepVerifier; import reactor.test.StepVerifier;
@ -80,7 +82,8 @@ class R2dbcRepositoriesAutoConfigurationTests {
.findById(2000L) .findById(2000L)
.as(StepVerifier::create) .as(StepVerifier::create)
.expectNextCount(1) .expectNextCount(1)
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
}); });
} }
@ -103,7 +106,8 @@ class R2dbcRepositoriesAutoConfigurationTests {
.findById(2000L) .findById(2000L)
.as(StepVerifier::create) .as(StepVerifier::create)
.expectNextCount(1) .expectNextCount(1)
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
}); });
} }

@ -16,6 +16,8 @@
package org.springframework.boot.autoconfigure.r2dbc; package org.springframework.boot.autoconfigure.r2dbc;
import java.time.Duration;
import io.r2dbc.spi.Connection; import io.r2dbc.spi.Connection;
import io.r2dbc.spi.ConnectionFactory; import io.r2dbc.spi.ConnectionFactory;
import io.r2dbc.spi.TransactionDefinition; import io.r2dbc.spi.TransactionDefinition;
@ -67,7 +69,11 @@ class R2dbcTransactionManagerAutoConfigurationTests {
this.contextRunner.withUserConfiguration(SingleConnectionFactoryConfiguration.class, BaseConfiguration.class) this.contextRunner.withUserConfiguration(SingleConnectionFactoryConfiguration.class, BaseConfiguration.class)
.run((context) -> { .run((context) -> {
TransactionalService bean = context.getBean(TransactionalService.class); TransactionalService bean = context.getBean(TransactionalService.class);
bean.isTransactionActive().as(StepVerifier::create).expectNext(true).verifyComplete(); bean.isTransactionActive()
.as(StepVerifier::create)
.expectNext(true)
.expectComplete()
.verify(Duration.ofSeconds(30));
}); });
} }

@ -79,8 +79,12 @@ class DataNeo4jTestReactiveIntegrationTests {
.flatMap(this.exampleRepository::save) .flatMap(this.exampleRepository::save)
.as(StepVerifier::create) .as(StepVerifier::create)
.expectNextCount(1) .expectNextCount(1)
.verifyComplete(); .expectComplete()
StepVerifier.create(this.neo4jTemplate.count(ExampleGraph.class)).expectNext(1L).verifyComplete(); .verify(Duration.ofSeconds(30));
StepVerifier.create(this.neo4jTemplate.count(ExampleGraph.class))
.expectNext(1L)
.expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2022 the original author or authors. * Copyright 2012-2023 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,6 +16,7 @@
package org.springframework.boot.test.autoconfigure.data.r2dbc; package org.springframework.boot.test.autoconfigure.data.r2dbc;
import java.time.Duration;
import java.util.Map; import java.util.Map;
import io.r2dbc.spi.ConnectionFactory; import io.r2dbc.spi.ConnectionFactory;
@ -50,7 +51,7 @@ class DataR2dbcTestIntegrationTests {
@Test @Test
void testDatabaseClient() { void testDatabaseClient() {
Flux<Map<String, Object>> all = this.databaseClient.sql("SELECT * FROM example").fetch().all(); Flux<Map<String, Object>> all = this.databaseClient.sql("SELECT * FROM example").fetch().all();
StepVerifier.create(all).expectNextCount(1).verifyComplete(); StepVerifier.create(all).expectNextCount(1).expectComplete().verify(Duration.ofSeconds(30));
} }
@Test @Test

@ -16,6 +16,7 @@
package org.springframework.boot.test.autoconfigure.data.redis; package org.springframework.boot.test.autoconfigure.data.redis;
import java.time.Duration;
import java.util.UUID; import java.util.UUID;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -62,11 +63,16 @@ class DataRedisTestReactiveIntegrationTests {
String id = UUID.randomUUID().toString(); String id = UUID.randomUUID().toString();
StepVerifier.create(this.operations.opsForValue().set(id, "Hello World")) StepVerifier.create(this.operations.opsForValue().set(id, "Hello World"))
.expectNext(Boolean.TRUE) .expectNext(Boolean.TRUE)
.verifyComplete(); .expectComplete()
StepVerifier.create(this.operations.opsForValue().get(id)).expectNext("Hello World").verifyComplete(); .verify(Duration.ofSeconds(30));
StepVerifier.create(this.operations.opsForValue().get(id))
.expectNext("Hello World")
.expectComplete()
.verify(Duration.ofSeconds(30));
StepVerifier.create(this.operations.execute((action) -> action.serverCommands().flushDb())) StepVerifier.create(this.operations.execute((action) -> action.serverCommands().flushDb()))
.expectNext("OK") .expectNext("OK")
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
@Test @Test

@ -18,6 +18,7 @@ package org.springframework.boot.rsocket.netty;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.nio.channels.ClosedChannelException; import java.nio.channels.ClosedChannelException;
import java.time.Duration;
import java.util.Arrays; import java.util.Arrays;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
@ -194,7 +195,7 @@ class NettyRSocketServerFactoryTests {
private void checkEchoRequest() { private void checkEchoRequest() {
String payload = "test payload"; String payload = "test payload";
Mono<String> response = this.requester.route("test").data(payload).retrieveMono(String.class); Mono<String> response = this.requester.route("test").data(payload).retrieveMono(String.class);
StepVerifier.create(response).expectNext(payload).verifyComplete(); StepVerifier.create(response).expectNext(payload).expectComplete().verify(Duration.ofSeconds(30));
} }
private void testBasicSslWithKeyStore(String keyStore, String keyPassword, Transport transport) { private void testBasicSslWithKeyStore(String keyStore, String keyPassword, Transport transport) {

@ -109,8 +109,7 @@ class NettyReactiveWebServerFactoryTests extends AbstractReactiveWebServerFactor
@Test @Test
void whenSslIsConfiguredWithAValidAliasARequestSucceeds() { void whenSslIsConfiguredWithAValidAliasARequestSucceeds() {
Mono<String> result = testSslWithAlias("test-alias"); Mono<String> result = testSslWithAlias("test-alias");
StepVerifier.setDefaultTimeout(Duration.ofSeconds(30)); StepVerifier.create(result).expectNext("Hello World").expectComplete().verify(Duration.ofSeconds(30));
StepVerifier.create(result).expectNext("Hello World").verifyComplete();
} }
@Test @Test

@ -55,7 +55,8 @@ class MustacheViewTests {
.block(Duration.ofSeconds(30)); .block(Duration.ofSeconds(30));
StepVerifier.create(exchange.getResponse().getBodyAsString()) StepVerifier.create(exchange.getResponse().getBodyAsString())
.assertNext((body) -> assertThat(body).isEqualToIgnoringWhitespace("Hello Spring")) .assertNext((body) -> assertThat(body).isEqualToIgnoringWhitespace("Hello Spring"))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
} }

@ -193,8 +193,7 @@ public abstract class AbstractReactiveWebServerFactoryTests {
.retrieve() .retrieve()
.bodyToMono(String.class); .bodyToMono(String.class);
StepVerifier.setDefaultTimeout(Duration.ofSeconds(30)); StepVerifier.create(result).expectNext("Hello World").expectComplete().verify(Duration.ofSeconds(30));
StepVerifier.create(result).expectNext("Hello World").verifyComplete();
} }
@Test @Test

@ -16,6 +16,8 @@
package smoketest.data.r2dbc; package smoketest.data.r2dbc;
import java.time.Duration;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Container;
@ -60,7 +62,8 @@ class CityRepositoryTests {
void databaseHasBeenInitialized() { void databaseHasBeenInitialized() {
StepVerifier.create(this.repository.findByState("DC").filter((city) -> city.getName().equals("Washington"))) StepVerifier.create(this.repository.findByState("DC").filter((city) -> city.getName().equals("Washington")))
.consumeNextWith((city) -> assertThat(city.getId()).isNotNull()) .consumeNextWith((city) -> assertThat(city.getId()).isNotNull())
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
private static String r2dbcUrl() { private static String r2dbcUrl() {

@ -16,6 +16,8 @@
package smoketest.data.r2dbc; package smoketest.data.r2dbc;
import java.time.Duration;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Container;
@ -60,7 +62,8 @@ class CityRepositoryTests {
void databaseHasBeenInitialized() { void databaseHasBeenInitialized() {
StepVerifier.create(this.repository.findByState("DC").filter((city) -> city.getName().equals("Washington"))) StepVerifier.create(this.repository.findByState("DC").filter((city) -> city.getName().equals("Washington")))
.consumeNextWith((city) -> assertThat(city.getId()).isNotNull()) .consumeNextWith((city) -> assertThat(city.getId()).isNotNull())
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
private static String r2dbcUrl() { private static String r2dbcUrl() {

@ -16,6 +16,8 @@
package smoketest.rsocket; package smoketest.rsocket;
import java.time.Duration;
import io.rsocket.metadata.WellKnownMimeType; import io.rsocket.metadata.WellKnownMimeType;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@ -57,7 +59,8 @@ class SampleRSocketApplicationTests {
Mono<Project> result = requester.route("find.project.spring-boot").retrieveMono(Project.class); Mono<Project> result = requester.route("find.project.spring-boot").retrieveMono(Project.class);
StepVerifier.create(result) StepVerifier.create(result)
.assertNext((project) -> assertThat(project.getName()).isEqualTo("spring-boot")) .assertNext((project) -> assertThat(project.getName()).isEqualTo("spring-boot"))
.verifyComplete(); .expectComplete()
.verify(Duration.ofSeconds(30));
} }
} }

Loading…
Cancel
Save