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.combined;
18  
19  import static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertThrows;
21  
22  import java.util.ArrayList;
23  import java.util.Collections;
24  import java.util.Locale;
25  
26  import org.apache.commons.configuration2.PropertiesConfiguration;
27  import org.apache.commons.configuration2.XMLPropertiesConfiguration;
28  import org.apache.commons.configuration2.builder.BasicConfigurationBuilder;
29  import org.apache.commons.configuration2.builder.BuilderParameters;
30  import org.apache.commons.configuration2.builder.FileBasedBuilderParametersImpl;
31  import org.apache.commons.configuration2.builder.ReloadingFileBasedConfigurationBuilder;
32  import org.apache.commons.configuration2.ex.ConfigurationException;
33  import org.junit.jupiter.api.Test;
34  import org.mockito.Mockito;
35  
36  /**
37   * Test class for {@code FileExtensionConfigurationBuilderProvider}.
38   */
39  public class TestFileExtensionConfigurationBuilderProvider {
40      /** Constant for the name of the default configuration class. */
41      private static final String DEF_CLASS = PropertiesConfiguration.class.getName();
42  
43      /** Constant for the name of the matching class. */
44      private static final String MATCH_CLASS = XMLPropertiesConfiguration.class.getName();
45  
46      /** The test file extension. */
47      private static final String EXT = "xml";
48  
49      /**
50       * Creates a test instance with default settings.
51       *
52       * @return the test object
53       */
54      private static FileExtensionConfigurationBuilderProvider setUpProvider() {
55          return new FileExtensionConfigurationBuilderProvider(BasicConfigurationBuilder.class.getName(), null, MATCH_CLASS, DEF_CLASS, EXT, null);
56      }
57  
58      /**
59       * Creates a mock for the configuration declaration.
60       *
61       * @return the mock object
62       */
63      private ConfigurationDeclaration setUpDecl() {
64          return Mockito.mock(ConfigurationDeclaration.class);
65      }
66  
67      /**
68       * Tests whether the correct configuration class is selected if the file extension matches.
69       */
70      @Test
71      public void testDetermineConfigurationClassExtensionMatch() throws ConfigurationException {
72          final ConfigurationDeclaration decl = setUpDecl();
73          final BuilderParameters params = new FileBasedBuilderParametersImpl().setPath("C:\\Test\\someTestConfiguration." + EXT);
74          final FileExtensionConfigurationBuilderProvider provider = setUpProvider();
75          assertEquals(MATCH_CLASS, provider.determineConfigurationClass(decl, Collections.singleton(params)));
76      }
77  
78      /**
79       * Tests whether the correct configuration class is selected if the file extension does not match.
80       */
81      @Test
82      public void testDetermineConfigurationClassExtensionNoMatch() throws ConfigurationException {
83          final ConfigurationDeclaration decl = setUpDecl();
84          final BuilderParameters params = new FileBasedBuilderParametersImpl().setPath("C:\\Test\\someTestConfiguration.properties");
85          final FileExtensionConfigurationBuilderProvider provider = setUpProvider();
86          assertEquals(DEF_CLASS, provider.determineConfigurationClass(decl, Collections.singleton(params)));
87      }
88  
89      /**
90       * Tests that matches of file extensions are case insensitive.
91       */
92      @Test
93      public void testDetermineConfigurationClassMatchCase() throws ConfigurationException {
94          final ConfigurationDeclaration decl = setUpDecl();
95          final BuilderParameters params = new FileBasedBuilderParametersImpl().setPath("C:\\Test\\someTestConfiguration." + EXT.toUpperCase(Locale.ENGLISH));
96          final FileExtensionConfigurationBuilderProvider provider = setUpProvider();
97          assertEquals(MATCH_CLASS, provider.determineConfigurationClass(decl, Collections.singleton(params)));
98      }
99  
100     /**
101      * Tests whether the correct configuration class is selected if the file name does not have an extension.
102      */
103     @Test
104     public void testDetermineConfigurationClassNoExtension() throws ConfigurationException {
105         final ConfigurationDeclaration decl = setUpDecl();
106         final BuilderParameters params = new FileBasedBuilderParametersImpl().setPath("C:\\Test\\someTestConfiguration");
107         final FileExtensionConfigurationBuilderProvider provider = setUpProvider();
108         assertEquals(DEF_CLASS, provider.determineConfigurationClass(decl, Collections.singleton(params)));
109     }
110 
111     /**
112      * Tests whether the correct configuration class is selected if no file-based parameters are provided.
113      */
114     @Test
115     public void testDetermineConfigurationClassNoParams() throws ConfigurationException {
116         final ConfigurationDeclaration decl = setUpDecl();
117         final FileExtensionConfigurationBuilderProvider provider = setUpProvider();
118         assertEquals(DEF_CLASS, provider.determineConfigurationClass(decl, new ArrayList<>()));
119     }
120 
121     /**
122      * Tests whether the correct configuration class is selected if no file name is set.
123      */
124     @Test
125     public void testDeterminieConfigurationClassNoFileName() throws ConfigurationException {
126         final ConfigurationDeclaration decl = setUpDecl();
127         final BuilderParameters params = new FileBasedBuilderParametersImpl();
128         final FileExtensionConfigurationBuilderProvider provider = setUpProvider();
129         assertEquals(DEF_CLASS, provider.determineConfigurationClass(decl, Collections.singleton(params)));
130     }
131 
132     /**
133      * Tries to create an instance without the default configuration class.
134      */
135     @Test
136     public void testInitNoDefaultConfigClass() {
137         final String builderClass = BasicConfigurationBuilder.class.getName();
138         assertThrows(IllegalArgumentException.class,
139                 () -> new FileExtensionConfigurationBuilderProvider(builderClass, null, MATCH_CLASS, null, EXT, null));
140     }
141 
142     /**
143      * Tries to create an instance without a file extension.
144      */
145     @Test
146     public void testInitNoExt() {
147         final String builderClass = BasicConfigurationBuilder.class.getName();
148         assertThrows(IllegalArgumentException.class,
149                 () -> new FileExtensionConfigurationBuilderProvider(builderClass, null, MATCH_CLASS, DEF_CLASS, null, null));
150     }
151 
152     /**
153      * Tries to create an instance without the matching configuration class.
154      */
155     @Test
156     public void testInitNoMatchingConfigClass() {
157         final String builderClass = BasicConfigurationBuilder.class.getName();
158         assertThrows(IllegalArgumentException.class,
159                 () -> new FileExtensionConfigurationBuilderProvider(builderClass, null, null, DEF_CLASS, EXT, null));
160     }
161 
162     /**
163      * Tests whether the super class is correctly initialized.
164      */
165     @Test
166     public void testInitSuper() {
167         final FileExtensionConfigurationBuilderProvider provider = new FileExtensionConfigurationBuilderProvider(BasicConfigurationBuilder.class.getName(),
168             ReloadingFileBasedConfigurationBuilder.class.getName(), MATCH_CLASS, DEF_CLASS, EXT, null);
169         assertEquals(BasicConfigurationBuilder.class.getName(), provider.getBuilderClass());
170         assertEquals(ReloadingFileBasedConfigurationBuilder.class.getName(), provider.getReloadingBuilderClass());
171         assertEquals(DEF_CLASS, provider.getConfigurationClass());
172     }
173 }