aboutsummaryrefslogtreecommitdiffstats
path: root/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2020-07-02 12:50:47 +0200
committerJon Bratseth <bratseth@gmail.com>2020-07-02 12:50:47 +0200
commit96a3e9f538ee5c542566cc5cb7f5d4c35453dcde (patch)
tree29b905398e2b28cf75ff8e7abd67220cf2a2864b /container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java
parenteb37f7dcbd89143715fbe9b838a91b296db0a3c9 (diff)
Add test
Diffstat (limited to 'container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java')
-rw-r--r--container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java169
1 files changed, 112 insertions, 57 deletions
diff --git a/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java b/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java
index e13debcddda..e7a9a1442f3 100644
--- a/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java
+++ b/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java
@@ -10,74 +10,24 @@ import com.yahoo.jdisc.core.SystemTimer;
import org.junit.Test;
/**
- * Smoke test that VipStatus has the right basic logic.
- *
- * @author steinar
+ * @author bratseth
*/
public class VipStatusTestCase {
- private static QrSearchersConfig getSearchersConfig(String[] clusters) {
- var b = new QrSearchersConfig.Builder();
- if (clusters.length > 0) {
- var searchClusterB = new QrSearchersConfig.Searchcluster.Builder();
- for (String cluster : clusters) {
- searchClusterB.name(cluster);
- }
- b.searchcluster(searchClusterB);
- }
- return b.build();
- }
-
- private static VipStatus getVipStatus(String[] clusters, StateMonitor.Status startState, boolean initiallyInRotation) {
- return new VipStatus(getSearchersConfig(clusters),
- new VipStatusConfig.Builder().initiallyInRotation(initiallyInRotation).build(),
- new ClustersStatus(),
- new StateMonitor(1000, startState, new SystemTimer(), runnable -> {
- Thread thread = new Thread(runnable, "StateMonitor");
- thread.setDaemon(true);
- return thread;
- }));
- }
-
- private static void remove(String[] clusters, VipStatus v) {
- for (String s : clusters) {
- v.removeFromRotation(s);
- }
- }
-
- private static void add(String[] clusters, VipStatus v) {
- for (String s : clusters) {
- v.addToRotation(s);
- }
- }
-
- private static void verifyUpOrDown(String[] clusters, StateMonitor.Status status) {
- VipStatus v = getVipStatus(clusters, status, true);
- remove(clusters, v);
- // initial state
- assertFalse(v.isInRotation());
- v.addToRotation(clusters[0]);
- assertFalse(v.isInRotation());
- v.addToRotation(clusters[1]);
- assertFalse(v.isInRotation());
- v.addToRotation(clusters[2]);
- assertTrue(v.isInRotation());
- }
-
@Test
public void testInitializingOrDownRequireAllUp() {
String[] clusters = {"cluster1", "cluster2", "cluster3"};
- verifyUpOrDown(clusters, StateMonitor.Status.initializing);
- verifyUpOrDown(clusters, StateMonitor.Status.down);
+ verifyStatus(clusters, StateMonitor.Status.initializing);
+ verifyStatus(clusters, StateMonitor.Status.down);
}
@Test
public void testUpRequireAllDown() {
String[] clusters = {"cluster1", "cluster2", "cluster3"};
- VipStatus v = getVipStatus(clusters, StateMonitor.Status.initializing, true);
+ VipStatus v = createVipStatus(clusters, StateMonitor.Status.initializing, true, new ClustersStatus());
assertFalse(v.isInRotation());
- add(clusters, v);
+ addToRotation(clusters, v);
assertTrue(v.isInRotation());
v.removeFromRotation(clusters[0]);
@@ -102,14 +52,119 @@ public class VipStatusTestCase {
@Test
public void testNoClustersConfiguringInitiallyInRotationFalse() {
String[] clusters = {};
- VipStatus v = getVipStatus(clusters, StateMonitor.Status.initializing, false);
+ VipStatus v = createVipStatus(clusters, StateMonitor.Status.initializing, false, new ClustersStatus());
assertFalse(v.isInRotation());
}
@Test
public void testNoClustersConfiguringInitiallyInRotationTrue() {
String[] clusters = {};
- VipStatus v = getVipStatus(clusters, StateMonitor.Status.initializing, true);
+ VipStatus v = createVipStatus(clusters, StateMonitor.Status.initializing, true, new ClustersStatus());
+ assertTrue(v.isInRotation());
+ }
+
+ @Test
+ public void testClusterRemovalRemovedIsDown() {
+ assertClusterRemoval(true, false);
+ }
+
+ @Test
+ public void testClusterRemovalRemovedIsUp() {
+ assertClusterRemoval(false, false);
+ }
+
+ @Test
+ public void testClusterRemovalAnotherIsDown() {
+ assertClusterRemoval(false, true);
+ }
+
+ private void assertClusterRemoval(boolean removedIsDown, boolean anotherIsDown) {
+ ClustersStatus clustersStatus = new ClustersStatus();
+ StateMonitor stateMonitor = createStateMonitor(StateMonitor.Status.initializing);
+
+ String[] clusters = {"cluster1", "cluster2", "cluster3"};
+
+ VipStatus v = createVipStatus(clusters, true, clustersStatus, stateMonitor);
+ assertFalse(v.isInRotation());
+ assertEquals(StateMonitor.Status.initializing, stateMonitor.status());
+
+ addToRotation(clusters, v);
+ assertTrue(v.isInRotation());
+ assertEquals(StateMonitor.Status.up, stateMonitor.status());
+
+ String[] newClusters = {"cluster2", "cluster3"};
+ if (removedIsDown)
+ v.removeFromRotation("cluster1");
+ if (anotherIsDown)
+ v.removeFromRotation("cluster3");
+ v = createVipStatus(newClusters, true, clustersStatus, stateMonitor);
+ assertTrue(v.isInRotation());
+ assertEquals(StateMonitor.Status.up, stateMonitor.status());
+
+ v.removeFromRotation(newClusters[0]);
+ if ( ! anotherIsDown)
+ assertTrue(v.isInRotation());
+
+ v.removeFromRotation(newClusters[1]);
+ assertFalse(v.isInRotation()); // Both remaining clusters are out
+ assertEquals(StateMonitor.Status.down, stateMonitor.status());
+ }
+
+ private static QrSearchersConfig createSearchersConfig(String[] clusters) {
+ var b = new QrSearchersConfig.Builder();
+ for (String cluster : clusters) {
+ var searchCluster = new QrSearchersConfig.Searchcluster.Builder();
+ searchCluster.name(cluster);
+ b.searchcluster(searchCluster);
+ }
+ return b.build();
+ }
+
+ private static VipStatus createVipStatus(String[] clusters,
+ StateMonitor.Status startState,
+ boolean initiallyInRotation,
+ ClustersStatus clustersStatus) {
+ return createVipStatus(clusters, initiallyInRotation, clustersStatus, createStateMonitor(startState));
+ }
+
+ private static VipStatus createVipStatus(String[] clusters,
+ boolean initiallyInRotation,
+ ClustersStatus clustersStatus,
+ StateMonitor stateMonitor) {
+ return new VipStatus(createSearchersConfig(clusters),
+ new VipStatusConfig.Builder().initiallyInRotation(initiallyInRotation).build(),
+ clustersStatus,
+ stateMonitor);
+ }
+
+ private static StateMonitor createStateMonitor(StateMonitor.Status startState) {
+ return new StateMonitor(1000, startState, new SystemTimer(), runnable -> {
+ Thread thread = new Thread(runnable, "StateMonitor");
+ thread.setDaemon(true);
+ return thread;
+ });
+ }
+
+ private static void removeFromRotation(String[] clusters, VipStatus v) {
+ for (String s : clusters)
+ v.removeFromRotation(s);
+ }
+
+ private static void addToRotation(String[] clusters, VipStatus v) {
+ for (String s : clusters)
+ v.addToRotation(s);
+ }
+
+ private static void verifyStatus(String[] clusters, StateMonitor.Status status) {
+ VipStatus v = createVipStatus(clusters, status, true, new ClustersStatus());
+ removeFromRotation(clusters, v);
+ // initial state
+ assertFalse(v.isInRotation());
+ v.addToRotation(clusters[0]);
+ assertFalse(v.isInRotation());
+ v.addToRotation(clusters[1]);
+ assertFalse(v.isInRotation());
+ v.addToRotation(clusters[2]);
assertTrue(v.isInRotation());
}