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.fluent;
18  
19  import static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertNotNull;
21  import static org.junit.jupiter.api.Assertions.assertSame;
22  import static org.junit.jupiter.api.Assertions.assertThrows;
23  
24  import java.io.File;
25  import java.net.URL;
26  import java.util.Map;
27  
28  import org.apache.commons.configuration2.CombinedConfiguration;
29  import org.apache.commons.configuration2.Configuration;
30  import org.apache.commons.configuration2.ConfigurationAssert;
31  import org.apache.commons.configuration2.INIConfiguration;
32  import org.apache.commons.configuration2.PropertiesConfiguration;
33  import org.apache.commons.configuration2.XMLConfiguration;
34  import org.apache.commons.configuration2.builder.BasicConfigurationBuilder;
35  import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
36  import org.apache.commons.configuration2.builder.combined.CombinedConfigurationBuilder;
37  import org.apache.commons.configuration2.ex.ConfigurationException;
38  import org.apache.commons.configuration2.plist.PropertyListConfiguration;
39  import org.junit.jupiter.api.Test;
40  
41  /**
42   * Test class for {@code Configurations}.
43   */
44  public class TestConfigurations {
45  
46      /** Constant for the name of the test properties file. */
47      private static final String TEST_PROPERTIES = "test.properties";
48  
49      /** Constant for the name of the test XML file. */
50      private static final String TEST_XML = "test.xml";
51  
52      /** Constant for the name of the test ini file. */
53      private static final String TEST_INI = "test.ini";
54  
55      /** Constant for the name of the configuration definition file. */
56      private static final String TEST_COMBINED = "testDigesterConfiguration.xml";
57  
58      /** Constant for the name of the test PList file. */
59      private static final String TEST_PLIST = "test.plist";
60  
61      /**
62       * Generates an absolute path for the test file with the given name.
63       *
64       * @param name the name of the test file
65       * @return the full path to this file
66       */
67      private static String absolutePath(final String name) {
68          return ConfigurationAssert.getTestFile(name).getAbsolutePath();
69      }
70  
71      /**
72       * Checks whether a combined configuration was successfully loaded.
73       *
74       * @param config the configuration instance to be checked.
75       */
76      private static void checkCombined(final Configuration config) {
77          checkProperties(config);
78          checkXML(config);
79      }
80  
81      /**
82       * Checks whether a test INI configuration was correctly loaded.
83       *
84       * @param config the configuration instance to be checked.
85       */
86      private static void checkINI(final INIConfiguration config) {
87          assertEquals("yes", config.getProperty("testini.loaded"));
88      }
89  
90      /**
91       * Checks whether a property list configuration was correctly loaded.
92       *
93       * @param config the configuration instance to be checked.
94       */
95      private static void checkPList(final Configuration config) {
96          assertEquals("string1", config.getProperty("simple-string"));
97      }
98  
99      /**
100      * Checks whether a test properties configuration was correctly loaded.
101      *
102      * @param config the configuration instance to be checked.
103      */
104     private static void checkProperties(final Configuration config) {
105         assertEquals("true", config.getString("configuration.loaded"));
106     }
107 
108     /**
109      * Checks whether a test XML configuration was correctly loaded.
110      *
111      * @param config the configuration instance to be checked.
112      */
113     private static void checkXML(final Configuration config) {
114         assertEquals("value", config.getProperty("element"));
115     }
116 
117     /**
118      * Tests whether a combined configuration builder can be constructed for a file.
119      */
120     @Test
121     void testCombinedBuilderFromFile() throws ConfigurationException {
122         final Configurations configs = new Configurations();
123         final CombinedConfigurationBuilder builder = configs.combinedBuilder(ConfigurationAssert.getTestFile(TEST_COMBINED));
124         checkCombined(builder.getConfiguration());
125     }
126 
127     /**
128      * Tests whether a combined configuration builder can be constructed for a file path.
129      */
130     @Test
131     void testCombinedBuilderFromPath() throws ConfigurationException {
132         final Configurations configs = new Configurations();
133         final CombinedConfigurationBuilder builder = configs.combinedBuilder(absolutePath(TEST_COMBINED));
134         checkCombined(builder.getConfiguration());
135     }
136 
137     /**
138      * Tests whether a combined configuration builder can be constructed for a URL.
139      */
140     @Test
141     void testCombinedBuilderFromURL() throws ConfigurationException {
142         final Configurations configs = new Configurations();
143         final CombinedConfigurationBuilder builder = configs.combinedBuilder(ConfigurationAssert.getTestURL(TEST_COMBINED));
144         checkCombined(builder.getConfiguration());
145     }
146 
147     /**
148      * Tests whether a combined configuration can be loaded from a file.
149      */
150     @Test
151     void testCombinedFromFile() throws ConfigurationException {
152         final Configurations configs = new Configurations();
153         final CombinedConfiguration config = configs.combined(ConfigurationAssert.getTestFile(TEST_COMBINED));
154         checkCombined(config);
155     }
156 
157     /**
158      * Tests whether a combined configuration can be loaded from a file path.
159      */
160     @Test
161     void testCombinedFromPath() throws ConfigurationException {
162         final Configurations configs = new Configurations();
163         final CombinedConfiguration config = configs.combined(absolutePath(TEST_COMBINED));
164         checkCombined(config);
165     }
166 
167     /**
168      * Tests whether a combined configuration can be loaded from a URL.
169      */
170     @Test
171     void testCombinedFromURL() throws ConfigurationException {
172         final Configurations configs = new Configurations();
173         final CombinedConfiguration config = configs.combined(ConfigurationAssert.getTestURL(TEST_COMBINED));
174         checkCombined(config);
175     }
176 
177     /**
178      * Tests whether a default {@code Parameters} instance is created if necessary.
179      */
180     @Test
181     void testDefaultParameters() {
182         final Configurations configs = new Configurations();
183         assertNotNull(configs.getParameters());
184     }
185 
186     /**
187      * Tests whether a builder for a file-based configuration can be created if an input File is specified.
188      */
189     @Test
190     void testFileBasedBuilderWithFile() {
191         final Configurations configs = new Configurations();
192         final File file = ConfigurationAssert.getTestFile(TEST_PROPERTIES);
193         final FileBasedConfigurationBuilder<PropertiesConfiguration> builder = configs.fileBasedBuilder(PropertiesConfiguration.class, file);
194         assertEquals(file.toURI(), builder.getFileHandler().getFile().toURI());
195     }
196 
197     /**
198      * Tests whether a builder for a file-based configuration can be created if a file name is specified.
199      */
200     @Test
201     void testFileBasedBuilderWithPath() {
202         final Configurations configs = new Configurations();
203         final String filePath = absolutePath(TEST_PROPERTIES);
204         final FileBasedConfigurationBuilder<PropertiesConfiguration> builder = configs.fileBasedBuilder(PropertiesConfiguration.class, filePath);
205         assertEquals(filePath, builder.getFileHandler().getFileName());
206     }
207 
208     /**
209      * Tests whether a builder for a file-based configuration can be created if a URL is specified.
210      */
211     @Test
212     void testFileBasedBuilderWithURL() {
213         final Configurations configs = new Configurations();
214         final URL url = ConfigurationAssert.getTestURL("test.properties");
215         final FileBasedConfigurationBuilder<PropertiesConfiguration> builder = configs.fileBasedBuilder(PropertiesConfiguration.class, url);
216         assertEquals(url, builder.getFileHandler().getURL());
217     }
218 
219     /**
220      * Tests whether a file-based configuration can be loaded from a file.
221      */
222     @Test
223     void testFileBasedFile() throws ConfigurationException {
224         final Configurations configs = new Configurations();
225         final PropertyListConfiguration config = configs.fileBased(PropertyListConfiguration.class, ConfigurationAssert.getTestFile(TEST_PLIST));
226         checkPList(config);
227     }
228 
229     /**
230      * Tests whether a file-based configuration can be loaded from a file path.
231      */
232     @Test
233     void testFileBasedPath() throws ConfigurationException {
234         final Configurations configs = new Configurations();
235         final PropertyListConfiguration config = configs.fileBased(PropertyListConfiguration.class, absolutePath(TEST_PLIST));
236         checkPList(config);
237     }
238 
239     /**
240      * Tests whether a file-based configuration can be loaded from a URL.
241      */
242     @Test
243     void testFileBasedURL() throws ConfigurationException {
244         final Configurations configs = new Configurations();
245         final PropertyListConfiguration config = configs.fileBased(PropertyListConfiguration.class, ConfigurationAssert.getTestURL(TEST_PLIST));
246         checkPList(config);
247     }
248 
249     /**
250      * Tests whether a builder for a INI configuration can be created for a given file.
251      */
252     @Test
253     void testINIBuilderFromFile() throws ConfigurationException {
254         final Configurations configs = new Configurations();
255         final FileBasedConfigurationBuilder<INIConfiguration> builder = configs.iniBuilder(ConfigurationAssert.getTestFile(TEST_INI));
256         checkINI(builder.getConfiguration());
257     }
258 
259     /**
260      * Tests whether a builder for a INI configuration can be created for a given file path.
261      */
262     @Test
263     void testINIBuilderFromPath() throws ConfigurationException {
264         final Configurations configs = new Configurations();
265         final FileBasedConfigurationBuilder<INIConfiguration> builder = configs.iniBuilder(absolutePath(TEST_INI));
266         checkINI(builder.getConfiguration());
267     }
268 
269     /**
270      * Tests whether a builder for a INI configuration can be created for a given URL.
271      */
272     @Test
273     void testINIBuilderFromURL() throws ConfigurationException {
274         final Configurations configs = new Configurations();
275         final FileBasedConfigurationBuilder<INIConfiguration> builder = configs.iniBuilder(ConfigurationAssert.getTestURL(TEST_INI));
276         checkINI(builder.getConfiguration());
277     }
278 
279     /**
280      * Tests whether a INI configuration can be loaded from a file.
281      */
282     @Test
283     void testINIFromFile() throws ConfigurationException {
284         final Configurations configs = new Configurations();
285         final INIConfiguration config = configs.ini(ConfigurationAssert.getTestFile(TEST_INI));
286         checkINI(config);
287     }
288 
289     /**
290      * Tests whether a INI configuration can be loaded from a file path.
291      */
292     @Test
293     void testINIFromPath() throws ConfigurationException {
294         final Configurations configs = new Configurations();
295         final INIConfiguration config = configs.ini(absolutePath(TEST_INI));
296         checkINI(config);
297     }
298 
299     /**
300      * Tests whether a INI configuration can be loaded from a URL.
301      */
302     @Test
303     void testINIFromURL() throws ConfigurationException {
304         final Configurations configs = new Configurations();
305         final INIConfiguration config = configs.ini(ConfigurationAssert.getTestURL(TEST_INI));
306         checkINI(config);
307     }
308 
309     /**
310      * Tests whether parameters can be passed in at construction time.
311      */
312     @Test
313     void testInitWithParameters() {
314         final Parameters params = new Parameters();
315         final Configurations configs = new Configurations(params);
316         assertSame(params, configs.getParameters());
317     }
318 
319     /**
320      * Tests whether a builder for a properties configuration can be created for a given file.
321      */
322     @Test
323     void testPropertiesBuilderFromFile() throws ConfigurationException {
324         final Configurations configs = new Configurations();
325         final FileBasedConfigurationBuilder<PropertiesConfiguration> builder = configs.propertiesBuilder(ConfigurationAssert.getTestFile(TEST_PROPERTIES));
326         checkProperties(builder.getConfiguration());
327     }
328 
329     /**
330      * Tests whether a builder for a properties configuration can be created for a given file path.
331      */
332     @Test
333     void testPropertiesBuilderFromPath() throws ConfigurationException {
334         final Configurations configs = new Configurations();
335         final FileBasedConfigurationBuilder<PropertiesConfiguration> builder = configs.propertiesBuilder(absolutePath(TEST_PROPERTIES));
336         checkProperties(builder.getConfiguration());
337     }
338 
339     /**
340      * Tests whether a builder for a properties configuration can be created for a given file path when an include is not
341      * found.
342      */
343     @Test
344     void testPropertiesBuilderFromPathIncludeNotFoundFail() {
345         final Configurations configs = new Configurations();
346         final FileBasedConfigurationBuilder<PropertiesConfiguration> builder = configs.propertiesBuilder(absolutePath("include-not-found.properties"));
347         assertThrows(ConfigurationException.class, builder::getConfiguration);
348     }
349 
350     /**
351      * Tests whether a builder for a properties configuration can be created for a given file path when an include is not
352      * found.
353      */
354     @Test
355     void testPropertiesBuilderFromPathIncludeNotFoundPass() throws ConfigurationException {
356         final Configurations configs = new Configurations();
357         final String absPath = absolutePath("include-not-found.properties");
358         final FileBasedConfigurationBuilder<PropertiesConfiguration> builderFail = configs.propertiesBuilder(absPath);
359         assertThrows(ConfigurationException.class, builderFail::getConfiguration);
360         assertThrows(ConfigurationException.class, () -> configs.properties(absPath));
361         // Expect success:
362         // @formatter:off
363             final Map<String, Object> map =
364                     new Parameters().properties()
365                             .setPath(absPath)
366                             .setIncludeListener(PropertiesConfiguration.NOOP_INCLUDE_LISTENER)
367                             .getParameters();
368         // @formatter:on
369         final BasicConfigurationBuilder<PropertiesConfiguration> builderOk = configs.propertiesBuilder(absPath).addParameters(map);
370         assertEquals("valueA", builderOk.getConfiguration().getString("keyA"));
371         // Expect success:
372         // @formatter:off
373             final BasicConfigurationBuilder<PropertiesConfiguration> builderOk2 = configs.propertiesBuilder(
374                     new Parameters().properties()
375                         .setPath(absPath)
376                         .setIncludeListener(PropertiesConfiguration.NOOP_INCLUDE_LISTENER));
377         // @formatter:on
378         assertEquals("valueA", builderOk2.getConfiguration().getString("keyA"));
379     }
380 
381     /**
382      * Tests whether a builder for a properties configuration can be created for a given URL.
383      */
384     @Test
385     void testPropertiesBuilderFromURL() throws ConfigurationException {
386         final Configurations configs = new Configurations();
387         final FileBasedConfigurationBuilder<PropertiesConfiguration> builder = configs.propertiesBuilder(ConfigurationAssert.getTestURL(TEST_PROPERTIES));
388         checkProperties(builder.getConfiguration());
389     }
390 
391     /**
392      * Tests whether a properties configuration can be loaded from a file.
393      */
394     @Test
395     void testPropertiesFromFile() throws ConfigurationException {
396         final Configurations configs = new Configurations();
397         final PropertiesConfiguration config = configs.properties(ConfigurationAssert.getTestFile(TEST_PROPERTIES));
398         checkProperties(config);
399     }
400 
401     /**
402      * Tests whether a properties configuration can be loaded from a file path.
403      */
404     @Test
405     void testPropertiesFromPath() throws ConfigurationException {
406         final Configurations configs = new Configurations();
407         final PropertiesConfiguration config = configs.properties(absolutePath(TEST_PROPERTIES));
408         checkProperties(config);
409     }
410 
411     /**
412      * Tests whether a properties configuration can be loaded from a URL.
413      */
414     @Test
415     void testPropertiesFromURL() throws ConfigurationException {
416         final Configurations configs = new Configurations();
417         final PropertiesConfiguration config = configs.properties(ConfigurationAssert.getTestURL(TEST_PROPERTIES));
418         checkProperties(config);
419     }
420 
421     /**
422      * Tests whether a builder for a XML configuration can be created for a given file.
423      */
424     @Test
425     void testXMLBuilderFromFile() throws ConfigurationException {
426         final Configurations configs = new Configurations();
427         final FileBasedConfigurationBuilder<XMLConfiguration> builder = configs.xmlBuilder(ConfigurationAssert.getTestFile(TEST_XML));
428         checkXML(builder.getConfiguration());
429     }
430 
431     /**
432      * Tests whether a builder for a XML configuration can be created for a given file path.
433      */
434     @Test
435     void testXMLBuilderFromPath() throws ConfigurationException {
436         final Configurations configs = new Configurations();
437         final FileBasedConfigurationBuilder<XMLConfiguration> builder = configs.xmlBuilder(absolutePath(TEST_XML));
438         checkXML(builder.getConfiguration());
439     }
440 
441     /**
442      * Tests whether a builder for a XML configuration can be created for a given URL.
443      */
444     @Test
445     void testXMLBuilderFromURL() throws ConfigurationException {
446         final Configurations configs = new Configurations();
447         final FileBasedConfigurationBuilder<XMLConfiguration> builder = configs.xmlBuilder(ConfigurationAssert.getTestURL(TEST_XML));
448         checkXML(builder.getConfiguration());
449     }
450 
451     /**
452      * Tests whether a XML configuration can be loaded from a file.
453      */
454     @Test
455     void testXMLFromFile() throws ConfigurationException {
456         final Configurations configs = new Configurations();
457         final XMLConfiguration config = configs.xml(ConfigurationAssert.getTestFile(TEST_XML));
458         checkXML(config);
459     }
460 
461     /**
462      * Tests whether a XML configuration can be loaded from a URL.
463      */
464     @Test
465     void testXMLFromPath() throws ConfigurationException {
466         final Configurations configs = new Configurations();
467         final XMLConfiguration config = configs.xml(absolutePath(TEST_XML));
468         checkXML(config);
469     }
470 
471     /**
472      * Tests whether a XML configuration can be loaded from a URL.
473      */
474     @Test
475     void testXMLFromURL() throws ConfigurationException {
476         final Configurations configs = new Configurations();
477         final XMLConfiguration config = configs.xml(ConfigurationAssert.getTestURL(TEST_XML));
478         checkXML(config);
479     }
480 }