1   /*
2    * Copyright 2001-2004 The Apache Software Foundation.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License")
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.apache.commons.configuration;
18  
19  import java.io.File;
20  import java.util.Collection;
21  
22  import junit.framework.TestCase;
23  
24  import org.xml.sax.SAXParseException;
25  
26  /***
27   * Test the ConfigurationFactory.
28   *
29   * @version $Id: TestConfigurationFactory.java,v 1.15 2004/09/21 17:18:27 ebourg Exp $
30   */
31  public class TestConfigurationFactory extends TestCase
32  {
33      /*** The Files that we test with */
34      private File digesterRules = new File("conf/digesterRules.xml");
35      private File testDigesterFile =
36          new File("conf/testDigesterConfiguration.xml");
37      private File testDigesterFileReverseOrder =
38          new File("conf/testDigesterConfigurationReverseOrder.xml");
39      private File testDigesterFileNamespaceAware =
40          new File("conf/testDigesterConfigurationNamespaceAware.xml");
41      private File testDigesterFileBasePath =
42          new File("conf/testDigesterConfigurationBasePath.xml");
43      private File testDigesterFileEnhanced =
44          new File("conf/testDigesterConfiguration2.xml");
45      private File testDigesterFileComplete =
46          new File("conf/testDigesterConfiguration3.xml");
47  
48      private File testDigesterBadXML = new File("conf/testDigesterBadXML.xml");
49  
50      private String testBasePath = new File("conf").getAbsolutePath();
51  
52      private Configuration configuration;
53      private CompositeConfiguration compositeConfiguration;
54      private ConfigurationFactory factory;
55  
56      public void setUp() throws Exception
57      {
58          System.setProperty("java.naming.factory.initial","org.apache.commons.configuration.MockStaticMemoryInitialContextFactory");
59          factory = new ConfigurationFactory();
60      }
61  
62      public void testJNDI() throws Exception
63      {
64          JNDIConfiguration jndiConfiguration = new JNDIConfiguration();
65          Object o = jndiConfiguration.getProperty("test.boolean");
66          assertNotNull(o);
67          assertEquals("true",o.toString());
68      }
69  
70      public void testLoadingConfiguration() throws Exception
71      {
72          factory.setConfigurationFileName(
73              testDigesterFile.toString());
74  
75          compositeConfiguration =
76              (CompositeConfiguration) factory.getConfiguration();
77  
78          assertEquals(
79              "Verify how many configs",
80              3,
81              compositeConfiguration.getNumberOfConfigurations());
82          assertEquals(
83              PropertiesConfiguration.class,
84              compositeConfiguration.getConfiguration(0).getClass());
85          PropertiesConfiguration pc =
86              (PropertiesConfiguration) compositeConfiguration.getConfiguration(
87                  0);
88  
89          assertNotNull(
90              "Make sure we have a fileName:" + pc.getFileName(),
91              pc.getFileName());
92  
93          assertTrue(
94              "Make sure we have loades our key",
95              compositeConfiguration.getBoolean("test.boolean"));
96          assertEquals(
97              "I'm complex!",
98              compositeConfiguration.getProperty(
99                  "element2.subelement.subsubelement"));
100 
101         configuration = compositeConfiguration;
102         assertEquals(
103             "I'm complex!",
104             configuration.getProperty("element2.subelement.subsubelement"));
105     }
106 
107     public void testLoadingConfigurationReverseOrder() throws Exception
108     {
109         factory.setConfigurationFileName(
110             testDigesterFileReverseOrder.toString());
111 
112         configuration = factory.getConfiguration();
113 
114         assertEquals("8", configuration.getProperty("test.short"));
115 
116         factory.setConfigurationFileName(testDigesterFile.toString());
117 
118         configuration = factory.getConfiguration();
119         assertEquals("1", configuration.getProperty("test.short"));
120     }
121 
122     public void testLoadingConfigurationWithRulesXML() throws Exception
123     {
124         factory.setConfigurationFileName(testDigesterFile.toString());
125         factory.setDigesterRules(digesterRules.toURL());
126 
127         compositeConfiguration = (CompositeConfiguration) factory.getConfiguration();
128 
129         assertEquals(
130             "Verify how many configs",
131             3,
132             compositeConfiguration.getNumberOfConfigurations());
133 
134         assertEquals(
135             PropertiesConfiguration.class,
136             compositeConfiguration.getConfiguration(0).getClass());
137 
138         PropertiesConfiguration pc =
139             (PropertiesConfiguration) compositeConfiguration.getConfiguration(
140                 0);
141         assertNotNull(
142             "Make sure we have a fileName:" + pc.getFileName(),
143             pc.getFileName());
144         assertTrue(
145             "Make sure we have loaded our key",
146             pc.getBoolean("test.boolean"));
147 
148         assertTrue(
149             "Make sure we have loaded our key",
150             compositeConfiguration.getBoolean("test.boolean"));
151 
152         assertEquals(
153             "I'm complex!",
154             compositeConfiguration.getProperty(
155                 "element2.subelement.subsubelement"));
156 
157         configuration = compositeConfiguration;
158         assertEquals(
159             "I'm complex!",
160             configuration.getProperty("element2.subelement.subsubelement"));
161     }
162 
163     public void testLoadingConfigurationNamespaceAware() throws Exception
164     {
165         factory.setConfigurationFileName(testDigesterFileNamespaceAware.toString());
166         //factory.setDigesterRules(digesterRules.toURL());
167         factory.setDigesterRuleNamespaceURI("namespace-one");
168 
169         checkCompositeConfiguration();
170     }
171 
172     public void testLoadingConfigurationBasePath() throws Exception
173     {
174         factory.setConfigurationFileName(testDigesterFileBasePath.toString());
175 
176         factory.setBasePath(testBasePath);
177 
178         //factory.setDigesterRules(digesterRules.toURL());
179         //factory.setDigesterRuleNamespaceURI("namespace-one");
180 
181         checkCompositeConfiguration();
182     }
183 
184     public void testLoadingAdditional() throws Exception
185     {
186         factory.setConfigurationFileName(testDigesterFileEnhanced.toString());
187         factory.setBasePath(null);
188         checkUnionConfig();
189     }
190 
191     public void testLoadingURL() throws Exception
192     {
193         factory.setConfigurationURL(testDigesterFileEnhanced.toURL());
194         checkUnionConfig();
195     }
196 
197     public void testThrowingConfigurationInitializationException() throws Exception
198     {
199         factory.setConfigurationFileName(testDigesterBadXML.toString());
200         try
201         {
202             factory.getConfiguration();
203             fail("Should have throw an Exception");
204         }
205         catch (ConfigurationException cle)
206         {
207             assertTrue(cle.getCause() instanceof SAXParseException);
208         }
209     }
210 
211     // Tests if properties from all sources can be loaded
212     public void testAllConfiguration() throws Exception
213     {
214 
215         factory.setConfigurationURL(testDigesterFileComplete.toURL());
216         Configuration config = factory.getConfiguration();
217         assertFalse(config.isEmpty());
218         assertTrue(config instanceof CompositeConfiguration);
219         CompositeConfiguration cc = (CompositeConfiguration)config;
220         assertTrue(cc.getNumberOfConfigurations()>1);
221         // Currently fails, should be 4?  Only 2?
222         //assertEquals(4, cc.getNumberOfConfigurations());
223 
224         assertNotNull(config.getProperty("tables.table(0).fields.field(2).name"));
225         assertNotNull(config.getProperty("element2.subelement.subsubelement"));
226         assertEquals("value", config.getProperty("element3"));
227         assertEquals("foo", config.getProperty("element3[@name]"));
228         assertNotNull(config.getProperty("mail.account.user"));
229                 
230         assertNotNull(config.getProperty("test.onlyinjndi"));
231         assertTrue(config.getBoolean("test.onlyinjndi"));
232         
233         Configuration subset = config.subset("test");
234         assertNotNull(subset.getProperty("onlyinjndi"));
235         assertTrue(subset.getBoolean("onlyinjndi"));
236     }
237 
238     private void checkUnionConfig() throws Exception
239     {
240         compositeConfiguration = (CompositeConfiguration) factory.getConfiguration();
241         assertEquals(
242             "Verify how many configs",
243             3,
244             compositeConfiguration.getNumberOfConfigurations());
245 
246         // Test if union was constructed correctly
247         Object prop = compositeConfiguration.getProperty("tables.table.name");
248         assertTrue(prop instanceof Collection);
249         assertEquals(3, ((Collection) prop).size());
250         assertEquals(
251             "users",
252             compositeConfiguration.getProperty("tables.table(0).name"));
253         assertEquals(
254             "documents",
255             compositeConfiguration.getProperty("tables.table(1).name"));
256         assertEquals(
257             "tasks",
258             compositeConfiguration.getProperty("tables.table(2).name"));
259 
260         prop =
261             compositeConfiguration.getProperty(
262                 "tables.table.fields.field.name");
263         assertTrue(prop instanceof Collection);
264         assertEquals(17, ((Collection) prop).size());
265 
266         assertEquals(
267             "smtp.mydomain.org",
268             compositeConfiguration.getString("mail.host.smtp"));
269         assertEquals(
270             "pop3.mydomain.org",
271             compositeConfiguration.getString("mail.host.pop"));
272 
273         // This was overriden
274         assertEquals(
275             "masterOfPost",
276             compositeConfiguration.getString("mail.account.user"));
277         assertEquals(
278             "topsecret",
279             compositeConfiguration.getString("mail.account.psswd"));
280 
281         // This was overriden, too, but not in additional section
282         assertEquals(
283             "enhanced factory",
284             compositeConfiguration.getString("test.configuration"));
285     }
286 
287     private void checkCompositeConfiguration() throws Exception
288     {
289         compositeConfiguration = (CompositeConfiguration) factory.getConfiguration();
290 
291         assertEquals(
292             "Verify how many configs",
293             2,
294             compositeConfiguration.getNumberOfConfigurations());
295 
296         assertEquals(
297             PropertiesConfiguration.class,
298             compositeConfiguration.getConfiguration(0).getClass());
299 
300         PropertiesConfiguration pc =
301             (PropertiesConfiguration) compositeConfiguration.getConfiguration(
302                 0);
303         assertNotNull(
304             "Make sure we have a fileName:" + pc.getFileName(),
305             pc.getFileName());
306         assertTrue(
307             "Make sure we have loaded our key",
308             pc.getBoolean("test.boolean"));
309 
310         assertTrue(
311             "Make sure we have loaded our key",
312             compositeConfiguration.getBoolean("test.boolean"));
313 
314         
315         Object property = compositeConfiguration.getProperty(
316             "element2.subelement.subsubelement");
317         assertNull("Should have returned a null",property);
318     }
319 }