View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.shared.utils.xml;
20  
21  import java.io.ByteArrayInputStream;
22  import java.io.IOException;
23  import java.io.InputStream;
24  import java.io.StringReader;
25  import java.io.StringWriter;
26  import java.io.UnsupportedEncodingException;
27  import java.nio.charset.StandardCharsets;
28  
29  import org.apache.maven.shared.utils.xml.pull.XmlPullParserException;
30  import org.junit.Assert;
31  import org.junit.Test;
32  
33  import static org.junit.Assert.assertEquals;
34  import static org.junit.Assert.assertTrue;
35  import static org.junit.Assert.fail;
36  
37  /**
38   * @author Kristian Rosenvold
39   */
40  public class Xpp3DomBuilderTest {
41  
42      private static final String XML_DECLARATION = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
43  
44      @Test
45      public void selfClosingTag() throws Exception {
46  
47          String domString = selfClosingTagSource();
48  
49          Xpp3Dom dom = Xpp3DomBuilder.build(new StringReader(domString));
50  
51          String expected = expectedSelfClosingTag();
52          String dom1Str = dom.toString();
53          assertEquals("check DOMs match", expected, dom1Str);
54      }
55  
56      @Test
57      public void testUnrecognizedEncoding() {
58  
59          byte[] data = "<foo/>".getBytes(StandardCharsets.UTF_8);
60          InputStream in = new ByteArrayInputStream(data);
61          try {
62              Xpp3DomBuilder.build(in, "nosuch encoding");
63              fail();
64          } catch (XmlPullParserException expected) {
65              assertTrue(expected.getCause() instanceof UnsupportedEncodingException);
66          }
67      }
68  
69      @Test
70      public void trimming() throws Exception {
71          String domString = createDomString();
72  
73          Xpp3Dom dom = Xpp3DomBuilder.build(new StringReader(domString), true);
74          assertEquals(" element1value\n ", dom.getChild("element1").getValue());
75          assertEquals("  preserve space  ", dom.getChild("element6").getValue());
76          dom = Xpp3DomBuilder.build(new StringReader(domString), false);
77          assertEquals(" element1value\n ", dom.getChild("element1").getValue());
78          assertEquals("  preserve space  ", dom.getChild("element6").getValue());
79      }
80  
81      @Test
82      public void testMalformedXml() {
83          try {
84              Xpp3DomBuilder.build(new StringReader("<newRoot>" + createDomString()));
85              fail("We're supposed to fail");
86          } catch (XmlPullParserException ex) {
87              Assert.assertNotNull(ex.getMessage());
88          }
89      }
90  
91      @Test
92      public void attributeEscaping() throws IOException, XmlPullParserException {
93          String s = getAttributeEncodedString();
94          Xpp3Dom dom = Xpp3DomBuilder.build(new StringReader(s));
95  
96          assertEquals("<foo>", dom.getChild("el").getAttribute("att"));
97          StringWriter w = new StringWriter();
98          Xpp3DomWriter.write(w, dom);
99          String newString = w.toString();
100         assertEquals(newString, s);
101     }
102 
103     @Test
104     public void contentEscaping() throws IOException, XmlPullParserException {
105         Xpp3Dom dom = Xpp3DomBuilder.build(new StringReader(getEncodedString()));
106 
107         assertEquals("\"msg\"", dom.getChild("a1").getValue());
108         assertEquals("<b>\"msg\"</b>", dom.getChild("a2").getValue());
109         assertEquals("<b>\"msg\"</b>", dom.getChild("a3").getValue());
110 
111         StringWriter w = new StringWriter();
112         Xpp3DomWriter.write(w, dom);
113         assertEquals(getExpectedString(), w.toString());
114     }
115 
116     private static String getAttributeEncodedString() {
117         StringBuilder domString = new StringBuilder();
118         domString.append("<root>");
119         domString.append("\n");
120         domString.append("  <el att=\"&lt;foo&gt;\">bar</el>");
121         domString.append("\n");
122         domString.append("</root>");
123 
124         return domString.toString();
125     }
126 
127     private static String getEncodedString() {
128         StringBuilder domString = new StringBuilder();
129         domString.append("<root>\n");
130         domString.append("  <a1>\"msg\"</a1>\n");
131         domString.append("  <a2><![CDATA[<b>\"msg\"</b>]]></a2>\n");
132         domString.append("  <a3>&lt;b&gt;&quot;msg&quot;&lt;/b&gt;</a3>\n");
133         domString.append("</root>");
134 
135         return domString.toString();
136     }
137 
138     private static String getExpectedString() {
139         StringBuilder domString = new StringBuilder();
140         domString.append("<root>");
141         domString.append("\n");
142         domString.append("  <a1>\"msg\"</a1>");
143         domString.append("\n");
144         domString.append("  <a2>&lt;b&gt;\"msg\"&lt;/b&gt;</a2>");
145         domString.append("\n");
146         domString.append("  <a3>&lt;b&gt;\"msg\"&lt;/b&gt;</a3>");
147         domString.append("\n");
148         domString.append("</root>");
149         return domString.toString();
150     }
151 
152     private static String createDomString() {
153         StringBuilder buf = new StringBuilder();
154         buf.append("<root>\n");
155         buf.append(" <element1> element1value\n </element1>\n");
156         buf.append(" <element2 att2='attribute2&#10;nextline'>\n");
157         buf.append("  <element3 att3='attribute3'>element3value</element3>\n");
158         buf.append(" </element2>\n");
159         buf.append(" <element4></element4>\n");
160         buf.append(" <element5/>\n");
161         buf.append(" <element6 xml:space=\"preserve\">  preserve space  </element6>\n");
162         buf.append("</root>\n");
163 
164         return buf.toString();
165     }
166 
167     private static String selfClosingTagSource() {
168         StringBuilder buf = new StringBuilder();
169         buf.append("<root>\n");
170         buf.append("  <el4></el4>\n");
171         buf.append("  <el5></el5>\n");
172         buf.append("</root>");
173         return buf.toString();
174     }
175 
176     private static String expectedSelfClosingTag() {
177         return XML_DECLARATION + selfClosingTagSource();
178     }
179 }