package com.linkedin.d2.balancer.strategies.degrader;
import com.linkedin.d2.balancer.properties.PropertyKeys;
import com.linkedin.d2.balancer.util.hashing.MPConsistentHashRing;
import com.linkedin.util.clock.Clock;
import com.linkedin.util.clock.SystemClock;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.fail;
/**
* TestsS for DegraderLoadBalancerStrategyConfig
*
* @author Oby Sumampouw (osumampouw@linkedin.com)
*/
public class DegraderLoadBalancerStrategyConfigTest
{
@Test
public void testCreateHttpConfigFromMap()
{
Map<String,Object> properties = new HashMap<String, Object>();
long httpUpdateIntervalMs = 5231;
boolean updateOnlyAtInterval = false;
double httpMaxClusterLatencyWithoutDegrading = 139.6;
double httpDefaultSuccessfulTransmissionWeight = 0.88;
int httpPointsPerWeight = 202;
String httpHashMethod = "sha1";
double httpInitialRecoveryLevel = 0.06;
double httpRingRampFactor = 1.67;
double httpHighWaterMark = 1866.2;
double httpLowWaterMark = 555.5;
double httpGlobalStepUp = 0.17;
double httpGlobalStepDown = 0.21;
double hashRingPointCleanUpRate = 0.1;
String consistentHashAlgo = "multiProbe";
int numProbes = 1024;
Map<String,Object> httpHashConfig = new HashMap<String,Object>();
List<String> httpRegexes = new LinkedList<String>();
httpRegexes.add("httphashToken=(\\d+)");
httpHashConfig.put("regexes", httpRegexes);
properties.put(PropertyKeys.HTTP_LB_HASH_CONFIG, httpHashConfig);
properties.put(PropertyKeys.HTTP_LB_STRATEGY_PROPERTIES_UPDATE_INTERVAL_MS,
httpUpdateIntervalMs);
properties.put(PropertyKeys.HTTP_LB_STRATEGY_PROPERTIES_UPDATE_ONLY_AT_INTERVAL,
updateOnlyAtInterval);
properties.put(PropertyKeys.HTTP_LB_STRATEGY_PROPERTIES_MAX_CLUSTER_LATENCY_WITHOUT_DEGRADING,
httpMaxClusterLatencyWithoutDegrading);
properties.put(PropertyKeys.HTTP_LB_STRATEGY_PROPERTIES_DEFAULT_SUCCESSFUL_TRANSMISSION_WEIGHT,
httpDefaultSuccessfulTransmissionWeight);
properties.put(PropertyKeys.HTTP_LB_STRATEGY_PROPERTIES_POINTS_PER_WEIGHT,
httpPointsPerWeight);
properties.put(PropertyKeys.HTTP_LB_HASH_METHOD, httpHashMethod);
properties.put(PropertyKeys.HTTP_LB_INITIAL_RECOVERY_LEVEL, httpInitialRecoveryLevel);
properties.put(PropertyKeys.HTTP_LB_RING_RAMP_FACTOR, httpRingRampFactor);
properties.put(PropertyKeys.HTTP_LB_HIGH_WATER_MARK, httpHighWaterMark);
properties.put(PropertyKeys.HTTP_LB_LOW_WATER_MARK, httpLowWaterMark);
properties.put(PropertyKeys.HTTP_LB_GLOBAL_STEP_DOWN, httpGlobalStepDown);
properties.put(PropertyKeys.HTTP_LB_GLOBAL_STEP_UP, httpGlobalStepUp);
properties.put(PropertyKeys.HTTP_LB_HASHRING_POINT_CLEANUP_RATE, hashRingPointCleanUpRate);
properties.put(PropertyKeys.HTTP_LB_CONSISTENT_HASH_ALGORITHM, consistentHashAlgo);
properties.put(PropertyKeys.HTTP_LB_CONSISTENT_HASH_NUM_PROBES, Integer.toString(numProbes));
//now test if there's http, then http config should take more priority
DegraderLoadBalancerStrategyConfig config = DegraderLoadBalancerStrategyConfig.createHttpConfigFromMap(properties);
assertEquals(config.getUpdateIntervalMs(), httpUpdateIntervalMs);
assertEquals(config.isUpdateOnlyAtInterval(), updateOnlyAtInterval);
assertEquals(config.getPointsPerWeight(), httpPointsPerWeight);
assertEquals(config.getHashMethod(), httpHashMethod);
assertEquals(config.getInitialRecoveryLevel(), httpInitialRecoveryLevel);
assertEquals(config.getRingRampFactor(), httpRingRampFactor);
assertEquals(config.getHighWaterMark(), httpHighWaterMark);
assertEquals(config.getLowWaterMark(), httpLowWaterMark);
assertEquals(config.getGlobalStepDown(), httpGlobalStepDown);
assertEquals(config.getGlobalStepUp(), httpGlobalStepUp);
assertEquals(config.getHashConfig(), httpHashConfig);
assertEquals(config.getHashRingPointCleanUpRate(), hashRingPointCleanUpRate);
assertEquals(config.getConsistentHashAlgorithm(), consistentHashAlgo);
assertEquals(config.getNumProbes(), numProbes);
//test if there's no config, will the default config value set
properties.clear();
config = DegraderLoadBalancerStrategyConfig.createHttpConfigFromMap(properties);
assertEquals(config.getUpdateIntervalMs(), DegraderLoadBalancerStrategyConfig.DEFAULT_UPDATE_INTERVAL_MS);
assertEquals(config.isUpdateOnlyAtInterval(), DegraderLoadBalancerStrategyConfig.DEFAULT_UPDATE_ONLY_AT_INTERVAL);
assertEquals(config.getPointsPerWeight(), DegraderLoadBalancerStrategyConfig.DEFAULT_POINTS_PER_WEIGHT);
assertNull(config.getHashMethod());
assertEquals(config.getInitialRecoveryLevel(), DegraderLoadBalancerStrategyConfig.DEFAULT_INITIAL_RECOVERY_LEVEL);
assertEquals(config.getRingRampFactor(), DegraderLoadBalancerStrategyConfig.DEFAULT_RAMP_FACTOR);
assertEquals(config.getHighWaterMark(), DegraderLoadBalancerStrategyConfig.DEFAULT_HIGH_WATER_MARK);
assertEquals(config.getLowWaterMark(), DegraderLoadBalancerStrategyConfig.DEFAULT_LOW_WATER_MARK);
assertEquals(config.getGlobalStepDown(), DegraderLoadBalancerStrategyConfig.DEFAULT_GLOBAL_STEP_DOWN);
assertEquals(config.getGlobalStepUp(), DegraderLoadBalancerStrategyConfig.DEFAULT_GLOBAL_STEP_UP);
assertEquals(config.getHashConfig(), Collections.emptyMap());
assertEquals(config.getHashRingPointCleanUpRate(), DegraderLoadBalancerStrategyConfig.DEFAULT_HASHRING_POINT_CLEANUP_RATE);
assertEquals(config.getConsistentHashAlgorithm(), null);
assertEquals(config.getNumProbes(), MPConsistentHashRing.DEFAULT_NUM_PROBES);
}
}