1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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=\"<foo>\">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><b>"msg"</b></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><b>\"msg\"</b></a2>");
145 domString.append("\n");
146 domString.append(" <a3><b>\"msg\"</b></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 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 }