|  | @@ -0,0 +1,225 @@
 | 
	
		
			
				|  |  | +using System;
 | 
	
		
			
				|  |  | +using System.Collections.Generic;
 | 
	
		
			
				|  |  | +using System.IO;
 | 
	
		
			
				|  |  | +using System.Text;
 | 
	
		
			
				|  |  | +using Google.ProtocolBuffers.Serialization;
 | 
	
		
			
				|  |  | +using Google.ProtocolBuffers.Serialization.Http;
 | 
	
		
			
				|  |  | +using Google.ProtocolBuffers.TestProtos;
 | 
	
		
			
				|  |  | +using NUnit.Framework;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +namespace Google.ProtocolBuffers
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    [TestFixture]
 | 
	
		
			
				|  |  | +    public class TestMimeMessageFormats
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        // There is a whole host of various json mime types in use around the net, this is the set we accept...
 | 
	
		
			
				|  |  | +        readonly IEnumerable<string> JsonTypes = new string[] { "application/json", "application/x-json", "application/x-javascript", "text/javascript", "text/x-javascript", "text/x-json", "text/json" };
 | 
	
		
			
				|  |  | +        readonly IEnumerable<string> XmlTypes = new string[] { "text/xml", "application/xml" };
 | 
	
		
			
				|  |  | +        readonly IEnumerable<string> ProtobufTypes = new string[] { "application/binary", "application/x-protobuf", "application/vnd.google.protobuf" };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestReadJsonMimeTypes()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            foreach (string type in JsonTypes)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Assert.IsTrue(
 | 
	
		
			
				|  |  | +                    MessageFormatFactory.CreateInputStream(new MessageFormatOptions(), type, Stream.Null)
 | 
	
		
			
				|  |  | +                    is JsonFormatReader);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            Assert.IsTrue(
 | 
	
		
			
				|  |  | +                MessageFormatFactory.CreateInputStream(new MessageFormatOptions() { DefaultContentType = "application/json" }, null, Stream.Null)
 | 
	
		
			
				|  |  | +                is JsonFormatReader);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestWriteJsonMimeTypes()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            foreach (string type in JsonTypes)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Assert.IsTrue(
 | 
	
		
			
				|  |  | +                    MessageFormatFactory.CreateOutputStream(new MessageFormatOptions(), type, Stream.Null)
 | 
	
		
			
				|  |  | +                    is JsonFormatWriter);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            Assert.IsTrue(
 | 
	
		
			
				|  |  | +                MessageFormatFactory.CreateOutputStream(new MessageFormatOptions() { DefaultContentType = "application/json" }, null, Stream.Null)
 | 
	
		
			
				|  |  | +                is JsonFormatWriter);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestReadXmlMimeTypes()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            foreach (string type in XmlTypes)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Assert.IsTrue(
 | 
	
		
			
				|  |  | +                    MessageFormatFactory.CreateInputStream(new MessageFormatOptions(), type, Stream.Null)
 | 
	
		
			
				|  |  | +                    is XmlFormatReader);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            Assert.IsTrue(
 | 
	
		
			
				|  |  | +                MessageFormatFactory.CreateInputStream(new MessageFormatOptions() { DefaultContentType = "application/xml" }, null, Stream.Null)
 | 
	
		
			
				|  |  | +                is XmlFormatReader);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestWriteXmlMimeTypes()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            foreach (string type in XmlTypes)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Assert.IsTrue(
 | 
	
		
			
				|  |  | +                    MessageFormatFactory.CreateOutputStream(new MessageFormatOptions(), type, Stream.Null)
 | 
	
		
			
				|  |  | +                    is XmlFormatWriter);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            Assert.IsTrue(
 | 
	
		
			
				|  |  | +                MessageFormatFactory.CreateOutputStream(new MessageFormatOptions() { DefaultContentType = "application/xml" }, null, Stream.Null)
 | 
	
		
			
				|  |  | +                is XmlFormatWriter);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestReadProtoMimeTypes()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            foreach (string type in ProtobufTypes)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Assert.IsTrue(
 | 
	
		
			
				|  |  | +                    MessageFormatFactory.CreateInputStream(new MessageFormatOptions(), type, Stream.Null)
 | 
	
		
			
				|  |  | +                    is CodedInputStream);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            Assert.IsTrue(
 | 
	
		
			
				|  |  | +                MessageFormatFactory.CreateInputStream(new MessageFormatOptions() { DefaultContentType = "application/vnd.google.protobuf" }, null, Stream.Null)
 | 
	
		
			
				|  |  | +                is CodedInputStream);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestWriteProtoMimeTypes()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            foreach (string type in ProtobufTypes)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Assert.IsTrue(
 | 
	
		
			
				|  |  | +                    MessageFormatFactory.CreateOutputStream(new MessageFormatOptions(), type, Stream.Null)
 | 
	
		
			
				|  |  | +                    is CodedOutputStream);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            Assert.IsTrue(
 | 
	
		
			
				|  |  | +                MessageFormatFactory.CreateOutputStream(new MessageFormatOptions() { DefaultContentType = "application/vnd.google.protobuf" }, null, Stream.Null)
 | 
	
		
			
				|  |  | +                is CodedOutputStream);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestMergeFromJsonType()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            TestXmlMessage msg = new TestXmlMessage.Builder().MergeFrom(
 | 
	
		
			
				|  |  | +                new MessageFormatOptions(), "application/json", new MemoryStream(Encoding.ASCII.GetBytes(
 | 
	
		
			
				|  |  | +                    TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build().ToJson()
 | 
	
		
			
				|  |  | +                    )))
 | 
	
		
			
				|  |  | +                .Build();
 | 
	
		
			
				|  |  | +            Assert.AreEqual("a", msg.Text);
 | 
	
		
			
				|  |  | +            Assert.AreEqual(1, msg.Number);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestMergeFromXmlType()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            TestXmlMessage msg = new TestXmlMessage.Builder().MergeFrom(
 | 
	
		
			
				|  |  | +                new MessageFormatOptions(), "application/xml", new MemoryStream(Encoding.ASCII.GetBytes(
 | 
	
		
			
				|  |  | +                    TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build().ToXml()
 | 
	
		
			
				|  |  | +                    )))
 | 
	
		
			
				|  |  | +                .Build();
 | 
	
		
			
				|  |  | +            Assert.AreEqual("a", msg.Text);
 | 
	
		
			
				|  |  | +            Assert.AreEqual(1, msg.Number);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestMergeFromProtoType()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            TestXmlMessage msg = new TestXmlMessage.Builder().MergeFrom(
 | 
	
		
			
				|  |  | +                new MessageFormatOptions(), "application/vnd.google.protobuf", new MemoryStream(
 | 
	
		
			
				|  |  | +                    TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build().ToByteArray()
 | 
	
		
			
				|  |  | +                    ))
 | 
	
		
			
				|  |  | +                .Build();
 | 
	
		
			
				|  |  | +            Assert.AreEqual("a", msg.Text);
 | 
	
		
			
				|  |  | +            Assert.AreEqual(1, msg.Number);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestWriteToJsonType()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            MemoryStream ms = new MemoryStream();
 | 
	
		
			
				|  |  | +            TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build()
 | 
	
		
			
				|  |  | +                .WriteTo(new MessageFormatOptions(), "application/json", ms);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Assert.AreEqual(@"{""text"":""a"",""number"":1}", Encoding.UTF8.GetString(ms.ToArray()));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestWriteToXmlType()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            MemoryStream ms = new MemoryStream();
 | 
	
		
			
				|  |  | +            TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build()
 | 
	
		
			
				|  |  | +                .WriteTo(new MessageFormatOptions(), "application/xml", ms);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Assert.AreEqual("<root><text>a</text><number>1</number></root>", Encoding.UTF8.GetString(ms.ToArray()));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestWriteToProtoType()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            MemoryStream ms = new MemoryStream();
 | 
	
		
			
				|  |  | +            TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build()
 | 
	
		
			
				|  |  | +                .WriteTo(new MessageFormatOptions(), "application/vnd.google.protobuf", ms);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            byte[] bytes = TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build().ToByteArray();
 | 
	
		
			
				|  |  | +            Assert.AreEqual(bytes, ms.ToArray());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestXmlReaderOptions()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            MemoryStream ms = new MemoryStream();
 | 
	
		
			
				|  |  | +            XmlFormatWriter.CreateInstance(ms)
 | 
	
		
			
				|  |  | +                .SetOptions(XmlWriterOptions.OutputNestedArrays)
 | 
	
		
			
				|  |  | +                .WriteMessage("my-root-node", TestXmlMessage.CreateBuilder().SetText("a").AddNumbers(1).AddNumbers(2).Build());
 | 
	
		
			
				|  |  | +            ms.Position = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            MessageFormatOptions options = new MessageFormatOptions()
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                XmlReaderOptions = XmlReaderOptions.ReadNestedArrays,
 | 
	
		
			
				|  |  | +                XmlReaderRootElementName = "my-root-node"
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            TestXmlMessage msg = new TestXmlMessage.Builder().MergeFrom(
 | 
	
		
			
				|  |  | +                options, "application/xml", ms)
 | 
	
		
			
				|  |  | +                .Build();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Assert.AreEqual("a", msg.Text);
 | 
	
		
			
				|  |  | +            Assert.AreEqual(1, msg.NumbersList[0]);
 | 
	
		
			
				|  |  | +            Assert.AreEqual(2, msg.NumbersList[1]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestXmlWriterOptions()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            TestXmlMessage message = TestXmlMessage.CreateBuilder().SetText("a").AddNumbers(1).AddNumbers(2).Build();
 | 
	
		
			
				|  |  | +            MessageFormatOptions options = new MessageFormatOptions()
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                XmlWriterOptions = XmlWriterOptions.OutputNestedArrays,
 | 
	
		
			
				|  |  | +                XmlWriterRootElementName = "root-node"
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            MemoryStream ms = new MemoryStream();
 | 
	
		
			
				|  |  | +            message.WriteTo(options, "application/xml", ms);
 | 
	
		
			
				|  |  | +            ms.Position = 0;
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
 | 
	
		
			
				|  |  | +            XmlFormatReader.CreateInstance(ms)
 | 
	
		
			
				|  |  | +                .SetOptions(XmlReaderOptions.ReadNestedArrays)
 | 
	
		
			
				|  |  | +                .Merge("root-node", builder);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Assert.AreEqual("a", builder.Text);
 | 
	
		
			
				|  |  | +            Assert.AreEqual(1, builder.NumbersList[0]);
 | 
	
		
			
				|  |  | +            Assert.AreEqual(2, builder.NumbersList[1]);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestJsonFormatted()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            MemoryStream ms = new MemoryStream();
 | 
	
		
			
				|  |  | +            TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build()
 | 
	
		
			
				|  |  | +                .WriteTo(new MessageFormatOptions() { FormattedOutput = true }, "application/json", ms);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Assert.AreEqual("{\r\n    \"text\": \"a\",\r\n    \"number\": 1\r\n}", Encoding.UTF8.GetString(ms.ToArray()));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [Test]
 | 
	
		
			
				|  |  | +        public void TestXmlFormatted()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            MemoryStream ms = new MemoryStream();
 | 
	
		
			
				|  |  | +            TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build()
 | 
	
		
			
				|  |  | +                .WriteTo(new MessageFormatOptions() { FormattedOutput = true }, "application/xml", ms);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Assert.AreEqual("<root>\r\n    <text>a</text>\r\n    <number>1</number>\r\n</root>", Encoding.UTF8.GetString(ms.ToArray()));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |