package org.ovirt.engine.core.bll.gluster; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner.Silent; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.gluster.GlusterHookManageParameters; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.gluster.GlusterHookEntity; import org.ovirt.engine.core.common.errors.EngineError; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.errors.VDSError; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.common.vdscommands.gluster.GlusterHookVDSParameters; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.VdsDao; @RunWith(Silent.class) public class RemoveGlusterHookCommandTest extends GlusterHookCommandTest<RemoveGlusterHookCommand> { @Override protected RemoveGlusterHookCommand createCommand() { return new RemoveGlusterHookCommand(new GlusterHookManageParameters(HOOK_ID), null); } @Mock private VdsDao vdsDao; private void setUpMocksForRemove() { setUpMocksForRemove(true); } private void setUpMocksForRemove(boolean hookFound) { setUpMocksForRemove(hookFound, getHookEntity(), VDSStatus.Up); } private void setUpMocksForRemove(boolean hookFound, GlusterHookEntity hook, VDSStatus status) { setupMocks(hookFound, hook); when(vdsDao.getAllForCluster(any(Guid.class))).thenReturn(getServers(status)); } private List<VDS> getServers(VDSStatus status) { List<VDS> servers = new ArrayList<>(); servers.add(getServer(GUIDS[0], "gfs1", CLUSTER_ID, status)); servers.add(getServer(GUIDS[1], "gfs2", CLUSTER_ID, status)); servers.add(getServer(GUIDS[2], "gfs3", CLUSTER_ID, status)); servers.add(getServer(GUIDS[3], "gfs4", CLUSTER_ID, status)); return servers; } private void mockBackend(boolean succeeded, EngineError errorCode) { doReturn(backend).when(cmd).getBackend(); VDSReturnValue vdsReturnValue = new VDSReturnValue(); vdsReturnValue.setSucceeded(succeeded); if (!succeeded) { vdsReturnValue.setVdsError(new VDSError(errorCode, "")); } when(vdsBrokerFrontend.runVdsCommand(eq(VDSCommandType.RemoveGlusterHook), any(GlusterHookVDSParameters.class))).thenReturn(vdsReturnValue); } @Test public void executeCommand() { setUpMocksForRemove(); mockBackend(true, null); cmd.executeCommand(); verify(hooksDao, times(1)).remove(any(Guid.class)); assertEquals(AuditLogType.GLUSTER_HOOK_REMOVED, cmd.getAuditLogTypeValue()); } @Test public void executeCommandWhenFailed() { setUpMocksForRemove(); mockBackend(false, EngineError.GlusterHookRemoveFailed); cmd.executeCommand(); verify(hooksDao, never()).remove(any(Guid.class)); assertEquals(AuditLogType.GLUSTER_HOOK_REMOVE_FAILED, cmd.getAuditLogTypeValue()); } @Test public void validateSucceeds() { setUpMocksForRemove(); assertTrue(cmd.validate()); } @Test public void validateFailsOnNullHookId() { cmd.getParameters().setHookId(null); setUpMocksForRemove(); assertFalse(cmd.validate()); assertTrue(cmd.getReturnValue().getValidationMessages().contains(EngineMessage.ACTION_TYPE_FAILED_GLUSTER_HOOK_ID_IS_REQUIRED.toString())); } @Test public void validateFailsOnNoHook() { setUpMocksForRemove(false); assertFalse(cmd.validate()); assertTrue(cmd.getReturnValue().getValidationMessages().contains(EngineMessage.ACTION_TYPE_FAILED_GLUSTER_HOOK_DOES_NOT_EXIST.toString())); } @Test public void validateFailsOnServerNotUp() { setUpMocksForRemove(true, getHookEntity(), VDSStatus.Down); assertFalse(cmd.validate()); assertTrue(cmd.getReturnValue().getValidationMessages().contains(EngineMessage.ACTION_TYPE_FAILED_SERVER_STATUS_NOT_UP.toString())); } }