|
|
|
@ -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())); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |