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  
18  package org.apache.commons.configuration2;
19  
20  import static org.junit.jupiter.api.Assertions.assertArrayEquals;
21  import static org.junit.jupiter.api.Assertions.assertEquals;
22  import static org.junit.jupiter.api.Assertions.assertFalse;
23  import static org.junit.jupiter.api.Assertions.assertNotEquals;
24  import static org.junit.jupiter.api.Assertions.assertTrue;
25  
26  import java.util.Iterator;
27  import java.util.List;
28  
29  import org.apache.commons.configuration2.builder.FileBasedBuilderParametersImpl;
30  import org.apache.commons.configuration2.builder.combined.CombinedConfigurationBuilder;
31  import org.apache.commons.configuration2.ex.ConfigurationException;
32  import org.apache.commons.configuration2.io.FileHandler;
33  import org.junit.jupiter.api.Test;
34  
35  /**
36   * Compare the behavior of various methods between CompositeConfiguration and normal (Properties) Configuration
37   */
38  public class TestEqualBehavior {
39      /**
40       * Checks whether two configurations have the same size, the same key sequence and contain the same key -> value
41       * mappings
42       */
43      private void checkEquality(final String msg, final Configuration c1, final Configuration c2) {
44          final Iterator<String> it1 = c1.getKeys();
45          final Iterator<String> it2 = c2.getKeys();
46  
47          while (it1.hasNext() && it2.hasNext()) {
48              final String key1 = it1.next();
49              final String key2 = it2.next();
50              assertEquals(key1, key2, msg + ", Keys: ");
51              assertEquals(c1.containsKey(key1), c2.containsKey(key2), msg + ", Contains: ");
52          }
53          assertEquals(it1.hasNext(), it2.hasNext(), msg + ", Iterator: ");
54      }
55  
56      /**
57       * Checks whether two configurations have the same key -> value mapping
58       */
59      private void checkSameKey(final String msg, final String key, final Configuration c1, final Configuration c2) {
60          final String[] s1 = c1.getStringArray(key);
61          final String[] s2 = c2.getStringArray(key);
62  
63          assertArrayEquals(s1, s2, msg + ", String Array: ");
64  
65          final List<Object> list1 = c1.getList(key);
66          final List<Object> list2 = c2.getList(key);
67  
68          assertEquals(list1, list2, msg + ", List: ");
69      }
70  
71      private Configuration setupCompositeConfiguration() throws ConfigurationException {
72          final CombinedConfigurationBuilder builder = new CombinedConfigurationBuilder();
73          builder.configure(new FileBasedBuilderParametersImpl().setFile(ConfigurationAssert.getTestFile("testEqualDigester.xml")));
74          return builder.getConfiguration();
75      }
76  
77      private Configuration setupSimpleConfiguration() throws Exception {
78          final String simpleConfigurationFile = ConfigurationAssert.getTestFile("testEqual.properties").getAbsolutePath();
79          final PropertiesConfiguration c = new PropertiesConfiguration();
80          final FileHandler handler = new FileHandler(c);
81          handler.setFileName(simpleConfigurationFile);
82          handler.load();
83          return c;
84      }
85  
86      /**
87       * If we add a to an existing key, does it work?
88       */
89      @Test
90      public void testAddingSet() throws Exception {
91          final Configuration simple = setupSimpleConfiguration();
92          final Configuration composite = setupCompositeConfiguration();
93  
94          final String key = "existing.property";
95          final String value = "new value";
96  
97          assertTrue(simple.containsKey(key));
98          assertEquals(simple.containsKey(key), composite.containsKey(key));
99  
100         simple.addProperty(key, value);
101         composite.addProperty(key, value);
102 
103         assertTrue(simple.containsKey(key));
104         assertEquals(simple.containsKey(key), composite.containsKey(key));
105 
106         checkSameKey("testAddingSet", key, simple, composite);
107         checkEquality("testAddingSet", simple, composite);
108     }
109 
110     /**
111      * If we add a key, does it work?
112      */
113     @Test
114     public void testAddingUnset() throws Exception {
115         final Configuration simple = setupSimpleConfiguration();
116         final Configuration composite = setupCompositeConfiguration();
117 
118         final String key = "nonexisting.property";
119         final String value = "new value";
120 
121         assertFalse(simple.containsKey(key));
122         assertEquals(simple.containsKey(key), composite.containsKey(key));
123 
124         simple.addProperty(key, value);
125         composite.addProperty(key, value);
126 
127         checkSameKey("testAddingUnset", key, simple, composite);
128         checkEquality("testAddingUnset", simple, composite);
129     }
130 
131     /**
132      * If we delete a key, does it vanish? Does it leave all the other keys unchanged? How about an unset key?
133      */
134     @Test
135     public void testDeletingExisting() throws Exception {
136         final Configuration simple = setupSimpleConfiguration();
137         final Configuration composite = setupCompositeConfiguration();
138 
139         final String key = "clear.property";
140 
141         assertTrue(simple.containsKey(key));
142         assertEquals(simple.containsKey(key), composite.containsKey(key));
143 
144         simple.clearProperty(key);
145         composite.clearProperty(key);
146 
147         assertFalse(simple.containsKey(key));
148         assertEquals(simple.containsKey(key), composite.containsKey(key));
149 
150         checkEquality("testDeletingExisting", simple, composite);
151     }
152 
153     @Test
154     public void testDeletingNonExisting() throws Exception {
155         final Configuration simple = setupSimpleConfiguration();
156         final Configuration composite = setupCompositeConfiguration();
157 
158         final String key = "nonexisting.clear.property";
159 
160         assertFalse(simple.containsKey(key));
161         assertEquals(simple.containsKey(key), composite.containsKey(key));
162 
163         simple.clearProperty(key);
164         composite.clearProperty(key);
165 
166         assertFalse(simple.containsKey(key));
167         assertEquals(simple.containsKey(key), composite.containsKey(key));
168 
169         checkEquality("testDeletingNonExisting", simple, composite);
170     }
171 
172     /**
173      * Are both configurations equal after loading?
174      */
175     @Test
176     public void testLoading() throws Exception {
177         final Configuration simple = setupSimpleConfiguration();
178         final Configuration composite = setupCompositeConfiguration();
179 
180         checkEquality("testLoading", simple, composite);
181     }
182 
183     @Test
184     public void testSettingExisting() throws Exception {
185         final Configuration simple = setupSimpleConfiguration();
186         final Configuration composite = setupCompositeConfiguration();
187 
188         final String key = "existing.property";
189         final String value = "new value";
190 
191         assertTrue(simple.containsKey(key));
192         assertNotEquals(value, simple.getString(key));
193         assertEquals(simple.containsKey(key), composite.containsKey(key));
194 
195         simple.setProperty(key, value);
196         composite.setProperty(key, value);
197 
198         assertTrue(simple.containsKey(key));
199         assertEquals(simple.getString(key), value);
200         assertEquals(simple.containsKey(key), composite.containsKey(key));
201 
202         checkSameKey("testSettingExisting", key, simple, composite);
203         checkEquality("testSettingExisting", simple, composite);
204     }
205 
206     /**
207      * If we set a key, does it work? How about an existing key? Can we change it?
208      */
209     @Test
210     public void testSettingNonExisting() throws Exception {
211         final Configuration simple = setupSimpleConfiguration();
212         final Configuration composite = setupCompositeConfiguration();
213 
214         final String key = "nonexisting.property";
215         final String value = "new value";
216 
217         assertFalse(simple.containsKey(key));
218         assertEquals(simple.containsKey(key), composite.containsKey(key));
219 
220         simple.setProperty(key, value);
221         composite.setProperty(key, value);
222 
223         assertTrue(simple.containsKey(key));
224         assertEquals(simple.containsKey(key), composite.containsKey(key));
225 
226         checkSameKey("testSettingNonExisting", key, simple, composite);
227         checkEquality("testSettingNonExisting", simple, composite);
228     }
229 }