package org.ovirt.engine.core.common.utils;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import org.junit.After;
import org.junit.Test;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigCommon;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.config.IConfigUtilsInterface;
import org.ovirt.engine.core.common.validation.annotation.ConfiguredRange;
public class ConfiguredRangeValidatorTest {
private static final int TEST_DEFAULT_MIN_RANGE = 0;
private static final int TEST_MIN_RANGE = 5;
private static final int TEST_MAX_RANGE = 100;
private static final int TEST_IN_RANGE = TEST_MAX_RANGE;
private static final int TEST_OUT_OF_UPPER_RANGE = TEST_MAX_RANGE + 1;
private static final int TEST_OUT_OF_LOWER_RANGE = TEST_MIN_RANGE - 1;
private Validator validator;
@After
public void tearDown() {
Config.setConfigUtils(null);
}
@Test
public void valueOutOfUpperRange() {
initConfiguredRange();
validateAndAssertResult(new ConfiguredRangeContainer(TEST_OUT_OF_UPPER_RANGE), false);
}
@Test
public void valueOutOfDefaultLowerRange() {
initConfiguredWithDefaultMinValue();
validateAndAssertResult(new ConfiguredRangeContainerDefaultMin(TEST_DEFAULT_MIN_RANGE - 1), false);
}
@Test
public void valueOutOfLowerRange() {
initConfiguredWithDefaultMinValue();
validateAndAssertResult(new ConfiguredRangeContainer(TEST_OUT_OF_LOWER_RANGE), false);
}
@Test
public void valueOutOfConfiguredLowerRange() {
initConfiguredWithDefaultMinValue();
validateAndAssertResult(new ConfiguredRangeContainerWithConfMin(TEST_MIN_RANGE - 1), false);
}
@Test
public void valueInConfiguredLowerRange() {
initConfiguredWithDefaultMinValue();
validateAndAssertResult(new ConfiguredRangeContainerWithConfMin(TEST_MIN_RANGE), true);
}
@Test
public void valueInRange() {
initConfiguredRange();
validateAndAssertResult(new ConfiguredRangeContainer(TEST_IN_RANGE), true);
}
/**
* The test assures the precedence of the configuration value over the min attribute of the annotated value.
*
* The minimum defined by <code>minConfigValue</code> is <code>TEST_MIN_RANGE</code>.<br/>
* The minimum defined by <code>min()</code> is <code>TEST_MIN_RANGE + 2</code>.<br/>
* The test verifies the valid values are greater then the min value obtained from <code>minConfigValue</code><br/>
*/
@Test
public void valueLowerLimitSetByConfigValue() {
initConfiguredWithDefaultMinValue();
validateAndAssertResult(new ConfiguredRangeContainerWithBothMinAttributes(TEST_MIN_RANGE + 1), true);
validateAndAssertResult(new ConfiguredRangeContainerWithBothMinAttributes(TEST_MIN_RANGE - 1), false);
}
private <T> void validateAndAssertResult(T container, boolean isValid) {
Set<ConstraintViolation<T>> validate = validator.validate(container);
assertEquals(isValid, validate.isEmpty());
}
public void initConfiguredRange() {
IConfigUtilsInterface configUtils = initConfigUtils();
Config.setConfigUtils(configUtils);
}
public void initConfiguredWithDefaultMinValue() {
IConfigUtilsInterface configUtils = initConfigUtils();
when(configUtils.getValue(ConfigValues.ConnectToServerTimeoutInSeconds, ConfigCommon.defaultConfigurationVersion)).thenReturn(TEST_MIN_RANGE);
Config.setConfigUtils(configUtils);
}
private IConfigUtilsInterface initConfigUtils() {
validator = ValidationUtils.getValidator();
IConfigUtilsInterface configUtils = mock(IConfigUtilsInterface.class);
when(configUtils.getValue(ConfigValues.vdsTimeout, ConfigCommon.defaultConfigurationVersion)).thenReturn(TEST_MAX_RANGE);
return configUtils;
}
private static class ConfiguredRangeContainer {
@ConfiguredRange(min = TEST_MIN_RANGE, maxConfigValue = ConfigValues.vdsTimeout)
private int value;
public ConfiguredRangeContainer(int value) {
this.value = value;
}
}
private static class ConfiguredRangeContainerDefaultMin {
@ConfiguredRange(maxConfigValue = ConfigValues.vdsTimeout)
private int value;
public ConfiguredRangeContainerDefaultMin(int value) {
this.value = value;
}
}
private static class ConfiguredRangeContainerWithConfMin {
@ConfiguredRange(minConfigValue = ConfigValues.ConnectToServerTimeoutInSeconds,
maxConfigValue = ConfigValues.vdsTimeout)
private int value;
public ConfiguredRangeContainerWithConfMin(int value) {
this.value = value;
}
}
private static class ConfiguredRangeContainerWithBothMinAttributes {
@ConfiguredRange(min = TEST_MIN_RANGE + 2, minConfigValue = ConfigValues.ConnectToServerTimeoutInSeconds,
maxConfigValue = ConfigValues.vdsTimeout)
private int value;
public ConfiguredRangeContainerWithBothMinAttributes(int value) {
this.value = value;
}
}
}