package org.ovirt.engine.core.bll.memory; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.doReturn; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.function.Predicate; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.compat.Guid; @RunWith(MockitoJUnitRunner.class) public class MemoryStorageHandlerTest { private StorageDomain validStorageDomain1; private StorageDomain validStorageDomain2; private StorageDomain validStorageDomain3; private StorageDomain invalidStorageDomain1; private StorageDomain invalidStorageDomain2; private StorageDomain invalidStorageDomain3; private List<DiskImage> memoryDisks; private List<DiskImage> vmDisks; @Spy private MemoryStorageHandler memoryStorageHandler; @Before public void setUp() { memoryDisks = new LinkedList<>(); vmDisks = new LinkedList<>(); initStorageDomains(); initFilters(); initComparators(); } @Test public void filterAllDomainsExceptForTheFirstOne() { filterAllStorageDomainsExceptOne(Arrays.asList( validStorageDomain1, invalidStorageDomain1, invalidStorageDomain2), validStorageDomain1); } @Test public void filterAllDomainsExceptForTheSecondOne() { filterAllStorageDomainsExceptOne(Arrays.asList( invalidStorageDomain1, validStorageDomain1, invalidStorageDomain2), validStorageDomain1); } @Test public void filterAllDomainsExceptForTheThirdOne() { filterAllStorageDomainsExceptOne(Arrays.asList( invalidStorageDomain1, invalidStorageDomain2, validStorageDomain1), validStorageDomain1); } @Test public void filterAllDomains() { List<StorageDomain> filteredStorageDomains = memoryStorageHandler.filterStorageDomains( Arrays.asList(invalidStorageDomain1, invalidStorageDomain2, invalidStorageDomain3), memoryDisks); assertTrue(filteredStorageDomains.isEmpty()); } @Test public void sortStorageDomainsWithSingleComparator() { sortStorageDomains(Arrays.asList(validStorageDomain1, validStorageDomain3), Arrays.asList(validStorageDomain3, validStorageDomain1)); } @Test public void sortStorageDomainsWithWithMultipleComparators() { sortStorageDomains(Arrays.asList(validStorageDomain1, validStorageDomain2, validStorageDomain3), Arrays.asList(validStorageDomain3, validStorageDomain1, validStorageDomain2)); } @Test public void testFindStorageDomainForMemoryWithSingleDomain() { verifyDomainForMemory(Collections.singletonList(validStorageDomain1), validStorageDomain1); } @Test public void testFindStorageDomainForMemory() { verifyDomainForMemory( Arrays.asList(invalidStorageDomain1, validStorageDomain1, invalidStorageDomain2, validStorageDomain2, invalidStorageDomain3, validStorageDomain3), validStorageDomain3); } @Test public void testFindStorageDomainForMemoryWithEmptyDomainsList() { verifyNoDomainForMemory(Collections.emptyList()); } @Test public void testFindStorageDomainForMemoryWithSingleInvalidDomain() { verifyNoDomainForMemory(Collections.singletonList(invalidStorageDomain1)); } private void initStorageDomains() { validStorageDomain1 = initStorageDomain(); validStorageDomain2 = initStorageDomain(); validStorageDomain3 = initStorageDomain(); invalidStorageDomain1 = initStorageDomain(); invalidStorageDomain2 = initStorageDomain(); invalidStorageDomain3 = initStorageDomain(); } private void initFilters() { List<Predicate<StorageDomain>> storageDomainFilters = Arrays.asList( d -> !d.equals(invalidStorageDomain1), d -> !d.equals(invalidStorageDomain2), d -> !d.equals(invalidStorageDomain3)); doReturn(storageDomainFilters).when(memoryStorageHandler).getStorageDomainFilters(memoryDisks); } private void initComparators() { List<Comparator<StorageDomain>> comparators = Arrays.asList( Comparator.comparing((StorageDomain sd) -> sd.equals(validStorageDomain2)), Comparator.comparing((StorageDomain sd) -> sd.equals(validStorageDomain3)).reversed()); doReturn(comparators).when(memoryStorageHandler).getStorageDomainComparators(anyList()); } private StorageDomain initStorageDomain() { StorageDomain storageDomain = new StorageDomain(); storageDomain.setId(Guid.newGuid()); return storageDomain; } private void filterAllStorageDomainsExceptOne(List<StorageDomain> storageDomains, StorageDomain expectedStorageDomain) { List<StorageDomain> filteredStorageDomains = new ArrayList<>( memoryStorageHandler.filterStorageDomains(storageDomains, memoryDisks)); assertEquals(filteredStorageDomains, Collections.singletonList(expectedStorageDomain)); } private void verifyDomainForMemory(List<StorageDomain> storageDomains, StorageDomain expectedStorageDomain) { StorageDomain storageDomain = memoryStorageHandler.findStorageDomainForMemory(storageDomains, memoryDisks, vmDisks); assertEquals(expectedStorageDomain, storageDomain); } private void verifyNoDomainForMemory(List<StorageDomain> storageDomains) { StorageDomain storageDomain = memoryStorageHandler.findStorageDomainForMemory(storageDomains, memoryDisks, vmDisks); assertNull(storageDomain); } private void sortStorageDomains(List<StorageDomain> domainsInPool, List<StorageDomain> expectedSortedList) { memoryStorageHandler.sortStorageDomains(domainsInPool, vmDisks); assertEquals(domainsInPool, expectedSortedList); } }