package org.ovirt.engine.core.bll; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static org.mockito.Mockito.when; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.spy; import static org.mockito.Matchers.*; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.common.action.RestoreAllSnapshotsParameters; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; 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_domains; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend; import org.ovirt.engine.core.common.vdscommands.IrsBaseVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBaseMockUtils; import org.ovirt.engine.core.dao.DiskImageDAO; import org.ovirt.engine.core.dao.StorageDomainDAO; import org.ovirt.engine.core.dao.VmDAO; import org.ovirt.engine.core.dao.VmDynamicDAO; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest({ DbFacade.class, Backend.class, Config.class }) public class RestoreAllSnapshotCommandTest { @Mock private VDSBrokerFrontend vdsBrokerFrontend; @Mock private VmDAO vmDAO; @Mock private VmDynamicDAO vmDynamicDAO; @Mock private BackendInternal backend; @Mock private DiskImageDAO diskImageDAO; @Mock private StorageDomainDAO storageDomainDAO; @Mock private DbFacade dbFacade; private Guid vmId = Guid.NewGuid(); private Guid diskImageId = Guid.NewGuid(); private Guid storageDomainId = Guid.NewGuid(); private Guid dstSnapshotId = Guid.NewGuid(); private VmDynamic mockDynamicVm; private VM mockVm; private RestoreAllSnapshotsCommand<RestoreAllSnapshotsParameters> spyCommand; public RestoreAllSnapshotCommandTest() { MockitoAnnotations.initMocks(this); mockStatic(DbFacade.class); mockStatic(Backend.class); mockStatic(Config.class); } @Before public void setupCommand() { when(Backend.getInstance()).thenReturn(backend); when(backend.getResourceManager()).thenReturn(vdsBrokerFrontend); mockDaos(); mockConfig(); initSpyCommand(); mockVm(spyCommand); mockIsValidVdsCommand(); } /** * Checking if checkImagesExist validation is passing * * @throws Exception */ @Test public void validateInternalCommandWithValidImage() throws Exception { spyCommand.setInternalExecution(true); mockGetImageInfoVdsCommand(new DiskImage()); assertTrue(spyCommand.canDoAction()); } /** * Checking if checkImagesExist validation is passing * * @throws Exception */ @Test public void validateNotInternalCommandWithValidImage() throws Exception { spyCommand.setInternalExecution(false); mockGetImageInfoVdsCommand(new DiskImage()); assertTrue(spyCommand.canDoAction()); } /** * Checking if for checkImagesExist there is no validation when the command is internal * * @throws Exception */ @Test public void validateInternalCommandWithInInValidImage() throws Exception { spyCommand.setInternalExecution(true); mockGetImageInfoVdsCommand(null); assertTrue(spyCommand.canDoAction()); } /** * Checking if there is validation for checkImagesExist. * * @throws Exception */ @Test public void validateNotInternalCommandWithInValidImage() throws Exception { spyCommand.setInternalExecution(false); mockGetImageInfoVdsCommand(null); assertFalse(spyCommand.canDoAction()); assertTrue(spyCommand.getReturnValue() .getCanDoActionMessages() .contains(VdcBllMessages.ACTION_TYPE_FAILED_VM_IMAGE_DOES_NOT_EXIST.toString())); } private List<DiskImage> createDiskImageList() { DiskImage disk = new DiskImage(); disk.setId(diskImageId); disk.setstorage_id(storageDomainId); List<DiskImage> diskImageList = new ArrayList<DiskImage>(); diskImageList.add(disk); return diskImageList; } /** * Returns image is valid. */ private void mockIsValidVdsCommand() { VDSReturnValue returnValue = new VDSReturnValue(); returnValue.setReturnValue(Boolean.TRUE); when(backend.getResourceManager().RunVdsCommand(eq(VDSCommandType.IsValid), any(IrsBaseVDSCommandParameters.class))).thenReturn(returnValue); } /** * Returns if image exists. */ private void mockGetImageInfoVdsCommand(DiskImage result) { VDSReturnValue returnValue = new VDSReturnValue(); returnValue.setReturnValue(result); when(backend.getResourceManager().RunVdsCommand(eq(VDSCommandType.GetImageInfo), any(IrsBaseVDSCommandParameters.class))).thenReturn(returnValue); } private void mockConfig() { when(Config.<Object> GetValue(ConfigValues.FreeSpaceLow)).thenReturn(new Integer("5")); when(Config.<Object> GetValue(ConfigValues.FreeSpaceCriticalLowInGB)).thenReturn(new Integer("5")); } private void initSpyCommand() { RestoreAllSnapshotsParameters parameters = new RestoreAllSnapshotsParameters(vmId, dstSnapshotId); List<DiskImage> diskImageList = createDiskImageList(); parameters.setImagesList(diskImageList); spyCommand = spy(new RestoreAllSnapshotsCommand<RestoreAllSnapshotsParameters>(parameters)); } private void mockDaos() { when(DbFacade.getInstance()).thenReturn(dbFacade); mockDiskImageDao(); mockStorageDomainDao(); mockDynamicVmDao(); } private void mockDynamicVmDao() { mockDynamicVm = getVmDynamic(); when(dbFacade.getVmDynamicDAO()).thenReturn(vmDynamicDAO); when(vmDynamicDAO.get(vmId)).thenReturn(mockDynamicVm); } /** * Mock disk image Dao. */ private void mockDiskImageDao() { List<DiskImage> diskImageList = new ArrayList<DiskImage>(); DiskImage diskImage = new DiskImage(); diskImage.setstorage_id(Guid.NewGuid()); diskImageList.add(diskImage); when(dbFacade.getDiskImageDAO()).thenReturn(diskImageDAO); when(diskImageDAO.getAllForVm(vmId)).thenReturn(diskImageList); } private void mockStorageDomainDao() { storage_domains storageDomains = new storage_domains(); storageDomains.setstatus(StorageDomainStatus.Active); // Variables only for passing the available size check. storageDomains.setavailable_disk_size(new Integer("10000000")); storageDomains.setused_disk_size(new Integer("10")); when(dbFacade.getStorageDomainDAO()).thenReturn(storageDomainDAO); when(storageDomainDAO.getForStoragePool(storageDomainId, Guid.Empty)).thenReturn(storageDomains); when(storageDomainDAO.get(storageDomainId)).thenReturn(storageDomains); } /** * Mock a VM. */ private VM mockVm(RestoreAllSnapshotsCommand<RestoreAllSnapshotsParameters> restoreAllSnapshotsCommand) { VM vm = new VM(); vm.setvm_guid(vmId); vm.setstatus(VMStatus.Down); AuditLogableBaseMockUtils.mockVmDao(restoreAllSnapshotsCommand, vmDAO); when(vmDAO.getById(vmId)).thenReturn(vm); return vm; } /** * Mock a VM. */ private VmDynamic getVmDynamic() { VmDynamic vmDynamic = new VmDynamic(); vmDynamic.setId(vmId); vmDynamic.setstatus(VMStatus.Down); return vmDynamic; } }