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 | |
{ | |
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 = Extensions.MergeFrom(new TestXmlMessage.Builder(), | |
new MessageFormatOptions(), "application/json", new MemoryStream(Encoding.UTF8.GetBytes( | |
Extensions.ToJson(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build()) | |
))) | |
.Build(); | |
Assert.AreEqual("a", msg.Text); | |
Assert.AreEqual(1, msg.Number); | |
} | |
[Test] | |
public void TestMergeFromXmlType() | |
{ | |
TestXmlMessage msg = Extensions.MergeFrom(new TestXmlMessage.Builder(), | |
new MessageFormatOptions(), "application/xml", new MemoryStream(Encoding.UTF8.GetBytes( | |
Extensions.ToXml(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build()) | |
))) | |
.Build(); | |
Assert.AreEqual("a", msg.Text); | |
Assert.AreEqual(1, msg.Number); | |
} | |
[Test] | |
public void TestMergeFromProtoType() | |
{ | |
TestXmlMessage msg = Extensions.MergeFrom(new TestXmlMessage.Builder(), | |
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(); | |
Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(), | |
new MessageFormatOptions(), "application/json", ms); | |
Assert.AreEqual(@"{""text"":""a"",""number"":1}", Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length)); | |
} | |
[Test] | |
public void TestWriteToXmlType() | |
{ | |
MemoryStream ms = new MemoryStream(); | |
Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(), | |
new MessageFormatOptions(), "application/xml", ms); | |
Assert.AreEqual("<root><text>a</text><number>1</number></root>", Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length)); | |
} | |
[Test] | |
public void TestWriteToProtoType() | |
{ | |
MemoryStream ms = new MemoryStream(); | |
Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(), | |
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 = Extensions.MergeFrom(new TestXmlMessage.Builder(), | |
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(); | |
Extensions.WriteTo(message, 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(); | |
Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(), | |
new MessageFormatOptions() { FormattedOutput = true }, "application/json", ms); | |
string expected = string.Format("{{{0} \"text\": \"a\",{0} \"number\": 1{0}}}", System.Environment.NewLine); | |
Assert.AreEqual(expected, Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length)); | |
} | |
[Test] | |
public void TestXmlFormatted() | |
{ | |
MemoryStream ms = new MemoryStream(); | |
Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(), | |
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(), 0, (int)ms.Length)); | |
} | |
[Test] | |
public void TestReadCustomMimeTypes() | |
{ | |
var options = new MessageFormatOptions(); | |
//Remove existing mime-type mappings | |
options.MimeInputTypes.Clear(); | |
//Add our own | |
options.MimeInputTypes.Add("-custom-XML-mime-type-", XmlFormatReader.CreateInstance); | |
Assert.AreEqual(1, options.MimeInputTypes.Count); | |
Stream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes( | |
Extensions.ToXml(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build()) | |
)); | |
TestXmlMessage msg = Extensions.MergeFrom(new TestXmlMessage.Builder(), | |
options, "-custom-XML-mime-type-", xmlStream) | |
.Build(); | |
Assert.AreEqual("a", msg.Text); | |
Assert.AreEqual(1, msg.Number); | |
} | |
[Test] | |
public void TestWriteToCustomType() | |
{ | |
var options = new MessageFormatOptions(); | |
//Remove existing mime-type mappings | |
options.MimeOutputTypes.Clear(); | |
//Add our own | |
options.MimeOutputTypes.Add("-custom-XML-mime-type-", XmlFormatWriter.CreateInstance); | |
Assert.AreEqual(1, options.MimeOutputTypes.Count); | |
MemoryStream ms = new MemoryStream(); | |
Extensions.WriteTo(TestXmlMessage.CreateBuilder().SetText("a").SetNumber(1).Build(), | |
options, "-custom-XML-mime-type-", ms); | |
Assert.AreEqual("<root><text>a</text><number>1</number></root>", Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length)); | |
} | |
} | |
} |