blob: acad6f1371b9fcad22bd84d02524cdba61cada65 [file] [log] [blame]
csharptest2b868842011-06-10 14:41:47 -05001using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Text;
5using System.Xml;
6using Google.ProtocolBuffers.Serialization;
7using NUnit.Framework;
8using Google.ProtocolBuffers.TestProtos;
9
10namespace Google.ProtocolBuffers
11{
12 [TestFixture]
13 public class TestWriterFormatXml
14 {
15 [Test]
csharptestf2925232011-06-11 10:41:57 -050016 public void TestToXmlParseFromXml()
17 {
18 TestAllTypes msg = new TestAllTypes.Builder().SetDefaultBool(true).Build();
19 string xml = msg.ToXml();
20 Assert.AreEqual("<root><default_bool>true</default_bool></root>", xml);
21 TestAllTypes copy = TestAllTypes.ParseFromXml(XmlReader.Create(new StringReader(xml)));
22 Assert.IsTrue(copy.HasDefaultBool && copy.DefaultBool);
23 Assert.AreEqual(msg, copy);
24 }
25
26 [Test]
27 public void TestToXmlParseFromXmlWithRootName()
28 {
29 TestAllTypes msg = new TestAllTypes.Builder().SetDefaultBool(true).Build();
30 string xml = msg.ToXml("message");
31 Assert.AreEqual("<message><default_bool>true</default_bool></message>", xml);
32 TestAllTypes copy = TestAllTypes.ParseFromXml("message", XmlReader.Create(new StringReader(xml)));
33 Assert.IsTrue(copy.HasDefaultBool && copy.DefaultBool);
34 Assert.AreEqual(msg, copy);
35 }
36
37 [Test]
csharptest2b868842011-06-10 14:41:47 -050038 public void TestEmptyMessage()
39 {
40 TestXmlChild message = TestXmlChild.CreateBuilder()
41 .Build();
42
43 StringWriter sw = new StringWriter();
44 XmlTextWriter xw = new XmlTextWriter(sw);
45
46 //When we call message.WriteTo, we are responsible for the root element
47 xw.WriteStartElement("root");
csharptest7fc785c2011-06-10 23:54:53 -050048 message.WriteTo(XmlFormatWriter.CreateInstance(xw));
csharptest2b868842011-06-10 14:41:47 -050049 xw.WriteEndElement();
50 xw.Flush();
51
52 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -050053 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -050054 TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build();
55 Assert.AreEqual(message, copy);
56 }
57 [Test]
58 public void TestRepeatedField()
59 {
60 TestXmlChild message = TestXmlChild.CreateBuilder()
61 .AddOptions(EnumOptions.ONE)
62 .AddOptions(EnumOptions.TWO)
63 .Build();
64
65 //Allow the writer to write the root element
66 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -050067 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -050068
69 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -050070 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -050071 TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build();
72 Assert.AreEqual(message, copy);
73 }
74 [Test]
75 public void TestNestedEmptyMessage()
76 {
77 TestXmlMessage message = TestXmlMessage.CreateBuilder()
78 .SetChild(TestXmlChild.CreateBuilder().Build())
79 .Build();
80
81 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -050082 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -050083
84 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -050085 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -050086 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
87 Assert.AreEqual(message, copy);
88 }
89 [Test]
90 public void TestNestedMessage()
91 {
92 TestXmlMessage message = TestXmlMessage.CreateBuilder()
93 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.TWO).Build())
94 .Build();
95
96 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -050097 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -050098
99 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -0500100 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500101 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
102 Assert.AreEqual(message, copy);
103 }
104 [Test]
105 public void TestBooleanTypes()
106 {
107 TestXmlMessage message = TestXmlMessage.CreateBuilder()
108 .SetValid(true)
109 .Build();
110
111 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500112 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500113
114 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -0500115 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500116 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
117 Assert.AreEqual(message, copy);
118 }
119 [Test]
120 public void TestFullMessage()
121 {
122 TestXmlMessage message = TestXmlMessage.CreateBuilder()
123 .SetValid(true)
124 .SetText("text")
125 .AddTextlines("a")
126 .AddTextlines("b")
127 .AddTextlines("c")
128 .SetNumber(0x1010101010)
129 .AddNumbers(1)
130 .AddNumbers(2)
131 .AddNumbers(3)
132 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
133 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
134 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
135 .Build();
136
137 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500138 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500139
140 string xml = sw.ToString();
141
csharptest7fc785c2011-06-10 23:54:53 -0500142 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500143 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
144 Assert.AreEqual(message, copy);
145 }
146 [Test]
147 public void TestFullMessageWithRichTypes()
148 {
149 TestXmlMessage message = TestXmlMessage.CreateBuilder()
150 .SetValid(true)
151 .SetText("text")
152 .AddTextlines("a")
153 .AddTextlines("b")
154 .AddTextlines("c")
155 .SetNumber(0x1010101010)
156 .AddNumbers(1)
157 .AddNumbers(2)
158 .AddNumbers(3)
159 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
160 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
161 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
162 .Build();
163
164 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500165 XmlFormatWriter.CreateInstance(sw)
166 .SetOptions(XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues)
167 .WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500168
169 string xml = sw.ToString();
170
csharptest7fc785c2011-06-10 23:54:53 -0500171 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500172 rdr.Options = XmlReaderOptions.ReadNestedArrays;
173 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
174 Assert.AreEqual(message, copy);
175 }
176 [Test]
177 public void TestFullMessageWithUnknownFields()
178 {
179 TestXmlMessage origial = TestXmlMessage.CreateBuilder()
180 .SetValid(true)
181 .SetText("text")
182 .AddTextlines("a")
183 .AddTextlines("b")
184 .AddTextlines("c")
185 .SetNumber(0x1010101010)
186 .AddNumbers(1)
187 .AddNumbers(2)
188 .AddNumbers(3)
189 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
190 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
191 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
192 .Build();
193 TestXmlNoFields message = TestXmlNoFields.CreateBuilder().MergeFrom(origial.ToByteArray()).Build();
194
195 Assert.AreEqual(0, message.AllFields.Count);
196
197 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500198 XmlFormatWriter.CreateInstance(sw)
199 .SetOptions(XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues)
200 .WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500201
202 string xml = sw.ToString();
203
204 using (XmlReader x = XmlReader.Create(new StringReader(xml)))
205 {
206 x.MoveToContent();
207 Assert.AreEqual(XmlNodeType.Element, x.NodeType);
208 //should always be empty
209 Assert.IsTrue(x.IsEmptyElement ||
210 (x.Read() && x.NodeType == XmlNodeType.EndElement)
211 );
212 }
213
csharptest7fc785c2011-06-10 23:54:53 -0500214 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500215 rdr.Options = XmlReaderOptions.ReadNestedArrays;
216 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
217 Assert.AreEqual(TestXmlMessage.DefaultInstance, copy);
218 }
219 [Test]
220 public void TestMessageWithXmlText()
221 {
222 TestXmlMessage message = TestXmlMessage.CreateBuilder()
223 .SetText("<text>").Build();
224
225 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500226 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500227
228 string xml = sw.ToString();
229
csharptest7fc785c2011-06-10 23:54:53 -0500230 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500231 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
232 Assert.AreEqual(message, copy);
233 }
234 [Test]
235 public void TestXmlWithWhitespace()
236 {
237 TestXmlMessage message = TestXmlMessage.CreateBuilder()
238 .SetText(" \t <- leading space and trailing -> \r\n\t").Build();
239
240 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500241 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500242
243 string xml = sw.ToString();
244
csharptest7fc785c2011-06-10 23:54:53 -0500245 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500246 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
247 Assert.AreEqual(message, copy);
248 }
249 [Test]
250 public void TestXmlWithExtensionText()
251 {
252 TestXmlMessage message = TestXmlMessage.CreateBuilder()
253 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ")
254 .Build();
255
256 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500257 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500258
259 string xml = sw.ToString();
260
261 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
262 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
263
csharptest7fc785c2011-06-10 23:54:53 -0500264 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500265 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
266 Assert.AreEqual(message, copy);
267 }
268 [Test]
269 public void TestXmlWithExtensionMessage()
270 {
271 TestXmlMessage message = TestXmlMessage.CreateBuilder()
272 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage,
273 new TestXmlExtension.Builder().SetNumber(42).Build()).Build();
274
275 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500276 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500277
278 string xml = sw.ToString();
279
280 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
281 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
282
csharptest7fc785c2011-06-10 23:54:53 -0500283 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500284 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
285 Assert.AreEqual(message, copy);
286 }
287 [Test]
288 public void TestXmlWithExtensionArray()
289 {
290 TestXmlMessage message = TestXmlMessage.CreateBuilder()
291 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
292 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
293 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
294 .Build();
295
296 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500297 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500298
299 string xml = sw.ToString();
300
301 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
302 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
303
csharptest7fc785c2011-06-10 23:54:53 -0500304 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500305 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
306 Assert.AreEqual(message, copy);
307 }
308 [Test]
309 public void TestXmlWithExtensionEnum()
310 {
311 TestXmlMessage message = TestXmlMessage.CreateBuilder()
312 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
313 .Build();
314
315 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500316 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500317
318 string xml = sw.ToString();
319
320 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
321 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
322
csharptest7fc785c2011-06-10 23:54:53 -0500323 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500324 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
325 Assert.AreEqual(message, copy);
326 }
csharptest3b70dd72011-06-11 12:22:17 -0500327 [Test, ExpectedException(typeof(InvalidProtocolBufferException))]
328 public void TestRecursiveLimit()
329 {
330 StringBuilder sb = new StringBuilder(8192);
331 for (int i = 0; i < 80; i++)
332 sb.Append("<child>");
333 TestXmlRescursive msg = TestXmlRescursive.ParseFromXml("child", XmlReader.Create(new StringReader(sb.ToString())));
334 }
csharptest2b868842011-06-10 14:41:47 -0500335 }
336}