package org.ovirt.engine.core.common.businessentities.network;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import javax.validation.Valid;
import javax.validation.groups.Default;
import org.junit.Test;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.utils.ValidationUtils;
import org.ovirt.engine.core.common.validation.group.CreateEntity;
import org.ovirt.engine.core.common.validation.group.UpdateEntity;
import org.ovirt.engine.core.common.validation.group.UpdateVmNic;
@SuppressWarnings("serial")
public class VmNetworkInterfaceValidationTest {
private static final VmInterfaceType VALID_NIC_TYPE = VmInterfaceType.e1000;
private static final String VALID_NIC_NAME = "nic";
private static final String VALID_MAC_ADDRESS = "00:23:45:67:89:ab";
private static final Random random = new Random();
@Test
public void nameIsNullForCreate() throws Exception {
assertNicValidation(createNic(VALID_MAC_ADDRESS, null, VALID_NIC_TYPE),
CreateEntity.class,
true,
VmNetworkInterface.VALIDATION_MESSAGE_NAME_NOT_NULL);
}
@Test
public void nameIsNullForUpdate() throws Exception {
assertNicValidation(createNic(VALID_MAC_ADDRESS, null, VALID_NIC_TYPE),
CreateEntity.class,
true,
VmNetworkInterface.VALIDATION_MESSAGE_NAME_NOT_NULL);
}
@Test
public void nameIsNullForDefault() throws Exception {
assertNicValidation(createNic(VALID_MAC_ADDRESS, null, VALID_NIC_TYPE),
Default.class,
false,
VmNetworkInterface.VALIDATION_MESSAGE_NAME_NOT_NULL);
}
@Test
public void nameIsNotNullForCreate() throws Exception {
assertNicValidation(createNic(VALID_MAC_ADDRESS, VALID_NIC_NAME, VALID_NIC_TYPE),
CreateEntity.class,
false,
VmNetworkInterface.VALIDATION_MESSAGE_NAME_NOT_NULL);
}
@Test
public void nameIsNotNullForUpdate() throws Exception {
assertNicValidation(createNic(VALID_MAC_ADDRESS, VALID_NIC_NAME, VALID_NIC_TYPE),
UpdateEntity.class,
false,
VmNetworkInterface.VALIDATION_MESSAGE_NAME_NOT_NULL);
}
@Test
public void macAddressIsNullForVmNicUpdate() throws Exception {
assertNicValidation(createNic(null, VALID_NIC_NAME, VALID_NIC_TYPE),
UpdateVmNic.class,
true,
VmNetworkInterface.VALIDATION_MESSAGE_MAC_ADDRESS_NOT_NULL);
}
@Test
public void macAddressIsNullForUpdate() throws Exception {
assertNicValidation(createNic(null, VALID_NIC_NAME, VALID_NIC_TYPE),
UpdateEntity.class,
false,
VmNetworkInterface.VALIDATION_MESSAGE_MAC_ADDRESS_NOT_NULL);
}
@Test
public void macAddressIsNullForDefault() throws Exception {
assertNicValidation(createNic(null, VALID_NIC_NAME, VALID_NIC_TYPE),
Default.class,
false,
VmNetworkInterface.VALIDATION_MESSAGE_MAC_ADDRESS_NOT_NULL);
}
@Test
public void macAddressEmptyForCreate() throws Exception {
assertMacAddressFormatValidation("", CreateEntity.class, false);
}
@Test
public void macAddressFormatValidForCreate() throws Exception {
assertMacAddressFormatValidation(VALID_MAC_ADDRESS, CreateEntity.class, false);
}
@Test
public void macAddressEmptyForUpdate() throws Exception {
assertMacAddressFormatValidation("", UpdateEntity.class, true);
}
@Test
public void macAddressFormatValidForUpdate() throws Exception {
assertMacAddressFormatValidation(VALID_MAC_ADDRESS, UpdateEntity.class, false);
}
@Test
public void macAddressFormatInvalidForDefault() throws Exception {
assertMacAddressFormatValidation(createInvalidMacAddress(), Default.class, false);
}
@Test
public void macAddressFormatInvalidForCreate() throws Exception {
assertMacAddressFormatValidation(createInvalidMacAddress(), CreateEntity.class, true);
}
@Test
public void macAddressFormatInvalidForUpdate() throws Exception {
assertMacAddressFormatValidation(createInvalidMacAddress(), UpdateEntity.class, true);
}
@Test
public void macAddressTooLongForCreate() throws Exception {
assertMacAddressFormatValidation(VALID_MAC_ADDRESS + ":00", CreateEntity.class, true);
}
@Test
public void macAddressTooLongForUpdate() throws Exception {
assertMacAddressFormatValidation(VALID_MAC_ADDRESS + ":00", UpdateEntity.class, true);
}
@Test
public void macAddressTooShortForCreate() throws Exception {
assertMacAddressFormatValidation(createShortMacAddress(), CreateEntity.class, true);
}
@Test
public void macAddressTooShortForUpdate() throws Exception {
assertMacAddressFormatValidation(createShortMacAddress(), UpdateEntity.class, true);
}
/**
* Assert that MAC address format is being validated.
*
* @param macAddress
* The MAC address to validate.
* @param validationGroup
* The validation group to use.
* @param shouldValidationFail
* Should the validation fail due to invalid format, or not.
*/
private static void assertMacAddressFormatValidation(String macAddress,
Class<?> validationGroup,
boolean shouldValidationFail) {
assertNicValidation(createNic(macAddress, VALID_NIC_NAME, VALID_NIC_TYPE),
validationGroup,
shouldValidationFail,
VmNetworkInterface.VALIDATION_MESSAGE_MAC_ADDRESS_INVALID);
}
private static NetworkInterface<?> createNic(String macAddress, String name, VmInterfaceType vmInterfaceType) {
NetworkInterface<?> nic = new VmNetworkInterface();
nic.setName(name);
nic.setMacAddress(macAddress);
nic.setType(vmInterfaceType == null ? null : vmInterfaceType.getValue());
return nic;
}
/**
* Assert that the given NIC is being validated.
*
* @param nic
* The NIC to validate.
* @param validationGroup
* The validation group to use.
* @param shouldValidationFail
* Should the validation fail due to invalid format, or not.
* @param possibleViolation
* Violation that should or shounldn't occur (determined by previous parameter),
*/
private static void assertNicValidation(NetworkInterface<?> nic,
Class<?> validationGroup,
boolean shouldValidationFail,
String possibleViolation) {
List<String> violations = ValidationUtils.validateInputs(
Arrays.asList(new Class<?>[] { validationGroup }), new TestParams(nic));
assertEquals("Validation should" + (shouldValidationFail ? "" : "'nt") + " fail due to violation: ["
+ possibleViolation + "]; Actual violations were: " + violations,
shouldValidationFail,
violations.contains(possibleViolation));
}
private static String createInvalidMacAddress() {
return VALID_MAC_ADDRESS.replace(VALID_MAC_ADDRESS.charAt(random.nextInt(VALID_MAC_ADDRESS.length())), 'x');
}
/**
* @return A MAC address that is at least 1 char long but shorter than a valid MAC address.
*/
private static String createShortMacAddress() {
return VALID_MAC_ADDRESS.substring(random.nextInt(VALID_MAC_ADDRESS.length() - 2) + 1);
}
private static class TestParams extends VdcActionParametersBase {
@Valid
private NetworkInterface<?> nic;
public TestParams(NetworkInterface<?> nic) {
this.nic = nic;
}
}
}