TestWriterFormatXml.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using System.Xml;
  6. using Google.ProtocolBuffers.Serialization;
  7. using NUnit.Framework;
  8. using Google.ProtocolBuffers.TestProtos;
  9. namespace Google.ProtocolBuffers
  10. {
  11. [TestFixture]
  12. public class TestWriterFormatXml
  13. {
  14. [Test]
  15. public void TestToXmlParseFromXml()
  16. {
  17. TestAllTypes msg = new TestAllTypes.Builder().SetDefaultBool(true).Build();
  18. string xml = msg.ToXml();
  19. Assert.AreEqual("<root><default_bool>true</default_bool></root>", xml);
  20. TestAllTypes copy = TestAllTypes.ParseFromXml(XmlReader.Create(new StringReader(xml)));
  21. Assert.IsTrue(copy.HasDefaultBool && copy.DefaultBool);
  22. Assert.AreEqual(msg, copy);
  23. }
  24. [Test]
  25. public void TestToXmlParseFromXmlWithRootName()
  26. {
  27. TestAllTypes msg = new TestAllTypes.Builder().SetDefaultBool(true).Build();
  28. string xml = msg.ToXml("message");
  29. Assert.AreEqual("<message><default_bool>true</default_bool></message>", xml);
  30. TestAllTypes copy = TestAllTypes.ParseFromXml("message", XmlReader.Create(new StringReader(xml)));
  31. Assert.IsTrue(copy.HasDefaultBool && copy.DefaultBool);
  32. Assert.AreEqual(msg, copy);
  33. }
  34. [Test]
  35. public void TestEmptyMessage()
  36. {
  37. TestXmlChild message = TestXmlChild.CreateBuilder()
  38. .Build();
  39. StringWriter sw = new StringWriter();
  40. XmlTextWriter xw = new XmlTextWriter(sw);
  41. //When we call message.WriteTo, we are responsible for the root element
  42. xw.WriteStartElement("root");
  43. message.WriteTo(XmlFormatWriter.CreateInstance(xw));
  44. xw.WriteEndElement();
  45. xw.Flush();
  46. string xml = sw.ToString();
  47. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  48. TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build();
  49. Assert.AreEqual(message, copy);
  50. }
  51. [Test]
  52. public void TestRepeatedField()
  53. {
  54. TestXmlChild message = TestXmlChild.CreateBuilder()
  55. .AddOptions(EnumOptions.ONE)
  56. .AddOptions(EnumOptions.TWO)
  57. .Build();
  58. //Allow the writer to write the root element
  59. StringWriter sw = new StringWriter();
  60. XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
  61. string xml = sw.ToString();
  62. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  63. TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build();
  64. Assert.AreEqual(message, copy);
  65. }
  66. [Test]
  67. public void TestNestedEmptyMessage()
  68. {
  69. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  70. .SetChild(TestXmlChild.CreateBuilder().Build())
  71. .Build();
  72. StringWriter sw = new StringWriter();
  73. XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
  74. string xml = sw.ToString();
  75. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  76. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
  77. Assert.AreEqual(message, copy);
  78. }
  79. [Test]
  80. public void TestNestedMessage()
  81. {
  82. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  83. .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.TWO).Build())
  84. .Build();
  85. StringWriter sw = new StringWriter();
  86. XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
  87. string xml = sw.ToString();
  88. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  89. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
  90. Assert.AreEqual(message, copy);
  91. }
  92. [Test]
  93. public void TestBooleanTypes()
  94. {
  95. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  96. .SetValid(true)
  97. .Build();
  98. StringWriter sw = new StringWriter();
  99. XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
  100. string xml = sw.ToString();
  101. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  102. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
  103. Assert.AreEqual(message, copy);
  104. }
  105. [Test]
  106. public void TestFullMessage()
  107. {
  108. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  109. .SetValid(true)
  110. .SetText("text")
  111. .AddTextlines("a")
  112. .AddTextlines("b")
  113. .AddTextlines("c")
  114. .SetNumber(0x1010101010)
  115. .AddNumbers(1)
  116. .AddNumbers(2)
  117. .AddNumbers(3)
  118. .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
  119. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
  120. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
  121. .Build();
  122. StringWriter sw = new StringWriter();
  123. XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
  124. string xml = sw.ToString();
  125. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  126. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
  127. Assert.AreEqual(message, copy);
  128. }
  129. [Test]
  130. public void TestFullMessageWithRichTypes()
  131. {
  132. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  133. .SetValid(true)
  134. .SetText("text")
  135. .AddTextlines("a")
  136. .AddTextlines("b")
  137. .AddTextlines("c")
  138. .SetNumber(0x1010101010)
  139. .AddNumbers(1)
  140. .AddNumbers(2)
  141. .AddNumbers(3)
  142. .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
  143. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
  144. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
  145. .Build();
  146. StringWriter sw = new StringWriter();
  147. XmlFormatWriter.CreateInstance(sw)
  148. .SetOptions(XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues)
  149. .WriteMessage("root", message);
  150. string xml = sw.ToString();
  151. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  152. rdr.Options = XmlReaderOptions.ReadNestedArrays;
  153. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
  154. Assert.AreEqual(message, copy);
  155. }
  156. [Test]
  157. public void TestFullMessageWithUnknownFields()
  158. {
  159. TestXmlMessage origial = TestXmlMessage.CreateBuilder()
  160. .SetValid(true)
  161. .SetText("text")
  162. .AddTextlines("a")
  163. .AddTextlines("b")
  164. .AddTextlines("c")
  165. .SetNumber(0x1010101010)
  166. .AddNumbers(1)
  167. .AddNumbers(2)
  168. .AddNumbers(3)
  169. .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
  170. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
  171. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
  172. .Build();
  173. TestXmlNoFields message = TestXmlNoFields.CreateBuilder().MergeFrom(origial.ToByteArray()).Build();
  174. Assert.AreEqual(0, message.AllFields.Count);
  175. StringWriter sw = new StringWriter();
  176. XmlFormatWriter.CreateInstance(sw)
  177. .SetOptions(XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues)
  178. .WriteMessage("root", message);
  179. string xml = sw.ToString();
  180. using (XmlReader x = XmlReader.Create(new StringReader(xml)))
  181. {
  182. x.MoveToContent();
  183. Assert.AreEqual(XmlNodeType.Element, x.NodeType);
  184. //should always be empty
  185. Assert.IsTrue(x.IsEmptyElement ||
  186. (x.Read() && x.NodeType == XmlNodeType.EndElement)
  187. );
  188. }
  189. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  190. rdr.Options = XmlReaderOptions.ReadNestedArrays;
  191. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
  192. Assert.AreEqual(TestXmlMessage.DefaultInstance, copy);
  193. }
  194. [Test]
  195. public void TestMessageWithXmlText()
  196. {
  197. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  198. .SetText("<text>").Build();
  199. StringWriter sw = new StringWriter();
  200. XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
  201. string xml = sw.ToString();
  202. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  203. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
  204. Assert.AreEqual(message, copy);
  205. }
  206. [Test]
  207. public void TestXmlWithWhitespace()
  208. {
  209. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  210. .SetText(" \t <- leading space and trailing -> \r\n\t").Build();
  211. StringWriter sw = new StringWriter();
  212. XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
  213. string xml = sw.ToString();
  214. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  215. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
  216. Assert.AreEqual(message, copy);
  217. }
  218. [Test]
  219. public void TestXmlWithExtensionText()
  220. {
  221. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  222. .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ")
  223. .Build();
  224. StringWriter sw = new StringWriter();
  225. XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
  226. string xml = sw.ToString();
  227. ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
  228. UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
  229. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  230. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
  231. Assert.AreEqual(message, copy);
  232. }
  233. [Test]
  234. public void TestXmlWithExtensionMessage()
  235. {
  236. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  237. .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage,
  238. new TestXmlExtension.Builder().SetNumber(42).Build()).Build();
  239. StringWriter sw = new StringWriter();
  240. XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
  241. string xml = sw.ToString();
  242. ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
  243. UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
  244. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  245. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
  246. Assert.AreEqual(message, copy);
  247. }
  248. [Test]
  249. public void TestXmlWithExtensionArray()
  250. {
  251. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  252. .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
  253. .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
  254. .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
  255. .Build();
  256. StringWriter sw = new StringWriter();
  257. XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
  258. string xml = sw.ToString();
  259. ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
  260. UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
  261. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  262. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
  263. Assert.AreEqual(message, copy);
  264. }
  265. [Test]
  266. public void TestXmlWithExtensionEnum()
  267. {
  268. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  269. .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
  270. .Build();
  271. StringWriter sw = new StringWriter();
  272. XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
  273. string xml = sw.ToString();
  274. ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
  275. UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
  276. XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
  277. TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
  278. Assert.AreEqual(message, copy);
  279. }
  280. }
  281. }