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.Collections; 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.VDSStatus; import org.ovirt.engine.core.common.businessentities.gluster.GlusterHookEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterHookStatus; import org.ovirt.engine.core.common.errors.EngineError; import org.ovirt.engine.core.common.errors.EngineException; 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 UpdateGlusterHookCommandTest extends GlusterHookCommandTest<UpdateGlusterHookCommand> { @Override protected UpdateGlusterHookCommand createCommand() { return new UpdateGlusterHookCommand(new GlusterHookManageParameters(HOOK_ID), null); } @Mock private VdsDao vdsDao; private static final String CONTENT = "TestContent"; private static final Guid SERVER_ID = Guid.newGuid(); private void setUpMocksForUpdate() { setUpMocksForUpdate(true); } private void setUpMocksForUpdate(boolean hookFound) { setUpMocksForUpdate(hookFound, getHookEntity()); } private void setUpMocksForUpdate(boolean hookFound, GlusterHookEntity hook) { setUpMocksForUpdate(hookFound, hook, VDSStatus.Up); } private void setUpMocksForUpdate(VDSStatus status) { setUpMocksForUpdate(true, getHookEntity(), status); } private void setUpMocksForUpdate(boolean hookFound, GlusterHookEntity hook, VDSStatus status) { setupMocks(hookFound, hook); when(vdsDao.get(any(Guid.class))).thenReturn(getServer(SERVER_ID, "gfs1", CLUSTER_ID, status)); } 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.UpdateGlusterHook), any(GlusterHookVDSParameters.class))).thenReturn(vdsReturnValue); } private void mockForReadContent(boolean succeeded, EngineError errorCode) { when(hooksDao.getGlusterServerHook(HOOK_ID, SERVER_ID)).thenReturn(getGlusterServerHook(0, GlusterHookStatus.ENABLED)); mockBackend(succeeded, errorCode); VDSReturnValue vdsReturnValue = new VDSReturnValue(); vdsReturnValue.setReturnValue(CONTENT); vdsReturnValue.setSucceeded(succeeded); if (!succeeded) { vdsReturnValue.setVdsError(new VDSError(errorCode, "")); } when(vdsBrokerFrontend.runVdsCommand(eq(VDSCommandType.GetGlusterHookContent), any(GlusterHookVDSParameters.class))).thenReturn(vdsReturnValue); } @Test public void executeCommand() { setUpMocksForUpdate(); mockBackend(true, null); cmd.executeCommand(); verify(hooksDao, times(1)).updateGlusterHook(any(GlusterHookEntity.class)); assertEquals(AuditLogType.GLUSTER_HOOK_UPDATED, cmd.getAuditLogTypeValue()); } @Test public void executeCommandWhenServerIdPresent() { setUpMocksForUpdate(); mockForReadContent(true, null); cmd.executeCommand(); verify(hooksDao, times(1)).updateGlusterHook(any(GlusterHookEntity.class)); assertEquals(AuditLogType.GLUSTER_HOOK_UPDATED, cmd.getAuditLogTypeValue()); } @Test public void executeCommandWhenFailed() { setUpMocksForUpdate(); mockBackend(false, EngineError.GlusterHookUpdateFailed); cmd.executeCommand(); verify(hooksDao, never()).updateGlusterHook(any(GlusterHookEntity.class)); assertEquals(AuditLogType.GLUSTER_HOOK_UPDATE_FAILED, cmd.getAuditLogTypeValue()); } @Test public void executeCommandFailedWhenServerIdPresent() { setUpMocksForUpdate(); mockForReadContent(false, EngineError.GlusterHookNotFound); try { cmd.executeCommand(); }catch (EngineException e) { assertEquals(EngineError.GlusterHookNotFound, e.getErrorCode()); } verify(hooksDao, never()).updateGlusterHook(any(GlusterHookEntity.class)); } @Test public void validateSucceeds() { setUpMocksForUpdate(); assertTrue(cmd.validate()); } @Test public void validateFailsOnNullHookId() { cmd.getParameters().setHookId(null); setUpMocksForUpdate(); assertFalse(cmd.validate()); assertTrue(cmd.getReturnValue().getValidationMessages().contains(EngineMessage.ACTION_TYPE_FAILED_GLUSTER_HOOK_ID_IS_REQUIRED.toString())); } @Test public void validateFailsOnNoHook() { setUpMocksForUpdate(false); assertFalse(cmd.validate()); assertTrue(cmd.getReturnValue().getValidationMessages().contains(EngineMessage.ACTION_TYPE_FAILED_GLUSTER_HOOK_DOES_NOT_EXIST.toString())); } @Test public void validateFailsOnNoConflictServers() { GlusterHookEntity hook = getHookEntity(); hook.setServerHooks(Collections.singletonList(getGlusterServerHook(0, GlusterHookStatus.MISSING))); setUpMocksForUpdate(true, hook); assertFalse(cmd.validate()); assertTrue(cmd.getReturnValue().getValidationMessages().contains(EngineMessage.ACTION_TYPE_FAILED_GLUSTER_HOOK_NO_CONFLICT_SERVERS.toString())); } @Test public void validateFailsOnServerNotUp() { setUpMocksForUpdate(VDSStatus.Down); assertFalse(cmd.validate()); assertTrue(cmd.getReturnValue().getValidationMessages().contains(EngineMessage.ACTION_TYPE_FAILED_SERVER_STATUS_NOT_UP.toString())); } }