package org.ovirt.engine.core.bll.profiles;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.common.businessentities.aaa.DbUser;
import org.ovirt.engine.core.common.businessentities.profiles.DiskProfile;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.ImageStatus;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.PermissionDao;
import org.ovirt.engine.core.dao.profiles.DiskProfileDao;
import org.ovirt.engine.core.utils.RandomUtils;
@RunWith(MockitoJUnitRunner.class)
public class DiskProfileHelperTest {
private static final Guid STORAGE_DOMAIN_1 = Guid.newGuid();
private static final Guid STORAGE_DOMAIN_2 = Guid.newGuid();
private static final Guid USER_ENTITY_ID = Guid.newGuid();
@Mock
private DiskProfileDao diskProfileDao;
@Mock
private PermissionDao permissionDao;
@Spy
@InjectMocks
private DiskProfileHelper diskProfileHelper = new DiskProfileHelper();
private DiskProfile diskProfile_a;
private DiskProfile diskProfile_b;
private DiskImage diskImage;
private DbUser dbUser;
private Map<DiskImage, Guid> map = new HashMap<>();
@Before
public void setUp() {
dbUser = new DbUser();
dbUser.setId(USER_ENTITY_ID);
diskProfile_a = diskProfileHelper.createDiskProfile(STORAGE_DOMAIN_1, "disk_profile_A");
diskProfile_b = diskProfileHelper.createDiskProfile(STORAGE_DOMAIN_2, "disk_profile_B");
diskImage = createDisk();
map.clear();
when(diskProfileHelper.isDiskProfileParentEntityValid(any(), any())).thenReturn(ValidationResult.VALID);
doReturn(Guid.newGuid()).when(permissionDao).getEntityPermissions(any(), any(), any(), any());
doReturn(Collections.singletonList(diskProfile_a)).when(diskProfileDao).getAllForStorageDomain
(STORAGE_DOMAIN_1);
doReturn(Collections.singletonList(diskProfile_b)).when(diskProfileDao).getAllForStorageDomain
(STORAGE_DOMAIN_2);
}
private DiskImage createDisk() {
DiskImage disk = new DiskImage();
disk.setId(Guid.newGuid());
disk.setDiskAlias(RandomUtils.instance().nextString(10));
disk.setActive(true);
disk.setImageStatus(ImageStatus.OK);
ArrayList<Guid> storageDomainIds = new ArrayList<>();
storageDomainIds.add(STORAGE_DOMAIN_1);
storageDomainIds.add(STORAGE_DOMAIN_2);
disk.setStorageIds(storageDomainIds);
return disk;
}
@Test
public void setAndValidateWithoutDiskProfilesTest() {
map.put(diskImage, STORAGE_DOMAIN_1);
assertEquals(ValidationResult.VALID, diskProfileHelper.setAndValidateDiskProfiles(map, dbUser));
}
@Test
public void setAndValidateSingleProfileTest() {
diskImage.setDiskProfileId(diskProfile_a.getId());
map.put(diskImage, STORAGE_DOMAIN_1);
assertEquals(ValidationResult.VALID, diskProfileHelper.setAndValidateDiskProfiles(map, dbUser));
}
@Test
public void setAndValidateMultipleStorageDomainsAndDiskProfilesTest() {
diskImage.setDiskProfileIds(new ArrayList<>(Arrays.asList(diskProfile_a.getId(), diskProfile_b.getId())));
map.put(diskImage, STORAGE_DOMAIN_1);
assertEquals(ValidationResult.VALID, diskProfileHelper.setAndValidateDiskProfiles(map, dbUser));
diskImage.setDiskProfileIds(new ArrayList<>(Arrays.asList(diskProfile_a.getId(), diskProfile_b.getId())));
map.clear();
map.put(diskImage, STORAGE_DOMAIN_2);
assertEquals(ValidationResult.VALID, diskProfileHelper.setAndValidateDiskProfiles(map, dbUser));
map.clear();
}
@Test
public void noDiskProfileAssociatedToStorageDomainFailureTest() {
map.put(diskImage, STORAGE_DOMAIN_2);
diskProfileHelper.setAndValidateDiskProfiles(map, dbUser);
map.clear();
map.put(diskImage, STORAGE_DOMAIN_1);
assertThat(diskProfileHelper.setAndValidateDiskProfiles(map, dbUser), failsWith(EngineMessage
.ACTION_TYPE_DISK_PROFILE_NOT_FOUND_FOR_STORAGE_DOMAIN));
}
}