package org.ovirt.engine.core.bll.storage.domain;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.storage.DiskVmElement;
import org.ovirt.engine.core.common.vdscommands.PostDeleteAction;
import org.ovirt.engine.core.common.vdscommands.StoragePoolDomainAndGroupIdBaseVDSCommandParameters;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase;
import org.ovirt.engine.core.dao.DiskVmElementDao;
import org.ovirt.engine.core.di.InjectorRule;
@RunWith(MockitoJUnitRunner.class)
public class PostDeleteActionHandlerTest {
@ClassRule
public static InjectorRule injectorRule = new InjectorRule();
@Spy
@InjectMocks
private PostDeleteActionHandler postDeleteActionHandler;
@Mock
private DiskVmElementDao diskVmElementDao;
@Mock
private AuditLogableBase auditLogableBase;
@Mock
private AuditLogDirector auditLogDirector;
@Test
public void parametersWithSecureDeletionAreFixedOnFileDomainWhenPostZeroIsTrue() {
ParametersWithPostDeleteAction parameters = postDeleteActionHandler.fixPostZeroField(
new ParametersWithPostDeleteAction(true, false), true);
assertPostZeroValue(parameters, false);
}
@Test
public void parametersWithSecureDeletionAreNotFixedOnBlockDomainWhenPostZeroIsTrue() {
ParametersWithPostDeleteAction parameters = postDeleteActionHandler.fixPostZeroField(
new ParametersWithPostDeleteAction(true, false), false);
assertPostZeroValue(parameters, true);
}
@Test
public void parametersWithSecureDeletionAreNotFixedOnFileDomainWhenPostZeroIsFalse() {
ParametersWithPostDeleteAction parameters = postDeleteActionHandler.fixPostZeroField(
new ParametersWithPostDeleteAction(false, false), true);
assertPostZeroValue(parameters, false);
}
@Test
public void parametersWithSecureDeletionAreNotFixedOnBlockDomainWhenPostZeroIsFalse() {
ParametersWithPostDeleteAction parameters = postDeleteActionHandler.fixPostZeroField(
new ParametersWithPostDeleteAction(false, false), false);
assertPostZeroValue(parameters, false);
}
@Test
public void discardIsTrueWhenDiscardAfterDeleteIsTrueAndDomainSupportsDiscard() {
assertDiscardValue(true, true, true, false);
}
@Test
public void discardIsFalseWhenDiscardAfterDeleteIsTrueAndDomainDoesNotSupportDiscard() {
assertDiscardValue(true, false, false, false);
assertDiscardValue(true, null, false, false);
}
@Test
public void discardIsTrueWhenTheDiskIsAttachedToVmWithEnableDiscardAndDomainSupportsDiscard() {
assertDiscardValue(false, true, true, true);
}
@Test
public void discardIsFalseWhenTheDiskIsAttachedToVmWithEnableDiscardAndDomainDoesNotSupportDiscard() {
assertDiscardValue(false, false, false, true);
}
@Test
public void diskVmElementWithPassDiscardExists() {
testExistenceOfDiskVmElementWithPassDiscard(true,
Arrays.asList(createDiskVmElementWithPassDiscardValue(false),
createDiskVmElementWithPassDiscardValue(true)));
}
@Test
public void diskVmElementWithPassDiscardDoesNotExist() {
testExistenceOfDiskVmElementWithPassDiscard(false,
Arrays.asList(createDiskVmElementWithPassDiscardValue(false),
createDiskVmElementWithPassDiscardValue(false)));
}
private DiskVmElement createDiskVmElementWithPassDiscardValue(boolean passDiscard) {
DiskVmElement diskVmElement = new DiskVmElement();
diskVmElement.setPassDiscard(passDiscard);
return diskVmElement;
}
private void testExistenceOfDiskVmElementWithPassDiscard(boolean expectedResult,
List<DiskVmElement> diskVmElements) {
when(diskVmElementDao.getAllDiskVmElementsByDiskId(any())).thenReturn(diskVmElements);
assertEquals(expectedResult, postDeleteActionHandler.diskVmElementWithPassDiscardExists(Guid.Empty));
}
private void assertPostZeroValue(ParametersWithPostDeleteAction parameters, boolean postZeroExpectedValue) {
assertEquals(MessageFormat.format(
"Wrong VDS command parameters: 'postZero' should be {0}.", postZeroExpectedValue),
parameters.getPostZero(), postZeroExpectedValue);
}
private void assertDiscardValue(boolean discardAfterDelete, Boolean supportsDiscard,
boolean expectedFixedDiscardParameter, boolean diskAttachedToAtLeastOneVmWithEnableDiscard) {
StorageDomain storageDomain = new StorageDomain();
storageDomain.setDiscardAfterDelete(discardAfterDelete);
storageDomain.setSupportsDiscard(supportsDiscard);
ParametersWithPostDeleteAction params =
new ParametersWithPostDeleteAction(false, storageDomain.isDiscardAfterDelete());
injectorRule.bind(AuditLogableBase.class, auditLogableBase);
doReturn(diskAttachedToAtLeastOneVmWithEnableDiscard)
.when(postDeleteActionHandler).diskVmElementWithPassDiscardExists(any());
assertEquals(expectedFixedDiscardParameter,
postDeleteActionHandler.fixDiscardField(params, storageDomain).isDiscard());
}
private static class ParametersWithPostDeleteAction
extends StoragePoolDomainAndGroupIdBaseVDSCommandParameters implements PostDeleteAction {
private boolean postZero;
private boolean discard;
public ParametersWithPostDeleteAction(boolean postZero, boolean discard) {
setPostZero(postZero);
setDiscard(discard);
}
@Override
public boolean getPostZero() {
return postZero;
}
@Override
public void setPostZero(boolean postZero) {
this.postZero = postZero;
}
@Override
public boolean isDiscard() {
return discard;
}
@Override
public void setDiscard(boolean discard) {
this.discard = discard;
}
}
}