WireFormatTest.cs 8.4 KB

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