package org.ovirt.engine.core.bll.storage.disk.image;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import java.util.ArrayList;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.ValidateTestUtils;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.bll.utils.PermissionSubject;
import org.ovirt.engine.core.bll.validator.storage.DiskImagesValidator;
import org.ovirt.engine.core.bll.validator.storage.DiskValidator;
import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.TransferDiskImageParameters;
import org.ovirt.engine.core.common.businessentities.ActionGroup;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.StorageDomainDao;
@RunWith(MockitoJUnitRunner.class)
public class TransferDiskImageCommandTest extends TransferImageCommandTest {
@Mock
DiskValidator diskValidator;
@Mock
DiskImagesValidator diskImagesValidator;
@Mock
StorageDomainValidator storageDomainValidator;
@Mock
StorageDomainDao storageDomainDao;
@Override
protected TransferDiskImageCommand spyCommand() {
return new TransferDiskImageCommand(new TransferDiskImageParameters(), null);
}
@Before
public void setUp() {
initCommand();
}
protected void initializeSuppliedImage() {
super.initSuppliedImage(transferImageCommand);
DiskImage diskImage = new DiskImage();
diskImage.setStorageIds(new ArrayList<>(Collections.singletonList(Guid.newGuid())));
doReturn(diskImage).when(diskDao).get(any());
doReturn(diskValidator).when(getCommand()).getDiskValidator(any());
doReturn(diskImagesValidator).when(getCommand()).getDiskImagesValidator(any());
doReturn(storageDomainValidator).when(getCommand()).getStorageDomainValidator(any());
}
@Test
public void validate() {
initializeSuppliedImage();
assertTrue(getCommand().validate());
}
@Test
public void validateCantUploadLockedImage() {
initializeSuppliedImage();
doReturn(new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_DISKS_LOCKED, ""))
.when(diskImagesValidator)
.diskImagesNotLocked();
getCommand().validate();
ValidateTestUtils.assertValidationMessages(
"Can't start a transfer for a locked image.",
getCommand(),
EngineMessage.ACTION_TYPE_FAILED_DISKS_LOCKED);
}
@Test
public void validateCantUploadDiskAttached() {
initializeSuppliedImage();
doReturn(new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_DISK_ATTACHED_TO_VMS, ""))
.when(diskValidator)
.isDiskAttachedToAnyVm();
getCommand().validate();
ValidateTestUtils.assertValidationMessages(
"Can't start a transfer for an image that is attached to any VMs.",
getCommand(),
EngineMessage.ACTION_TYPE_FAILED_DISK_ATTACHED_TO_VMS);
}
@Test
public void validateCantUploadDiskNotExists() {
initializeSuppliedImage();
doReturn(new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_DISK_NOT_EXIST, ""))
.when(diskValidator)
.isDiskExists();
getCommand().validate();
ValidateTestUtils.assertValidationMessages(
"Can't start a transfer for image that doesn't exist.",
getCommand(),
EngineMessage.ACTION_TYPE_FAILED_DISK_NOT_EXIST);
}
@Test
public void validateCantUploadIllegalImage() {
initializeSuppliedImage();
doReturn(new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_DISKS_ILLEGAL, ""))
.when(diskImagesValidator)
.diskImagesNotIllegal();
getCommand().validate();
ValidateTestUtils.assertValidationMessages(
"Can't start a transfer for an illegal image.",
getCommand(),
EngineMessage.ACTION_TYPE_FAILED_DISKS_ILLEGAL);
}
@Test
public void validateCantUploadToNonActiveDomain() {
initializeSuppliedImage();
doReturn(new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL2, ""))
.when(storageDomainValidator)
.isDomainExistAndActive();
ValidateTestUtils.runAndAssertValidateFailure(
"Can't start a transfer to a non-active storage domain.",
getCommand(),
EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL2);
}
@Test
public void testPermissionSubjectOnProvidedImage() {
initializeSuppliedImage();
assertEquals(getCommand().getPermissionCheckSubjects().get(0),
new PermissionSubject(getCommand().getParameters().getImageId(),
VdcObjectType.Disk,
ActionGroup.EDIT_DISK_PROPERTIES));
}
@Test
public void testPermissionSubjectOnNewImage() {
assertEquals(getCommand().getPermissionCheckSubjects().get(0),
new PermissionSubject(getCommand().getParameters().getImageId(),
VdcObjectType.Storage,
ActionGroup.CREATE_DISK));
}
private TransferDiskImageCommand<TransferDiskImageParameters> getCommand() {
return (TransferDiskImageCommand) transferImageCommand;
}
}