2 * Copyright © 2016-2018 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 * Modifications Copyright (c) 2019 Samsung
20 package org.onap.config;
22 import static java.util.stream.Collectors.toList;
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertNull;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertTrue;
27 import static org.junit.Assert.assertFalse;
30 import java.io.IOException;
31 import java.lang.reflect.Array;
32 import java.lang.reflect.Field;
33 import java.nio.file.Path;
34 import java.nio.file.Paths;
35 import java.util.ArrayDeque;
36 import java.util.ArrayList;
37 import java.util.Arrays;
38 import java.util.Collection;
39 import java.util.Deque;
40 import java.util.HashSet;
41 import java.util.List;
43 import java.util.Queue;
45 import java.util.SortedSet;
46 import java.util.TreeSet;
47 import java.util.concurrent.BlockingQueue;
48 import java.util.concurrent.ConcurrentLinkedQueue;
49 import java.util.concurrent.LinkedBlockingQueue;
50 import java.util.concurrent.LinkedTransferQueue;
51 import java.util.concurrent.TransferQueue;
52 import java.util.stream.Collectors;
53 import java.util.stream.IntStream;
54 import java.util.stream.Stream;
56 import org.apache.commons.configuration2.BaseConfiguration;
57 import org.apache.commons.configuration2.CompositeConfiguration;
58 import org.apache.commons.configuration2.Configuration;
59 import org.apache.commons.configuration2.PropertiesConfiguration;
60 import org.junit.Test;
61 import org.onap.config.util.TestUtil;
62 import org.onap.config.api.Hint;
63 import org.onap.config.impl.ConfigurationRepository;
65 public class ConfigurationUtilsTest {
67 public static final String TMP_DIR_PREFIX = "sdc-testing-";
68 private static final String TEST_NAME_SPACE = "testNameSpaceOne";
69 private static final String TEST_COMPOSITE_NAMESPACE = "testCOmpositeConfig";
72 public void testCommaList() {
73 List<?> list = Arrays.asList("1", "2", 3);
74 String commaSeparatedList = ConfigurationUtils.getCommaSeparatedList(list);
75 list.forEach(o -> assertTrue(commaSeparatedList.contains(o.toString())));
79 public void testCommaListWithNullAndEmptyStrings() {
80 List list = Arrays.asList(null, "", " ");
81 String commaSeparatedList = ConfigurationUtils.getCommaSeparatedList(list);
82 assertTrue(commaSeparatedList.isEmpty());
86 public void testGetArrayClassFunction() {
87 assertEquals(String[].class, ConfigurationUtils.getArrayClass(String.class));
88 assertNull(ConfigurationUtils.getArrayClass(ConfigurationUtilsTest.class));
92 public void testGetCollectionGenericType() throws NoSuchFieldException {
95 public Map<String, String> testParameterizedTypeField;
97 Field field = DummyClass.class.getField("testParameterizedTypeField");
98 assertEquals(String.class, ConfigurationUtils.getCollectionGenericType(field));
102 public void testCastingArray() {
104 final Class[] primitiveType = new Class[]{boolean.class, byte.class,
105 double.class, float.class, int.class, long.class, short.class};
107 for (Class clazz: primitiveType) {
108 Class expectedResultClass = Array.newInstance(clazz, 0).getClass();
109 List defaultCollection = IntStream.range(0, arraySize).mapToObj(i ->
110 ConfigurationUtils.getDefaultFor(clazz)).collect(toList());
112 Object resultArray = ConfigurationUtils.getPrimitiveArray(defaultCollection, clazz);
114 assertNotNull(resultArray);
115 assertFalse(ConfigurationUtils.isZeroLengthArray(expectedResultClass, resultArray));
116 assertNotNull(expectedResultClass.cast(resultArray));
120 @Test(expected = IllegalArgumentException.class)
121 public void testGetCompatibleCollection() {
122 final Map<Class, Class> testClasses = Stream.of(new Class[][] {
123 {BlockingQueue.class, LinkedBlockingQueue.class},
124 {TransferQueue.class, LinkedTransferQueue.class},
125 {Deque.class, ArrayDeque.class},
126 {Queue.class, ConcurrentLinkedQueue.class},
127 {SortedSet.class, TreeSet.class},
128 {Set.class, HashSet.class},
129 {List.class, ArrayList.class}
130 }).collect(Collectors.toMap(data -> data[0], data -> data[1]));
132 testClasses.forEach((entryClass, expResultClass) -> {
133 Class resultClass = ConfigurationUtils.getCompatibleCollectionForAbstractDef(entryClass).getClass();
134 assertEquals(expResultClass, resultClass);
138 ConfigurationUtils.getCompatibleCollectionForAbstractDef(Collection.class);
143 public void testGetAllFilesRecursiveIncludeAll() throws IOException {
144 Path tmpRoot = TestUtil.createTestDirsStructure(TMP_DIR_PREFIX);
145 Collection<File> allFiles = ConfigurationUtils.getAllFiles(tmpRoot.toFile(), true, false);
146 assertEquals(7, allFiles.size());
147 TestUtil.deleteTestDirsStrucuture(tmpRoot);
151 public void testGetAllFilesRecursiveIncludeDirsOnly() throws IOException {
152 Path tmpRoot = TestUtil.createTestDirsStructure(TMP_DIR_PREFIX);
153 Collection<File> allFiles = ConfigurationUtils.getAllFiles(tmpRoot.toFile(), true, true);
154 assertEquals(3, allFiles.size());
155 TestUtil.deleteTestDirsStrucuture(tmpRoot);
159 public void testGetAllFilesNonRecursiveIncludeAll() throws IOException {
160 Path tmpRoot = TestUtil.createTestDirsStructure(TMP_DIR_PREFIX);
161 Collection<File> allFiles = ConfigurationUtils.getAllFiles(tmpRoot.toFile(), false, false);
162 assertEquals(2, allFiles.size());
163 TestUtil.deleteTestDirsStrucuture(tmpRoot);
167 public void testGetAllFilesNonRecursiveIncludeDirsOnly() throws IOException {
168 Path tmpRoot = TestUtil.createTestDirsStructure(TMP_DIR_PREFIX);
169 Collection<File> allFiles = ConfigurationUtils.getAllFiles(tmpRoot.toFile(), false, true);
170 assertEquals(1, allFiles.size());
171 TestUtil.deleteTestDirsStrucuture(tmpRoot);
175 public void testGetAllFilesEmptyDir() throws IOException {
176 Path tmpRoot = TestUtil.createEmptyTmpDir(TMP_DIR_PREFIX);
177 Collection<File> allFiles = ConfigurationUtils.getAllFiles(tmpRoot.toFile(), true, true);
178 assertEquals(0, allFiles.size());
179 TestUtil.deleteTestDirsStrucuture(tmpRoot);
183 public void testGetAllFilesNonExistentDir() throws IOException {
184 Path nonExistentDir = Paths.get("/tmp/nonexistentdir");
185 Collection<File> allFiles = ConfigurationUtils.getAllFiles(nonExistentDir.toFile(), false, true);
186 assertEquals(0, allFiles.size());
190 public void testGetConfigPropertyBaseConfig() throws Exception {
191 ConfigurationRepository repo = populateTestBaseConfig();
192 Configuration config = repo.getConfigurationFor(Constants.DEFAULT_TENANT, TEST_NAME_SPACE);
193 assertEquals(TEST_NAME_SPACE, ConfigurationUtils.getProperty(config, Constants.NAMESPACE_KEY, Hint.DEFAULT.value()));
197 public void testGetCompositeConfigPropertyDefaultHints() throws Exception {
198 ConfigurationRepository repo = populateTestCompositeConfig();
199 Configuration config = repo.getConfigurationFor(Constants.DEFAULT_TENANT, TEST_COMPOSITE_NAMESPACE);
200 assertEquals(TEST_NAME_SPACE, ConfigurationUtils.getProperty(config, Constants.NAMESPACE_KEY, Hint.DEFAULT.value()));
204 public void testGetCompositeConfigPropertyNodeSpecificHints() throws Exception {
205 ConfigurationRepository repo = populateTestCompositeConfig();
206 Configuration config = repo.getConfigurationFor(Constants.DEFAULT_TENANT, TEST_COMPOSITE_NAMESPACE);
207 assertEquals(TEST_NAME_SPACE, ConfigurationUtils.getProperty(config, Constants.NAMESPACE_KEY, Hint.NODE_SPECIFIC.value()));
210 private ConfigurationRepository populateTestBaseConfig() {
211 BaseConfiguration inputConfig = new PropertiesConfiguration();
212 inputConfig.setProperty(Constants.NAMESPACE_KEY, TEST_NAME_SPACE);
213 ConfigurationRepository repo = ConfigurationRepository.lookup();
215 repo.populateConfiguration(
216 Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMITER + TEST_NAME_SPACE, inputConfig);
221 private ConfigurationRepository populateTestCompositeConfig() {
222 CompositeConfiguration inputCompositeConfig = new CompositeConfiguration();
223 Configuration inputConfig1= new BaseConfiguration();
224 Configuration inputConfig2= new BaseConfiguration();
225 inputConfig1.setProperty(Constants.NAMESPACE_KEY, TEST_NAME_SPACE);
226 inputCompositeConfig.addConfiguration(inputConfig1);
227 inputCompositeConfig.addConfigurationFirst(inputConfig2);
229 ConfigurationRepository repo = ConfigurationRepository.lookup();
230 repo.populateConfiguration(
231 Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMITER + TEST_COMPOSITE_NAMESPACE,