UnknownFieldSetTest.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #region Copyright notice and license
  2. // Protocol Buffers - Google's data interchange format
  3. // Copyright 2008 Google Inc. All rights reserved.
  4. // https://developers.google.com/protocol-buffers/
  5. //
  6. // Redistribution and use in source and binary forms, with or without
  7. // modification, are permitted provided that the following conditions are
  8. // met:
  9. //
  10. // * Redistributions of source code must retain the above copyright
  11. // notice, this list of conditions and the following disclaimer.
  12. // * Redistributions in binary form must reproduce the above
  13. // copyright notice, this list of conditions and the following disclaimer
  14. // in the documentation and/or other materials provided with the
  15. // distribution.
  16. // * Neither the name of Google Inc. nor the names of its
  17. // contributors may be used to endorse or promote products derived from
  18. // this software without specific prior written permission.
  19. //
  20. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  23. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  24. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  25. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  26. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  27. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  28. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  29. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  30. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. #endregion
  32. using System;
  33. using System.IO;
  34. using Google.Protobuf.TestProtos;
  35. using Proto2 = Google.Protobuf.TestProtos.Proto2;
  36. using NUnit.Framework;
  37. namespace Google.Protobuf
  38. {
  39. public class UnknownFieldSetTest
  40. {
  41. public class Data
  42. {
  43. public static System.Collections.IEnumerable Messages
  44. {
  45. get
  46. {
  47. yield return SampleMessages.CreateFullTestAllTypesProto2();
  48. yield return SampleMessages.CreateFullTestAllTypes();
  49. }
  50. }
  51. }
  52. [Test]
  53. public void EmptyUnknownFieldSet()
  54. {
  55. UnknownFieldSet unknownFields = new UnknownFieldSet();
  56. Assert.AreEqual(0, unknownFields.CalculateSize());
  57. }
  58. [Test]
  59. public void MergeUnknownFieldSet()
  60. {
  61. UnknownFieldSet unknownFields = new UnknownFieldSet();
  62. UnknownField field = new UnknownField();
  63. field.AddFixed32(123);
  64. unknownFields.AddOrReplaceField(1, field);
  65. UnknownFieldSet otherUnknownFields = new UnknownFieldSet();
  66. Assert.IsFalse(otherUnknownFields.HasField(1));
  67. UnknownFieldSet.MergeFrom(otherUnknownFields, unknownFields);
  68. Assert.IsTrue(otherUnknownFields.HasField(1));
  69. }
  70. [Test]
  71. [TestCaseSource(typeof(Data), "Messages")]
  72. public void TestMergeCodedInput(IMessage message)
  73. {
  74. var emptyMessage = new TestEmptyMessage();
  75. emptyMessage.MergeFrom(message.ToByteArray());
  76. Assert.AreEqual(message.CalculateSize(), emptyMessage.CalculateSize());
  77. Assert.AreEqual(message.ToByteArray(), emptyMessage.ToByteArray());
  78. var newMessage = message.Descriptor.Parser.ParseFrom(emptyMessage.ToByteArray());
  79. Assert.AreEqual(message, newMessage);
  80. Assert.AreEqual(message.CalculateSize(), newMessage.CalculateSize());
  81. }
  82. [Test]
  83. [TestCaseSource(typeof(Data), "Messages")]
  84. public void TestMergeMessage(IMessage message)
  85. {
  86. var emptyMessage = new TestEmptyMessage();
  87. var otherEmptyMessage = new TestEmptyMessage();
  88. emptyMessage.MergeFrom(message.ToByteArray());
  89. otherEmptyMessage.MergeFrom(emptyMessage);
  90. Assert.AreEqual(message.CalculateSize(), otherEmptyMessage.CalculateSize());
  91. Assert.AreEqual(message.ToByteArray(), otherEmptyMessage.ToByteArray());
  92. }
  93. [Test]
  94. [TestCaseSource(typeof(Data), "Messages")]
  95. public void TestEquals(IMessage message)
  96. {
  97. var emptyMessage = new TestEmptyMessage();
  98. var otherEmptyMessage = new TestEmptyMessage();
  99. Assert.AreEqual(emptyMessage, otherEmptyMessage);
  100. emptyMessage.MergeFrom(message.ToByteArray());
  101. Assert.AreNotEqual(emptyMessage.CalculateSize(),
  102. otherEmptyMessage.CalculateSize());
  103. Assert.AreNotEqual(emptyMessage, otherEmptyMessage);
  104. }
  105. [Test]
  106. [TestCaseSource(typeof(Data), "Messages")]
  107. public void TestHashCode(IMessage message)
  108. {
  109. var emptyMessage = new TestEmptyMessage();
  110. int hashCode = emptyMessage.GetHashCode();
  111. emptyMessage.MergeFrom(message.ToByteArray());
  112. Assert.AreNotEqual(hashCode, emptyMessage.GetHashCode());
  113. }
  114. [Test]
  115. [TestCaseSource(typeof(Data), "Messages")]
  116. public void TestClone(IMessage message)
  117. {
  118. var emptyMessage = new TestEmptyMessage();
  119. var otherEmptyMessage = new TestEmptyMessage();
  120. otherEmptyMessage = emptyMessage.Clone();
  121. Assert.AreEqual(emptyMessage.CalculateSize(), otherEmptyMessage.CalculateSize());
  122. Assert.AreEqual(emptyMessage.ToByteArray(), otherEmptyMessage.ToByteArray());
  123. emptyMessage.MergeFrom(message.ToByteArray());
  124. otherEmptyMessage = emptyMessage.Clone();
  125. Assert.AreEqual(message.CalculateSize(), otherEmptyMessage.CalculateSize());
  126. Assert.AreEqual(message.ToByteArray(), otherEmptyMessage.ToByteArray());
  127. }
  128. [Test]
  129. [TestCaseSource(typeof(Data), "Messages")]
  130. public void TestDiscardUnknownFields(IMessage message)
  131. {
  132. var goldenEmptyMessage = new TestEmptyMessage();
  133. byte[] data = message.ToByteArray();
  134. int fullSize = message.CalculateSize();
  135. Action<IMessage> assertEmpty = msg =>
  136. {
  137. Assert.AreEqual(0, msg.CalculateSize());
  138. Assert.AreEqual(goldenEmptyMessage, msg);
  139. };
  140. Action<IMessage> assertFull = msg => Assert.AreEqual(fullSize, msg.CalculateSize());
  141. // Test the behavior of the parsers with and without discarding, both generic and non-generic.
  142. MessageParser<TestEmptyMessage> retainingParser1 = TestEmptyMessage.Parser;
  143. MessageParser retainingParser2 = retainingParser1;
  144. MessageParser<TestEmptyMessage> discardingParser1 = retainingParser1.WithDiscardUnknownFields(true);
  145. MessageParser discardingParser2 = retainingParser2.WithDiscardUnknownFields(true);
  146. // Test parse from byte[]
  147. MessageParsingHelpers.AssertReadingMessage(retainingParser1, data, m => assertFull(m));
  148. MessageParsingHelpers.AssertReadingMessage(retainingParser2, data, m => assertFull(m));
  149. MessageParsingHelpers.AssertReadingMessage(discardingParser1, data, m => assertEmpty(m));
  150. MessageParsingHelpers.AssertReadingMessage(discardingParser2, data, m => assertEmpty(m));
  151. // Test parse from byte[] with offset
  152. assertFull(retainingParser1.ParseFrom(data, 0, data.Length));
  153. assertFull(retainingParser2.ParseFrom(data, 0, data.Length));
  154. assertEmpty(discardingParser1.ParseFrom(data, 0, data.Length));
  155. assertEmpty(discardingParser2.ParseFrom(data, 0, data.Length));
  156. // Test parse from CodedInputStream
  157. assertFull(retainingParser1.ParseFrom(new CodedInputStream(data)));
  158. assertFull(retainingParser2.ParseFrom(new CodedInputStream(data)));
  159. assertEmpty(discardingParser1.ParseFrom(new CodedInputStream(data)));
  160. assertEmpty(discardingParser2.ParseFrom(new CodedInputStream(data)));
  161. // Test parse from Stream
  162. assertFull(retainingParser1.ParseFrom(new MemoryStream(data)));
  163. assertFull(retainingParser2.ParseFrom(new MemoryStream(data)));
  164. assertEmpty(discardingParser1.ParseFrom(new MemoryStream(data)));
  165. assertEmpty(discardingParser2.ParseFrom(new MemoryStream(data)));
  166. }
  167. [Test]
  168. public void TestReadInvalidWireTypeThrowsInvalidProtocolBufferException()
  169. {
  170. MemoryStream ms = new MemoryStream();
  171. CodedOutputStream output = new CodedOutputStream(ms);
  172. uint tag = WireFormat.MakeTag(1, (WireFormat.WireType)6);
  173. output.WriteRawVarint32(tag);
  174. output.WriteLength(-1);
  175. output.Flush();
  176. ms.Position = 0;
  177. CodedInputStream input = new CodedInputStream(ms);
  178. Assert.AreEqual(tag, input.ReadTag());
  179. Assert.Throws<InvalidProtocolBufferException>(() => UnknownFieldSet.MergeFieldFrom(null, input));
  180. }
  181. }
  182. }