Commit 6f08e970 authored by Stephane Nicoll's avatar Stephane Nicoll

Polish "Improve Cassandra health indicator with more robust mechanism"

See gh-23041
parent 8e5a041b
......@@ -16,7 +16,10 @@
package org.springframework.boot.actuate.cassandra;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
......@@ -34,15 +37,13 @@ import org.springframework.boot.actuate.health.Status;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.mock;
import static org.mockito.BDDMockito.when;
import static org.mockito.Mockito.mock;
/**
* Tests for {@link CassandraDriverHealthIndicator}.
*
* @author Alexandre Dutra
* @author Tomasz Lelek
* @since 2.4.0
* @author Stephane Nicoll
*/
class CassandraDriverHealthIndicatorTests {
......@@ -52,112 +53,70 @@ class CassandraDriverHealthIndicatorTests {
}
@Test
void oneHealthyNodeShouldReturnUp() {
CqlSession session = mock(CqlSession.class);
Metadata metadata = mock(Metadata.class);
Node healthyNode = mock(Node.class);
given(healthyNode.getState()).willReturn(NodeState.UP);
given(session.getMetadata()).willReturn(metadata);
given(metadata.getNodes()).willReturn(createNodesMap(healthyNode));
void healthWithOneHealthyNodeShouldReturnUp() {
CqlSession session = mockCqlSessionWithNodeState(NodeState.UP);
CassandraDriverHealthIndicator healthIndicator = new CassandraDriverHealthIndicator(session);
Health health = healthIndicator.health();
assertThat(health.getStatus()).isEqualTo(Status.UP);
}
@Test
void oneUnhealthyNodeShouldReturnDown() {
CqlSession session = mock(CqlSession.class);
Metadata metadata = mock(Metadata.class);
Node unhealthyNode = mock(Node.class);
given(unhealthyNode.getState()).willReturn(NodeState.DOWN);
given(session.getMetadata()).willReturn(metadata);
given(metadata.getNodes()).willReturn(createNodesMap(unhealthyNode));
void healthWithOneUnhealthyNodeShouldReturnDown() {
CqlSession session = mockCqlSessionWithNodeState(NodeState.DOWN);
CassandraDriverHealthIndicator healthIndicator = new CassandraDriverHealthIndicator(session);
Health health = healthIndicator.health();
assertThat(health.getStatus()).isEqualTo(Status.DOWN);
}
@Test
void oneUnknownNodeShouldReturnDown() {
CqlSession session = mock(CqlSession.class);
Metadata metadata = mock(Metadata.class);
Node unknownNode = mock(Node.class);
given(unknownNode.getState()).willReturn(NodeState.UNKNOWN);
given(session.getMetadata()).willReturn(metadata);
given(metadata.getNodes()).willReturn(createNodesMap(unknownNode));
void healthWithOneUnknownNodeShouldReturnDown() {
CqlSession session = mockCqlSessionWithNodeState(NodeState.UNKNOWN);
CassandraDriverHealthIndicator healthIndicator = new CassandraDriverHealthIndicator(session);
Health health = healthIndicator.health();
assertThat(health.getStatus()).isEqualTo(Status.DOWN);
}
@Test
void oneForcedDownNodeShouldReturnDown() {
CqlSession session = mock(CqlSession.class);
Metadata metadata = mock(Metadata.class);
Node forcedDownNode = mock(Node.class);
given(forcedDownNode.getState()).willReturn(NodeState.FORCED_DOWN);
given(session.getMetadata()).willReturn(metadata);
given(metadata.getNodes()).willReturn(createNodesMap(forcedDownNode));
void healthWithOneForcedDownNodeShouldReturnDown() {
CqlSession session = mockCqlSessionWithNodeState(NodeState.FORCED_DOWN);
CassandraDriverHealthIndicator healthIndicator = new CassandraDriverHealthIndicator(session);
Health health = healthIndicator.health();
assertThat(health.getStatus()).isEqualTo(Status.DOWN);
}
@Test
void oneHealthyNodeAndOneUnhealthyNodeShouldReturnUp() {
CqlSession session = mock(CqlSession.class);
Metadata metadata = mock(Metadata.class);
Node healthyNode = mock(Node.class);
Node unhealthyNode = mock(Node.class);
given(healthyNode.getState()).willReturn(NodeState.UP);
given(unhealthyNode.getState()).willReturn(NodeState.DOWN);
given(session.getMetadata()).willReturn(metadata);
given(metadata.getNodes()).willReturn(createNodesMap(healthyNode, unhealthyNode));
void healthWithOneHealthyNodeAndOneUnhealthyNodeShouldReturnUp() {
CqlSession session = mockCqlSessionWithNodeState(NodeState.UP, NodeState.DOWN);
CassandraDriverHealthIndicator healthIndicator = new CassandraDriverHealthIndicator(session);
Health health = healthIndicator.health();
assertThat(health.getStatus()).isEqualTo(Status.UP);
}
@Test
void oneHealthyNodeAndOneUnknownNodeShouldReturnUp() {
CqlSession session = mock(CqlSession.class);
Metadata metadata = mock(Metadata.class);
Node healthyNode = mock(Node.class);
Node unknownNode = mock(Node.class);
given(healthyNode.getState()).willReturn(NodeState.UP);
given(unknownNode.getState()).willReturn(NodeState.UNKNOWN);
given(session.getMetadata()).willReturn(metadata);
given(metadata.getNodes()).willReturn(createNodesMap(healthyNode, unknownNode));
void healthWithOneHealthyNodeAndOneUnknownNodeShouldReturnUp() {
CqlSession session = mockCqlSessionWithNodeState(NodeState.UP, NodeState.UNKNOWN);
CassandraDriverHealthIndicator healthIndicator = new CassandraDriverHealthIndicator(session);
Health health = healthIndicator.health();
assertThat(health.getStatus()).isEqualTo(Status.UP);
}
@Test
void oneHealthyNodeAndOneForcedDownNodeShouldReturnUp() {
CqlSession session = mock(CqlSession.class);
Metadata metadata = mock(Metadata.class);
Node healthyNode = mock(Node.class);
Node forcedDownNode = mock(Node.class);
given(healthyNode.getState()).willReturn(NodeState.UP);
given(forcedDownNode.getState()).willReturn(NodeState.FORCED_DOWN);
given(session.getMetadata()).willReturn(metadata);
given(metadata.getNodes()).willReturn(createNodesMap(healthyNode, forcedDownNode));
void healthWithOneHealthyNodeAndOneForcedDownNodeShouldReturnUp() {
CqlSession session = mockCqlSessionWithNodeState(NodeState.UP, NodeState.FORCED_DOWN);
CassandraDriverHealthIndicator healthIndicator = new CassandraDriverHealthIndicator(session);
Health health = healthIndicator.health();
assertThat(health.getStatus()).isEqualTo(Status.UP);
}
@Test
void addVersionToDetailsIfReportedNotNull() {
void healthWithNodeVersionShouldAddVersionDetail() {
CqlSession session = mock(CqlSession.class);
Metadata metadata = mock(Metadata.class);
when(session.getMetadata()).thenReturn(metadata);
given(session.getMetadata()).willReturn(metadata);
Node node = mock(Node.class);
when(node.getState()).thenReturn(NodeState.UP);
when(node.getCassandraVersion()).thenReturn(Version.V4_0_0);
when(metadata.getNodes()).thenReturn(createNodesMap(node));
given(node.getState()).willReturn(NodeState.UP);
given(node.getCassandraVersion()).willReturn(Version.V4_0_0);
given(metadata.getNodes()).willReturn(createNodesWithRandomUUID(Collections.singletonList(node)));
CassandraDriverHealthIndicator healthIndicator = new CassandraDriverHealthIndicator(session);
Health health = healthIndicator.health();
assertThat(health.getStatus()).isEqualTo(Status.UP);
......@@ -165,14 +124,8 @@ class CassandraDriverHealthIndicatorTests {
}
@Test
void doNotAddVersionToDetailsIfReportedNull() {
CqlSession session = mock(CqlSession.class);
Metadata metadata = mock(Metadata.class);
when(session.getMetadata()).thenReturn(metadata);
Node node = mock(Node.class);
when(node.getState()).thenReturn(NodeState.UP);
when(metadata.getNodes()).thenReturn(createNodesMap(node));
void healthWithoutNodeVersionShouldNotAddVersionDetail() {
CqlSession session = mockCqlSessionWithNodeState(NodeState.UP);
CassandraDriverHealthIndicator healthIndicator = new CassandraDriverHealthIndicator(session);
Health health = healthIndicator.health();
assertThat(health.getStatus()).isEqualTo(Status.UP);
......@@ -180,7 +133,7 @@ class CassandraDriverHealthIndicatorTests {
}
@Test
void healthWithCassandraDown() {
void healthWithcassandraDownShouldReturnDown() {
CqlSession session = mock(CqlSession.class);
given(session.getMetadata()).willThrow(new DriverTimeoutException("Test Exception"));
CassandraDriverHealthIndicator healthIndicator = new CassandraDriverHealthIndicator(session);
......@@ -190,12 +143,24 @@ class CassandraDriverHealthIndicatorTests {
.isEqualTo(DriverTimeoutException.class.getName() + ": Test Exception");
}
private static Map<UUID, Node> createNodesMap(Node... nodes) {
Map<UUID, Node> nodesMap = new HashMap<>();
for (Node n : nodes) {
nodesMap.put(UUID.randomUUID(), n);
private CqlSession mockCqlSessionWithNodeState(NodeState... nodeStates) {
CqlSession session = mock(CqlSession.class);
Metadata metadata = mock(Metadata.class);
List<Node> nodes = new ArrayList<>();
for (NodeState nodeState : nodeStates) {
Node node = mock(Node.class);
given(node.getState()).willReturn(nodeState);
nodes.add(node);
}
given(session.getMetadata()).willReturn(metadata);
given(metadata.getNodes()).willReturn(createNodesWithRandomUUID(nodes));
return session;
}
return nodesMap;
private Map<UUID, Node> createNodesWithRandomUUID(List<Node> nodes) {
Map<UUID, Node> indexedNodes = new HashMap<>();
nodes.forEach((node) -> indexedNodes.put(UUID.randomUUID(), node));
return indexedNodes;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment