|
|
@ -1,6 +1,7 @@ |
|
|
|
using System; |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Text; |
|
|
|
using System.Text; |
|
|
|
|
|
|
|
using Google.ProtocolBuffers.TestProtos; |
|
|
|
using NUnit.Framework; |
|
|
|
using NUnit.Framework; |
|
|
|
using Google.ProtocolBuffers.Descriptors; |
|
|
|
using Google.ProtocolBuffers.Descriptors; |
|
|
|
|
|
|
|
|
|
|
@ -16,5 +17,196 @@ namespace Google.ProtocolBuffers { |
|
|
|
Assert.AreEqual(WireFormat.WireType.LengthDelimited, WireFormat.FieldTypeToWireFormatMap[FieldType.String]); |
|
|
|
Assert.AreEqual(WireFormat.WireType.LengthDelimited, WireFormat.FieldTypeToWireFormatMap[FieldType.String]); |
|
|
|
Assert.AreEqual(WireFormat.WireType.LengthDelimited, WireFormat.FieldTypeToWireFormatMap[FieldType.Message]); |
|
|
|
Assert.AreEqual(WireFormat.WireType.LengthDelimited, WireFormat.FieldTypeToWireFormatMap[FieldType.Message]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
|
|
|
public void Serialization() { |
|
|
|
|
|
|
|
TestAllTypes message = TestUtil.GetAllSet(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ByteString rawBytes = message.ToByteString(); |
|
|
|
|
|
|
|
Assert.AreEqual(rawBytes.Length, message.SerializedSize); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TestAllTypes message2 = TestAllTypes.ParseFrom(rawBytes); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TestUtil.AssertAllFieldsSet(message2); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
|
|
|
public void SerializeExtensions() { |
|
|
|
|
|
|
|
// TestAllTypes and TestAllExtensions should have compatible wire formats, |
|
|
|
|
|
|
|
// so if we serealize a TestAllExtensions then parse it as TestAllTypes |
|
|
|
|
|
|
|
// it should work. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TestAllExtensions message = TestUtil.GetAllExtensionsSet(); |
|
|
|
|
|
|
|
ByteString rawBytes = message.ToByteString(); |
|
|
|
|
|
|
|
Assert.AreEqual(rawBytes.Length, message.SerializedSize); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TestAllTypes message2 = TestAllTypes.ParseFrom(rawBytes); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TestUtil.AssertAllFieldsSet(message2); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
|
|
|
public void ParseExtensions() { |
|
|
|
|
|
|
|
// TestAllTypes and TestAllExtensions should have compatible wire formats, |
|
|
|
|
|
|
|
// so if we serealize a TestAllTypes then parse it as TestAllExtensions |
|
|
|
|
|
|
|
// it should work. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TestAllTypes message = TestUtil.GetAllSet(); |
|
|
|
|
|
|
|
ByteString rawBytes = message.ToByteString(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ExtensionRegistry registry = ExtensionRegistry.CreateInstance(); |
|
|
|
|
|
|
|
TestUtil.RegisterAllExtensions(registry); |
|
|
|
|
|
|
|
registry = registry.AsReadOnly(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TestAllExtensions message2 = |
|
|
|
|
|
|
|
TestAllExtensions.ParseFrom(rawBytes, registry); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TestUtil.AssertAllExtensionsSet(message2); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
|
|
|
public void ExtensionsSerializedSize() { |
|
|
|
|
|
|
|
Assert.AreEqual(TestUtil.GetAllSet().SerializedSize, TestUtil.GetAllExtensionsSet().SerializedSize); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void AssertFieldsInOrder(ByteString data) { |
|
|
|
|
|
|
|
CodedInputStream input = data.CreateCodedInput(); |
|
|
|
|
|
|
|
uint previousTag = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (true) { |
|
|
|
|
|
|
|
uint tag = input.ReadTag(); |
|
|
|
|
|
|
|
if (tag == 0) { |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Assert.IsTrue(tag > previousTag); |
|
|
|
|
|
|
|
previousTag = tag; |
|
|
|
|
|
|
|
input.SkipField(tag); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
|
|
|
public void InterleavedFieldsAndExtensions() { |
|
|
|
|
|
|
|
// Tests that fields are written in order even when extension ranges |
|
|
|
|
|
|
|
// are interleaved with field numbers. |
|
|
|
|
|
|
|
ByteString data = |
|
|
|
|
|
|
|
TestFieldOrderings.CreateBuilder() |
|
|
|
|
|
|
|
.SetMyInt(1) |
|
|
|
|
|
|
|
.SetMyString("foo") |
|
|
|
|
|
|
|
.SetMyFloat(1.0F) |
|
|
|
|
|
|
|
.SetExtension(UnitTestProtoFile.MyExtensionInt, 23) |
|
|
|
|
|
|
|
.SetExtension(UnitTestProtoFile.MyExtensionString, "bar") |
|
|
|
|
|
|
|
.Build().ToByteString(); |
|
|
|
|
|
|
|
AssertFieldsInOrder(data); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MessageDescriptor descriptor = TestFieldOrderings.Descriptor; |
|
|
|
|
|
|
|
ByteString dynamic_data = |
|
|
|
|
|
|
|
DynamicMessage.CreateBuilder(TestFieldOrderings.Descriptor) |
|
|
|
|
|
|
|
.SetField(descriptor.FindDescriptor<FieldDescriptor>("my_int"), 1L) |
|
|
|
|
|
|
|
.SetField(descriptor.FindDescriptor<FieldDescriptor>("my_string"), "foo") |
|
|
|
|
|
|
|
.SetField(descriptor.FindDescriptor<FieldDescriptor>("my_float"), 1.0F) |
|
|
|
|
|
|
|
.SetField(UnitTestProtoFile.MyExtensionInt.Descriptor, 23) |
|
|
|
|
|
|
|
.SetField(UnitTestProtoFile.MyExtensionString.Descriptor, "bar") |
|
|
|
|
|
|
|
.WeakBuild().ToByteString(); |
|
|
|
|
|
|
|
AssertFieldsInOrder(dynamic_data); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private const int UnknownTypeId = 1550055; |
|
|
|
|
|
|
|
private static readonly int TypeId1 = TestMessageSetExtension1.Descriptor.Extensions[0].FieldNumber; |
|
|
|
|
|
|
|
private static readonly int TypeId2 = TestMessageSetExtension2.Descriptor.Extensions[0].FieldNumber; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
|
|
|
public void SerializeMessageSet() { |
|
|
|
|
|
|
|
// Set up a TestMessageSet with two known messages and an unknown one. |
|
|
|
|
|
|
|
TestMessageSet messageSet = |
|
|
|
|
|
|
|
TestMessageSet.CreateBuilder() |
|
|
|
|
|
|
|
.SetExtension( |
|
|
|
|
|
|
|
TestMessageSetExtension1.Types.MessageSetExtension, |
|
|
|
|
|
|
|
TestMessageSetExtension1.CreateBuilder().SetI(123).Build()) |
|
|
|
|
|
|
|
.SetExtension( |
|
|
|
|
|
|
|
TestMessageSetExtension2.Types.MessageSetExtension, |
|
|
|
|
|
|
|
TestMessageSetExtension2.CreateBuilder().SetStr("foo").Build()) |
|
|
|
|
|
|
|
.SetUnknownFields( |
|
|
|
|
|
|
|
UnknownFieldSet.CreateBuilder() |
|
|
|
|
|
|
|
.AddField(UnknownTypeId, |
|
|
|
|
|
|
|
UnknownField.CreateBuilder() |
|
|
|
|
|
|
|
.AddLengthDelimited(ByteString.CopyFromUtf8("bar")) |
|
|
|
|
|
|
|
.Build()) |
|
|
|
|
|
|
|
.Build()) |
|
|
|
|
|
|
|
.Build(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ByteString data = messageSet.ToByteString(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Parse back using RawMessageSet and check the contents. |
|
|
|
|
|
|
|
RawMessageSet raw = RawMessageSet.ParseFrom(data); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Assert.AreEqual(0, raw.UnknownFields.FieldDictionary.Count); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Assert.AreEqual(3, raw.ItemCount); |
|
|
|
|
|
|
|
Assert.AreEqual(TypeId1, raw.ItemList[0].TypeId); |
|
|
|
|
|
|
|
Assert.AreEqual(TypeId2, raw.ItemList[1].TypeId); |
|
|
|
|
|
|
|
Assert.AreEqual(UnknownTypeId, raw.ItemList[2].TypeId); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TestMessageSetExtension1 message1 = TestMessageSetExtension1.ParseFrom(raw.GetItem(0).Message.ToByteArray()); |
|
|
|
|
|
|
|
Assert.AreEqual(123, message1.I); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TestMessageSetExtension2 message2 = TestMessageSetExtension2.ParseFrom(raw.GetItem(1).Message.ToByteArray()); |
|
|
|
|
|
|
|
Assert.AreEqual("foo", message2.Str); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Assert.AreEqual("bar", raw.GetItem(2).Message.ToStringUtf8()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
|
|
|
public void ParseMessageSet() { |
|
|
|
|
|
|
|
ExtensionRegistry extensionRegistry = ExtensionRegistry.CreateInstance(); |
|
|
|
|
|
|
|
extensionRegistry.Add(TestMessageSetExtension1.Types.MessageSetExtension); |
|
|
|
|
|
|
|
extensionRegistry.Add(TestMessageSetExtension2.Types.MessageSetExtension); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Set up a RawMessageSet with two known messages and an unknown one. |
|
|
|
|
|
|
|
RawMessageSet raw = |
|
|
|
|
|
|
|
RawMessageSet.CreateBuilder() |
|
|
|
|
|
|
|
.AddItem( |
|
|
|
|
|
|
|
RawMessageSet.Types.Item.CreateBuilder() |
|
|
|
|
|
|
|
.SetTypeId(TypeId1) |
|
|
|
|
|
|
|
.SetMessage( |
|
|
|
|
|
|
|
TestMessageSetExtension1.CreateBuilder() |
|
|
|
|
|
|
|
.SetI(123) |
|
|
|
|
|
|
|
.Build().ToByteString()) |
|
|
|
|
|
|
|
.Build()) |
|
|
|
|
|
|
|
.AddItem( |
|
|
|
|
|
|
|
RawMessageSet.Types.Item.CreateBuilder() |
|
|
|
|
|
|
|
.SetTypeId(TypeId2) |
|
|
|
|
|
|
|
.SetMessage( |
|
|
|
|
|
|
|
TestMessageSetExtension2.CreateBuilder() |
|
|
|
|
|
|
|
.SetStr("foo") |
|
|
|
|
|
|
|
.Build().ToByteString()) |
|
|
|
|
|
|
|
.Build()) |
|
|
|
|
|
|
|
.AddItem( |
|
|
|
|
|
|
|
RawMessageSet.Types.Item.CreateBuilder() |
|
|
|
|
|
|
|
.SetTypeId(UnknownTypeId) |
|
|
|
|
|
|
|
.SetMessage(ByteString.CopyFromUtf8("bar")) |
|
|
|
|
|
|
|
.Build()) |
|
|
|
|
|
|
|
.Build(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ByteString data = raw.ToByteString(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Parse as a TestMessageSet and check the contents. |
|
|
|
|
|
|
|
TestMessageSet messageSet = |
|
|
|
|
|
|
|
TestMessageSet.ParseFrom(data, extensionRegistry); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Assert.AreEqual(123, messageSet.GetExtension(TestMessageSetExtension1.Types.MessageSetExtension).I); |
|
|
|
|
|
|
|
Assert.AreEqual("foo", messageSet.GetExtension(TestMessageSetExtension2.Types.MessageSetExtension).Str); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check for unknown field with type LENGTH_DELIMITED, |
|
|
|
|
|
|
|
// number UNKNOWN_TYPE_ID, and contents "bar". |
|
|
|
|
|
|
|
UnknownFieldSet unknownFields = messageSet.UnknownFields; |
|
|
|
|
|
|
|
Assert.AreEqual(1, unknownFields.FieldDictionary.Count); |
|
|
|
|
|
|
|
Assert.IsTrue(unknownFields.HasField(UnknownTypeId)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UnknownField field = unknownFields[UnknownTypeId]; |
|
|
|
|
|
|
|
Assert.AreEqual(1, field.LengthDelimitedList.Count); |
|
|
|
|
|
|
|
Assert.AreEqual("bar", field.LengthDelimitedList[0].ToStringUtf8()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|