package org.ovirt.engine.core.bll;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.context.NoOpCompensationContext;
import org.ovirt.engine.core.common.action.DiskProfileParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
public class PrevalidatingMultipleActionsRunnerTest extends MultipleActionsRunnerBaseTest{
private static CommandContext commandContext = CommandContext.createContext(new
DiskProfileParameters().getSessionId()).withCompensationContext(NoOpCompensationContext.getInstance());
@InjectMocks
private MultipleActionsRunner runner = new PrevalidatingMultipleActionsRunner(VdcActionType
.RemoveDiskProfile,
Arrays.asList(new DiskProfileParameters(), new DiskProfileParameters(), new DiskProfileParameters()),
commandContext,
true);
@Before
public void setUp() {
runner.setIsWaitForResult(true);
}
@Test
public void shouldExecuteValidCommands() {
TestCommand failingCommand = failingValidationCommand();
TestCommand successfulCommand = successfulCommand();
setUpFactory(failingCommand, successfulCommand, successfulCommand);
runner.setIsRunOnlyIfAllValidatePass(false);
runner.execute();
verify(successfulCommand, times(2)).validateOnly();
verify(failingCommand, times(1)).validateOnly();
verify(successfulCommand, times(2)).executeAction();
verify(failingCommand, never()).executeAction();
}
@Test
public void shouldExecuteNoCommandsBecauseOneFails() {
TestCommand failingCommand = failingValidationCommand();
TestCommand successfulCommand = successfulCommand();
setUpFactory(failingCommand, successfulCommand, successfulCommand);
runner.setIsRunOnlyIfAllValidatePass(true);
runner.execute();
verify(successfulCommand, times(2)).validateOnly();
verify(failingCommand, times(1)).validateOnly();
verify(successfulCommand, never()).executeAction();
verify(failingCommand, never()).executeAction();
}
@Test
public void shouldExecuteMoreThanOneValidCommands() {
TestCommand successfulCommand = successfulCommand();
setUpFactory(successfulCommand, successfulCommand, successfulCommand);
runner.setIsRunOnlyIfAllValidatePass(true);
runner.execute();
verify(successfulCommand, times(3)).validateOnly();
verify(successfulCommand, times(3)).executeAction();
}
@Test
public void shouldCollectReturnValuesOfCommands() {
setUpFactory(successfulCommand(), failingValidationCommand(), failingExecutionCommand());
runner.setIsRunOnlyIfAllValidatePass(false);
List<VdcReturnValueBase> returnValues = runner.execute();
assertThat(returnValues).hasSize(3);
// Command succeeds
assertThat(returnValues.get(0).isValid()).isTrue();
assertThat(returnValues.get(0).getSucceeded()).isTrue();
// Validation fails
assertThat(returnValues.get(1).isValid()).isFalse();
assertThat(returnValues.get(1).getSucceeded()).isFalse();
// Execution fails
assertThat(returnValues.get(2).isValid()).isTrue();
assertThat(returnValues.get(2).getSucceeded()).isFalse();
}
}