PageRenderTime 42ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/java/core/src/test/java/com/google/protobuf/DynamicMessageTest.java

https://gitlab.com/admin-github-cloud/protobuf
Java | 326 lines | 225 code | 47 blank | 54 comment | 0 complexity | 161458bd8dc9fdbe9a9afd6b4125651a MD5 | raw file
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc. All rights reserved.
  3. // https://developers.google.com/protocol-buffers/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. package com.google.protobuf;
  31. import com.google.protobuf.Descriptors.EnumDescriptor;
  32. import com.google.protobuf.Descriptors.FieldDescriptor;
  33. import com.google.protobuf.Descriptors.OneofDescriptor;
  34. import protobuf_unittest.UnittestProto.TestAllExtensions;
  35. import protobuf_unittest.UnittestProto.TestAllTypes;
  36. import protobuf_unittest.UnittestProto.TestEmptyMessage;
  37. import protobuf_unittest.UnittestProto.TestPackedTypes;
  38. import junit.framework.TestCase;
  39. import java.util.Arrays;
  40. /**
  41. * Unit test for {@link DynamicMessage}. See also {@link MessageTest}, which
  42. * tests some {@link DynamicMessage} functionality.
  43. *
  44. * @author kenton@google.com Kenton Varda
  45. */
  46. public class DynamicMessageTest extends TestCase {
  47. TestUtil.ReflectionTester reflectionTester =
  48. new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null);
  49. TestUtil.ReflectionTester extensionsReflectionTester =
  50. new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(),
  51. TestUtil.getExtensionRegistry());
  52. TestUtil.ReflectionTester packedReflectionTester =
  53. new TestUtil.ReflectionTester(TestPackedTypes.getDescriptor(), null);
  54. public void testDynamicMessageAccessors() throws Exception {
  55. Message.Builder builder =
  56. DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
  57. reflectionTester.setAllFieldsViaReflection(builder);
  58. Message message = builder.build();
  59. reflectionTester.assertAllFieldsSetViaReflection(message);
  60. }
  61. public void testSettersAfterBuild() throws Exception {
  62. Message.Builder builder =
  63. DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
  64. Message firstMessage = builder.build();
  65. // double build()
  66. builder.build();
  67. // clear() after build()
  68. builder.clear();
  69. // setters after build()
  70. reflectionTester.setAllFieldsViaReflection(builder);
  71. Message message = builder.build();
  72. reflectionTester.assertAllFieldsSetViaReflection(message);
  73. // repeated setters after build()
  74. reflectionTester.modifyRepeatedFieldsViaReflection(builder);
  75. message = builder.build();
  76. reflectionTester.assertRepeatedFieldsModifiedViaReflection(message);
  77. // firstMessage shouldn't have been modified.
  78. reflectionTester.assertClearViaReflection(firstMessage);
  79. }
  80. public void testUnknownFields() throws Exception {
  81. Message.Builder builder =
  82. DynamicMessage.newBuilder(TestEmptyMessage.getDescriptor());
  83. builder.setUnknownFields(UnknownFieldSet.newBuilder()
  84. .addField(1, UnknownFieldSet.Field.newBuilder().addVarint(1).build())
  85. .addField(2, UnknownFieldSet.Field.newBuilder().addFixed32(1).build())
  86. .build());
  87. Message message = builder.build();
  88. assertEquals(2, message.getUnknownFields().asMap().size());
  89. // clone() with unknown fields
  90. Message.Builder newBuilder = builder.clone();
  91. assertEquals(2, newBuilder.getUnknownFields().asMap().size());
  92. // clear() with unknown fields
  93. newBuilder.clear();
  94. assertTrue(newBuilder.getUnknownFields().asMap().isEmpty());
  95. // serialize/parse with unknown fields
  96. newBuilder.mergeFrom(message.toByteString());
  97. assertEquals(2, newBuilder.getUnknownFields().asMap().size());
  98. }
  99. public void testDynamicMessageSettersRejectNull() throws Exception {
  100. Message.Builder builder =
  101. DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
  102. reflectionTester.assertReflectionSettersRejectNull(builder);
  103. }
  104. public void testDynamicMessageExtensionAccessors() throws Exception {
  105. // We don't need to extensively test DynamicMessage's handling of
  106. // extensions because, frankly, it doesn't do anything special with them.
  107. // It treats them just like any other fields.
  108. Message.Builder builder =
  109. DynamicMessage.newBuilder(TestAllExtensions.getDescriptor());
  110. extensionsReflectionTester.setAllFieldsViaReflection(builder);
  111. Message message = builder.build();
  112. extensionsReflectionTester.assertAllFieldsSetViaReflection(message);
  113. }
  114. public void testDynamicMessageExtensionSettersRejectNull() throws Exception {
  115. Message.Builder builder =
  116. DynamicMessage.newBuilder(TestAllExtensions.getDescriptor());
  117. extensionsReflectionTester.assertReflectionSettersRejectNull(builder);
  118. }
  119. public void testDynamicMessageRepeatedSetters() throws Exception {
  120. Message.Builder builder =
  121. DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
  122. reflectionTester.setAllFieldsViaReflection(builder);
  123. reflectionTester.modifyRepeatedFieldsViaReflection(builder);
  124. Message message = builder.build();
  125. reflectionTester.assertRepeatedFieldsModifiedViaReflection(message);
  126. }
  127. public void testDynamicMessageRepeatedSettersRejectNull() throws Exception {
  128. Message.Builder builder =
  129. DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
  130. reflectionTester.assertReflectionRepeatedSettersRejectNull(builder);
  131. }
  132. public void testDynamicMessageDefaults() throws Exception {
  133. reflectionTester.assertClearViaReflection(
  134. DynamicMessage.getDefaultInstance(TestAllTypes.getDescriptor()));
  135. reflectionTester.assertClearViaReflection(
  136. DynamicMessage.newBuilder(TestAllTypes.getDescriptor()).build());
  137. }
  138. public void testDynamicMessageSerializedSize() throws Exception {
  139. TestAllTypes message = TestUtil.getAllSet();
  140. Message.Builder dynamicBuilder =
  141. DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
  142. reflectionTester.setAllFieldsViaReflection(dynamicBuilder);
  143. Message dynamicMessage = dynamicBuilder.build();
  144. assertEquals(message.getSerializedSize(),
  145. dynamicMessage.getSerializedSize());
  146. }
  147. public void testDynamicMessageSerialization() throws Exception {
  148. Message.Builder builder =
  149. DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
  150. reflectionTester.setAllFieldsViaReflection(builder);
  151. Message message = builder.build();
  152. ByteString rawBytes = message.toByteString();
  153. TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
  154. TestUtil.assertAllFieldsSet(message2);
  155. // In fact, the serialized forms should be exactly the same, byte-for-byte.
  156. assertEquals(TestUtil.getAllSet().toByteString(), rawBytes);
  157. }
  158. public void testDynamicMessageParsing() throws Exception {
  159. TestAllTypes.Builder builder = TestAllTypes.newBuilder();
  160. TestUtil.setAllFields(builder);
  161. TestAllTypes message = builder.build();
  162. ByteString rawBytes = message.toByteString();
  163. Message message2 =
  164. DynamicMessage.parseFrom(TestAllTypes.getDescriptor(), rawBytes);
  165. reflectionTester.assertAllFieldsSetViaReflection(message2);
  166. // Test Parser interface.
  167. Message message3 = message2.getParserForType().parseFrom(rawBytes);
  168. reflectionTester.assertAllFieldsSetViaReflection(message3);
  169. }
  170. public void testDynamicMessageExtensionParsing() throws Exception {
  171. ByteString rawBytes = TestUtil.getAllExtensionsSet().toByteString();
  172. Message message = DynamicMessage.parseFrom(
  173. TestAllExtensions.getDescriptor(), rawBytes,
  174. TestUtil.getExtensionRegistry());
  175. extensionsReflectionTester.assertAllFieldsSetViaReflection(message);
  176. // Test Parser interface.
  177. Message message2 = message.getParserForType().parseFrom(
  178. rawBytes, TestUtil.getExtensionRegistry());
  179. extensionsReflectionTester.assertAllFieldsSetViaReflection(message2);
  180. }
  181. public void testDynamicMessagePackedSerialization() throws Exception {
  182. Message.Builder builder =
  183. DynamicMessage.newBuilder(TestPackedTypes.getDescriptor());
  184. packedReflectionTester.setPackedFieldsViaReflection(builder);
  185. Message message = builder.build();
  186. ByteString rawBytes = message.toByteString();
  187. TestPackedTypes message2 = TestPackedTypes.parseFrom(rawBytes);
  188. TestUtil.assertPackedFieldsSet(message2);
  189. // In fact, the serialized forms should be exactly the same, byte-for-byte.
  190. assertEquals(TestUtil.getPackedSet().toByteString(), rawBytes);
  191. }
  192. public void testDynamicMessagePackedParsing() throws Exception {
  193. TestPackedTypes.Builder builder = TestPackedTypes.newBuilder();
  194. TestUtil.setPackedFields(builder);
  195. TestPackedTypes message = builder.build();
  196. ByteString rawBytes = message.toByteString();
  197. Message message2 =
  198. DynamicMessage.parseFrom(TestPackedTypes.getDescriptor(), rawBytes);
  199. packedReflectionTester.assertPackedFieldsSetViaReflection(message2);
  200. // Test Parser interface.
  201. Message message3 = message2.getParserForType().parseFrom(rawBytes);
  202. packedReflectionTester.assertPackedFieldsSetViaReflection(message3);
  203. }
  204. public void testDynamicMessageCopy() throws Exception {
  205. TestAllTypes.Builder builder = TestAllTypes.newBuilder();
  206. TestUtil.setAllFields(builder);
  207. TestAllTypes message = builder.build();
  208. DynamicMessage copy = DynamicMessage.newBuilder(message).build();
  209. reflectionTester.assertAllFieldsSetViaReflection(copy);
  210. // Test oneof behavior
  211. FieldDescriptor bytesField =
  212. TestAllTypes.getDescriptor().findFieldByName("oneof_bytes");
  213. FieldDescriptor uint32Field =
  214. TestAllTypes.getDescriptor().findFieldByName("oneof_uint32");
  215. assertTrue(copy.hasField(bytesField));
  216. assertFalse(copy.hasField(uint32Field));
  217. DynamicMessage copy2 =
  218. DynamicMessage.newBuilder(message).setField(uint32Field, 123).build();
  219. assertFalse(copy2.hasField(bytesField));
  220. assertTrue(copy2.hasField(uint32Field));
  221. assertEquals(123, copy2.getField(uint32Field));
  222. }
  223. public void testToBuilder() throws Exception {
  224. DynamicMessage.Builder builder =
  225. DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
  226. reflectionTester.setAllFieldsViaReflection(builder);
  227. int unknownFieldNum = 9;
  228. long unknownFieldVal = 90;
  229. builder.setUnknownFields(UnknownFieldSet.newBuilder()
  230. .addField(unknownFieldNum,
  231. UnknownFieldSet.Field.newBuilder()
  232. .addVarint(unknownFieldVal).build())
  233. .build());
  234. DynamicMessage message = builder.build();
  235. DynamicMessage derived = message.toBuilder().build();
  236. reflectionTester.assertAllFieldsSetViaReflection(derived);
  237. assertEquals(Arrays.asList(unknownFieldVal),
  238. derived.getUnknownFields().getField(unknownFieldNum).getVarintList());
  239. }
  240. public void testDynamicOneofMessage() throws Exception {
  241. DynamicMessage.Builder builder =
  242. DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
  243. OneofDescriptor oneof = TestAllTypes.getDescriptor().getOneofs().get(0);
  244. assertFalse(builder.hasOneof(oneof));
  245. assertSame(null, builder.getOneofFieldDescriptor(oneof));
  246. reflectionTester.setAllFieldsViaReflection(builder);
  247. assertTrue(builder.hasOneof(oneof));
  248. FieldDescriptor field = oneof.getField(3);
  249. assertSame(field, builder.getOneofFieldDescriptor(oneof));
  250. DynamicMessage message = builder.buildPartial();
  251. assertTrue(message.hasOneof(oneof));
  252. DynamicMessage.Builder mergedBuilder =
  253. DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
  254. FieldDescriptor mergedField = oneof.getField(0);
  255. mergedBuilder.setField(mergedField, 123);
  256. assertTrue(mergedBuilder.hasField(mergedField));
  257. mergedBuilder.mergeFrom(message);
  258. assertTrue(mergedBuilder.hasField(field));
  259. assertFalse(mergedBuilder.hasField(mergedField));
  260. builder.clearOneof(oneof);
  261. assertSame(null, builder.getOneofFieldDescriptor(oneof));
  262. message = builder.build();
  263. assertSame(null, message.getOneofFieldDescriptor(oneof));
  264. }
  265. // Regression test for a bug that makes setField() not work for repeated
  266. // enum fields.
  267. public void testSettersForRepeatedEnumField() throws Exception {
  268. DynamicMessage.Builder builder =
  269. DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
  270. FieldDescriptor repeatedEnumField =
  271. TestAllTypes.getDescriptor().findFieldByName(
  272. "repeated_nested_enum");
  273. EnumDescriptor enumDescriptor = TestAllTypes.NestedEnum.getDescriptor();
  274. builder.setField(repeatedEnumField, enumDescriptor.getValues());
  275. DynamicMessage message = builder.build();
  276. assertEquals(
  277. enumDescriptor.getValues(), message.getField(repeatedEnumField));
  278. }
  279. }