UnknownFieldSetTest.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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. [Test]
  42. public void EmptyUnknownFieldSet()
  43. {
  44. UnknownFieldSet unknownFields = new UnknownFieldSet();
  45. Assert.AreEqual(0, unknownFields.CalculateSize());
  46. }
  47. [Test]
  48. public void MergeUnknownFieldSet()
  49. {
  50. UnknownFieldSet unknownFields = new UnknownFieldSet();
  51. UnknownField field = new UnknownField();
  52. field.AddFixed32(123);
  53. unknownFields.AddOrReplaceField(1, field);
  54. UnknownFieldSet otherUnknownFields = new UnknownFieldSet();
  55. Assert.IsFalse(otherUnknownFields.HasField(1));
  56. UnknownFieldSet.MergeFrom(otherUnknownFields, unknownFields);
  57. Assert.IsTrue(otherUnknownFields.HasField(1));
  58. }
  59. [Test]
  60. public void TestMergeCodedInput()
  61. {
  62. var message = SampleMessages.CreateFullTestAllTypesProto2();
  63. var emptyMessage = new TestEmptyMessage();
  64. emptyMessage.MergeFrom(message.ToByteArray());
  65. Assert.AreEqual(message.CalculateSize(), emptyMessage.CalculateSize());
  66. Assert.AreEqual(message.ToByteArray(), emptyMessage.ToByteArray());
  67. var newMessage = new Proto2.TestAllTypes();
  68. newMessage.MergeFrom(emptyMessage.ToByteArray());
  69. Assert.AreEqual(message, newMessage);
  70. Assert.AreEqual(message.CalculateSize(), newMessage.CalculateSize());
  71. }
  72. [Test]
  73. public void TestMergeMessage()
  74. {
  75. var message = SampleMessages.CreateFullTestAllTypesProto2();
  76. var emptyMessage = new TestEmptyMessage();
  77. var otherEmptyMessage = new TestEmptyMessage();
  78. emptyMessage.MergeFrom(message.ToByteArray());
  79. otherEmptyMessage.MergeFrom(emptyMessage);
  80. Assert.AreEqual(message.CalculateSize(), otherEmptyMessage.CalculateSize());
  81. Assert.AreEqual(message.ToByteArray(), otherEmptyMessage.ToByteArray());
  82. }
  83. [Test]
  84. public void TestEquals()
  85. {
  86. var message = SampleMessages.CreateFullTestAllTypesProto2();
  87. var emptyMessage = new TestEmptyMessage();
  88. var otherEmptyMessage = new TestEmptyMessage();
  89. Assert.AreEqual(emptyMessage, otherEmptyMessage);
  90. emptyMessage.MergeFrom(message.ToByteArray());
  91. Assert.AreNotEqual(emptyMessage.CalculateSize(),
  92. otherEmptyMessage.CalculateSize());
  93. Assert.AreNotEqual(emptyMessage, otherEmptyMessage);
  94. }
  95. [Test]
  96. public void TestHashCode()
  97. {
  98. var message = SampleMessages.CreateFullTestAllTypesProto2();
  99. var emptyMessage = new TestEmptyMessage();
  100. int hashCode = emptyMessage.GetHashCode();
  101. emptyMessage.MergeFrom(message.ToByteArray());
  102. Assert.AreNotEqual(hashCode, emptyMessage.GetHashCode());
  103. }
  104. [Test]
  105. public void TestClone()
  106. {
  107. var emptyMessage = new TestEmptyMessage();
  108. var otherEmptyMessage = new TestEmptyMessage();
  109. otherEmptyMessage = emptyMessage.Clone();
  110. Assert.AreEqual(emptyMessage.CalculateSize(), otherEmptyMessage.CalculateSize());
  111. Assert.AreEqual(emptyMessage.ToByteArray(), otherEmptyMessage.ToByteArray());
  112. var message = SampleMessages.CreateFullTestAllTypesProto2();
  113. emptyMessage.MergeFrom(message.ToByteArray());
  114. otherEmptyMessage = emptyMessage.Clone();
  115. Assert.AreEqual(message.CalculateSize(), otherEmptyMessage.CalculateSize());
  116. Assert.AreEqual(message.ToByteArray(), otherEmptyMessage.ToByteArray());
  117. }
  118. [Test]
  119. public void TestDiscardUnknownFields()
  120. {
  121. var message = SampleMessages.CreateFullTestAllTypesProto2();
  122. var goldenEmptyMessage = new TestEmptyMessage();
  123. byte[] data = message.ToByteArray();
  124. int fullSize = message.CalculateSize();
  125. Action<IMessage> assertEmpty = msg =>
  126. {
  127. Assert.AreEqual(0, msg.CalculateSize());
  128. Assert.AreEqual(goldenEmptyMessage, msg);
  129. };
  130. Action<IMessage> assertFull = msg => Assert.AreEqual(fullSize, msg.CalculateSize());
  131. // Test the behavior of the parsers with and without discarding, both generic and non-generic.
  132. MessageParser<TestEmptyMessage> retainingParser1 = TestEmptyMessage.Parser;
  133. MessageParser retainingParser2 = retainingParser1;
  134. MessageParser<TestEmptyMessage> discardingParser1 = retainingParser1.WithDiscardUnknownFields(true);
  135. MessageParser discardingParser2 = retainingParser2.WithDiscardUnknownFields(true);
  136. // Test parse from byte[]
  137. assertFull(retainingParser1.ParseFrom(data));
  138. assertFull(retainingParser2.ParseFrom(data));
  139. assertEmpty(discardingParser1.ParseFrom(data));
  140. assertEmpty(discardingParser2.ParseFrom(data));
  141. // Test parse from byte[] with offset
  142. assertFull(retainingParser1.ParseFrom(data, 0, data.Length));
  143. assertFull(retainingParser2.ParseFrom(data, 0, data.Length));
  144. assertEmpty(discardingParser1.ParseFrom(data, 0, data.Length));
  145. assertEmpty(discardingParser2.ParseFrom(data, 0, data.Length));
  146. // Test parse from CodedInputStream
  147. assertFull(retainingParser1.ParseFrom(new CodedInputStream(data)));
  148. assertFull(retainingParser2.ParseFrom(new CodedInputStream(data)));
  149. assertEmpty(discardingParser1.ParseFrom(new CodedInputStream(data)));
  150. assertEmpty(discardingParser2.ParseFrom(new CodedInputStream(data)));
  151. // Test parse from Stream
  152. assertFull(retainingParser1.ParseFrom(new MemoryStream(data)));
  153. assertFull(retainingParser2.ParseFrom(new MemoryStream(data)));
  154. assertEmpty(discardingParser1.ParseFrom(new MemoryStream(data)));
  155. assertEmpty(discardingParser2.ParseFrom(new MemoryStream(data)));
  156. }
  157. [Test]
  158. public void TestReadInvalidWireTypeThrowsInvalidProtocolBufferException()
  159. {
  160. MemoryStream ms = new MemoryStream();
  161. CodedOutputStream output = new CodedOutputStream(ms);
  162. uint tag = WireFormat.MakeTag(1, (WireFormat.WireType)6);
  163. output.WriteRawVarint32(tag);
  164. output.WriteLength(-1);
  165. output.Flush();
  166. ms.Position = 0;
  167. CodedInputStream input = new CodedInputStream(ms);
  168. Assert.AreEqual(tag, input.ReadTag());
  169. Assert.Throws<InvalidProtocolBufferException>(() => UnknownFieldSet.MergeFieldFrom(null, input));
  170. }
  171. }
  172. }