// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package com.cloud.configuration; import com.cloud.exception.InvalidParameterValueException; import com.cloud.storage.StorageManager; import com.cloud.utils.net.NetUtils; import org.apache.cloudstack.framework.config.ConfigDepot; import org.apache.cloudstack.framework.config.ConfigKey; import com.cloud.dc.dao.DataCenterDao; import com.cloud.domain.Domain; import com.cloud.domain.dao.DomainDao; import com.cloud.offering.DiskOffering; import com.cloud.storage.DiskOfferingVO; import com.cloud.user.Account; import com.cloud.user.User; import com.cloud.utils.db.EntityManager; import com.cloud.utils.db.SearchCriteria; import org.apache.cloudstack.api.command.admin.offering.UpdateDiskOfferingCmd; import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO; import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import org.mockito.InjectMocks; import org.mockito.Spy; import java.util.ArrayList; import java.util.List; @RunWith(MockitoJUnitRunner.class) public class ConfigurationManagerImplTest { @Mock ConfigDepot configDepot; @InjectMocks ConfigurationManagerImpl configurationManagerImplSpy = Mockito.spy(new ConfigurationManagerImpl()); @Mock SearchCriteria searchCriteriaDiskOfferingDetailMock; @Mock DiskOffering diskOfferingMock; @Mock Account accountMock; @Mock User userMock; @Mock Domain domainMock; @Mock DataCenterDao zoneDaoMock; @Mock DomainDao domainDaoMock; @Mock EntityManager entityManagerMock; @Mock DiskOfferingDetailsDao diskOfferingDetailsDao; @Spy DiskOfferingVO diskOfferingVOSpy; @Mock UpdateDiskOfferingCmd updateDiskOfferingCmdMock; Long validId = 1L; Long invalidId = 100L; List filteredZoneIds = List.of(1L, 2L, 3L); List existingZoneIds = List.of(1L, 2L, 3L); List filteredDomainIds = List.of(1L, 2L, 3L); List existingDomainIds = List.of(1L, 2L, 3L); List emptyExistingZoneIds = new ArrayList<>(); List emptyExistingDomainIds = new ArrayList<>(); List emptyFilteredDomainIds = new ArrayList<>(); @Before public void setUp() throws Exception { configurationManagerImplSpy._configDepot = configDepot; } @Test public void validateIfIntValueIsInRangeTestValidValueReturnNull() { String testVariable = configurationManagerImplSpy.validateIfIntValueIsInRange("String name", "3", "1-5"); Assert.assertNull(testVariable); } @Test public void validateIfIntValueIsInRangeTestInvalidValueReturnString() { String testVariable = configurationManagerImplSpy.validateIfIntValueIsInRange("String name", "9", "1-5"); Assert.assertNotNull(testVariable); } @Test public void validateIfStringValueIsInRangeTestValidValuesReturnNull() { String testVariable; List methods = List.of("privateip", "hypervisorList", "instanceName", "domainName", "default"); Mockito.doReturn(null).when(configurationManagerImplSpy).validateRangePrivateIp(Mockito.anyString(), Mockito.anyString()); Mockito.doReturn(null).when(configurationManagerImplSpy).validateRangeHypervisorList(Mockito.anyString()); Mockito.doReturn(null).when(configurationManagerImplSpy).validateRangeInstanceName(Mockito.anyString()); Mockito.doReturn(null).when(configurationManagerImplSpy).validateRangeDomainName(Mockito.anyString()); Mockito.doReturn(null).when(configurationManagerImplSpy).validateRangeOther(Mockito.anyString(), Mockito.anyString(), Mockito.anyString()); for (String method : methods) { testVariable = configurationManagerImplSpy.validateIfStringValueIsInRange("name", "value", method); Assert.assertNull(testVariable); } } @Test public void validateIfStringValueIsInRangeTestInvalidValuesReturnString() { String testVariable; List methods = List.of("privateip", "hypervisorList", "instanceName", "domainName", "default"); Mockito.doReturn("returnMsg").when(configurationManagerImplSpy).validateRangePrivateIp(Mockito.anyString(), Mockito.anyString()); Mockito.doReturn("returnMsg").when(configurationManagerImplSpy).validateRangeHypervisorList(Mockito.anyString()); Mockito.doReturn("returnMsg").when(configurationManagerImplSpy).validateRangeInstanceName(Mockito.anyString()); Mockito.doReturn("returnMsg").when(configurationManagerImplSpy).validateRangeDomainName(Mockito.anyString()); Mockito.doReturn("returnMsg").when(configurationManagerImplSpy).validateRangeOther(Mockito.anyString(), Mockito.anyString(), Mockito.anyString()); for (String method : methods) { testVariable = configurationManagerImplSpy.validateIfStringValueIsInRange("name", "value", method); Assert.assertEquals("The provided value is not returnMsg.", testVariable); } } @Test public void validateIfStringValueIsInRangeTestMultipleRangesValidValueReturnNull() { Mockito.doReturn("returnMsg1").when(configurationManagerImplSpy).validateRangePrivateIp(Mockito.anyString(), Mockito.anyString()); Mockito.doReturn(null).when(configurationManagerImplSpy).validateRangeInstanceName(Mockito.anyString()); String testVariable = configurationManagerImplSpy.validateIfStringValueIsInRange("name", "value", "privateip", "instanceName", "default"); Assert.assertNull(testVariable); } @Test public void validateIfStringValueIsInRangeTestMultipleRangesInvalidValueReturnMessages() { Mockito.doReturn("returnMsg1").when(configurationManagerImplSpy).validateRangePrivateIp(Mockito.anyString(), Mockito.anyString()); Mockito.doReturn("returnMsg2").when(configurationManagerImplSpy).validateRangeInstanceName(Mockito.anyString()); Mockito.doReturn("returnMsg3").when(configurationManagerImplSpy).validateRangeOther(Mockito.anyString(), Mockito.anyString(), Mockito.anyString()); String testVariable = configurationManagerImplSpy.validateIfStringValueIsInRange("name", "value", "privateip", "instanceName", "default"); Assert.assertEquals("The provided value is neither returnMsg1 NOR returnMsg2 NOR returnMsg3.", testVariable); } @Test public void validateRangePrivateIpTestValidValueReturnNull() { try (MockedStatic ignored = Mockito.mockStatic(NetUtils.class)) { Mockito.when(NetUtils.isSiteLocalAddress(Mockito.anyString())).thenReturn(true); String testVariable = configurationManagerImplSpy.validateRangePrivateIp("name", "value"); Assert.assertNull(testVariable); } } @Test public void validateRangePrivateIpTestInvalidValueReturnString() { try (MockedStatic ignored = Mockito.mockStatic(NetUtils.class)) { Mockito.when(NetUtils.isSiteLocalAddress(Mockito.anyString())).thenReturn(false); String testVariable = configurationManagerImplSpy.validateRangePrivateIp("name", "value"); Assert.assertEquals("a valid site local IP address", testVariable); } } @Test public void validateRangeHypervisorListTestValidValueReturnNull() { String testVariable = configurationManagerImplSpy.validateRangeHypervisorList("Ovm3,VirtualBox,KVM,VMware"); Assert.assertNull(testVariable); } @Test public void validateRangeHypervisorListTestInvalidValueReturnString() { String testVariable = configurationManagerImplSpy.validateRangeHypervisorList("Ovm3,VirtualBox,KVM,VMware,Any,InvalidHypervisorName"); Assert.assertEquals("a valid hypervisor type", testVariable); } @Test public void validateRangeInstanceNameTestValidValueReturnNull() { try (MockedStatic ignored = Mockito.mockStatic(NetUtils.class)) { Mockito.when(NetUtils.verifyInstanceName(Mockito.anyString())).thenReturn(true); String testVariable = configurationManagerImplSpy.validateRangeInstanceName("ThisStringShouldBeValid"); Assert.assertNull(testVariable); } } @Test public void validateRangeInstanceNameTestInvalidValueReturnString() { try (MockedStatic ignored = Mockito.mockStatic(NetUtils.class)) { Mockito.when(NetUtils.verifyInstanceName(Mockito.anyString())).thenReturn(false); String testVariable = configurationManagerImplSpy.validateRangeInstanceName("This string should not be valid."); Assert.assertEquals("a valid instance name (instance names cannot contain hyphens, spaces or plus signs)", testVariable); } } @Test public void validateRangeDomainNameTestValueDoesNotStartWithStarAndIsAValidValueReturnNull() { String testVariable = configurationManagerImplSpy.validateRangeDomainName("ThisStringShould.Work"); Assert.assertNull(testVariable); } @Test public void validateRangeDomainNameTestValueDoesNotStartWithStarAndIsAValidValueButIsOver238charactersLongReturnString() { String testVariable = configurationManagerImplSpy.validateRangeDomainName("ThisStringDoesNotStartWithStarAndIsOverTwoHundredAndForty.CharactersLongWithAtLeast" + "OnePeriodEverySixtyFourLetters.ThisShouldCauseAnErrorBecauseItIsTooLong.TheRestOfThisAreRandomlyGeneratedCharacters.gNXhNOBNTNAoMCQqJMzcvFSBwHUhmWHftjfTNUaHR"); Assert.assertEquals("a valid domain name", testVariable); } @Test public void validateRangeDomainNameTestValueDoesNotStartWithStarAndIsNotAValidValueReturnString() { String testVariable = configurationManagerImplSpy.validateRangeDomainName("ThisStringDoesNotMatchThePatternFor.DomainNamesSinceItHas1NumberInTheLastPartOfTheString"); Assert.assertEquals("a valid domain name", testVariable); } @Test public void validateRangeDomainNameTestValueStartsWithStarAndIsAValidValueReturnNull() { String testVariable = configurationManagerImplSpy.validateRangeDomainName("*.ThisStringStartsWithAStarAndAPeriod.ThisShouldWorkEvenThoughItIsOverTwoHundredAnd" + "ThirtyEight.CharactersLong.BecauseTheFirstTwoCharactersAreIgnored.TheRestOfThisStringWasRandomlyGenerated.MgTUerXPlLyMaUpKTjAhxasFYRCfNCXmtWDwqSDOcTjASWlAXS"); Assert.assertNull(testVariable); } @Test public void validateRangeDomainNameTestValueStartsWithStarAndIsAValidValueButIsOver238charactersLongReturnString() { String testVariable = configurationManagerImplSpy.validateRangeDomainName("*.ThisStringStartsWithStarAndIsOverTwoHundredAndForty.CharactersLongWithAtLeastOnePeriod" + "EverySixtyFourLetters.ThisShouldCauseAnErrorBecauseItIsTooLong.TheRestOfThisAreRandomlyGeneratedCharacters.gNXNOBNTNAoMChQqJMzcvFSBwHUhmWHftjfTNUaHRKVyXm"); Assert.assertEquals("a valid domain name", testVariable); } @Test public void validateRangeDomainNameTestValueStartsWithStarAndIsNotAValidValueReturnString() { String testVariable = configurationManagerImplSpy.validateRangeDomainName("*.ThisStringDoesNotMatchThePatternFor.DomainNamesSinceItHas1NumberInTheLastPartOfTheString"); Assert.assertEquals("a valid domain name", testVariable); } @Test public void validateRangeOtherTestValidValueReturnNull() { String testVariable = configurationManagerImplSpy.validateRangeOther("NameTest1", "SoShouldThis", "ThisShouldWork,ThisShouldAlsoWork,SoShouldThis"); Assert.assertNull(testVariable); } @Test public void validateRangeOtherTestInvalidValueReturnString() { String testVariable = configurationManagerImplSpy.validateRangeOther("NameTest1", "ThisShouldNotWork", "ThisShouldWork,ThisShouldAlsoWork,SoShouldThis"); Assert.assertNotNull(testVariable); } @Test public void testValidateIpAddressRelatedConfigValuesUnrelated() { configurationManagerImplSpy.validateIpAddressRelatedConfigValues(StorageManager.PreferredStoragePool.key(), "something"); configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.ip", ""); Mockito.when(configurationManagerImplSpy._configDepot.get("config.ip")).thenReturn(null); configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.ip", "something"); configurationManagerImplSpy.validateIpAddressRelatedConfigValues(StorageManager.MountDisabledStoragePool.key(), "false"); } @Test(expected = InvalidParameterValueException.class) public void testValidateIpAddressRelatedConfigValuesInvalidIp() { ConfigKey key = StorageManager.PreferredStoragePool; // Any ConfigKey of String type Mockito.doReturn(key).when(configurationManagerImplSpy._configDepot).get("config.ip"); configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.ip", "abcdefg"); } @Test public void testValidateIpAddressRelatedConfigValuesValidIp() { ConfigKey key = StorageManager.PreferredStoragePool; // Any ConfigKey of String type Mockito.doReturn(key).when(configurationManagerImplSpy._configDepot).get("config.ip"); configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.ip", "192.168.1.1"); } @Test(expected = InvalidParameterValueException.class) public void testValidateIpAddressRelatedConfigValuesInvalidIpRange() { ConfigKey key = StorageManager.PreferredStoragePool; // Any ConfigKey of String type. RemoteAccessVpnManagerImpl.RemoteAccessVpnClientIpRange not accessible here Mockito.doReturn(key).when(configurationManagerImplSpy._configDepot).get("config.iprange"); configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.iprange", "xyz-192.168.1.20"); } @Test(expected = InvalidParameterValueException.class) public void testValidateIpAddressRelatedConfigValuesInvalidIpRange1() { ConfigKey key = StorageManager.PreferredStoragePool; // Any ConfigKey of String type. RemoteAccessVpnManagerImpl.RemoteAccessVpnClientIpRange not accessible here Mockito.doReturn(key).when(configurationManagerImplSpy._configDepot).get("config.iprange"); configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.iprange", "192.168.1.20"); } @Test public void testValidateIpAddressRelatedConfigValuesValidIpRange() { ConfigKey key = StorageManager.PreferredStoragePool; // Any ConfigKey of String type. RemoteAccessVpnManagerImpl.RemoteAccessVpnClientIpRange not accessible here Mockito.doReturn(key).when(configurationManagerImplSpy._configDepot).get("config.iprange"); configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.iprange", "192.168.1.1-192.168.1.100"); } @Test public void validateDomainTestInvalidIdThrowException() { Mockito.doReturn(null).when(domainDaoMock).findById(invalidId); Assert.assertThrows(InvalidParameterValueException.class, () -> configurationManagerImplSpy.validateDomain(List.of(invalidId))); } @Test public void validateZoneTestInvalidIdThrowException() { Mockito.doReturn(null).when(zoneDaoMock).findById(invalidId); Assert.assertThrows(InvalidParameterValueException.class, () -> configurationManagerImplSpy.validateZone(List.of(invalidId))); } @Test public void updateDiskOfferingIfCmdAttributeNotNullTestNotNullValueUpdateOfferingAttribute() { Mockito.doReturn("DiskOfferingName").when(updateDiskOfferingCmdMock).getDiskOfferingName(); Mockito.doReturn("DisplayText").when(updateDiskOfferingCmdMock).getDisplayText(); Mockito.doReturn(1).when(updateDiskOfferingCmdMock).getSortKey(); Mockito.doReturn(false).when(updateDiskOfferingCmdMock).getDisplayOffering(); configurationManagerImplSpy.updateDiskOfferingIfCmdAttributeNotNull(diskOfferingVOSpy, updateDiskOfferingCmdMock); Assert.assertEquals(updateDiskOfferingCmdMock.getDiskOfferingName(), diskOfferingVOSpy.getName()); Assert.assertEquals(updateDiskOfferingCmdMock.getDisplayText(), diskOfferingVOSpy.getDisplayText()); Assert.assertEquals(updateDiskOfferingCmdMock.getSortKey(), (Integer) diskOfferingVOSpy.getSortKey()); Assert.assertEquals(updateDiskOfferingCmdMock.getDisplayOffering(), diskOfferingVOSpy.getDisplayOffering()); } @Test public void updateDiskOfferingIfCmdAttributeNotNullTestNullValueDoesntUpdateOfferingAttribute() { Mockito.doReturn("Name").when(diskOfferingVOSpy).getName(); Mockito.doReturn("DisplayText").when(diskOfferingVOSpy).getDisplayText(); Mockito.doReturn(1).when(diskOfferingVOSpy).getSortKey(); Mockito.doReturn(true).when(diskOfferingVOSpy).getDisplayOffering(); configurationManagerImplSpy.updateDiskOfferingIfCmdAttributeNotNull(diskOfferingVOSpy, updateDiskOfferingCmdMock); Assert.assertNotEquals(updateDiskOfferingCmdMock.getDiskOfferingName(), diskOfferingVOSpy.getName()); Assert.assertNotEquals(updateDiskOfferingCmdMock.getDisplayText(), diskOfferingVOSpy.getDisplayText()); Assert.assertNotEquals(updateDiskOfferingCmdMock.getSortKey(), (Integer) diskOfferingVOSpy.getSortKey()); Assert.assertNotEquals(updateDiskOfferingCmdMock.getDisplayOffering(), diskOfferingVOSpy.getDisplayOffering()); } @Test public void updateDiskOfferingDetailsDomainIdsTestDifferentDomainIdsDiskOfferingDetailsAddDomainIds() { List detailsVO = new ArrayList<>(); Long diskOfferingId = validId; configurationManagerImplSpy.updateDiskOfferingDetailsDomainIds(detailsVO, searchCriteriaDiskOfferingDetailMock, diskOfferingId, filteredDomainIds, existingDomainIds); for (int i = 0; i < detailsVO.size(); i++) { Assert.assertEquals(filteredDomainIds.get(i), (Long) Long.parseLong(detailsVO.get(i).getValue())); } } @Test public void checkDomainAdminUpdateOfferingRestrictionsTestDifferentZoneIdsThrowException() { Assert.assertThrows(InvalidParameterValueException.class, () -> configurationManagerImplSpy.checkDomainAdminUpdateOfferingRestrictions(diskOfferingMock, userMock, filteredZoneIds, emptyExistingZoneIds, existingDomainIds, filteredDomainIds)); } @Test public void checkDomainAdminUpdateOfferingRestrictionsTestEmptyExistingDomainIdsThrowException() { Assert.assertThrows(InvalidParameterValueException.class, () -> configurationManagerImplSpy.checkDomainAdminUpdateOfferingRestrictions(diskOfferingMock, userMock, filteredZoneIds, existingZoneIds, emptyExistingDomainIds, filteredDomainIds)); } @Test public void checkDomainAdminUpdateOfferingRestrictionsTestEmptyFilteredDomainIdsThrowException() { Assert.assertThrows(InvalidParameterValueException.class, () -> configurationManagerImplSpy.checkDomainAdminUpdateOfferingRestrictions(diskOfferingMock, userMock, filteredZoneIds, existingZoneIds, existingDomainIds, emptyFilteredDomainIds)); } @Test public void getAccountNonChildDomainsTestValidValuesReturnChildDomains() { Mockito.doReturn(null).when(updateDiskOfferingCmdMock).getSortKey(); List nonChildDomains = configurationManagerImplSpy.getAccountNonChildDomains(diskOfferingMock, accountMock, userMock, updateDiskOfferingCmdMock, existingDomainIds); for (int i = 0; i < existingDomainIds.size(); i++) { Assert.assertEquals(existingDomainIds.get(i), nonChildDomains.get(i)); } } @Test public void getAccountNonChildDomainsTestAllDomainsAreChildDomainsReturnEmptyList() { for (Long existingDomainId : existingDomainIds) { Mockito.when(domainDaoMock.isChildDomain(accountMock.getDomainId(), existingDomainId)).thenReturn(true); } List nonChildDomains = configurationManagerImplSpy.getAccountNonChildDomains(diskOfferingMock, accountMock, userMock, updateDiskOfferingCmdMock, existingDomainIds); Assert.assertTrue(nonChildDomains.isEmpty()); } @Test public void getAccountNonChildDomainsTestNotNullCmdAttributeThrowException() { Mockito.doReturn("name").when(updateDiskOfferingCmdMock).getDiskOfferingName(); Assert.assertThrows(InvalidParameterValueException.class, () -> configurationManagerImplSpy.getAccountNonChildDomains(diskOfferingMock, accountMock, userMock, updateDiskOfferingCmdMock, existingDomainIds)); } @Test public void checkIfDomainIsChildDomainTestNonChildDomainThrowException() { Mockito.doReturn(false).when(domainDaoMock).isChildDomain(Mockito.anyLong(), Mockito.anyLong()); Mockito.doReturn(domainMock).when(entityManagerMock).findById(Domain.class, 1L); Assert.assertThrows(InvalidParameterValueException.class, () -> configurationManagerImplSpy.checkIfDomainIsChildDomain(diskOfferingMock, accountMock, userMock, filteredDomainIds)); } }