package org.ovirt.engine.core.bll.network.cluster; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.ovirt.engine.core.bll.BaseCommandTest; import org.ovirt.engine.core.bll.ValidateTestUtils; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AttachNetworkToClusterParameter; 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.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.ClusterDao; import org.ovirt.engine.core.dao.network.NetworkClusterDao; import org.ovirt.engine.core.dao.network.NetworkDao; import org.springframework.dao.DataIntegrityViolationException; public class AttachNetworkToClusterInternalCommandTest extends BaseCommandTest { @Mock private NetworkClusterDao mockNetworkClusterDao; @Mock private ClusterDao mockClusterDao; @Mock private NetworkDao mockNetworkDao; private Cluster existingGroup = new Cluster(); private Network network = createNetwork(); private AttachNetworkToClusterParameter param = new AttachNetworkToClusterParameter(getExistingCluster(), getNetwork()); @InjectMocks private AttachNetworkToClusterInternalCommand<AttachNetworkToClusterParameter> underTest = new AttachNetworkToClusterInternalCommand<>(param, null); @Test public void networkExists() { simulateClusterExists(); when(mockNetworkDao.get(any(Guid.class))).thenReturn(getNetwork()); when(mockNetworkClusterDao.get(param.getNetworkCluster().getId())).thenReturn(param.getNetworkCluster()); ValidateTestUtils.runAndAssertValidateFailure(underTest, EngineMessage.NETWORK_ALREADY_ATTACHED_TO_CLUSTER); } @Test public void networkDoesntExist() { simulateClusterExists(); ValidateTestUtils.runAndAssertValidateFailure(underTest, EngineMessage.NETWORK_NOT_EXISTS); } @Test public void noCluster() { ValidateTestUtils.runAndAssertValidateFailure(underTest, EngineMessage.VDS_CLUSTER_IS_NOT_VALID); } @Test public void raceConditionClusterRemoved() { simulateClusterExists(); simulateClusterWasRemoved(); assertExecuteActionFailure(); } private Network createNetwork() { network = new Network(); network.setName("test network"); return network; } private void simulateClusterExists() { dbFacadeReturnCluster(); } private void simulateClusterWasRemoved() { dbFacadeThrowOnNetworkClusterSave(); } private void dbFacadeReturnCluster() { when(mockClusterDao.get(any())).thenReturn(existingGroup); } private void dbFacadeThrowOnNetworkClusterSave() { doThrow(new DataIntegrityViolationException("test violations")).when(mockNetworkClusterDao) .save(any(NetworkCluster.class)); } private Network getNetwork() { return network; } private Cluster getExistingCluster() { return existingGroup; } private void assertExecuteActionFailure() { try { underTest.executeCommand(); } catch (Exception expected) { // An exception is expected here } assertFalse(underTest.getReturnValue().getSucceeded()); assertEquals(AuditLogType.NETWORK_ATTACH_NETWORK_TO_CLUSTER_FAILED, underTest.getAuditLogTypeValue()); } }