Merge branch '2.7.x' into 3.0.x

Closes gh-36043
This commit is contained in:
Andy Wilkinson
2023-06-23 15:50:02 +01:00
24 changed files with 159 additions and 69 deletions

View File

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

View File

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

View File

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

View File

@@ -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");
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
package org.springframework.boot.actuate.metrics.r2dbc;
import java.time.Duration;
import java.util.Collections;
import java.util.UUID;
@@ -59,7 +60,7 @@ class ConnectionPoolMetricsTests {
@AfterEach
void close() {
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));
metrics.bindTo(registry);
// acquire two connections
connectionPool.create().as(StepVerifier::create).expectNextCount(1).verifyComplete();
connectionPool.create().as(StepVerifier::create).expectNextCount(1).verifyComplete();
connectionPool.create()
.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.allocated", 3);
assertGauge(registry, "r2dbc.pool.idle", 1);

View File

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

View File

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

View File

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

View File

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

View File

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