package com.redhat.lightblue.migrator.features;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.togglz.core.Feature;
import org.togglz.core.manager.FeatureManager;
import org.togglz.core.manager.FeatureManagerBuilder;
import org.togglz.core.repository.FeatureState;
import org.togglz.core.repository.mem.InMemoryStateRepository;
/**
*
* @author nmalik
*/
public class TogglzRandomUserProviderTest {
/**
* Number of iterations.
*/
private static final int ITERATIONS = 100000;
/**
* % error from target that's acceptable in the test.
*/
private static final double ACCEPTABLE_PERCENTAGE_ERROR = 0.05;
/**
* Just need a feature to work with.
*/
private static final Feature FEATURE = LightblueMigrationFeatures.READ_DESTINATION_ENTITY;
private FeatureManager featureManager;
@Before
public void setup() {
featureManager = new FeatureManagerBuilder()
.featureEnum(LightblueMigrationFeatures.class)
.stateRepository(new InMemoryStateRepository())
.userProvider(new TogglzRandomUserProvider())
.build();
}
@Test
public void disabled() {
featureManager.setFeatureState(new FeatureState(FEATURE, false));
int count = 0;
for (int i = 0; i < ITERATIONS; i++) {
if (featureManager.isActive(FEATURE)) {
count++;
}
}
Assert.assertEquals(0, count);
}
@Test
public void enabled() {
featureManager.setFeatureState(new FeatureState(FEATURE, true));
int count = 0;
for (int i = 0; i < ITERATIONS; i++) {
if (featureManager.isActive(FEATURE)) {
count++;
}
}
Assert.assertEquals(ITERATIONS, count);
}
@Test
public void disabled_0percent() {
int targetPercentage = 0;
{
FeatureState featureState = new FeatureState(FEATURE, false);
featureState.setStrategyId("gradual");
featureState.setParameter("percentage", String.valueOf(targetPercentage));
featureManager.setFeatureState(featureState);
}
{
// verify the state
FeatureState featureState = featureManager.getFeatureState(FEATURE);
Assert.assertFalse(featureState.isEnabled());
Assert.assertEquals("gradual", featureState.getStrategyId());
Assert.assertEquals(String.valueOf(targetPercentage), featureState.getParameter("percentage"));
}
int count = 0;
for (int i = 0; i < ITERATIONS; i++) {
// re-init for each check to set a new random username
TogglzRandomUsername.init();
if (featureManager.isActive(FEATURE)) {
count++;
}
}
Assert.assertEquals(0, count);
}
@Test
public void enabled_0percent() {
int targetPercentage = 0;
{
FeatureState featureState = new FeatureState(FEATURE, true);
featureState.setStrategyId("gradual");
featureState.setParameter("percentage", String.valueOf(targetPercentage));
featureManager.setFeatureState(featureState);
}
{
// verify the state
FeatureState featureState = featureManager.getFeatureState(FEATURE);
Assert.assertTrue(featureState.isEnabled());
Assert.assertEquals("gradual", featureState.getStrategyId());
Assert.assertEquals(String.valueOf(targetPercentage), featureState.getParameter("percentage"));
}
int count = 0;
for (int i = 0; i < ITERATIONS; i++) {
// re-init for each check to set a new random username
TogglzRandomUsername.init();
if (featureManager.isActive(FEATURE)) {
count++;
}
}
Assert.assertEquals(0, count);
}
@Test
public void enabled_10percent() {
int targetPercentage = 10;
{
FeatureState featureState = new FeatureState(FEATURE, true);
featureState.setStrategyId("gradual");
featureState.setParameter("percentage", String.valueOf(targetPercentage));
featureManager.setFeatureState(featureState);
}
{
// verify the state
FeatureState featureState = featureManager.getFeatureState(FEATURE);
Assert.assertTrue(featureState.isEnabled());
Assert.assertEquals("gradual", featureState.getStrategyId());
Assert.assertEquals(String.valueOf(targetPercentage), featureState.getParameter("percentage"));
}
int count = 0;
for (int i = 0; i < ITERATIONS; i++) {
// re-init for each check to set a new random username
TogglzRandomUsername.init();
if (featureManager.isActive(FEATURE)) {
count++;
}
}
int target = ITERATIONS * targetPercentage / 100;
Assert.assertTrue("should have been close to " + target + " but was " + count,
target - target * ACCEPTABLE_PERCENTAGE_ERROR < count
&& count < target + target * ACCEPTABLE_PERCENTAGE_ERROR);
}
@Test
public void enabled_50percent() {
int targetPercentage = 50;
{
FeatureState featureState = new FeatureState(FEATURE, true);
featureState.setStrategyId("gradual");
featureState.setParameter("percentage", String.valueOf(targetPercentage));
featureManager.setFeatureState(featureState);
}
{
// verify the state
FeatureState featureState = featureManager.getFeatureState(FEATURE);
Assert.assertTrue(featureState.isEnabled());
Assert.assertEquals("gradual", featureState.getStrategyId());
Assert.assertEquals(String.valueOf(targetPercentage), featureState.getParameter("percentage"));
}
int count = 0;
for (int i = 0; i < ITERATIONS; i++) {
// re-init for each check to set a new random username
TogglzRandomUsername.init();
if (featureManager.isActive(FEATURE)) {
count++;
}
}
int target = ITERATIONS * targetPercentage / 100;
Assert.assertTrue("should have been close to " + target + " but was " + count,
target - target * ACCEPTABLE_PERCENTAGE_ERROR < count
&& count < target + target * ACCEPTABLE_PERCENTAGE_ERROR);
}
@Test
public void enabled_100percent() {
int targetPercentage = 100;
{
FeatureState featureState = new FeatureState(FEATURE, true);
featureState.setStrategyId("gradual");
featureState.setParameter("percentage", String.valueOf(targetPercentage));
featureManager.setFeatureState(featureState);
}
{
// verify the state
FeatureState featureState = featureManager.getFeatureState(FEATURE);
Assert.assertTrue(featureState.isEnabled());
Assert.assertEquals("gradual", featureState.getStrategyId());
Assert.assertEquals(String.valueOf(targetPercentage), featureState.getParameter("percentage"));
}
int count = 0;
for (int i = 0; i < ITERATIONS; i++) {
// re-init for each check to set a new random username
TogglzRandomUsername.init();
if (featureManager.isActive(FEATURE)) {
count++;
}
}
Assert.assertEquals(ITERATIONS, count);
}
}