View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.configuration2.builder.combined;
18  
19  import static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertFalse;
21  import static org.junit.jupiter.api.Assertions.assertNotNull;
22  import static org.junit.jupiter.api.Assertions.assertNotSame;
23  import static org.junit.jupiter.api.Assertions.assertNull;
24  import static org.junit.jupiter.api.Assertions.assertSame;
25  import static org.junit.jupiter.api.Assertions.assertThrows;
26  import static org.junit.jupiter.api.Assertions.assertTrue;
27  import static org.mockito.Mockito.mock;
28  import static org.mockito.Mockito.verify;
29  
30  import java.util.Collections;
31  import java.util.HashMap;
32  import java.util.Map;
33  
34  import org.apache.commons.configuration2.ConfigurationAssert;
35  import org.apache.commons.configuration2.XMLConfiguration;
36  import org.apache.commons.configuration2.beanutils.BeanHelper;
37  import org.apache.commons.configuration2.builder.BasicBuilderParameters;
38  import org.apache.commons.configuration2.builder.BasicConfigurationBuilder;
39  import org.apache.commons.configuration2.builder.BuilderParameters;
40  import org.apache.commons.configuration2.builder.ConfigurationBuilder;
41  import org.apache.commons.configuration2.builder.DefaultParametersHandler;
42  import org.apache.commons.configuration2.builder.DefaultParametersManager;
43  import org.apache.commons.configuration2.builder.XMLBuilderParametersImpl;
44  import org.apache.commons.configuration2.builder.fluent.FileBasedBuilderParameters;
45  import org.junit.jupiter.api.Test;
46  
47  /**
48   * Test class for {@code CombinedBuilderParametersImpl}.
49   */
50  public class TestCombinedBuilderParametersImpl {
51  
52      /**
53       * Creates a mock for a defaults handler.
54       *
55       * @return the handler mock
56       */
57      @SuppressWarnings("unchecked")
58      private static DefaultParametersHandler<BuilderParameters> createDefaultsHandlerMock() {
59          return mock(DefaultParametersHandler.class);
60      }
61  
62      /**
63       * Tests whether cloning works as expected.
64       */
65      @Test
66      void testClone() {
67          final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
68          params.setBasePath("some base path");
69          final XMLBuilderParametersImpl defParams = new XMLBuilderParametersImpl();
70          defParams.setSystemID("someSysID");
71          params.setDefinitionBuilderParameters(defParams);
72          final CombinedBuilderParametersImpl clone = params.clone();
73          assertEquals(params.getBasePath(), clone.getBasePath());
74          assertNotSame(params.getDefinitionBuilderParameters(), clone.getDefinitionBuilderParameters());
75          assertEquals(params.getDefinitionBuilderParameters().getParameters().get("systemID"),
76                  clone.getDefinitionBuilderParameters().getParameters().get("systemID"));
77      }
78  
79      /**
80       * Tests whether a new instance can be created if none is found in the parameters map.
81       */
82      @Test
83      void testFromParametersCreate() {
84          final CombinedBuilderParametersImpl params = CombinedBuilderParametersImpl.fromParameters(new HashMap<>(), true);
85          assertNotNull(params);
86          assertNull(params.getDefinitionBuilder());
87      }
88  
89      /**
90       * Tests whether an instance can be obtained from a parameters map.
91       */
92      @Test
93      void testFromParametersExisting() {
94          final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
95          final Map<String, Object> map = params.getParameters();
96          assertSame(params, CombinedBuilderParametersImpl.fromParameters(map));
97      }
98  
99      /**
100      * Tests fromParameters() if the map does not contain an instance.
101      */
102     @Test
103     void testFromParametersNotFound() {
104         assertNull(CombinedBuilderParametersImpl.fromParameters(new HashMap<>()));
105     }
106 
107     /**
108      * Tests whether a default parameters manager can be set and queried.
109      */
110     @Test
111     void testGetChildDefaultParametersManagerSpecific() {
112         final DefaultParametersManager manager = mock(DefaultParametersManager.class);
113         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
114         assertSame(params, params.setChildDefaultParametersManager(manager));
115         assertSame(manager, params.getChildDefaultParametersManager());
116     }
117 
118     /**
119      * Tests whether a default parameters manager is dynamically created if it has not been set.
120      */
121     @Test
122     void testGetChildDefaultParametersManagerUndefined() {
123         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
124         assertNotNull(params.getChildDefaultParametersManager());
125     }
126 
127     /**
128      * Tests that inherited properties are also stored in the parameters map.
129      */
130     @Test
131     void testGetParametersInherited() {
132         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
133         params.setThrowExceptionOnMissing(true);
134         final Map<String, Object> map = params.getParameters();
135         assertEquals(Boolean.TRUE, map.get("throwExceptionOnMissing"));
136     }
137 
138     /**
139      * Tests whether the map with providers is initially empty.
140      */
141     @Test
142     void testGetProvidersInitial() {
143         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
144         assertEquals(Collections.emptyMap(), params.getProviders());
145     }
146 
147     /**
148      * Tests that the map with providers cannot be modified.
149      */
150     @Test
151     void testGetProvidersModify() {
152         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
153         final Map<String, ConfigurationBuilderProvider> providers = params.getProviders();
154         final ConfigurationBuilderProvider provider = mock(ConfigurationBuilderProvider.class);
155         assertThrows(UnsupportedOperationException.class, () -> providers.put("tag", provider));
156     }
157 
158     /**
159      * Tests whether properties can be inherited.
160      */
161     @Test
162     void testInheritFrom() {
163         final DefaultParametersManager manager = mock(DefaultParametersManager.class);
164         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl().setInheritSettings(false).setChildDefaultParametersManager(manager);
165         params.setThrowExceptionOnMissing(true);
166         final CombinedBuilderParametersImpl params2 = new CombinedBuilderParametersImpl();
167 
168         params2.inheritFrom(params.getParameters());
169         final Map<String, Object> parameters = params2.getParameters();
170         assertEquals(Boolean.TRUE, parameters.get("throwExceptionOnMissing"));
171         assertEquals(manager, params2.getChildDefaultParametersManager());
172         assertFalse(params2.isInheritSettings());
173     }
174 
175     /**
176      * Tests that inheritFrom() can handle a map which does not contain a parameters object.
177      */
178     @Test
179     void testInheritFromNoParametersInMap() {
180         final BasicBuilderParameters params = new BasicBuilderParameters().setThrowExceptionOnMissing(true);
181         final CombinedBuilderParametersImpl params2 = new CombinedBuilderParametersImpl();
182 
183         params2.inheritFrom(params.getParameters());
184         final Map<String, Object> parameters = params2.getParameters();
185         assertEquals(Boolean.TRUE, parameters.get("throwExceptionOnMissing"));
186     }
187 
188     /**
189      * Tests the result for an unknown provider.
190      */
191     @Test
192     void testProviderForUnknown() {
193         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
194         assertNull(params.providerForTag("someTag"));
195     }
196 
197     /**
198      * Tests whether a defaults handler for a child source can be registered.
199      */
200     @Test
201     void testRegisterChildDefaultsHandler() {
202         final DefaultParametersManager manager = mock(DefaultParametersManager.class);
203         final DefaultParametersHandler<BuilderParameters> handler = createDefaultsHandlerMock();
204         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
205         params.setChildDefaultParametersManager(manager);
206         assertSame(params, params.registerChildDefaultsHandler(BuilderParameters.class, handler));
207 
208         verify(manager).registerDefaultsHandler(BuilderParameters.class, handler);
209     }
210 
211     /**
212      * Tests whether a defaults handler for a child source with a class restriction can be registered.
213      */
214     @Test
215     void testRegisterChildDefaultsHandlerWithStartClass() {
216         final DefaultParametersManager manager = mock(DefaultParametersManager.class);
217         final DefaultParametersHandler<BuilderParameters> handler = createDefaultsHandlerMock();
218         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
219         params.setChildDefaultParametersManager(manager);
220         assertSame(params, params.registerChildDefaultsHandler(BuilderParameters.class, handler, FileBasedBuilderParameters.class));
221 
222         verify(manager).registerDefaultsHandler(BuilderParameters.class, handler, FileBasedBuilderParameters.class);
223     }
224 
225     /**
226      * Tests whether missing providers can be registered.
227      */
228     @Test
229     void testRegisterMissingProviders() {
230         final ConfigurationBuilderProvider provider1 = mock(ConfigurationBuilderProvider.class);
231         final ConfigurationBuilderProvider provider2 = mock(ConfigurationBuilderProvider.class);
232         final ConfigurationBuilderProvider provider3 = mock(ConfigurationBuilderProvider.class);
233         final String tagPrefix = "testTag";
234         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
235         params.registerProvider(tagPrefix, provider1);
236         final Map<String, ConfigurationBuilderProvider> map = new HashMap<>();
237         map.put(tagPrefix, provider2);
238         map.put(tagPrefix + 1, provider3);
239         assertSame(params, params.registerMissingProviders(map));
240         assertEquals(2, params.getProviders().size());
241         assertSame(provider1, params.providerForTag(tagPrefix));
242         assertSame(provider3, params.providerForTag(tagPrefix + 1));
243     }
244 
245     /**
246      * Tries to register a map with missing providers containing a null entry.
247      */
248     @Test
249     void testRegisterMissingProvidersNullEntry() {
250         final Map<String, ConfigurationBuilderProvider> map = new HashMap<>();
251         map.put("tag", null);
252         final CombinedBuilderParametersImpl builderParameters = new CombinedBuilderParametersImpl();
253         assertThrows(IllegalArgumentException.class, () -> builderParameters.registerMissingProviders(map));
254     }
255 
256     /**
257      * Tries to register a null map with missing providers.
258      */
259     @Test
260     void testRegisterMissingProvidersNullMap() {
261         final Map<String, ConfigurationBuilderProvider> map = null;
262         final CombinedBuilderParametersImpl builderParameters = new CombinedBuilderParametersImpl();
263         assertThrows(IllegalArgumentException.class, () -> builderParameters.registerMissingProviders(map));
264     }
265 
266     /**
267      * Tests whether missing providers can be copied from a parameters object.
268      */
269     @Test
270     void testRegisterMissingProvidersParams() {
271         final ConfigurationBuilderProvider provider1 = mock(ConfigurationBuilderProvider.class);
272         final ConfigurationBuilderProvider provider2 = mock(ConfigurationBuilderProvider.class);
273         final ConfigurationBuilderProvider provider3 = mock(ConfigurationBuilderProvider.class);
274         final String tagPrefix = "testTag";
275         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
276         final CombinedBuilderParametersImpl params2 = new CombinedBuilderParametersImpl();
277         params.registerProvider(tagPrefix, provider1);
278         params2.registerProvider(tagPrefix, provider2);
279         params2.registerProvider(tagPrefix + 1, provider3);
280         assertSame(params, params.registerMissingProviders(params2));
281         assertEquals(2, params.getProviders().size());
282         assertSame(provider1, params.providerForTag(tagPrefix));
283         assertSame(provider3, params.providerForTag(tagPrefix + 1));
284     }
285 
286     /**
287      * Tries to copy providers from a null parameters object.
288      */
289     @Test
290     void testRegisterMissingProvidersParamsNull() {
291         final CombinedBuilderParametersImpl builderParameters = new CombinedBuilderParametersImpl();
292         assertThrows(IllegalArgumentException.class, () -> builderParameters.registerMissingProviders((CombinedBuilderParametersImpl) null));
293     }
294 
295     /**
296      * Tests whether a new builder provider can be registered.
297      */
298     @Test
299     void testRegisterProvider() {
300         final ConfigurationBuilderProvider provider = mock(ConfigurationBuilderProvider.class);
301         final String tagName = "testTag";
302         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
303         assertSame(params, params.registerProvider(tagName, provider));
304         final Map<String, ConfigurationBuilderProvider> providers = params.getProviders();
305         assertEquals(1, providers.size());
306         assertSame(provider, providers.get(tagName));
307         assertSame(provider, params.providerForTag(tagName));
308     }
309 
310     /**
311      * Tries to register a null provider.
312      */
313     @Test
314     void testRegisterProviderNoProvider() {
315         final CombinedBuilderParametersImpl builderParameters = new CombinedBuilderParametersImpl();
316         assertThrows(IllegalArgumentException.class, () -> builderParameters.registerProvider("aTag", null));
317     }
318 
319     /**
320      * Tries to register a provider without a tag name.
321      */
322     @Test
323     void testRegisterProviderNoTag() {
324         final CombinedBuilderParametersImpl builderParameters = new CombinedBuilderParametersImpl();
325         final ConfigurationBuilderProvider provider = mock(ConfigurationBuilderProvider.class);
326         assertThrows(IllegalArgumentException.class, () -> builderParameters.registerProvider(null, provider));
327     }
328 
329     /**
330      * Tests whether the base path can be set.
331      */
332     @Test
333     void testSetBasePath() {
334         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
335         final String basePath = ConfigurationAssert.OUT_DIR.getAbsolutePath();
336         assertSame(params, params.setBasePath(basePath));
337         assertEquals(basePath, params.getBasePath());
338     }
339 
340     /**
341      * Tests whether properties can be set using BeanUtils.
342      */
343     @Test
344     void testSetBeanProperties() throws Exception {
345         final BuilderParameters defparams = mock(BuilderParameters.class);
346         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
347         BeanHelper.setProperty(params, "basePath", "testPath");
348         BeanHelper.setProperty(params, "definitionBuilderParameters", defparams);
349         BeanHelper.setProperty(params, "inheritSettings", false);
350         assertEquals("testPath", params.getBasePath());
351         assertSame(defparams, params.getDefinitionBuilderParameters());
352         assertFalse(params.isInheritSettings());
353     }
354 
355     /**
356      * Tests whether the definition builder can be set.
357      */
358     @Test
359     void testSetDefinitionBuilder() {
360         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
361         assertNull(params.getDefinitionBuilder());
362         final ConfigurationBuilder<XMLConfiguration> builder = new BasicConfigurationBuilder<>(XMLConfiguration.class);
363         assertSame(params, params.setDefinitionBuilder(builder));
364         assertSame(builder, params.getDefinitionBuilder());
365     }
366 
367     /**
368      * Tests whether a parameters object for the definition builder can be set.
369      */
370     @Test
371     void testSetDefinitionBuilderParameters() {
372         final BuilderParameters defparams = mock(BuilderParameters.class);
373         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
374         assertSame(params, params.setDefinitionBuilderParameters(defparams));
375         assertSame(defparams, params.getDefinitionBuilderParameters());
376     }
377 
378     /**
379      * Tests whether the flag that controls settings inheritance can be set.
380      */
381     @Test
382     void testSetInheritSettings() {
383         final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
384         assertTrue(params.isInheritSettings());
385         assertSame(params, params.setInheritSettings(false));
386         assertFalse(params.isInheritSettings());
387     }
388 }