package org.ovirt.engine.core.bll.snapshots; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; import java.util.ArrayList; 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.validator.VmValidator; import org.ovirt.engine.core.bll.validator.storage.MultipleStorageDomainsValidator; import org.ovirt.engine.core.common.action.RestoreAllSnapshotsParameters; import org.ovirt.engine.core.common.businessentities.Snapshot; import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotStatus; import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType; import org.ovirt.engine.core.common.businessentities.SnapshotActionEnum; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; 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.VmDynamic; import org.ovirt.engine.core.common.businessentities.storage.Disk; 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.DiskDao; import org.ovirt.engine.core.dao.SnapshotDao; import org.ovirt.engine.core.dao.StoragePoolDao; import org.ovirt.engine.core.dao.VmDao; import org.ovirt.engine.core.dao.VmDynamicDao; public class RestoreAllSnapshotsCommandTest extends BaseCommandTest { @Mock private VmDao vmDao; @Mock private VmDynamicDao vmDynamicDao; @Mock private DiskDao diskDao; @Mock private StoragePoolDao storagePoolDao; @Mock protected SnapshotDao snapshotDao; @Mock private MultipleStorageDomainsValidator storageValidator; @Spy @InjectMocks private SnapshotsValidator snapshotsValidator; @Mock private VmValidator vmValidator; private Guid vmId = Guid.newGuid(); private Guid diskImageId = Guid.newGuid(); private Guid storageDomainId = Guid.newGuid(); private Guid spId = Guid.newGuid(); private Snapshot mockSnapshot; @Spy @InjectMocks private RestoreAllSnapshotsCommand<RestoreAllSnapshotsParameters> spyCommand = createCommand(); private RestoreAllSnapshotsCommand<RestoreAllSnapshotsParameters> createCommand() { RestoreAllSnapshotsParameters parameters = new RestoreAllSnapshotsParameters(vmId, SnapshotActionEnum.COMMIT); List<DiskImage> diskImageList = createDiskImageList(); parameters.setImages(diskImageList); return new RestoreAllSnapshotsCommand<>(parameters, null); } @Before public void setupCommand() { initSpyCommand(); mockDaos(); mockVm(); } @Test public void validateFailsOnSnapshotNotExists() { when(snapshotDao.exists(any(Guid.class), any(Guid.class))).thenReturn(false); ValidateTestUtils.runAndAssertValidateFailure (spyCommand, EngineMessage.ACTION_TYPE_FAILED_VM_SNAPSHOT_DOES_NOT_EXIST); } @Test public void validateFailsOnSnapshotTypeRegularNotInPreview() { mockSnapshotExists(); mockSnapshot = new Snapshot(); when(snapshotDao.exists(nullable(Guid.class), nullable(Guid.class))).thenReturn(true); mockSnapshotFromDb(); mockSnapshot.setType(SnapshotType.REGULAR); mockSnapshot.setStatus(SnapshotStatus.OK); ValidateTestUtils.runAndAssertValidateFailure (spyCommand, EngineMessage.ACTION_TYPE_FAILED_VM_SNAPSHOT_NOT_IN_PREVIEW); } private List<DiskImage> createDiskImageList() { DiskImage disk = new DiskImage(); disk.setImageId(diskImageId); disk.setStorageIds(new ArrayList<>(Collections.singletonList(storageDomainId))); return Collections.singletonList(disk); } private void mockSnapshotExists() { when(snapshotDao.exists(any(Guid.class), any(Guid.class))).thenReturn(true); } private void mockSnapshotFromDb() { mockSnapshot = new Snapshot(); mockSnapshot.setType(SnapshotType.STATELESS); when(snapshotDao.get(any(Guid.class), any(SnapshotType.class), any(SnapshotStatus.class))).thenReturn(mockSnapshot); when(snapshotDao.get(any(Guid.class), any(SnapshotType.class))).thenReturn(mockSnapshot); when(snapshotDao.get(any(Guid.class), any(SnapshotStatus.class))).thenReturn(mockSnapshot); } private void initSpyCommand() { doReturn(true).when(spyCommand).performImagesChecks(); doReturn(storageValidator).when(spyCommand).createStorageDomainValidator(); doReturn(vmValidator).when(spyCommand).createVmValidator(any(VM.class)); } private void mockDaos() { mockDiskImageDao(); mockStorageDomainDao(); mockStoragePoolDao(); mockDynamicVmDao(); } private void mockDynamicVmDao() { VmDynamic mockDynamicVm = getVmDynamic(); when(vmDynamicDao.get(vmId)).thenReturn(mockDynamicVm); } /** * Mock disk image Dao. */ private void mockDiskImageDao() { List<Disk> diskImageList = new ArrayList<>(); DiskImage diskImage = new DiskImage(); diskImage.setStorageIds(new ArrayList<>(Collections.singletonList(Guid.newGuid()))); diskImageList.add(diskImage); when(diskDao.getAllForVm(vmId)).thenReturn(diskImageList); } private void mockStorageDomainDao() { StorageDomain storageDomains = new StorageDomain(); storageDomains.setStatus(StorageDomainStatus.Active); // Variables only for passing the available size check. storageDomains.setAvailableDiskSize(10000000); storageDomains.setUsedDiskSize(10); } private void mockStoragePoolDao() { StoragePool sp = new StoragePool(); sp.setId(spId); sp.setStatus(StoragePoolStatus.Up); when(storagePoolDao.get(spId)).thenReturn(sp); } /** * Mock a VM. */ private VM mockVm() { VM vm = new VM(); vm.setId(vmId); vm.setStoragePoolId(spId); vm.setStatus(VMStatus.Down); when(vmDao.get(vmId)).thenReturn(vm); return vm; } /** * Mock a VM. */ private VmDynamic getVmDynamic() { VmDynamic vmDynamic = new VmDynamic(); vmDynamic.setId(vmId); vmDynamic.setStatus(VMStatus.Down); return vmDynamic; } }