WireFormatTest.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Google.ProtocolBuffers.TestProtos;
  5. using NUnit.Framework;
  6. using Google.ProtocolBuffers.Descriptors;
  7. namespace Google.ProtocolBuffers {
  8. [TestFixture]
  9. public class WireFormatTest {
  10. [Test]
  11. public void FieldTypeToWireTypeMapping() {
  12. // Just test a few values
  13. Assert.AreEqual(WireFormat.WireType.Fixed64, WireFormat.FieldTypeToWireFormatMap[FieldType.SFixed64]);
  14. Assert.AreEqual(WireFormat.WireType.LengthDelimited, WireFormat.FieldTypeToWireFormatMap[FieldType.String]);
  15. Assert.AreEqual(WireFormat.WireType.LengthDelimited, WireFormat.FieldTypeToWireFormatMap[FieldType.Message]);
  16. }
  17. [Test]
  18. public void Serialization() {
  19. TestAllTypes message = TestUtil.GetAllSet();
  20. ByteString rawBytes = message.ToByteString();
  21. Assert.AreEqual(rawBytes.Length, message.SerializedSize);
  22. TestAllTypes message2 = TestAllTypes.ParseFrom(rawBytes);
  23. TestUtil.AssertAllFieldsSet(message2);
  24. }
  25. [Test]
  26. public void SerializeExtensions() {
  27. // TestAllTypes and TestAllExtensions should have compatible wire formats,
  28. // so if we serealize a TestAllExtensions then parse it as TestAllTypes
  29. // it should work.
  30. TestAllExtensions message = TestUtil.GetAllExtensionsSet();
  31. ByteString rawBytes = message.ToByteString();
  32. Assert.AreEqual(rawBytes.Length, message.SerializedSize);
  33. TestAllTypes message2 = TestAllTypes.ParseFrom(rawBytes);
  34. TestUtil.AssertAllFieldsSet(message2);
  35. }
  36. [Test]
  37. public void ParseExtensions() {
  38. // TestAllTypes and TestAllExtensions should have compatible wire formats,
  39. // so if we serealize a TestAllTypes then parse it as TestAllExtensions
  40. // it should work.
  41. TestAllTypes message = TestUtil.GetAllSet();
  42. ByteString rawBytes = message.ToByteString();
  43. ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
  44. TestUtil.RegisterAllExtensions(registry);
  45. registry = registry.AsReadOnly();
  46. TestAllExtensions message2 =
  47. TestAllExtensions.ParseFrom(rawBytes, registry);
  48. TestUtil.AssertAllExtensionsSet(message2);
  49. }
  50. [Test]
  51. public void ExtensionsSerializedSize() {
  52. Assert.AreEqual(TestUtil.GetAllSet().SerializedSize, TestUtil.GetAllExtensionsSet().SerializedSize);
  53. }
  54. private void AssertFieldsInOrder(ByteString data) {
  55. CodedInputStream input = data.CreateCodedInput();
  56. uint previousTag = 0;
  57. while (true) {
  58. uint tag = input.ReadTag();
  59. if (tag == 0) {
  60. break;
  61. }
  62. Assert.IsTrue(tag > previousTag);
  63. previousTag = tag;
  64. input.SkipField(tag);
  65. }
  66. }
  67. [Test]
  68. public void InterleavedFieldsAndExtensions() {
  69. // Tests that fields are written in order even when extension ranges
  70. // are interleaved with field numbers.
  71. ByteString data =
  72. TestFieldOrderings.CreateBuilder()
  73. .SetMyInt(1)
  74. .SetMyString("foo")
  75. .SetMyFloat(1.0F)
  76. .SetExtension(UnitTestProtoFile.MyExtensionInt, 23)
  77. .SetExtension(UnitTestProtoFile.MyExtensionString, "bar")
  78. .Build().ToByteString();
  79. AssertFieldsInOrder(data);
  80. MessageDescriptor descriptor = TestFieldOrderings.Descriptor;
  81. ByteString dynamic_data =
  82. DynamicMessage.CreateBuilder(TestFieldOrderings.Descriptor)
  83. .SetField(descriptor.FindDescriptor<FieldDescriptor>("my_int"), 1L)
  84. .SetField(descriptor.FindDescriptor<FieldDescriptor>("my_string"), "foo")
  85. .SetField(descriptor.FindDescriptor<FieldDescriptor>("my_float"), 1.0F)
  86. .SetField(UnitTestProtoFile.MyExtensionInt.Descriptor, 23)
  87. .SetField(UnitTestProtoFile.MyExtensionString.Descriptor, "bar")
  88. .WeakBuild().ToByteString();
  89. AssertFieldsInOrder(dynamic_data);
  90. }
  91. private const int UnknownTypeId = 1550055;
  92. private static readonly int TypeId1 = TestMessageSetExtension1.Descriptor.Extensions[0].FieldNumber;
  93. private static readonly int TypeId2 = TestMessageSetExtension2.Descriptor.Extensions[0].FieldNumber;
  94. [Test]
  95. public void SerializeMessageSet() {
  96. // Set up a TestMessageSet with two known messages and an unknown one.
  97. TestMessageSet messageSet =
  98. TestMessageSet.CreateBuilder()
  99. .SetExtension(
  100. TestMessageSetExtension1.Types.MessageSetExtension,
  101. TestMessageSetExtension1.CreateBuilder().SetI(123).Build())
  102. .SetExtension(
  103. TestMessageSetExtension2.Types.MessageSetExtension,
  104. TestMessageSetExtension2.CreateBuilder().SetStr("foo").Build())
  105. .SetUnknownFields(
  106. UnknownFieldSet.CreateBuilder()
  107. .AddField(UnknownTypeId,
  108. UnknownField.CreateBuilder()
  109. .AddLengthDelimited(ByteString.CopyFromUtf8("bar"))
  110. .Build())
  111. .Build())
  112. .Build();
  113. ByteString data = messageSet.ToByteString();
  114. // Parse back using RawMessageSet and check the contents.
  115. RawMessageSet raw = RawMessageSet.ParseFrom(data);
  116. Assert.AreEqual(0, raw.UnknownFields.FieldDictionary.Count);
  117. Assert.AreEqual(3, raw.ItemCount);
  118. Assert.AreEqual(TypeId1, raw.ItemList[0].TypeId);
  119. Assert.AreEqual(TypeId2, raw.ItemList[1].TypeId);
  120. Assert.AreEqual(UnknownTypeId, raw.ItemList[2].TypeId);
  121. TestMessageSetExtension1 message1 = TestMessageSetExtension1.ParseFrom(raw.GetItem(0).Message.ToByteArray());
  122. Assert.AreEqual(123, message1.I);
  123. TestMessageSetExtension2 message2 = TestMessageSetExtension2.ParseFrom(raw.GetItem(1).Message.ToByteArray());
  124. Assert.AreEqual("foo", message2.Str);
  125. Assert.AreEqual("bar", raw.GetItem(2).Message.ToStringUtf8());
  126. }
  127. [Test]
  128. public void ParseMessageSet() {
  129. ExtensionRegistry extensionRegistry = ExtensionRegistry.CreateInstance();
  130. extensionRegistry.Add(TestMessageSetExtension1.Types.MessageSetExtension);
  131. extensionRegistry.Add(TestMessageSetExtension2.Types.MessageSetExtension);
  132. // Set up a RawMessageSet with two known messages and an unknown one.
  133. RawMessageSet raw =
  134. RawMessageSet.CreateBuilder()
  135. .AddItem(
  136. RawMessageSet.Types.Item.CreateBuilder()
  137. .SetTypeId(TypeId1)
  138. .SetMessage(
  139. TestMessageSetExtension1.CreateBuilder()
  140. .SetI(123)
  141. .Build().ToByteString())
  142. .Build())
  143. .AddItem(
  144. RawMessageSet.Types.Item.CreateBuilder()
  145. .SetTypeId(TypeId2)
  146. .SetMessage(
  147. TestMessageSetExtension2.CreateBuilder()
  148. .SetStr("foo")
  149. .Build().ToByteString())
  150. .Build())
  151. .AddItem(
  152. RawMessageSet.Types.Item.CreateBuilder()
  153. .SetTypeId(UnknownTypeId)
  154. .SetMessage(ByteString.CopyFromUtf8("bar"))
  155. .Build())
  156. .Build();
  157. ByteString data = raw.ToByteString();
  158. // Parse as a TestMessageSet and check the contents.
  159. TestMessageSet messageSet =
  160. TestMessageSet.ParseFrom(data, extensionRegistry);
  161. Assert.AreEqual(123, messageSet.GetExtension(TestMessageSetExtension1.Types.MessageSetExtension).I);
  162. Assert.AreEqual("foo", messageSet.GetExtension(TestMessageSetExtension2.Types.MessageSetExtension).Str);
  163. // Check for unknown field with type LENGTH_DELIMITED,
  164. // number UNKNOWN_TYPE_ID, and contents "bar".
  165. UnknownFieldSet unknownFields = messageSet.UnknownFields;
  166. Assert.AreEqual(1, unknownFields.FieldDictionary.Count);
  167. Assert.IsTrue(unknownFields.HasField(UnknownTypeId));
  168. UnknownField field = unknownFields[UnknownTypeId];
  169. Assert.AreEqual(1, field.LengthDelimitedList.Count);
  170. Assert.AreEqual("bar", field.LengthDelimitedList[0].ToStringUtf8());
  171. }
  172. }
  173. }