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