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.mockito.Mockito.when; import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith; import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.isValid; import java.util.HashSet; import java.util.Set; 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.network.host.NetworkDeviceHelper; import org.ovirt.engine.core.common.businessentities.network.HostNicVfsConfig; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.network.InterfaceDao; import org.ovirt.engine.core.dao.network.NetworkDao; @RunWith(MockitoJUnitRunner.class) public class VfsConfigValidatorTest { private static final String NETWORK_NAME = "net"; private static final String NIC_NAME = "nic"; private static final int NUM_OF_VFS = 5; private static final Guid NIC_ID = Guid.newGuid(); private static final Guid NETWORK_ID = Guid.newGuid(); private static final String LABEL = "lbl"; @Mock private VdsNetworkInterface nic; @Mock private Network network; @Mock private HostNicVfsConfig oldVfsConfig; @Mock private DbFacade dbFacade; @Mock private InterfaceDao interfaceDao; @Mock private NetworkDeviceHelper networkDeviceHelper; @Mock private NetworkDao networkDao; private VfsConfigValidator validator; @Before public void setup() { createValidator(); when(dbFacade.getInterfaceDao()).thenReturn(interfaceDao); when(dbFacade.getNetworkDao()).thenReturn(networkDao); } private void createValidator() { validator = spy(new VfsConfigValidator(NIC_ID, oldVfsConfig)); doReturn(dbFacade).when(validator).getDbFacade(); } @Test public void nicSriovEnabled() { simulateNicExists(); assertThat(validator.nicSriovEnabled(), isValid()); } @Test public void nicSriovNotEnabled() { simulateNicExists(); validator.setOldVfsConfig(null); assertThat(validator.nicSriovEnabled(), failsWith(EngineMessage.ACTION_TYPE_FAILED_NIC_IS_NOT_SRIOV_ENABLED, String.format(VfsConfigValidator.NIC_NAME_REPLACEMENT, nic.getName()))); } private void simulateNicExists() { when(interfaceDao.get(NIC_ID)).thenReturn(nic); when(nic.getName()).thenReturn(NIC_NAME); } @Test public void numOfVfsValidLessThanMax() { numOfVfsInRangeTest(NUM_OF_VFS, NUM_OF_VFS + 1); assertThat(validator.nicSriovEnabled(), isValid()); } @Test public void numOfVfsValidEqualsMax() { numOfVfsInRangeTest(NUM_OF_VFS, NUM_OF_VFS); assertThat(validator.nicSriovEnabled(), isValid()); } @Test public void numOfVfsValidZero() { numOfVfsInRangeTest(0, NUM_OF_VFS); assertThat(validator.nicSriovEnabled(), isValid()); } @Test public void numOfVfsNotValidBiggerThanMax() { numOfVfsInRangeTest(NUM_OF_VFS, NUM_OF_VFS - 1); assertNumOfVfsInValidRange(NUM_OF_VFS); } @Test public void numOfVfsNotValidNegative() { numOfVfsInRangeTest(-NUM_OF_VFS, NUM_OF_VFS); assertNumOfVfsInValidRange(-NUM_OF_VFS); } private void numOfVfsInRangeTest(int numOfVfs, int maxNumOfVfs) { simulateNicExists(); when(oldVfsConfig.getMaxNumOfVfs()).thenReturn(maxNumOfVfs); } private void assertNumOfVfsInValidRange(int numOfVfs) { assertThat(validator.numOfVfsInValidRange(numOfVfs), failsWith(EngineMessage.ACTION_TYPE_FAILED_NUM_OF_VFS_NOT_IN_VALID_RANGE, String.format(VfsConfigValidator.NIC_NAME_REPLACEMENT, nic.getName()), String.format(VfsConfigValidator.NUM_OF_VFS_REPLACEMENT, numOfVfs), String.format(VfsConfigValidator.MAX_NUM_OF_VFS_REPLACEMENT, oldVfsConfig.getMaxNumOfVfs()))); } @Test public void notAllVfsAreFree() { allVfsAreFreeTest(false); assertThat(validator.allVfsAreFree(networkDeviceHelper), failsWith(EngineMessage.ACTION_TYPE_FAILED_NUM_OF_VFS_CANNOT_BE_CHANGED, String.format(VfsConfigValidator.NIC_NAME_REPLACEMENT, nic.getName()))); } @Test public void allVfsAreFree() { allVfsAreFreeTest(true); assertThat(validator.allVfsAreFree(networkDeviceHelper), isValid()); } private void allVfsAreFreeTest(boolean areAllVfsFree) { simulateNicExists(); when(networkDeviceHelper.areAllVfsFree(nic)).thenReturn(areAllVfsFree); } @Test public void settingSpecificNetworksAllowed() { settingSpecificNetworksAllowedTest(true); assertThat(validator.settingSpecificNetworksAllowed(), failsWith(EngineMessage.ACTION_TYPE_FAILED_CANNOT_SET_SPECIFIC_NETWORKS, String.format(VfsConfigValidator.NIC_NAME_REPLACEMENT, nic.getName()))); } @Test public void settingSpecificNetworksNotAllowed() { settingSpecificNetworksAllowedTest(false); assertThat(validator.settingSpecificNetworksAllowed(), isValid()); } private void settingSpecificNetworksAllowedTest(boolean isAllNetworksAllowed) { simulateNicExists(); when(oldVfsConfig.isAllNetworksAllowed()).thenReturn(isAllNetworksAllowed); } @Test public void networExists() { simulateNicExists(); simulateNetworkExists(); assertThat(validator.networkExists(NETWORK_ID), isValid()); } @Test public void networNotExist() { simulateNicExists(); assertThat(validator.networkExists(NETWORK_ID), failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_NOT_EXIST, String.format(VfsConfigValidator.NIC_NAME_REPLACEMENT, nic.getName()), String.format(VfsConfigValidator.NETWORK_ID_REPLACEMENT, NETWORK_ID))); } private void simulateNetworkExists() { when(networkDao.get(NETWORK_ID)).thenReturn(network); when(network.getName()).thenReturn(NETWORK_NAME); } @Test public void networkNotInVfsConfigValid() { networkInVfsConfigCommonTest(false); assertThat(validator.networkNotInVfsConfig(NETWORK_ID), isValid()); } @Test public void networkNotInVfsConfigNotValid() { networkInVfsConfigCommonTest(true); assertThat(validator.networkNotInVfsConfig(NETWORK_ID), failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_ALREADY_IN_VFS_CONFIG, String.format(VfsConfigValidator.NIC_NAME_REPLACEMENT, nic.getName()), String.format(VfsConfigValidator.NETWORK_NAME_REPLACEMENT, network.getName()))); } @Test public void networkInVfsConfigValid() { networkInVfsConfigCommonTest(true); assertThat(validator.networkInVfsConfig(NETWORK_ID), isValid()); } @Test public void networkInVfsConfigNotValid() { networkInVfsConfigCommonTest(false); assertThat(validator.networkInVfsConfig(NETWORK_ID), failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_NOT_IN_VFS_CONFIG, String.format(VfsConfigValidator.NIC_NAME_REPLACEMENT, nic.getName()), String.format(VfsConfigValidator.NETWORK_NAME_REPLACEMENT, network.getName()))); } private void networkInVfsConfigCommonTest(boolean inVfsConfig) { simulateNicExists(); simulateNetworkExists(); Set<Guid> networks = new HashSet<>(); if (inVfsConfig) { networks.add(NETWORK_ID); } when(oldVfsConfig.getNetworks()).thenReturn(networks); } @Test public void labelNotInVfsConfigValid() { labelInVfsConfigCommonTest(false); assertThat(validator.labelNotInVfsConfig(LABEL), isValid()); } @Test public void labelNotInVfsConfigNotValid() { labelInVfsConfigCommonTest(true); assertThat(validator.labelNotInVfsConfig(LABEL), failsWith(EngineMessage.ACTION_TYPE_FAILED_LABEL_ALREADY_IN_VFS_CONFIG, String.format(VfsConfigValidator.NIC_NAME_REPLACEMENT, nic.getName()), String.format(VfsConfigValidator.LABEL_REPLACEMENT, LABEL))); } @Test public void labelInVfsConfigNotValid() { labelInVfsConfigCommonTest(false); assertThat(validator.labelInVfsConfig(LABEL), failsWith(EngineMessage.ACTION_TYPE_FAILED_LABEL_NOT_IN_VFS_CONFIG, String.format(VfsConfigValidator.NIC_NAME_REPLACEMENT, nic.getName()), String.format(VfsConfigValidator.LABEL_REPLACEMENT, LABEL))); } private void labelInVfsConfigCommonTest(boolean inVfsConfig) { simulateNicExists(); Set<String> labels = new HashSet<>(); if (inVfsConfig) { labels.add(LABEL); } when(oldVfsConfig.getNetworkLabels()).thenReturn(labels); } }