package org.ovirt.engine.core.bll.storage.disk.image;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
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.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.AbstractQueryTest;
import org.ovirt.engine.core.bll.context.EngineContext;
import org.ovirt.engine.core.bll.interfaces.BackendInternal;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.storage.Disk;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend;
import org.ovirt.engine.core.common.queries.GetUnregisteredDiskQueryParameters;
import org.ovirt.engine.core.common.queries.GetUnregisteredDisksQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.common.vdscommands.GetImagesListVDSCommandParameters;
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.dao.DiskImageDao;
import org.ovirt.engine.core.dao.StorageDomainDao;
@RunWith(MockitoJUnitRunner.class)
public class GetUnregisteredDisksQueryTest
extends
AbstractQueryTest<GetUnregisteredDisksQueryParameters, GetUnregisteredDisksQuery<GetUnregisteredDisksQueryParameters>> {
@Mock
private StorageDomainDao storageDomainDaoMock;
@Mock
private DiskImageDao diskImageDaoMock;
@Mock
private VDSBrokerFrontend vdsBroker;
@Mock
private BackendInternal backendMock;
private Guid importDiskId;
private Guid existingDiskId;
private Guid storageDomainId;
private Guid storagePoolId;
private List<Guid> importDiskIds;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
importDiskId = Guid.newGuid();
existingDiskId = Guid.newGuid();
storageDomainId = Guid.newGuid();
storagePoolId = Guid.newGuid();
// Wrapping the list in a new ArrayList as this will eventually be modified by the GetUnregisteredDisksQuery command and
// Arrays returned by Arrays.asList are immutable. The wrapping allows for mutability.
importDiskIds = new ArrayList<>(Arrays.asList(importDiskId, existingDiskId));
prepareMocks();
}
@Test
public void testGetUnregisteredDisks() {
StorageDomain storageDomain = new StorageDomain();
when(storageDomainDaoMock.get(storageDomainId)).thenReturn(storageDomain);
// Execute query
getQuery().executeQueryCommand();
// Assert the query's results
@SuppressWarnings("unchecked")
List<Disk> newDisks = getQuery().getQueryReturnValue().getReturnValue();
assertEquals(1, newDisks.size());
assertEquals(importDiskId, newDisks.get(0).getId());
}
/**
* Mock the VDSBroker and the Daos
*/
private void prepareMocks() {
DiskImage existingDiskImage = mock(DiskImage.class);
when(existingDiskImage.getId()).thenReturn(existingDiskId);
List<DiskImage> existingDiskImages = Collections.singletonList(existingDiskImage);
// Mock the get images List VDS command
VDSReturnValue volListReturnValue = new VDSReturnValue();
volListReturnValue.setSucceeded(true);
volListReturnValue.setReturnValue(importDiskIds);
doReturn(volListReturnValue).when(vdsBroker).runVdsCommand(eq(VDSCommandType.GetImagesList),
any(GetImagesListVDSCommandParameters.class));
// Mock the get unregistered disk query
when(backendMock.runInternalQuery(eq(VdcQueryType.GetUnregisteredDisk), any(GetUnregisteredDiskQueryParameters.class), any(EngineContext.class)))
.thenAnswer(invocation -> {
GetUnregisteredDiskQueryParameters p = (GetUnregisteredDiskQueryParameters) invocation
.getArguments()[1];
VdcQueryReturnValue unregDiskReturnValue = new VdcQueryReturnValue();
unregDiskReturnValue.setSucceeded(true);
DiskImage newDiskImage = mock(DiskImage.class);
when(newDiskImage.getId()).thenReturn(p.getDiskId());
unregDiskReturnValue.setReturnValue(newDiskImage);
return unregDiskReturnValue;
});
doReturn(storagePoolId).when(getQuery()).getStoragePoolId();
doReturn(storageDomainId).when(getQuery()).getStorageDomainId();
when(diskImageDaoMock.getAllSnapshotsForStorageDomain(eq(storageDomainId))).thenReturn(existingDiskImages);
}
}