1   /*
2    * Copyright (C) The DNA Group. All rights reserved.
3    *
4    * This software is published under the terms of the DNA
5    * Software License version 1.1, a copy of which has been included
6    * with this distribution in the LICENSE.txt file.
7    */
8   package org.codehaus.dna.impl;
9   
10  import java.io.StringReader;
11  import java.lang.reflect.Proxy;
12  import javax.xml.parsers.DocumentBuilder;
13  import javax.xml.parsers.DocumentBuilderFactory;
14  import javax.xml.parsers.ParserConfigurationException;
15  import javax.xml.transform.sax.SAXResult;
16  import junit.framework.TestCase;
17  
18  import org.codehaus.dna.Configuration;
19  import org.codehaus.dna.impl.ConfigurationUtil;
20  import org.codehaus.dna.impl.DefaultConfiguration;
21  import org.w3c.dom.Comment;
22  import org.w3c.dom.Document;
23  import org.w3c.dom.Element;
24  import org.w3c.dom.NamedNodeMap;
25  import org.w3c.dom.Node;
26  import org.w3c.dom.NodeList;
27  import org.w3c.dom.Text;
28  import org.xml.sax.ContentHandler;
29  import org.xml.sax.InputSource;
30  
31  public class ConfigurationUtilTestCase
32      extends TestCase
33  {
34      private static final String DOC_FACTORY = "javax.xml.parsers.DocumentBuilderFactory";
35  
36      public void testToElementWithBasicConfiguration()
37          throws Exception
38      {
39          final String name = "meep";
40          final DefaultConfiguration configuration = new DefaultConfiguration( name, "", "" );
41          final Element element = ConfigurationUtil.toElement( configuration );
42          assertEquals( "element.getNodeName()", name, element.getNodeName() );
43  
44          final NodeList nodeList = element.getChildNodes();
45          assertEquals( "nodeList.getLength()", 0, nodeList.getLength() );
46  
47          final NamedNodeMap attributes = element.getAttributes();
48          assertEquals( "attributes.getLength()", 0, attributes.getLength() );
49      }
50  
51      public void testToElementWithConfigurationWithValue()
52          throws Exception
53      {
54          final String name = "meep";
55          final String value = "blah";
56          final DefaultConfiguration configuration = new DefaultConfiguration( name, "", "" );
57          configuration.setValue( value );
58          final Element element = ConfigurationUtil.toElement( configuration );
59          assertEquals( "element.getNodeName()", name, element.getNodeName() );
60  
61          final NodeList nodeList = element.getChildNodes();
62          assertEquals( "nodeList.getLength()", 1, nodeList.getLength() );
63          final Node node = nodeList.item( 0 );
64          assertEquals( "element[0].value", value, node.getNodeValue() );
65  
66          final NamedNodeMap attributes = element.getAttributes();
67          assertEquals( "attributes.getLength()", 0, attributes.getLength() );
68      }
69  
70      public void testToElementWithConfigurationWithAttributes()
71          throws Exception
72      {
73          final String name = "meep";
74          final String key = "key";
75          final String value = "value";
76  
77          final DefaultConfiguration configuration = new DefaultConfiguration( name, "", "" );
78          configuration.setAttribute( key, value );
79  
80          final Element element = ConfigurationUtil.toElement( configuration );
81          assertEquals( "element.getNodeName()", name, element.getNodeName() );
82  
83          final NodeList nodeList = element.getChildNodes();
84          assertEquals( "nodeList.getLength()", 0, nodeList.getLength() );
85  
86          final NamedNodeMap attributes = element.getAttributes();
87          assertEquals( "attributes.getLength()", 1, attributes.getLength() );
88          final Node node = attributes.item( 0 );
89          assertEquals( "attribute[0].name", key, node.getNodeName() );
90          assertEquals( "attribute[0].value", value, node.getNodeValue() );
91      }
92  
93      public void testToElementWithConfigurationWithChildren()
94          throws Exception
95      {
96          final String name = "meep";
97          final String childName = "moop";
98  
99          final DefaultConfiguration configuration = new DefaultConfiguration( name, "", "" );
100         final DefaultConfiguration child = new DefaultConfiguration( childName, "", "" );
101         configuration.addChild( child );
102 
103         final Element element = ConfigurationUtil.toElement( configuration );
104         assertEquals( "element.getNodeName()", name, element.getNodeName() );
105 
106         final NodeList nodeList = element.getChildNodes();
107         assertEquals( "nodeList.getLength()", 1, nodeList.getLength() );
108         final Node node = nodeList.item( 0 );
109         assertEquals( "element[0].name", childName, node.getNodeName() );
110 
111         final NamedNodeMap attributes = element.getAttributes();
112         assertEquals( "attributes.getLength()", 0, attributes.getLength() );
113 
114     }
115 
116     public void testToElementWithSevereError()
117         throws Exception
118     {
119         final String name = "meep";
120         final DefaultConfiguration configuration = new DefaultConfiguration( name, "", "" );
121 
122         final String property = System.getProperty( DOC_FACTORY );
123         try
124         {
125             System.setProperty( "javax.xml.parsers.DocumentBuilderFactory",
126                                 "I dont exist!!!" );
127             ConfigurationUtil.toElement( configuration );
128         }
129         catch( final IllegalStateException ise )
130         {
131             return;
132         }
133         finally
134         {
135             if( null != property )
136             {
137                 System.setProperty( DOC_FACTORY, property );
138             }
139             else
140             {
141                 System.getProperties().remove( DOC_FACTORY );
142             }
143         }
144         fail( "Expected to fail to create element as " +
145               "invlaid document factory property" );
146     }
147 
148     public void testToConfigurationFromBasicElement()
149         throws Exception
150     {
151         final Document document = createDocument();
152         final String name = "meep";
153         final Element element = document.createElement( name );
154         final Configuration configuration = ConfigurationUtil.toConfiguration( element );
155 
156         assertEquals( "configuration.getName()", name, configuration.getName() );
157         assertEquals( "configuration.getPath()",
158                       ConfigurationUtil.ROOT_PATH,
159                       configuration.getPath() );
160         assertEquals( "configuration.getLocation()",
161                       "dom-gen",
162                       configuration.getLocation() );
163     }
164 
165     public void testToConfigurationFromElementWithValue()
166         throws Exception
167     {
168         final Document document = createDocument();
169         final String name = "meep";
170         final String value = "text";
171         final Element element = document.createElement( name );
172         final Text text = document.createTextNode( value );
173         element.appendChild( text );
174         final Configuration configuration = ConfigurationUtil.toConfiguration( element );
175 
176         assertEquals( "configuration.getName()", name, configuration.getName() );
177         assertEquals( "configuration.getPath()",
178                       ConfigurationUtil.ROOT_PATH,
179                       configuration.getPath() );
180         assertEquals( "configuration.getLocation()",
181                       "dom-gen",
182                       configuration.getLocation() );
183         assertEquals( "configuration.getValue()",
184                       value,
185                       configuration.getValue() );
186     }
187 
188     public void testToConfigurationFromElementWithMultipleValueFragments()
189         throws Exception
190     {
191         final Document document = createDocument();
192         final String name = "meep";
193         final String value = "text";
194         final Element element = document.createElement( name );
195         final Text text = document.createTextNode( value );
196         element.appendChild( text );
197         final Text text2 = document.createTextNode( value );
198         element.appendChild( text2 );
199         final Configuration configuration = ConfigurationUtil.toConfiguration( element );
200 
201         assertEquals( "configuration.getName()", name, configuration.getName() );
202         assertEquals( "configuration.getPath()",
203                       ConfigurationUtil.ROOT_PATH,
204                       configuration.getPath() );
205         assertEquals( "configuration.getLocation()",
206                       "dom-gen",
207                       configuration.getLocation() );
208         assertEquals( "configuration.getValue()",
209                       value + value,
210                       configuration.getValue() );
211     }
212 
213     public void testToConfigurationFromElementWithInternalComment()
214         throws Exception
215     {
216         final Document document = createDocument();
217         final String name = "meep";
218         final Element element = document.createElement( name );
219         final Comment comment = document.createComment( "comment" );
220         element.appendChild( comment );
221         final Configuration configuration = ConfigurationUtil.toConfiguration( element );
222 
223         assertEquals( "configuration.getName()", name, configuration.getName() );
224         assertEquals( "configuration.getPath()",
225                       ConfigurationUtil.ROOT_PATH,
226                       configuration.getPath() );
227         assertEquals( "configuration.getLocation()",
228                       "dom-gen",
229                       configuration.getLocation() );
230         assertEquals( "configuration.getValue()",
231                       null,
232                       configuration.getValue( null ) );
233     }
234 
235     public void testToConfigurationFromElementWithAttributes()
236         throws Exception
237     {
238         final Document document = createDocument();
239         final String name = "meep";
240         final String key = "key";
241         final String value = "value";
242         final Element element = document.createElement( name );
243         element.setAttribute( key, value );
244         final Configuration configuration = ConfigurationUtil.toConfiguration( element );
245 
246         assertEquals( "configuration.getName()", name, configuration.getName() );
247         assertEquals( "configuration.getPath()",
248                       ConfigurationUtil.ROOT_PATH,
249                       configuration.getPath() );
250         assertEquals( "configuration.getLocation()",
251                       "dom-gen",
252                       configuration.getLocation() );
253         assertEquals( "configuration.getAttributeNames().length",
254                       1,
255                       configuration.getAttributeNames().length );
256         assertEquals( "configuration.getAttribute( key )",
257                       value,
258                       configuration.getAttribute( key ) );
259     }
260 
261     public void testToConfigurationFromElementWithChildren()
262         throws Exception
263     {
264         final Document document = createDocument();
265         final String name = "meep";
266         final String childName = "lilmeep";
267         final Element element = document.createElement( name );
268         final Element childElement = document.createElement( childName );
269         element.appendChild( childElement );
270 
271         final Configuration configuration = ConfigurationUtil.toConfiguration( element );
272 
273         assertEquals( "configuration.getName()", name, configuration.getName() );
274         assertEquals( "configuration.getPath()",
275                       ConfigurationUtil.ROOT_PATH,
276                       configuration.getPath() );
277         assertEquals( "configuration.getLocation()",
278                       "dom-gen",
279                       configuration.getLocation() );
280         assertEquals( "configuration.getAttributeNames().length",
281                       0,
282                       configuration.getAttributeNames().length );
283         assertEquals( "configuration.getChildren().length",
284                       1,
285                       configuration.getChildren().length );
286         final Configuration child = configuration.getChildren()[ 0 ];
287         assertEquals( "child.name", childName, child.getName() );
288         assertEquals( "child.getPath()", "meep", child.getPath() );
289     }
290 
291     public void testSerializeToResult()
292         throws Exception
293     {
294         final String name = "meep";
295         final DefaultConfiguration configuration = new DefaultConfiguration( name, "", "" );
296 
297         final MockInvocationRecorder recorder = new MockInvocationRecorder();
298         recorder.addInvocation( SAXMethods.START_DOCUMENT,
299                                 new Object[ 0 ],
300                                 null );
301         recorder.addInvocation( SAXMethods.START_ELEMENT,
302                                 new Object[]{"", name, name,
303                                              MockSAXConfigurationSerializer.ATTRIBUTES},
304                                 null );
305         recorder.addInvocation( SAXMethods.END_ELEMENT,
306                                 new Object[]{"", name, name},
307                                 null );
308         recorder.addInvocation( SAXMethods.END_DOCUMENT,
309                                 new Object[ 0 ],
310                                 null );
311 
312         final ContentHandler handler = (ContentHandler)
313             Proxy.newProxyInstance( getClass().getClassLoader(),
314                                     new Class[]{ContentHandler.class},
315                                     recorder );
316 
317         final SAXResult result = new SAXResult( handler );
318 
319         ConfigurationUtil.serializeToResult( result, configuration );
320     }
321 
322     public void testBuildFromXML()
323         throws Exception
324     {
325         final String data = "<element/>";
326         final InputSource input = new InputSource();
327         input.setCharacterStream( new StringReader( data ) );
328         final Configuration configuration = ConfigurationUtil.buildFromXML( input );
329         assertEquals( "configuration.name", "element", configuration.getName() );
330         assertEquals( "configuration.path", "", configuration.getPath() );
331         assertEquals( "configuration.location", "", configuration.getLocation() );
332     }
333 
334     private Document createDocument() throws ParserConfigurationException
335     {
336         final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
337         final DocumentBuilder builder = factory.newDocumentBuilder();
338         return builder.newDocument();
339     }
340 
341     public void testGeneratePathNameFromRootForRoot()
342         throws Exception
343     {
344         final String path =
345             ConfigurationUtil.generatePathName( "", "" );
346         assertEquals( "", path );
347     }
348 
349     public void testGeneratePathNameFromRoot()
350         throws Exception
351     {
352         final String path =
353             ConfigurationUtil.generatePathName( "", "element" );
354 
355         assertEquals( "element", path );
356     }
357 
358     public void testGeneratePathNameFromNonRoot()
359         throws Exception
360     {
361         final String path =
362             ConfigurationUtil.generatePathName( "element", "child" );
363 
364         assertEquals( "element/child", path );
365     }
366 
367     public void testEqualsOnEmptyConfigurations()
368         throws Exception
369     {
370         final String name = "x";
371         final DefaultConfiguration configuration1 = new DefaultConfiguration( name, "", "" );
372         final DefaultConfiguration configuration2 = new DefaultConfiguration( name, "", "" );
373 
374         final boolean equal =
375             ConfigurationUtil.equals( configuration1, configuration2 );
376         assertEquals( "config1 == config2", true, equal );
377     }
378 
379     public void testEqualsWithDifferentNames()
380         throws Exception
381     {
382         final DefaultConfiguration configuration1 = new DefaultConfiguration( "x", "", "" );
383         final DefaultConfiguration configuration2 = new DefaultConfiguration( "y", "", "" );
384 
385         final boolean equal =
386             ConfigurationUtil.equals( configuration1, configuration2 );
387         assertEquals( "config1 == config2", false, equal );
388     }
389 
390     public void testEqualsWithAttributes()
391         throws Exception
392     {
393         final DefaultConfiguration configuration1 = new DefaultConfiguration( "x", "", "" );
394         configuration1.setAttribute( "key", "value" );
395         final DefaultConfiguration configuration2 = new DefaultConfiguration( "x", "", "" );
396         configuration2.setAttribute( "key", "value" );
397 
398         final boolean equal =
399             ConfigurationUtil.equals( configuration1, configuration2 );
400         assertEquals( "config1 == config2", true, equal );
401     }
402 
403     public void testEqualsWithDifferentNumberOfAttributes()
404         throws Exception
405     {
406         final DefaultConfiguration configuration1 = new DefaultConfiguration( "x", "", "" );
407         configuration1.setAttribute( "key", "value" );
408         configuration1.setAttribute( "key2", "value" );
409         final DefaultConfiguration configuration2 = new DefaultConfiguration( "x", "", "" );
410         configuration2.setAttribute( "key", "value" );
411 
412         final boolean equal =
413             ConfigurationUtil.equals( configuration1, configuration2 );
414         assertEquals( "config1 == config2", false, equal );
415     }
416 
417     public void testEqualsWithDifferentAttributeNames()
418         throws Exception
419     {
420         final DefaultConfiguration configuration1 = new DefaultConfiguration( "x", "", "" );
421         configuration1.setAttribute( "key1", "value" );
422         final DefaultConfiguration configuration2 = new DefaultConfiguration( "x", "", "" );
423         configuration2.setAttribute( "key2", "value" );
424 
425         final boolean equal =
426             ConfigurationUtil.equals( configuration1, configuration2 );
427         assertEquals( "config1 == config2", false, equal );
428     }
429 
430     public void testEqualsWithDifferentAttributeValues()
431         throws Exception
432     {
433         final DefaultConfiguration configuration1 = new DefaultConfiguration( "x", "", "" );
434         configuration1.setAttribute( "key", "value1" );
435         final DefaultConfiguration configuration2 = new DefaultConfiguration( "x", "", "" );
436         configuration2.setAttribute( "key", "value2" );
437 
438         final boolean equal =
439             ConfigurationUtil.equals( configuration1, configuration2 );
440         assertEquals( "config1 == config2", false, equal );
441     }
442 
443     public void testEqualsWithChild()
444         throws Exception
445     {
446         final DefaultConfiguration configuration1 = new DefaultConfiguration( "x", "", "" );
447         final DefaultConfiguration child1 = new DefaultConfiguration( "x", "", "" );
448         configuration1.addChild( child1 );
449         final DefaultConfiguration configuration2 = new DefaultConfiguration( "x", "", "" );
450         final DefaultConfiguration child2 = new DefaultConfiguration( "x", "", "" );
451         configuration2.addChild( child2 );
452 
453         final boolean equal =
454             ConfigurationUtil.equals( configuration1, configuration2 );
455         assertEquals( "config1 == config2", true, equal );
456     }
457 
458     public void testEqualsWithDifferentChildCount()
459         throws Exception
460     {
461         final DefaultConfiguration configuration1 = new DefaultConfiguration( "x", "", "" );
462         final DefaultConfiguration child1 = new DefaultConfiguration( "x", "", "" );
463         configuration1.addChild( child1 );
464         final DefaultConfiguration configuration2 = new DefaultConfiguration( "x", "", "" );
465 
466         final boolean equal =
467             ConfigurationUtil.equals( configuration1, configuration2 );
468         assertEquals( "config1 == config2", false, equal );
469     }
470 
471     public void testEqualsWithDifferentChildren()
472         throws Exception
473     {
474         final DefaultConfiguration configuration1 = new DefaultConfiguration( "x", "", "" );
475         final DefaultConfiguration child1 = new DefaultConfiguration( "x", "", "" );
476         configuration1.addChild( child1 );
477         final DefaultConfiguration configuration2 = new DefaultConfiguration( "x", "", "" );
478         final DefaultConfiguration child2 = new DefaultConfiguration( "y", "", "" );
479         configuration2.addChild( child2 );
480 
481         final boolean equal =
482             ConfigurationUtil.equals( configuration1, configuration2 );
483         assertEquals( "config1 == config2", false, equal );
484     }
485 
486     public void testEqualsWithContent()
487         throws Exception
488     {
489         final DefaultConfiguration configuration1 = new DefaultConfiguration( "x", "", "" );
490         configuration1.setValue( "content" );
491         final DefaultConfiguration configuration2 = new DefaultConfiguration( "x", "", "" );
492         configuration2.setValue( "content" );
493 
494         final boolean equal =
495             ConfigurationUtil.equals( configuration1, configuration2 );
496         assertEquals( "config1 == config2", true, equal );
497     }
498 
499     public void testEqualsWithDifferentContent()
500         throws Exception
501     {
502         final DefaultConfiguration configuration1 = new DefaultConfiguration( "x", "", "" );
503         configuration1.setValue( "content1" );
504         final DefaultConfiguration configuration2 = new DefaultConfiguration( "x", "", "" );
505         configuration2.setValue( "content2" );
506 
507         final boolean equal =
508             ConfigurationUtil.equals( configuration1, configuration2 );
509         assertEquals( "config1 == config2", false, equal );
510     }
511 
512     public void testEqualsWithContentOnOne()
513         throws Exception
514     {
515         final DefaultConfiguration configuration1 = new DefaultConfiguration( "x", "", "" );
516         final DefaultConfiguration configuration2 = new DefaultConfiguration( "x", "", "" );
517         configuration2.setValue( "content2" );
518 
519         final boolean equal =
520             ConfigurationUtil.equals( configuration1, configuration2 );
521         assertEquals( "config1 == config2", false, equal );
522     }
523 }