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;
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.assertNull;
22  import static org.junit.jupiter.api.Assertions.assertSame;
23  import static org.junit.jupiter.api.Assertions.assertThrows;
24  import static org.mockito.Mockito.mock;
25  
26  import java.nio.charset.StandardCharsets;
27  import java.util.Map;
28  
29  import org.apache.commons.configuration2.builder.fluent.FileBasedBuilderParameters;
30  import org.apache.commons.configuration2.builder.fluent.Parameters;
31  import org.apache.commons.configuration2.builder.fluent.PropertiesBuilderParameters;
32  import org.apache.commons.configuration2.builder.fluent.XMLBuilderParameters;
33  import org.apache.commons.configuration2.convert.ListDelimiterHandler;
34  import org.apache.commons.configuration2.tree.ExpressionEngine;
35  import org.junit.jupiter.api.BeforeAll;
36  import org.junit.jupiter.api.BeforeEach;
37  import org.junit.jupiter.api.Test;
38  
39  /**
40   * Test class for {@code DefaultParametersManager}.
41   */
42  public class TestDefaultParametersManager {
43  
44      /**
45       * A test defaults handler implementation for testing the initialization of parameters objects with default values. This
46       * class sets some hard-coded default values.
47       */
48      private static final class FileBasedDefaultsHandler implements DefaultParametersHandler<FileBasedBuilderParameters> {
49          @Override
50          public void initializeDefaults(final FileBasedBuilderParameters parameters) {
51              parameters.setThrowExceptionOnMissing(true).setEncoding(DEF_ENCODING).setListDelimiterHandler(listHandler);
52          }
53      }
54  
55      /** Constant for the default encoding. */
56      private static final String DEF_ENCODING = StandardCharsets.UTF_8.name();
57  
58      /** A test list delimiter handler. */
59      private static ListDelimiterHandler listHandler;
60  
61      /**
62       * Checks whether the expected default values have been set on a parameters object.
63       *
64       * @param map the map with parameters
65       */
66      private static void checkDefaultValues(final Map<String, Object> map) {
67          assertEquals(listHandler, map.get("listDelimiterHandler"));
68          assertEquals(Boolean.TRUE, map.get("throwExceptionOnMissing"));
69          final FileBasedBuilderParametersImpl fbparams = FileBasedBuilderParametersImpl.fromParameters(map);
70          assertEquals(DEF_ENCODING, fbparams.getFileHandler().getEncoding());
71      }
72  
73      /**
74       * Checks that no default values have been set on a parameters object.
75       *
76       * @param map the map with parameters
77       */
78      private static void checkNoDefaultValues(final Map<String, Object> map) {
79          assertFalse(map.containsKey("throwExceptionOnMissing"));
80          final FileBasedBuilderParametersImpl fbParams = FileBasedBuilderParametersImpl.fromParameters(map, true);
81          assertNull(fbParams.getFileHandler().getEncoding());
82      }
83  
84      @BeforeAll
85      public static void setUpBeforeClass() throws Exception {
86          listHandler = mock(ListDelimiterHandler.class);
87      }
88  
89      /** An object for creating new parameters objects. */
90      private Parameters parameters;
91  
92      /** The manager to be tested. */
93      private DefaultParametersManager manager;
94  
95      @BeforeEach
96      public void setUp() throws Exception {
97          parameters = new Parameters();
98          manager = new DefaultParametersManager();
99      }
100 
101     /**
102      * Tests whether default values are set for newly created parameters objects.
103      */
104     @Test
105     void testApplyDefaults() {
106         manager.registerDefaultsHandler(FileBasedBuilderParameters.class, new FileBasedDefaultsHandler());
107         final FileBasedBuilderParameters params = parameters.fileBased();
108         manager.initializeParameters(params);
109         final Map<String, Object> map = params.getParameters();
110         checkDefaultValues(map);
111     }
112 
113     /**
114      * Tests whether multiple handlers can be registered for the same classes and whether they are called in the correct
115      * order.
116      */
117     @Test
118     void testApplyDefaultsMultipleHandlers() {
119         final ExpressionEngine engine = mock(ExpressionEngine.class);
120         manager.registerDefaultsHandler(XMLBuilderParameters.class, parameters -> parameters.setThrowExceptionOnMissing(false)
121             .setListDelimiterHandler(mock(ListDelimiterHandler.class)).setExpressionEngine(engine));
122         manager.registerDefaultsHandler(FileBasedBuilderParameters.class, new FileBasedDefaultsHandler());
123         final XMLBuilderParameters params = parameters.xml();
124         manager.initializeParameters(params);
125         final Map<String, Object> map = params.getParameters();
126         checkDefaultValues(map);
127         assertSame(engine, map.get("expressionEngine"));
128     }
129 
130     /**
131      * Tests whether default values are also applied when a sub parameters class is created.
132      */
133     @Test
134     void testApplyDefaultsOnSubClass() {
135         manager.registerDefaultsHandler(FileBasedBuilderParameters.class, new FileBasedDefaultsHandler());
136         final XMLBuilderParameters params = parameters.xml();
137         manager.initializeParameters(params);
138         final Map<String, Object> map = params.getParameters();
139         checkDefaultValues(map);
140     }
141 
142     /**
143      * Tests that default values are only applied if the start class provided at registration time matches.
144      */
145     @Test
146     void testApplyDefaultsStartClass() {
147         manager.registerDefaultsHandler(FileBasedBuilderParameters.class, new FileBasedDefaultsHandler(), XMLBuilderParameters.class);
148         final XMLBuilderParameters paramsXml = parameters.xml();
149         manager.initializeParameters(paramsXml);
150         Map<String, Object> map = paramsXml.getParameters();
151         checkDefaultValues(map);
152         final PropertiesBuilderParameters paramsProps = parameters.properties();
153         manager.initializeParameters(paramsProps);
154         map = paramsProps.getParameters();
155         checkNoDefaultValues(map);
156     }
157 
158     /**
159      * Tests whether initializeParameters() ignores null input. (We can only test that no exception is thrown.)
160      */
161     @Test
162     void testInitializeParametersNull() {
163         manager.registerDefaultsHandler(FileBasedBuilderParameters.class, new FileBasedDefaultsHandler());
164         manager.initializeParameters(null);
165     }
166 
167     /**
168      * Tries to register a default handler without a class.
169      */
170     @Test
171     void testRegisterDefaultsHandlerNoClass() {
172         final FileBasedDefaultsHandler handler = new FileBasedDefaultsHandler();
173         assertThrows(IllegalArgumentException.class, () -> manager.registerDefaultsHandler(null, handler));
174     }
175 
176     /**
177      * Tries to register a null default handler.
178      */
179     @Test
180     void testRegisterDefaultsHandlerNoHandler() {
181         assertThrows(IllegalArgumentException.class, () -> manager.registerDefaultsHandler(BasicBuilderProperties.class, null));
182     }
183 
184     /**
185      * Tests whether all occurrences of a given defaults handler can be removed.
186      */
187     @Test
188     void testUnregisterDefaultsHandlerAll() {
189         final FileBasedDefaultsHandler handler = new FileBasedDefaultsHandler();
190         manager.registerDefaultsHandler(FileBasedBuilderParameters.class, handler, XMLBuilderParameters.class);
191         manager.registerDefaultsHandler(FileBasedBuilderParameters.class, handler, PropertiesBuilderParameters.class);
192         manager.unregisterDefaultsHandler(handler);
193 
194         final XMLBuilderParameters paramsXml = parameters.xml();
195         manager.initializeParameters(paramsXml);
196         checkNoDefaultValues(paramsXml.getParameters());
197         final PropertiesBuilderParameters paramsProps = parameters.properties();
198         manager.initializeParameters(paramsProps);
199         checkNoDefaultValues(paramsProps.getParameters());
200     }
201 
202     /**
203      * Tests whether a specific occurrence of a defaults handler can be removed.
204      */
205     @Test
206     void testUnregisterDefaultsHandlerSpecific() {
207         final FileBasedDefaultsHandler handler = new FileBasedDefaultsHandler();
208         manager.registerDefaultsHandler(FileBasedBuilderParameters.class, handler, XMLBuilderParameters.class);
209         manager.registerDefaultsHandler(FileBasedBuilderParameters.class, handler, PropertiesBuilderParameters.class);
210         manager.unregisterDefaultsHandler(handler, PropertiesBuilderParameters.class);
211         final XMLBuilderParameters paramsXml = parameters.xml();
212         manager.initializeParameters(paramsXml);
213         checkDefaultValues(paramsXml.getParameters());
214         final PropertiesBuilderParameters paramsProps = parameters.properties();
215         manager.initializeParameters(paramsProps);
216         checkNoDefaultValues(paramsProps.getParameters());
217     }
218 }