package org.ovirt.engine.core.bll.network.cluster; import static org.hamcrest.CoreMatchers.both; import static org.hamcrest.CoreMatchers.hasItem; import static org.junit.Assert.assertThat; 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 static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.replacements; import org.hamcrest.Matcher; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; import org.ovirt.engine.core.common.businessentities.network.ProviderNetwork; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.VdsDao; import org.ovirt.engine.core.dao.network.InterfaceDao; import org.ovirt.engine.core.dao.network.NetworkDao; import org.ovirt.engine.core.utils.RandomUtils; public abstract class NetworkClusterValidatorTestBase<T extends NetworkClusterValidatorBase> { private static final Guid TEST_DC_ID1 = Guid.newGuid(); private static final Guid TEST_DC_ID2 = Guid.newGuid(); protected static final Guid TEST_CLUSTER_ID = Guid.newGuid(); private static final String NETWORK_NAME = RandomUtils.instance().nextString( RandomUtils.instance().nextInt(1, 10)); private static final String NETWORK_NAME_REPLACEMENT = String.format( NetworkClusterValidatorBase.NETWORK_NAME_REPLACEMENT, NETWORK_NAME); @Mock protected VdsDao vdsDao; @Mock protected InterfaceDao interfaceDao; @Mock protected NetworkDao networkDao; protected Network network; protected Cluster cluster; protected NetworkCluster networkCluster; protected T validator; @Before public void setup() { network = createNetwork(); networkCluster = createNetworkCluster(); cluster = new Cluster(); validator = spy(createValidator()); } private Network createNetwork() { Network network = new Network(); network.setName(NETWORK_NAME); return network; } private NetworkCluster createNetworkCluster() { NetworkCluster networkCluster = new NetworkCluster(); networkCluster.setClusterId(TEST_CLUSTER_ID); return networkCluster; } protected abstract T createValidator(); @Test public void managementNetworkNotExternalValid() { testManagementNetworkNotExternal(true, false, isValid()); } @Test public void managementNetworkNotExternalValidNotManagement() { testManagementNetworkNotExternal(false, true, isValid()); } @Test public void managementNetworkNotExternalValidNotManagementNotExternal() { testManagementNetworkNotExternal(false, false, isValid()); } @Test public void managementNetworkNotExternalValidInvalidExternal() { testManagementNetworkNotExternal(true, true, both(failsWith(EngineMessage.ACTION_TYPE_FAILED_MANAGEMENT_NETWORK_CANNOT_BE_EXTERNAL)) .and(replacements(hasItem(NETWORK_NAME_REPLACEMENT)))); } @Test public void testDefaultRouteNetworkCannotBeExternal() throws Exception { networkCluster.setDefaultRoute(true); setNetworkExternal(network, true); EngineMessage message = EngineMessage.ACTION_TYPE_FAILED_DEFAULT_ROUTE_NETWORK_CANNOT_BE_EXTERNAL; assertThat(validator.defaultRouteNetworkCannotBeExternal(network), both(failsWith(message)).and(replacements(hasItem(NETWORK_NAME_REPLACEMENT)))); } @Test public void testDefaultRouteNetworkCannotBeExternalWhenNotDefaultRoute() throws Exception { networkCluster.setDefaultRoute(false); setNetworkExternal(network, true); assertThat(validator.defaultRouteNetworkCannotBeExternal(network), isValid()); } @Test public void testDefaultRouteNetworkCannotBeExternalWhenNotExternalNetwork() throws Exception { networkCluster.setDefaultRoute(true); setNetworkExternal(network, false); assertThat(validator.defaultRouteNetworkCannotBeExternal(network), isValid()); } private void testManagementNetworkNotExternal(boolean management, boolean external, Matcher<ValidationResult> expected) { networkCluster.setManagement(management); setNetworkExternal(network, external); assertThat(validator.managementNetworkNotExternal(network), expected); } private void setNetworkExternal(Network network, boolean external) { network.setProvidedBy(external ? new ProviderNetwork() : null); } private void testManagementNetworkRequired(boolean management, boolean required, Matcher<ValidationResult> expected) { networkCluster.setManagement(management); networkCluster.setRequired(required); assertThat(validator.managementNetworkRequired(network), expected); } @Test public void managementNetworkRequiredValidNotManagementNotRequired() { testManagementNetworkRequired(false, false, isValid()); } @Test public void managementNetworkRequiredValidNotManagementRequired() { testManagementNetworkRequired(false, true, isValid()); } @Test public void managementNetworkRequiredValidManagementRequired() { testManagementNetworkRequired(true, true, isValid()); } @Test public void managementNetworkRequiredInvalid() { testManagementNetworkRequired(true, false, both(failsWith(EngineMessage.ACTION_TYPE_FAILED_MANAGEMENT_NETWORK_REQUIRED)) .and(replacements(hasItem(NETWORK_NAME_REPLACEMENT)))); } @Test public void networkBelongsToClusterDataCenterValid() throws Exception { cluster.setStoragePoolId(TEST_DC_ID1); network.setDataCenterId(TEST_DC_ID1); assertThat(validator.networkBelongsToClusterDataCenter(cluster, network), isValid()); } @Test public void networkBelongsToClusterDataCenterNotValid() throws Exception { cluster.setStoragePoolId(TEST_DC_ID1); network.setDataCenterId(TEST_DC_ID2); assertThat(validator.networkBelongsToClusterDataCenter(cluster, network), both(failsWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_FROM_DIFFERENT_DC)). and(replacements(hasItem(NETWORK_NAME_REPLACEMENT)))); } }