diff options
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.java | 169 |
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()); } |