WireFormatTest.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc.
  3. // http://code.google.com/p/protobuf/
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. using System.Reflection;
  17. using Google.ProtocolBuffers.Descriptors;
  18. using Google.ProtocolBuffers.TestProtos;
  19. using NUnit.Framework;
  20. namespace Google.ProtocolBuffers {
  21. [TestFixture]
  22. public class WireFormatTest {
  23. /// <summary>
  24. /// Keeps the attributes on FieldType and the switch statement in WireFormat in sync.
  25. /// </summary>
  26. [Test]
  27. public void FieldTypeToWireTypeMapping() {
  28. foreach (FieldInfo field in typeof(FieldType).GetFields(BindingFlags.Static | BindingFlags.Public)) {
  29. FieldType fieldType = (FieldType)field.GetValue(null);
  30. FieldMappingAttribute mapping = (FieldMappingAttribute)field.GetCustomAttributes(typeof(FieldMappingAttribute), false)[0];
  31. Assert.AreEqual(mapping.WireType, WireFormat.GetWireType(fieldType));
  32. }
  33. }
  34. [Test]
  35. public void Serialization() {
  36. TestAllTypes message = TestUtil.GetAllSet();
  37. ByteString rawBytes = message.ToByteString();
  38. Assert.AreEqual(rawBytes.Length, message.SerializedSize);
  39. TestAllTypes message2 = TestAllTypes.ParseFrom(rawBytes);
  40. TestUtil.AssertAllFieldsSet(message2);
  41. }
  42. [Test]
  43. public void SerializeExtensions() {
  44. // TestAllTypes and TestAllExtensions should have compatible wire formats,
  45. // so if we serealize a TestAllExtensions then parse it as TestAllTypes
  46. // it should work.
  47. TestAllExtensions message = TestUtil.GetAllExtensionsSet();
  48. ByteString rawBytes = message.ToByteString();
  49. Assert.AreEqual(rawBytes.Length, message.SerializedSize);
  50. TestAllTypes message2 = TestAllTypes.ParseFrom(rawBytes);
  51. TestUtil.AssertAllFieldsSet(message2);
  52. }
  53. [Test]
  54. public void ParseExtensions() {
  55. // TestAllTypes and TestAllExtensions should have compatible wire formats,
  56. // so if we serealize a TestAllTypes then parse it as TestAllExtensions
  57. // it should work.
  58. TestAllTypes message = TestUtil.GetAllSet();
  59. ByteString rawBytes = message.ToByteString();
  60. ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
  61. TestUtil.RegisterAllExtensions(registry);
  62. registry = registry.AsReadOnly();
  63. TestAllExtensions message2 =
  64. TestAllExtensions.ParseFrom(rawBytes, registry);
  65. TestUtil.AssertAllExtensionsSet(message2);
  66. }
  67. [Test]
  68. public void ExtensionsSerializedSize() {
  69. Assert.AreEqual(TestUtil.GetAllSet().SerializedSize, TestUtil.GetAllExtensionsSet().SerializedSize);
  70. }
  71. private void AssertFieldsInOrder(ByteString data) {
  72. CodedInputStream input = data.CreateCodedInput();
  73. uint previousTag = 0;
  74. while (true) {
  75. uint tag = input.ReadTag();
  76. if (tag == 0) {
  77. break;
  78. }
  79. Assert.IsTrue(tag > previousTag);
  80. previousTag = tag;
  81. input.SkipField(tag);
  82. }
  83. }
  84. [Test]
  85. public void InterleavedFieldsAndExtensions() {
  86. // Tests that fields are written in order even when extension ranges
  87. // are interleaved with field numbers.
  88. ByteString data =
  89. TestFieldOrderings.CreateBuilder()
  90. .SetMyInt(1)
  91. .SetMyString("foo")
  92. .SetMyFloat(1.0F)
  93. .SetExtension(UnitTestProtoFile.MyExtensionInt, 23)
  94. .SetExtension(UnitTestProtoFile.MyExtensionString, "bar")
  95. .Build().ToByteString();
  96. AssertFieldsInOrder(data);
  97. MessageDescriptor descriptor = TestFieldOrderings.Descriptor;
  98. ByteString dynamic_data =
  99. DynamicMessage.CreateBuilder(TestFieldOrderings.Descriptor)
  100. .SetField(descriptor.FindDescriptor<FieldDescriptor>("my_int"), 1L)
  101. .SetField(descriptor.FindDescriptor<FieldDescriptor>("my_string"), "foo")
  102. .SetField(descriptor.FindDescriptor<FieldDescriptor>("my_float"), 1.0F)
  103. .SetField(UnitTestProtoFile.MyExtensionInt.Descriptor, 23)
  104. .SetField(UnitTestProtoFile.MyExtensionString.Descriptor, "bar")
  105. .WeakBuild().ToByteString();
  106. AssertFieldsInOrder(dynamic_data);
  107. }
  108. private const int UnknownTypeId = 1550055;
  109. private static readonly int TypeId1 = TestMessageSetExtension1.Descriptor.Extensions[0].FieldNumber;
  110. private static readonly int TypeId2 = TestMessageSetExtension2.Descriptor.Extensions[0].FieldNumber;
  111. [Test]
  112. public void SerializeMessageSet() {
  113. // Set up a TestMessageSet with two known messages and an unknown one.
  114. TestMessageSet messageSet =
  115. TestMessageSet.CreateBuilder()
  116. .SetExtension(
  117. TestMessageSetExtension1.MessageSetExtension,
  118. TestMessageSetExtension1.CreateBuilder().SetI(123).Build())
  119. .SetExtension(
  120. TestMessageSetExtension2.MessageSetExtension,
  121. TestMessageSetExtension2.CreateBuilder().SetStr("foo").Build())
  122. .SetUnknownFields(
  123. UnknownFieldSet.CreateBuilder()
  124. .AddField(UnknownTypeId,
  125. UnknownField.CreateBuilder()
  126. .AddLengthDelimited(ByteString.CopyFromUtf8("bar"))
  127. .Build())
  128. .Build())
  129. .Build();
  130. ByteString data = messageSet.ToByteString();
  131. // Parse back using RawMessageSet and check the contents.
  132. RawMessageSet raw = RawMessageSet.ParseFrom(data);
  133. Assert.AreEqual(0, raw.UnknownFields.FieldDictionary.Count);
  134. Assert.AreEqual(3, raw.ItemCount);
  135. Assert.AreEqual(TypeId1, raw.ItemList[0].TypeId);
  136. Assert.AreEqual(TypeId2, raw.ItemList[1].TypeId);
  137. Assert.AreEqual(UnknownTypeId, raw.ItemList[2].TypeId);
  138. TestMessageSetExtension1 message1 = TestMessageSetExtension1.ParseFrom(raw.GetItem(0).Message.ToByteArray());
  139. Assert.AreEqual(123, message1.I);
  140. TestMessageSetExtension2 message2 = TestMessageSetExtension2.ParseFrom(raw.GetItem(1).Message.ToByteArray());
  141. Assert.AreEqual("foo", message2.Str);
  142. Assert.AreEqual("bar", raw.GetItem(2).Message.ToStringUtf8());
  143. }
  144. [Test]
  145. public void ParseMessageSet() {
  146. ExtensionRegistry extensionRegistry = ExtensionRegistry.CreateInstance();
  147. extensionRegistry.Add(TestMessageSetExtension1.MessageSetExtension);
  148. extensionRegistry.Add(TestMessageSetExtension2.MessageSetExtension);
  149. // Set up a RawMessageSet with two known messages and an unknown one.
  150. RawMessageSet raw =
  151. RawMessageSet.CreateBuilder()
  152. .AddItem(
  153. RawMessageSet.Types.Item.CreateBuilder()
  154. .SetTypeId(TypeId1)
  155. .SetMessage(
  156. TestMessageSetExtension1.CreateBuilder()
  157. .SetI(123)
  158. .Build().ToByteString())
  159. .Build())
  160. .AddItem(
  161. RawMessageSet.Types.Item.CreateBuilder()
  162. .SetTypeId(TypeId2)
  163. .SetMessage(
  164. TestMessageSetExtension2.CreateBuilder()
  165. .SetStr("foo")
  166. .Build().ToByteString())
  167. .Build())
  168. .AddItem(
  169. RawMessageSet.Types.Item.CreateBuilder()
  170. .SetTypeId(UnknownTypeId)
  171. .SetMessage(ByteString.CopyFromUtf8("bar"))
  172. .Build())
  173. .Build();
  174. ByteString data = raw.ToByteString();
  175. // Parse as a TestMessageSet and check the contents.
  176. TestMessageSet messageSet =
  177. TestMessageSet.ParseFrom(data, extensionRegistry);
  178. Assert.AreEqual(123, messageSet.GetExtension(TestMessageSetExtension1.MessageSetExtension).I);
  179. Assert.AreEqual("foo", messageSet.GetExtension(TestMessageSetExtension2.MessageSetExtension).Str);
  180. // Check for unknown field with type LENGTH_DELIMITED,
  181. // number UNKNOWN_TYPE_ID, and contents "bar".
  182. UnknownFieldSet unknownFields = messageSet.UnknownFields;
  183. Assert.AreEqual(1, unknownFields.FieldDictionary.Count);
  184. Assert.IsTrue(unknownFields.HasField(UnknownTypeId));
  185. UnknownField field = unknownFields[UnknownTypeId];
  186. Assert.AreEqual(1, field.LengthDelimitedList.Count);
  187. Assert.AreEqual("bar", field.LengthDelimitedList[0].ToStringUtf8());
  188. }
  189. }
  190. }