UnknownFieldSetTest.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  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;
  17. using System.Collections.Generic;
  18. using Google.ProtocolBuffers.Descriptors;
  19. using Google.ProtocolBuffers.TestProtos;
  20. using NUnit.Framework;
  21. namespace Google.ProtocolBuffers {
  22. [TestFixture]
  23. public class UnknownFieldSetTest {
  24. private MessageDescriptor descriptor;
  25. private TestAllTypes allFields;
  26. private ByteString allFieldsData;
  27. /// <summary>
  28. /// An empty message that has been parsed from allFieldsData. So, it has
  29. /// unknown fields of every type.
  30. /// </summary>
  31. private TestEmptyMessage emptyMessage;
  32. private UnknownFieldSet unknownFields;
  33. [SetUp]
  34. public void SetUp() {
  35. descriptor = TestAllTypes.Descriptor;
  36. allFields = TestUtil.GetAllSet();
  37. allFieldsData = allFields.ToByteString();
  38. emptyMessage = TestEmptyMessage.ParseFrom(allFieldsData);
  39. unknownFields = emptyMessage.UnknownFields;
  40. }
  41. private UnknownField GetField(String name) {
  42. FieldDescriptor field = descriptor.FindDescriptor<FieldDescriptor>(name);
  43. Assert.IsNotNull(field);
  44. return unknownFields.FieldDictionary[field.FieldNumber];
  45. }
  46. /// <summary>
  47. /// Constructs a protocol buffer which contains fields with all the same
  48. /// numbers as allFieldsData except that each field is some other wire
  49. /// type.
  50. /// </summary>
  51. private ByteString GetBizarroData() {
  52. UnknownFieldSet.Builder bizarroFields = UnknownFieldSet.CreateBuilder();
  53. UnknownField varintField = UnknownField.CreateBuilder().AddVarint(1).Build();
  54. UnknownField fixed32Field = UnknownField.CreateBuilder().AddFixed32(1).Build();
  55. foreach (KeyValuePair<int, UnknownField> entry in unknownFields.FieldDictionary) {
  56. if (entry.Value.VarintList.Count == 0) {
  57. // Original field is not a varint, so use a varint.
  58. bizarroFields.AddField(entry.Key, varintField);
  59. } else {
  60. // Original field *is* a varint, so use something else.
  61. bizarroFields.AddField(entry.Key, fixed32Field);
  62. }
  63. }
  64. return bizarroFields.Build().ToByteString();
  65. }
  66. // =================================================================
  67. [Test]
  68. public void Varint() {
  69. UnknownField field = GetField("optional_int32");
  70. Assert.AreEqual(1, field.VarintList.Count);
  71. Assert.AreEqual(allFields.OptionalInt32, (long) field.VarintList[0]);
  72. }
  73. [Test]
  74. public void Fixed32() {
  75. UnknownField field = GetField("optional_fixed32");
  76. Assert.AreEqual(1, field.Fixed32List.Count);
  77. Assert.AreEqual(allFields.OptionalFixed32, (int) field.Fixed32List[0]);
  78. }
  79. [Test]
  80. public void Fixed64() {
  81. UnknownField field = GetField("optional_fixed64");
  82. Assert.AreEqual(1, field.Fixed64List.Count);
  83. Assert.AreEqual(allFields.OptionalFixed64, (long) field.Fixed64List[0]);
  84. }
  85. [Test]
  86. public void LengthDelimited() {
  87. UnknownField field = GetField("optional_bytes");
  88. Assert.AreEqual(1, field.LengthDelimitedList.Count);
  89. Assert.AreEqual(allFields.OptionalBytes, field.LengthDelimitedList[0]);
  90. }
  91. [Test]
  92. public void Group() {
  93. FieldDescriptor nestedFieldDescriptor =
  94. TestAllTypes.Types.OptionalGroup.Descriptor.FindDescriptor<FieldDescriptor>("a");
  95. Assert.IsNotNull(nestedFieldDescriptor);
  96. UnknownField field = GetField("optionalgroup");
  97. Assert.AreEqual(1, field.GroupList.Count);
  98. UnknownFieldSet group = field.GroupList[0];
  99. Assert.AreEqual(1, group.FieldDictionary.Count);
  100. Assert.IsTrue(group.HasField(nestedFieldDescriptor.FieldNumber));
  101. UnknownField nestedField = group[nestedFieldDescriptor.FieldNumber];
  102. Assert.AreEqual(1, nestedField.VarintList.Count);
  103. Assert.AreEqual(allFields.OptionalGroup.A, (long) nestedField.VarintList[0]);
  104. }
  105. [Test]
  106. public void Serialize() {
  107. // Check that serializing the UnknownFieldSet produces the original data again.
  108. ByteString data = emptyMessage.ToByteString();
  109. Assert.AreEqual(allFieldsData, data);
  110. }
  111. [Test]
  112. public void CopyFrom() {
  113. TestEmptyMessage message =
  114. TestEmptyMessage.CreateBuilder().MergeFrom(emptyMessage).Build();
  115. Assert.AreEqual(emptyMessage.ToString(), message.ToString());
  116. }
  117. [Test]
  118. public void MergeFrom() {
  119. TestEmptyMessage source =
  120. TestEmptyMessage.CreateBuilder()
  121. .SetUnknownFields(
  122. UnknownFieldSet.CreateBuilder()
  123. .AddField(2,
  124. UnknownField.CreateBuilder()
  125. .AddVarint(2).Build())
  126. .AddField(3,
  127. UnknownField.CreateBuilder()
  128. .AddVarint(4).Build())
  129. .Build())
  130. .Build();
  131. TestEmptyMessage destination =
  132. TestEmptyMessage.CreateBuilder()
  133. .SetUnknownFields(
  134. UnknownFieldSet.CreateBuilder()
  135. .AddField(1,
  136. UnknownField.CreateBuilder()
  137. .AddVarint(1).Build())
  138. .AddField(3,
  139. UnknownField.CreateBuilder()
  140. .AddVarint(3).Build())
  141. .Build())
  142. .MergeFrom(source)
  143. .Build();
  144. Assert.AreEqual(
  145. "1: 1\n" +
  146. "2: 2\n" +
  147. "3: 3\n" +
  148. "3: 4\n",
  149. destination.ToString());
  150. }
  151. [Test]
  152. public void Clear() {
  153. UnknownFieldSet fields =
  154. UnknownFieldSet.CreateBuilder().MergeFrom(unknownFields).Clear().Build();
  155. Assert.AreEqual(0, fields.FieldDictionary.Count);
  156. }
  157. [Test]
  158. public void ClearMessage() {
  159. TestEmptyMessage message =
  160. TestEmptyMessage.CreateBuilder().MergeFrom(emptyMessage).Clear().Build();
  161. Assert.AreEqual(0, message.SerializedSize);
  162. }
  163. [Test]
  164. public void ParseKnownAndUnknown() {
  165. // Test mixing known and unknown fields when parsing.
  166. UnknownFieldSet fields =
  167. UnknownFieldSet.CreateBuilder(unknownFields)
  168. .AddField(123456,
  169. UnknownField.CreateBuilder().AddVarint(654321).Build())
  170. .Build();
  171. ByteString data = fields.ToByteString();
  172. TestAllTypes destination = TestAllTypes.ParseFrom(data);
  173. TestUtil.AssertAllFieldsSet(destination);
  174. Assert.AreEqual(1, destination.UnknownFields.FieldDictionary.Count);
  175. UnknownField field = destination.UnknownFields[123456];
  176. Assert.AreEqual(1, field.VarintList.Count);
  177. Assert.AreEqual(654321, (long) field.VarintList[0]);
  178. }
  179. [Test]
  180. public void WrongTypeTreatedAsUnknown() {
  181. // Test that fields of the wrong wire type are treated like unknown fields
  182. // when parsing.
  183. ByteString bizarroData = GetBizarroData();
  184. TestAllTypes allTypesMessage = TestAllTypes.ParseFrom(bizarroData);
  185. TestEmptyMessage emptyMessage = TestEmptyMessage.ParseFrom(bizarroData);
  186. // All fields should have been interpreted as unknown, so the debug strings
  187. // should be the same.
  188. Assert.AreEqual(emptyMessage.ToString(), allTypesMessage.ToString());
  189. }
  190. [Test]
  191. public void UnknownExtensions() {
  192. // Make sure fields are properly parsed to the UnknownFieldSet even when
  193. // they are declared as extension numbers.
  194. TestEmptyMessageWithExtensions message =
  195. TestEmptyMessageWithExtensions.ParseFrom(allFieldsData);
  196. Assert.AreEqual(unknownFields.FieldDictionary.Count,
  197. message.UnknownFields.FieldDictionary.Count);
  198. Assert.AreEqual(allFieldsData, message.ToByteString());
  199. }
  200. [Test]
  201. public void WrongExtensionTypeTreatedAsUnknown() {
  202. // Test that fields of the wrong wire type are treated like unknown fields
  203. // when parsing extensions.
  204. ByteString bizarroData = GetBizarroData();
  205. TestAllExtensions allExtensionsMessage = TestAllExtensions.ParseFrom(bizarroData);
  206. TestEmptyMessage emptyMessage = TestEmptyMessage.ParseFrom(bizarroData);
  207. // All fields should have been interpreted as unknown, so the debug strings
  208. // should be the same.
  209. Assert.AreEqual(emptyMessage.ToString(),
  210. allExtensionsMessage.ToString());
  211. }
  212. [Test]
  213. public void ParseUnknownEnumValue() {
  214. FieldDescriptor singularField = TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("optional_nested_enum");
  215. FieldDescriptor repeatedField = TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("repeated_nested_enum");
  216. Assert.IsNotNull(singularField);
  217. Assert.IsNotNull(repeatedField);
  218. ByteString data =
  219. UnknownFieldSet.CreateBuilder()
  220. .AddField(singularField.FieldNumber,
  221. UnknownField.CreateBuilder()
  222. .AddVarint((int) TestAllTypes.Types.NestedEnum.BAR)
  223. .AddVarint(5) // not valid
  224. .Build())
  225. .AddField(repeatedField.FieldNumber,
  226. UnknownField.CreateBuilder()
  227. .AddVarint((int) TestAllTypes.Types.NestedEnum.FOO)
  228. .AddVarint(4) // not valid
  229. .AddVarint((int) TestAllTypes.Types.NestedEnum.BAZ)
  230. .AddVarint(6) // not valid
  231. .Build())
  232. .Build()
  233. .ToByteString();
  234. {
  235. TestAllTypes message = TestAllTypes.ParseFrom(data);
  236. Assert.AreEqual(TestAllTypes.Types.NestedEnum.BAR,
  237. message.OptionalNestedEnum);
  238. TestUtil.AssertEqual(new [] {TestAllTypes.Types.NestedEnum.FOO, TestAllTypes.Types.NestedEnum.BAZ},
  239. message.RepeatedNestedEnumList);
  240. TestUtil.AssertEqual(new[] {5UL}, message.UnknownFields[singularField.FieldNumber].VarintList);
  241. TestUtil.AssertEqual(new[] {4UL, 6UL}, message.UnknownFields[repeatedField.FieldNumber].VarintList);
  242. }
  243. {
  244. TestAllExtensions message =
  245. TestAllExtensions.ParseFrom(data, TestUtil.CreateExtensionRegistry());
  246. Assert.AreEqual(TestAllTypes.Types.NestedEnum.BAR,
  247. message.GetExtension(UnitTestProtoFile.OptionalNestedEnumExtension));
  248. TestUtil.AssertEqual(new[] { TestAllTypes.Types.NestedEnum.FOO, TestAllTypes.Types.NestedEnum.BAZ },
  249. message.GetExtension(UnitTestProtoFile.RepeatedNestedEnumExtension));
  250. TestUtil.AssertEqual(new[] { 5UL }, message.UnknownFields[singularField.FieldNumber].VarintList);
  251. TestUtil.AssertEqual(new[] { 4UL, 6UL }, message.UnknownFields[repeatedField.FieldNumber].VarintList);
  252. }
  253. }
  254. [Test]
  255. public void LargeVarint() {
  256. ByteString data =
  257. UnknownFieldSet.CreateBuilder()
  258. .AddField(1,
  259. UnknownField.CreateBuilder()
  260. .AddVarint(0x7FFFFFFFFFFFFFFFL)
  261. .Build())
  262. .Build()
  263. .ToByteString();
  264. UnknownFieldSet parsed = UnknownFieldSet.ParseFrom(data);
  265. UnknownField field = parsed[1];
  266. Assert.AreEqual(1, field.VarintList.Count);
  267. Assert.AreEqual(0x7FFFFFFFFFFFFFFFUL, field.VarintList[0]);
  268. }
  269. }
  270. }