/src/ProtocolBuffers.Test/TestMimeMessageFormats.cs

https://code.google.com/p/protobuf-csharp-port/ · C# · 264 lines · 238 code · 21 blank · 5 comment · 0 complexity · 705200dff7fa0cd4ae269d9e3a11f8c5 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using Google.ProtocolBuffers.Serialization;
  6. using Google.ProtocolBuffers.Serialization.Http;
  7. using Google.ProtocolBuffers.TestProtos;
  8. using Microsoft.VisualStudio.TestTools.UnitTesting;
  9. namespace Google.ProtocolBuffers
  10. {
  11. [TestClass]
  12. public class TestMimeMessageFormats
  13. {
  14. // There is a whole host of various json mime types in use around the net, this is the set we accept...
  15. readonly IEnumerable<string> JsonTypes = new string[] { "application/json", "application/x-json", "application/x-javascript", "text/javascript", "text/x-javascript", "text/x-json", "text/json" };
  16. readonly IEnumerable<string> XmlTypes = new string[] { "text/xml", "application/xml" };
  17. readonly IEnumerable<string> ProtobufTypes = new string[] { "application/binary", "application/x-protobuf", "application/vnd.google.protobuf" };
  18. [TestMethod]
  19. public void TestReadJsonMimeTypes()
  20. {
  21. foreach (string type in JsonTypes)
  22. {
  23. Assert.IsTrue(
  24. MessageFormatFactory.CreateInputStream(new MessageFormatOptions(), type, Stream.Null)
  25. is JsonFormatReader);
  26. }
  27. Assert.IsTrue(
  28. MessageFormatFactory.CreateInputStream(new MessageFormatOptions() { DefaultContentType = "application/json" }, null, Stream.Null)
  29. is JsonFormatReader);
  30. }
  31. [TestMethod]
  32. public void TestWriteJsonMimeTypes()
  33. {
  34. foreach (string type in JsonTypes)
  35. {
  36. Assert.IsTrue(
  37. MessageFormatFactory.CreateOutputStream(new MessageFormatOptions(), type, Stream.Null)
  38. is JsonFormatWriter);
  39. }
  40. Assert.IsTrue(
  41. MessageFormatFactory.CreateOutputStream(new MessageFormatOptions() { DefaultContentType = "application/json" }, null, Stream.Null)
  42. is JsonFormatWriter);
  43. }
  44. [TestMethod]
  45. public void TestReadXmlMimeTypes()
  46. {
  47. foreach (string type in XmlTypes)
  48. {
  49. Assert.IsTrue(
  50. MessageFormatFactory.CreateInputStream(new MessageFormatOptions(), type, Stream.Null)
  51. is XmlFormatReader);
  52. }
  53. Assert.IsTrue(
  54. MessageFormatFactory.CreateInputStream(new MessageFormatOptions() { DefaultContentType = "application/xml" }, null, Stream.Null)
  55. is XmlFormatReader);
  56. }
  57. [TestMethod]
  58. public void TestWriteXmlMimeTypes()
  59. {
  60. foreach (string type in XmlTypes)
  61. {
  62. Assert.IsTrue(
  63. MessageFormatFactory.CreateOutputStream(new MessageFormatOptions(), type, Stream.Null)
  64. is XmlFormatWriter);
  65. }
  66. Assert.IsTrue(
  67. MessageFormatFactory.CreateOutputStream(new MessageFormatOptions() { DefaultContentType = "application/xml" }, null, Stream.Null)
  68. is XmlFormatWriter);
  69. }
  70. [TestMethod]
  71. public void TestReadProtoMimeTypes()
  72. {
  73. foreach (string type in ProtobufTypes)
  74. {
  75. Assert.IsTrue(
  76. MessageFormatFactory.CreateInputStream(new MessageFormatOptions(), type, Stream.Null)
  77. is CodedInputStream);
  78. }
  79. Assert.IsTrue(
  80. MessageFormatFactory.CreateInputStream(new MessageFormatOptions() { DefaultContentType = "application/vnd.google.protobuf" }, null, Stream.Null)
  81. is CodedInputStream);
  82. }
  83. [TestMethod]
  84. public void TestWriteProtoMimeTypes()
  85. {
  86. foreach (string type in ProtobufTypes)
  87. {
  88. Assert.IsTrue(
  89. MessageFormatFactory.CreateOutputStream(new MessageFormatOptions(), type, Stream.Null)
  90. is CodedOutputStream);
  91. }
  92. Assert.IsTrue(
  93. MessageFormatFactory.CreateOutputStream(new MessageFormatOptions() { DefaultContentType = "application/vnd.google.protobuf" }, null, Stream.Null)
  94. is CodedOutputStream);
  95. }
  96. [TestMethod]
  97. public void TestMergeFromJsonType()
  98. {
  99. TestXmlMessage msg = Extensions.MergeFrom(new TestXmlMessage.Builder(),
  100. new MessageFormatOptions(), "application/json", new MemoryStream(Encoding.UTF8.GetBytes(
  101. Extensions.ToJson(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build())
  102. )))
  103. .Build();
  104. Assert.AreEqual("a", msg.Text);
  105. Assert.AreEqual(1, msg.Number);
  106. }
  107. [TestMethod]
  108. public void TestMergeFromXmlType()
  109. {
  110. TestXmlMessage msg = Extensions.MergeFrom(new TestXmlMessage.Builder(),
  111. new MessageFormatOptions(), "application/xml", new MemoryStream(Encoding.UTF8.GetBytes(
  112. Extensions.ToXml(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build())
  113. )))
  114. .Build();
  115. Assert.AreEqual("a", msg.Text);
  116. Assert.AreEqual(1, msg.Number);
  117. }
  118. [TestMethod]
  119. public void TestMergeFromProtoType()
  120. {
  121. TestXmlMessage msg = Extensions.MergeFrom(new TestXmlMessage.Builder(),
  122. new MessageFormatOptions(), "application/vnd.google.protobuf", new MemoryStream(
  123. TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build().ToByteArray()
  124. ))
  125. .Build();
  126. Assert.AreEqual("a", msg.Text);
  127. Assert.AreEqual(1, msg.Number);
  128. }
  129. [TestMethod]
  130. public void TestWriteToJsonType()
  131. {
  132. MemoryStream ms = new MemoryStream();
  133. Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(),
  134. new MessageFormatOptions(), "application/json", ms);
  135. Assert.AreEqual(@"{""text"":""a"",""number"":1}", Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length));
  136. }
  137. [TestMethod]
  138. public void TestWriteToXmlType()
  139. {
  140. MemoryStream ms = new MemoryStream();
  141. Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(),
  142. new MessageFormatOptions(), "application/xml", ms);
  143. Assert.AreEqual("<root><text>a</text><number>1</number></root>", Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length));
  144. }
  145. [TestMethod]
  146. public void TestWriteToProtoType()
  147. {
  148. MemoryStream ms = new MemoryStream();
  149. Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(),
  150. new MessageFormatOptions(), "application/vnd.google.protobuf", ms);
  151. byte[] bytes = TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build().ToByteArray();
  152. TestUtil.AssertBytesEqual(bytes, ms.ToArray());
  153. }
  154. [TestMethod]
  155. public void TestXmlReaderOptions()
  156. {
  157. MemoryStream ms = new MemoryStream();
  158. XmlFormatWriter.CreateInstance(ms)
  159. .SetOptions(XmlWriterOptions.OutputNestedArrays)
  160. .WriteMessage("my-root-node", TestXmlMessage.CreateBuilder().SetText("a").AddNumbers(1).AddNumbers(2).Build());
  161. ms.Position = 0;
  162. MessageFormatOptions options = new MessageFormatOptions()
  163. {
  164. XmlReaderOptions = XmlReaderOptions.ReadNestedArrays,
  165. XmlReaderRootElementName = "my-root-node"
  166. };
  167. TestXmlMessage msg = Extensions.MergeFrom(new TestXmlMessage.Builder(),
  168. options, "application/xml", ms)
  169. .Build();
  170. Assert.AreEqual("a", msg.Text);
  171. Assert.AreEqual(1, msg.NumbersList[0]);
  172. Assert.AreEqual(2, msg.NumbersList[1]);
  173. }
  174. [TestMethod]
  175. public void TestXmlWriterOptions()
  176. {
  177. TestXmlMessage message = TestXmlMessage.CreateBuilder().SetText("a").AddNumbers(1).AddNumbers(2).Build();
  178. MessageFormatOptions options = new MessageFormatOptions()
  179. {
  180. XmlWriterOptions = XmlWriterOptions.OutputNestedArrays,
  181. XmlWriterRootElementName = "root-node"
  182. };
  183. MemoryStream ms = new MemoryStream();
  184. Extensions.WriteTo(message, options, "application/xml", ms);
  185. ms.Position = 0;
  186. TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
  187. XmlFormatReader.CreateInstance(ms)
  188. .SetOptions(XmlReaderOptions.ReadNestedArrays)
  189. .Merge("root-node", builder);
  190. Assert.AreEqual("a", builder.Text);
  191. Assert.AreEqual(1, builder.NumbersList[0]);
  192. Assert.AreEqual(2, builder.NumbersList[1]);
  193. }
  194. [TestMethod]
  195. public void TestJsonFormatted()
  196. {
  197. MemoryStream ms = new MemoryStream();
  198. Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(),
  199. new MessageFormatOptions() { FormattedOutput = true }, "application/json", ms);
  200. Assert.AreEqual("{\r\n \"text\": \"a\",\r\n \"number\": 1\r\n}", Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length));
  201. }
  202. [TestMethod]
  203. public void TestXmlFormatted()
  204. {
  205. MemoryStream ms = new MemoryStream();
  206. Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(),
  207. new MessageFormatOptions() { FormattedOutput = true }, "application/xml", ms);
  208. Assert.AreEqual("<root>\r\n <text>a</text>\r\n <number>1</number>\r\n</root>", Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length));
  209. }
  210. [TestMethod]
  211. public void TestReadCustomMimeTypes()
  212. {
  213. var options = new MessageFormatOptions();
  214. //Remove existing mime-type mappings
  215. options.MimeInputTypes.Clear();
  216. //Add our own
  217. options.MimeInputTypes.Add("-custom-XML-mime-type-", XmlFormatReader.CreateInstance);
  218. Assert.AreEqual(1, options.MimeInputTypes.Count);
  219. Stream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(
  220. Extensions.ToXml(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build())
  221. ));
  222. TestXmlMessage msg = Extensions.MergeFrom(new TestXmlMessage.Builder(),
  223. options, "-custom-XML-mime-type-", xmlStream)
  224. .Build();
  225. Assert.AreEqual("a", msg.Text);
  226. Assert.AreEqual(1, msg.Number);
  227. }
  228. [TestMethod]
  229. public void TestWriteToCustomType()
  230. {
  231. var options = new MessageFormatOptions();
  232. //Remove existing mime-type mappings
  233. options.MimeOutputTypes.Clear();
  234. //Add our own
  235. options.MimeOutputTypes.Add("-custom-XML-mime-type-", XmlFormatWriter.CreateInstance);
  236. Assert.AreEqual(1, options.MimeOutputTypes.Count);
  237. MemoryStream ms = new MemoryStream();
  238. Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(),
  239. options, "-custom-XML-mime-type-", ms);
  240. Assert.AreEqual("<root><text>a</text><number>1</number></root>", Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length));
  241. }
  242. }
  243. }