DynamicMessageTest.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. using System.Collections.Generic;
  2. using Google.ProtocolBuffers.TestProtos;
  3. // Protocol Buffers - Google's data interchange format
  4. // Copyright 2008 Google Inc. All rights reserved.
  5. // http://github.com/jskeet/dotnet-protobufs/
  6. // Original C++/Java/Python code:
  7. // http://code.google.com/p/protobuf/
  8. //
  9. // Redistribution and use in source and binary forms, with or without
  10. // modification, are permitted provided that the following conditions are
  11. // met:
  12. //
  13. // * Redistributions of source code must retain the above copyright
  14. // notice, this list of conditions and the following disclaimer.
  15. // * Redistributions in binary form must reproduce the above
  16. // copyright notice, this list of conditions and the following disclaimer
  17. // in the documentation and/or other materials provided with the
  18. // distribution.
  19. // * Neither the name of Google Inc. nor the names of its
  20. // contributors may be used to endorse or promote products derived from
  21. // this software without specific prior written permission.
  22. //
  23. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  24. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  25. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  26. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  27. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  28. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  29. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  30. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  31. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  32. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  33. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  34. using NUnit.Framework;
  35. using System;
  36. namespace Google.ProtocolBuffers {
  37. [TestFixture]
  38. public class DynamicMessageTest {
  39. private ReflectionTester reflectionTester;
  40. private ReflectionTester extensionsReflectionTester;
  41. private ReflectionTester packedReflectionTester;
  42. [SetUp]
  43. public void SetUp() {
  44. reflectionTester = ReflectionTester.CreateTestAllTypesInstance();
  45. extensionsReflectionTester = ReflectionTester.CreateTestAllExtensionsInstance();
  46. packedReflectionTester = ReflectionTester.CreateTestPackedTypesInstance();
  47. }
  48. [Test]
  49. public void DynamicMessageAccessors() {
  50. IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
  51. reflectionTester.SetAllFieldsViaReflection(builder);
  52. IMessage message = builder.WeakBuild();
  53. reflectionTester.AssertAllFieldsSetViaReflection(message);
  54. }
  55. [Test]
  56. public void DoubleBuildError() {
  57. DynamicMessage.Builder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
  58. builder.Build();
  59. try {
  60. builder.Build();
  61. Assert.Fail("Should have thrown exception.");
  62. } catch (InvalidOperationException) {
  63. // Success.
  64. }
  65. }
  66. [Test]
  67. public void DynamicMessageSettersRejectNull() {
  68. IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
  69. reflectionTester.AssertReflectionSettersRejectNull(builder);
  70. }
  71. [Test]
  72. public void DynamicMessageExtensionAccessors() {
  73. // We don't need to extensively test DynamicMessage's handling of
  74. // extensions because, frankly, it doesn't do anything special with them.
  75. // It treats them just like any other fields.
  76. IBuilder builder = DynamicMessage.CreateBuilder(TestAllExtensions.Descriptor);
  77. extensionsReflectionTester.SetAllFieldsViaReflection(builder);
  78. IMessage message = builder.WeakBuild();
  79. extensionsReflectionTester.AssertAllFieldsSetViaReflection(message);
  80. }
  81. [Test]
  82. public void DynamicMessageExtensionSettersRejectNull() {
  83. IBuilder builder = DynamicMessage.CreateBuilder(TestAllExtensions.Descriptor);
  84. extensionsReflectionTester.AssertReflectionSettersRejectNull(builder);
  85. }
  86. [Test]
  87. public void DynamicMessageRepeatedSetters() {
  88. IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
  89. reflectionTester.SetAllFieldsViaReflection(builder);
  90. reflectionTester.ModifyRepeatedFieldsViaReflection(builder);
  91. IMessage message = builder.WeakBuild();
  92. reflectionTester.AssertRepeatedFieldsModifiedViaReflection(message);
  93. }
  94. [Test]
  95. public void DynamicMessageRepeatedSettersRejectNull() {
  96. IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
  97. reflectionTester.AssertReflectionRepeatedSettersRejectNull(builder);
  98. }
  99. [Test]
  100. public void DynamicMessageDefaults() {
  101. reflectionTester.AssertClearViaReflection(DynamicMessage.GetDefaultInstance(TestAllTypes.Descriptor));
  102. reflectionTester.AssertClearViaReflection(DynamicMessage.CreateBuilder(TestAllTypes.Descriptor).Build());
  103. }
  104. [Test]
  105. public void DynamicMessageSerializedSize() {
  106. TestAllTypes message = TestUtil.GetAllSet();
  107. IBuilder dynamicBuilder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
  108. reflectionTester.SetAllFieldsViaReflection(dynamicBuilder);
  109. IMessage dynamicMessage = dynamicBuilder.WeakBuild();
  110. Assert.AreEqual(message.SerializedSize, dynamicMessage.SerializedSize);
  111. }
  112. [Test]
  113. public void DynamicMessageSerialization() {
  114. IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
  115. reflectionTester.SetAllFieldsViaReflection(builder);
  116. IMessage message = builder.WeakBuild();
  117. ByteString rawBytes = message.ToByteString();
  118. TestAllTypes message2 = TestAllTypes.ParseFrom(rawBytes);
  119. TestUtil.AssertAllFieldsSet(message2);
  120. // In fact, the serialized forms should be exactly the same, byte-for-byte.
  121. Assert.AreEqual(TestUtil.GetAllSet().ToByteString(), rawBytes);
  122. }
  123. [Test]
  124. public void DynamicMessageParsing() {
  125. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  126. TestUtil.SetAllFields(builder);
  127. TestAllTypes message = builder.Build();
  128. ByteString rawBytes = message.ToByteString();
  129. IMessage message2 = DynamicMessage.ParseFrom(TestAllTypes.Descriptor, rawBytes);
  130. reflectionTester.AssertAllFieldsSetViaReflection(message2);
  131. }
  132. [Test]
  133. public void DynamicMessagePackedSerialization() {
  134. IBuilder builder = DynamicMessage.CreateBuilder(TestPackedTypes.Descriptor);
  135. packedReflectionTester.SetPackedFieldsViaReflection(builder);
  136. IMessage message = builder.WeakBuild();
  137. ByteString rawBytes = message.ToByteString();
  138. TestPackedTypes message2 = TestPackedTypes.ParseFrom(rawBytes);
  139. TestUtil.AssertPackedFieldsSet(message2);
  140. // In fact, the serialized forms should be exactly the same, byte-for-byte.
  141. Assert.AreEqual(TestUtil.GetPackedSet().ToByteString(), rawBytes);
  142. }
  143. [Test]
  144. public void testDynamicMessagePackedParsing() {
  145. TestPackedTypes.Builder builder = TestPackedTypes.CreateBuilder();
  146. TestUtil.SetPackedFields(builder);
  147. TestPackedTypes message = builder.Build();
  148. ByteString rawBytes = message.ToByteString();
  149. IMessage message2 = DynamicMessage.ParseFrom(TestPackedTypes.Descriptor, rawBytes);
  150. packedReflectionTester.AssertPackedFieldsSetViaReflection(message2);
  151. }
  152. [Test]
  153. public void DynamicMessageCopy() {
  154. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  155. TestUtil.SetAllFields(builder);
  156. TestAllTypes message = builder.Build();
  157. DynamicMessage copy = DynamicMessage.CreateBuilder(message).Build();
  158. reflectionTester.AssertAllFieldsSetViaReflection(copy);
  159. }
  160. [Test]
  161. public void ToBuilder() {
  162. DynamicMessage.Builder builder =
  163. DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
  164. reflectionTester.SetAllFieldsViaReflection(builder);
  165. int unknownFieldNum = 9;
  166. ulong unknownFieldVal = 90;
  167. builder.SetUnknownFields(UnknownFieldSet.CreateBuilder()
  168. .AddField(unknownFieldNum,
  169. UnknownField.CreateBuilder().AddVarint(unknownFieldVal).Build())
  170. .Build());
  171. DynamicMessage message = builder.Build();
  172. DynamicMessage derived = message.ToBuilder().Build();
  173. reflectionTester.AssertAllFieldsSetViaReflection(derived);
  174. IList<ulong> values = derived.UnknownFields.FieldDictionary[unknownFieldNum].VarintList;
  175. Assert.AreEqual(1, values.Count);
  176. Assert.AreEqual(unknownFieldVal, values[0]);
  177. }
  178. }
  179. }