package org.ovirt.engine.core.bll.validator;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.isValid;
import org.hamcrest.Matcher;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.common.businessentities.network.HostNetworkQos;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.utils.RandomUtils;
@RunWith(MockitoJUnitRunner.class)
public class HostNetworkQosValidatorTest {
private static int LOW_BANDWIDTH = 500;
private static int HIGH_BANDWIDTH = 2000;
@Mock
private HostNetworkQos qos;
private HostNetworkQosValidator validator;
private HostNetworkQosValidator nullValidator;
@Before
public void setup() {
validator = new HostNetworkQosValidator(qos);
nullValidator = new HostNetworkQosValidator(null);
}
private void mockQos(Integer linkshare, Integer upperlimit, Integer realtime) {
when(qos.getOutAverageLinkshare()).thenReturn(linkshare);
when(qos.getOutAverageUpperlimit()).thenReturn(upperlimit);
when(qos.getOutAverageRealtime()).thenReturn(realtime);
}
private int generateValue() {
return RandomUtils.instance().nextInt(0, 1000000);
}
private void requiredValuesTest(Matcher<ValidationResult> matcher) {
assertThat(validator.requiredValuesPresent(), matcher);
}
@Test
public void onlyLinksharePresent() {
mockQos(generateValue(), null, null);
requiredValuesTest(isValid());
}
@Test
public void allValuesPresent() {
mockQos(generateValue(), generateValue(), generateValue());
requiredValuesTest(isValid());
}
@Test
public void noValuesPresent() {
mockQos(null, null, null);
requiredValuesTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_HOST_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void allButLinksharePresent() {
mockQos(null, generateValue(), generateValue());
requiredValuesTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_HOST_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void nullQosValuesPresent() {
assertThat(nullValidator.requiredValuesPresent(), isValid());
}
private void consistentValuesTest(Matcher<ValidationResult> matcher) {
assertThat(validator.valuesConsistent(), matcher);
}
@Test
public void valuesConsistent() {
mockQos(generateValue(), HIGH_BANDWIDTH, LOW_BANDWIDTH);
consistentValuesTest(isValid());
}
@Test
public void valuesConsistentEqual() {
mockQos(generateValue(), HIGH_BANDWIDTH, HIGH_BANDWIDTH);
consistentValuesTest(isValid());
}
@Test
public void valuesConsistentOnlyLinkshare() {
mockQos(generateValue(), null, null);
consistentValuesTest(isValid());
}
@Test
public void upperlimitLowerThanRealTime() {
mockQos(generateValue(), LOW_BANDWIDTH, HIGH_BANDWIDTH);
consistentValuesTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_HOST_NETWORK_QOS_INCONSISTENT_VALUES));
}
@Test
public void nullQosValuesConsistent() {
assertThat(nullValidator.valuesConsistent(), isValid());
}
}