package org.togglz.core.activation;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.junit.Test;
import org.togglz.core.Feature;
import org.togglz.core.repository.FeatureState;
import org.togglz.core.spi.ActivationStrategy;
import org.togglz.core.user.FeatureUser;
import org.togglz.core.user.SimpleFeatureUser;
public class GradualActivationStrategyTest {
private final ActivationStrategy strategy = new TestingGradualActivationStrategy();
@Test
public void shouldAlwaysReturnFalseForZeroPercent() {
FeatureState state = new FeatureState(GradualFeature.FEATURE);
state.setEnabled(true);
state.setParameter(GradualActivationStrategy.PARAM_PERCENTAGE, "0");
// whatever the hash value is, false is expected
assertFalse(strategy.isActive(state, aUserWithHash(0)));
assertFalse(strategy.isActive(state, aUserWithHash(1)));
assertFalse(strategy.isActive(state, aUserWithHash(3)));
assertFalse(strategy.isActive(state, aUserWithHash(10)));
assertFalse(strategy.isActive(state, aUserWithHash(99)));
assertFalse(strategy.isActive(state, aUserWithHash(100)));
assertFalse(strategy.isActive(state, aUserWithHash(110)));
}
@Test
public void shouldAlwaysReturnTrueForOneHundredPercent() {
FeatureState state = new FeatureState(GradualFeature.FEATURE);
state.setEnabled(true);
state.setParameter(GradualActivationStrategy.PARAM_PERCENTAGE, "100");
// whatever the hash value is, true is expected
assertTrue(strategy.isActive(state, aUserWithHash(0)));
assertTrue(strategy.isActive(state, aUserWithHash(1)));
assertTrue(strategy.isActive(state, aUserWithHash(3)));
assertTrue(strategy.isActive(state, aUserWithHash(10)));
assertTrue(strategy.isActive(state, aUserWithHash(99)));
assertTrue(strategy.isActive(state, aUserWithHash(100)));
assertTrue(strategy.isActive(state, aUserWithHash(110)));
}
@Test
public void shouldWorkCorrectlyForOnePercent() {
FeatureState state = new FeatureState(GradualFeature.FEATURE);
state.setEnabled(true);
state.setParameter(GradualActivationStrategy.PARAM_PERCENTAGE, "1");
// every value with % 100 == 0 will be active, which is exactly 1%
assertTrue(strategy.isActive(state, aUserWithHash(0)));
assertTrue(strategy.isActive(state, aUserWithHash(100)));
// all other values result in false
assertFalse(strategy.isActive(state, aUserWithHash(1)));
assertFalse(strategy.isActive(state, aUserWithHash(3)));
assertFalse(strategy.isActive(state, aUserWithHash(10)));
assertFalse(strategy.isActive(state, aUserWithHash(99)));
assertFalse(strategy.isActive(state, aUserWithHash(110)));
}
@Test
public void shouldWorkCorrectlyForNinetyNinePercent() {
FeatureState state = new FeatureState(GradualFeature.FEATURE);
state.setEnabled(true);
state.setParameter(GradualActivationStrategy.PARAM_PERCENTAGE, "99");
// most values result in true
assertTrue(strategy.isActive(state, aUserWithHash(0)));
assertTrue(strategy.isActive(state, aUserWithHash(1)));
assertTrue(strategy.isActive(state, aUserWithHash(3)));
assertTrue(strategy.isActive(state, aUserWithHash(10)));
assertTrue(strategy.isActive(state, aUserWithHash(98)));
assertTrue(strategy.isActive(state, aUserWithHash(100)));
// only 1% should result in false
assertFalse(strategy.isActive(state, aUserWithHash(99)));
assertFalse(strategy.isActive(state, aUserWithHash(199)));
}
@Test
public void shouldFindCorrectDecisionForIntermediateValues() {
FeatureState state = new FeatureState(GradualFeature.FEATURE);
state.setEnabled(true);
state.setParameter(GradualActivationStrategy.PARAM_PERCENTAGE, "50");
// for hash values 0-49 the feature is active
assertTrue(strategy.isActive(state, aUserWithHash(0)));
assertTrue(strategy.isActive(state, aUserWithHash(25)));
assertTrue(strategy.isActive(state, aUserWithHash(49)));
// for hash values 50-99 the feaute is active
assertFalse(strategy.isActive(state, aUserWithHash(50)));
assertFalse(strategy.isActive(state, aUserWithHash(99)));
}
@Test
public void shouldReturnFalseForInvalidPercentage() {
FeatureState state = new FeatureState(GradualFeature.FEATURE);
state.setEnabled(true);
state.setParameter(GradualActivationStrategy.PARAM_PERCENTAGE, "100x");
assertFalse(strategy.isActive(state, aUserWithHash(0)));
assertFalse(strategy.isActive(state, aUserWithHash(99)));
}
private FeatureUser aUserWithHash(int hash) {
return new SimpleFeatureUser("hash-" + hash, false);
}
private enum GradualFeature implements Feature {
FEATURE;
}
private class TestingGradualActivationStrategy extends GradualActivationStrategy {
private final Pattern HASH_PATTERN = Pattern.compile("^hash\\-(\\d+)$");;
@Override
protected int calculateHashCode(FeatureUser user, Feature feature) {
Matcher matcher = HASH_PATTERN.matcher(user.getName());
if (matcher.matches()) {
return Integer.valueOf(matcher.group(1));
}
return super.calculateHashCode(user, feature);
}
}
}