package org.ovirt.engine.core.bll; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.junit.Test; import org.mockito.Mock; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.queries.GetUserVmsByUserIdAndGroupsParameters; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.VmDao; public class GetUserVmsByUserIdAndGroupsQueryTest extends AbstractUserQueryTest<GetUserVmsByUserIdAndGroupsParameters, GetUserVmsByUserIdAndGroupsQuery<GetUserVmsByUserIdAndGroupsParameters>> { @Mock private VmDao vmDaoMock; /** Tests that executing a query with the same user works when requesting disks */ @Test public void testQueryWithSameUserAndDisks() { assertExecuteQueryCommandResult(getUser().getId(), true, true); } /** Tests that executing a query with the same user works when not requesting disks */ @Test public void testQueryWithSameUserNoDisks() { assertExecuteQueryCommandResult(getUser().getId(), false, true); } @SuppressWarnings("rawtypes") public void assertExecuteQueryCommandResult(Guid requestedUser, boolean includeDiskData, boolean expectedResults) { mockQueryParameters(requestedUser, includeDiskData); // Mock the result of the Dao final VM expectedVM = mockVMFromDao(requestedUser); final DiskImage expectedDisk = mockDisk(); final ArrayList<DiskImage> snapshots = mockSnapshots(); DiskImage expectedSnapshot = snapshots.get(0); // Mock the disks, if needed if (includeDiskData) { doAnswer(invocation -> { expectedDisk.getSnapshots().addAll(snapshots); expectedVM.getDiskMap().put(expectedDisk.getId(), expectedDisk); expectedVM.getDiskList().add(expectedDisk); return null; }).when(getQuery()).updateDisksFromDB(expectedVM); doNothing().when(getQuery()).fillImagesBySnapshots(expectedVM); } doNothing().when(getQuery()).updateVmInit(expectedVM); doNothing().when(getQuery()).updateVmGuestAgentVersion(expectedVM); getQuery().executeQueryCommand(); @SuppressWarnings("unchecked") List<VM> actualVMs = getQuery().getQueryReturnValue().getReturnValue(); if (!expectedResults) { assertTrue("no VMs should have been returned", actualVMs.isEmpty()); } else { assertEquals("wrong number of VMs returned", 1, actualVMs.size()); VM actualVM = actualVMs.get(0); assertEquals("wrong VMs returned", expectedVM, actualVM); if (includeDiskData) { assertEquals("Wrong number of disks on VM", 1, actualVM.getDiskList().size()); DiskImage actualDisk = actualVM.getDiskList().get(0); assertEquals("Wrong disk on VM", expectedDisk, actualDisk); assertEquals("Wrong number of snapshots", 1, actualDisk.getSnapshots().size()); DiskImage actualSnapshot = actualDisk.getSnapshots().get(0); assertEquals("Wrong snapshot", expectedSnapshot, actualSnapshot); } } } /** * Adds additional parameters to the parameters object * @param requestedUser The user to get the VMs for * @param includeDiskData Whether or not to include disk data */ private void mockQueryParameters(Guid requestedUser, boolean includeDiskData) { when(getQuery().getUserID()).thenReturn(requestedUser); when(getQueryParameters().getIncludeDiskData()).thenReturn(includeDiskData); } /** * Mocks the Daos to return a VM * @param requestedUser The user on the parameter object to return the VM for * @return The VM the mocked Dao will return */ private VM mockVMFromDao(Guid requestedUser) { VM expectedVM = new VM(); when(vmDaoMock.getAllForUserWithGroupsAndUserRoles(requestedUser)).thenReturn(Collections.singletonList(expectedVM)); return expectedVM; } /** @return A disk to add to the VM */ private static DiskImage mockDisk() { // Prepare the disk Guid diskGuid = Guid.newGuid(); Guid itGuid = Guid.newGuid(); final DiskImage expectedDisk = new DiskImage(); expectedDisk.setImageId(diskGuid); expectedDisk.setImageTemplateId(itGuid); return expectedDisk; } /** @return The snapshots to add to the disk */ private static ArrayList<DiskImage> mockSnapshots() { Guid snapshotGuid = Guid.newGuid(); DiskImage expectedSnapshot = new DiskImage(); expectedSnapshot.setImageId(snapshotGuid); ArrayList<DiskImage> snapshots = new ArrayList<>(1); snapshots.add(expectedSnapshot); return snapshots; } }