package org.ovirt.engine.core.bll.validator;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.isValid;
import java.util.ArrayList;
import java.util.List;
import org.hamcrest.Matcher;
import org.junit.Before;
import org.junit.Test;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.common.businessentities.network.NetworkQoS;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
public class NetworkQosValidatorTest {
private static final Guid DEFAULT_GUID = Guid.newGuid();
private static final Guid OTHER_GUID = Guid.newGuid();
private static final Integer BANDWIDTH_LOW = 10;
private static final Integer BANDWIDTH_MEDIUM = 100;
private static final Integer BANDWIDTH_HIGH = 1000;
private NetworkQoS qos;
private NetworkQoS oldQos;
private List<NetworkQoS> allQos;
private NetworkQosValidator validator;
private NetworkQosValidator nullValidator;
@Before
public void setup() {
qos = new NetworkQoS();
oldQos = new NetworkQoS();
allQos = new ArrayList<>();
validator = spy(new NetworkQosValidator(qos));
doReturn(oldQos).when(validator).getOldQos();
doReturn(allQos).when(validator).getAllQosInDcByType();
nullValidator = spy(new NetworkQosValidator(null));
doReturn(oldQos).when(nullValidator).getOldQos();
}
private void qosExistsTest(Matcher<ValidationResult> matcher, NetworkQosValidator validator) {
assertThat(validator.qosExists(), matcher);
}
@Test
public void qosExistsNullInput() {
oldQos.setId(DEFAULT_GUID);
qosExistsTest(isValid(), nullValidator);
}
@Test
public void qosDoesNotExistNullInput() {
doReturn(null).when(nullValidator).getOldQos();
qosExistsTest(isValid(), nullValidator);
}
@Test
public void qosExists() {
qos.setId(DEFAULT_GUID);
oldQos.setId(DEFAULT_GUID);
qosExistsTest(isValid(), validator);
}
@Test
public void qosDoesNotExist() {
qos.setId(DEFAULT_GUID);
doReturn(null).when(validator).getOldQos();
qosExistsTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_QOS_NOT_FOUND), validator);
}
private void consistentDataCenterTest(Matcher<ValidationResult> matcher) {
assertThat(validator.consistentDataCenter(), matcher);
}
@Test
public void sameDataCenter() {
qos.setStoragePoolId(DEFAULT_GUID);
oldQos.setStoragePoolId(DEFAULT_GUID);
consistentDataCenterTest(isValid());
}
@Test
public void differentDataCenter() {
qos.setStoragePoolId(DEFAULT_GUID);
oldQos.setStoragePoolId(OTHER_GUID);
consistentDataCenterTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_QOS_STORAGE_POOL_NOT_CONSISTENT));
}
private void nameNotChangedOrNotTakenTest(Matcher<ValidationResult> matcher) {
NetworkQoS otherQos = new NetworkQoS();
allQos.add(otherQos);
allQos.add(oldQos);
otherQos.setName("foo");
oldQos.setName("bar");
assertThat(validator.nameNotChangedOrNotTaken(), matcher);
}
@Test
public void nameNotChanged() {
qos.setName("bar");
nameNotChangedOrNotTakenTest(isValid());
}
@Test
public void nameNotTaken() {
qos.setName("fubar");
nameNotChangedOrNotTakenTest(isValid());
}
@Test
public void nameTaken() {
qos.setName("foo");
nameNotChangedOrNotTakenTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_QOS_NAME_EXIST));
}
private void valuesPresentTest(Matcher<ValidationResult> matcher) {
assertThat(validator.requiredValuesPresent(), matcher);
}
@Test
public void valuesPresentNullInput() {
assertThat(nullValidator.requiredValuesPresent(), isValid());
}
@Test
public void noValuePresent() {
valuesPresentTest(isValid());
}
@Test
public void allValuesPresent() {
qos.setInboundAverage(BANDWIDTH_MEDIUM);
qos.setInboundPeak(BANDWIDTH_MEDIUM);
qos.setInboundBurst(BANDWIDTH_MEDIUM);
qos.setOutboundAverage(BANDWIDTH_MEDIUM);
qos.setOutboundPeak(BANDWIDTH_MEDIUM);
qos.setOutboundBurst(BANDWIDTH_MEDIUM);
valuesPresentTest(isValid());
}
@Test
public void allInboundValuesPresent() {
qos.setInboundAverage(BANDWIDTH_MEDIUM);
qos.setInboundPeak(BANDWIDTH_MEDIUM);
qos.setInboundBurst(BANDWIDTH_MEDIUM);
valuesPresentTest(isValid());
}
@Test
public void allOutboundValuesPresent() {
qos.setOutboundAverage(BANDWIDTH_MEDIUM);
qos.setOutboundPeak(BANDWIDTH_MEDIUM);
qos.setOutboundBurst(BANDWIDTH_MEDIUM);
valuesPresentTest(isValid());
}
@Test
public void onlyInboundAveragePresent() {
qos.setInboundAverage(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void onlyInboundPeakPresent() {
qos.setInboundPeak(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void onlyInboundBurstPresent() {
qos.setInboundBurst(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void onlyOutboundAveragePresent() {
qos.setOutboundAverage(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void onlyOutboundPeakPresent() {
qos.setOutboundPeak(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void onlyOutboundBurstPresent() {
qos.setOutboundBurst(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void inboundBurstMissing() {
qos.setInboundAverage(BANDWIDTH_MEDIUM);
qos.setInboundPeak(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void inboundPeakMissing() {
qos.setInboundBurst(BANDWIDTH_MEDIUM);
qos.setInboundAverage(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void inboundAverageMissing() {
qos.setInboundPeak(BANDWIDTH_MEDIUM);
qos.setInboundBurst(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void outboundBurstMissing() {
qos.setOutboundAverage(BANDWIDTH_MEDIUM);
qos.setOutboundPeak(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void outboundPeakMissing() {
qos.setOutboundBurst(BANDWIDTH_MEDIUM);
qos.setOutboundAverage(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
@Test
public void outboundAverageMissing() {
qos.setOutboundPeak(BANDWIDTH_MEDIUM);
qos.setOutboundBurst(BANDWIDTH_MEDIUM);
valuesPresentTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_MISSING_VALUES));
}
private void peakConsistentWithAverageTest(Matcher<ValidationResult> matcher) {
qos.setInboundAverage(BANDWIDTH_MEDIUM);
qos.setOutboundAverage(BANDWIDTH_MEDIUM);
assertThat(validator.peakConsistentWithAverage(), matcher);
}
@Test
public void peakConsistentWithAverageNullInput() {
assertThat(nullValidator.peakConsistentWithAverage(), isValid());
}
@Test
public void peakHigherThanAverage() {
qos.setInboundPeak(BANDWIDTH_HIGH);
qos.setOutboundPeak(BANDWIDTH_HIGH);
peakConsistentWithAverageTest(isValid());
}
@Test
public void peakEqualToAverage() {
qos.setInboundPeak(BANDWIDTH_MEDIUM);
qos.setOutboundPeak(BANDWIDTH_MEDIUM);
peakConsistentWithAverageTest(isValid());
}
@Test
public void inboundPeakLowerThanAverage() {
qos.setInboundPeak(BANDWIDTH_LOW);
qos.setOutboundPeak(BANDWIDTH_HIGH);
peakConsistentWithAverageTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_PEAK_LOWER_THAN_AVERAGE));
}
@Test
public void outboundPeakLowerThanAverage() {
qos.setInboundPeak(BANDWIDTH_HIGH);
qos.setOutboundPeak(BANDWIDTH_LOW);
peakConsistentWithAverageTest(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_QOS_PEAK_LOWER_THAN_AVERAGE));
}
}