package org.ovirt.engine.core.bll.snapshots; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.ovirt.engine.core.bll.BaseCommandTest; import org.ovirt.engine.core.bll.ValidateTestUtils; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.bll.validator.storage.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator; import org.ovirt.engine.core.common.action.RemoveDiskSnapshotsParameters; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.DiskImageDao; import org.ovirt.engine.core.dao.StoragePoolDao; /** A test case for the {@link RemoveDiskSnapshotsCommand} class. */ public class RemoveDiskSnapshotsCommandTest extends BaseCommandTest { @Spy @InjectMocks private RemoveDiskSnapshotsCommand<RemoveDiskSnapshotsParameters> cmd = createCommand(); @Mock private DiskImageDao diskImageDao; @Mock private StoragePoolDao spDao; @Mock private SnapshotsValidator snapshotsValidator; @Mock private StorageDomainValidator storageDomainValidator; private VmValidator vmValidator; private static final Guid STORAGE_DOMAIN_ID = Guid.newGuid(); private static final Guid STORAGE_POOLD_ID = Guid.newGuid(); private static final Guid IMAGE_ID_1 = Guid.newGuid(); private static final Guid IMAGE_ID_2 = Guid.newGuid(); private static RemoveDiskSnapshotsCommand<RemoveDiskSnapshotsParameters> createCommand() { RemoveDiskSnapshotsParameters params = new RemoveDiskSnapshotsParameters( new ArrayList<>(Arrays.asList(IMAGE_ID_1, IMAGE_ID_2))); Guid vmGuid = Guid.newGuid(); params.setContainerId(vmGuid); return new RemoveDiskSnapshotsCommand<>(params, null); } @Before public void setUp() { doReturn(storageDomainValidator).when(cmd).getStorageDomainValidator(); doReturn(STORAGE_POOLD_ID).when(cmd).getStoragePoolId(); doReturn(mockImages()).when(cmd).getImages(); mockVm(); vmValidator = spy(new VmValidator(cmd.getVm())); doReturn(vmValidator).when(cmd).createVmValidator(any(VM.class)); DiskImagesValidator diskImagesValidator = spy(new DiskImagesValidator(mockImages())); doReturn(diskImagesValidator).when(cmd).createDiskImageValidator(anyList()); doReturn(ValidationResult.VALID).when(diskImagesValidator).diskImagesSnapshotsNotAttachedToOtherVms(false); } private void mockVm() { VM vm = new VM(); vm.setId(Guid.newGuid()); vm.setStatus(VMStatus.Down); vm.setStoragePoolId(STORAGE_POOLD_ID); doReturn(vm).when(cmd).getVm(); } private void prepareForVmValidatorTests() { StoragePool sp = new StoragePool(); sp.setId(STORAGE_POOLD_ID); sp.setStatus(StoragePoolStatus.Up); cmd.setSnapshotName("someSnapshot"); doReturn(true).when(cmd).validateAllDiskImages(); doReturn(sp).when(spDao).get(STORAGE_POOLD_ID); } private List<DiskImage> mockImages() { DiskImage image1 = new DiskImage(); image1.setImageId(IMAGE_ID_1); image1.setStorageIds(new ArrayList<>(Collections.singletonList(STORAGE_DOMAIN_ID))); DiskImage image2 = new DiskImage(); image2.setImageId(IMAGE_ID_2); image2.setStorageIds(new ArrayList<>(Collections.singletonList(STORAGE_DOMAIN_ID))); return new ArrayList<>(Arrays.asList(image1, image2)); } @Test public void testValidateVmUpLiveMergeSupported() { prepareForVmValidatorTests(); cmd.getVm().setStatus(VMStatus.Up); doReturn(true).when(cmd).isDiskPlugged(); doReturn(ValidationResult.VALID).when(vmValidator).vmQualifiedForSnapshotMerge(); doReturn(true).when(cmd).validateStorageDomainAvailableSpace(); ValidateTestUtils.runAndAssertValidateSuccess(cmd); } }