/thirdparty/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java

http://github.com/tomahawk-player/tomahawk · Java · 427 lines · 275 code · 82 blank · 70 comment · 4 complexity · adb27ff0fdcb46db72176cdc7789efc9 MD5 · raw file

  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc. All rights reserved.
  3. // http://code.google.com/p/protobuf/
  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 junit.framework.TestCase;
  32. import java.io.ByteArrayInputStream;
  33. import java.io.ByteArrayOutputStream;
  34. import protobuf_unittest.UnittestProto;
  35. import protobuf_unittest.UnittestProto.TestAllExtensions;
  36. import protobuf_unittest.UnittestProto.TestAllTypes;
  37. import protobuf_unittest.UnittestProto.TestFieldOrderings;
  38. import protobuf_unittest.UnittestProto.TestPackedExtensions;
  39. import protobuf_unittest.UnittestProto.TestPackedTypes;
  40. import protobuf_unittest.UnittestMset.TestMessageSet;
  41. import protobuf_unittest.UnittestMset.RawMessageSet;
  42. import protobuf_unittest.UnittestMset.TestMessageSetExtension1;
  43. import protobuf_unittest.UnittestMset.TestMessageSetExtension2;
  44. import com.google.protobuf.UnittestLite.TestAllExtensionsLite;
  45. import com.google.protobuf.UnittestLite.TestPackedExtensionsLite;
  46. /**
  47. * Tests related to parsing and serialization.
  48. *
  49. * @author kenton@google.com (Kenton Varda)
  50. */
  51. public class WireFormatTest extends TestCase {
  52. public void testSerialization() throws Exception {
  53. TestAllTypes message = TestUtil.getAllSet();
  54. ByteString rawBytes = message.toByteString();
  55. assertEquals(rawBytes.size(), message.getSerializedSize());
  56. TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
  57. TestUtil.assertAllFieldsSet(message2);
  58. }
  59. public void testSerializationPacked() throws Exception {
  60. TestPackedTypes message = TestUtil.getPackedSet();
  61. ByteString rawBytes = message.toByteString();
  62. assertEquals(rawBytes.size(), message.getSerializedSize());
  63. TestPackedTypes message2 = TestPackedTypes.parseFrom(rawBytes);
  64. TestUtil.assertPackedFieldsSet(message2);
  65. }
  66. public void testSerializeExtensions() throws Exception {
  67. // TestAllTypes and TestAllExtensions should have compatible wire formats,
  68. // so if we serialize a TestAllExtensions then parse it as TestAllTypes
  69. // it should work.
  70. TestAllExtensions message = TestUtil.getAllExtensionsSet();
  71. ByteString rawBytes = message.toByteString();
  72. assertEquals(rawBytes.size(), message.getSerializedSize());
  73. TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
  74. TestUtil.assertAllFieldsSet(message2);
  75. }
  76. public void testSerializePackedExtensions() throws Exception {
  77. // TestPackedTypes and TestPackedExtensions should have compatible wire
  78. // formats; check that they serialize to the same string.
  79. TestPackedExtensions message = TestUtil.getPackedExtensionsSet();
  80. ByteString rawBytes = message.toByteString();
  81. TestPackedTypes message2 = TestUtil.getPackedSet();
  82. ByteString rawBytes2 = message2.toByteString();
  83. assertEquals(rawBytes, rawBytes2);
  84. }
  85. public void testSerializationPackedWithoutGetSerializedSize()
  86. throws Exception {
  87. // Write directly to an OutputStream, without invoking getSerializedSize()
  88. // This used to be a bug where the size of a packed field was incorrect,
  89. // since getSerializedSize() was never invoked.
  90. TestPackedTypes message = TestUtil.getPackedSet();
  91. // Directly construct a CodedOutputStream around the actual OutputStream,
  92. // in case writeTo(OutputStream output) invokes getSerializedSize();
  93. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  94. CodedOutputStream codedOutput = CodedOutputStream.newInstance(outputStream);
  95. message.writeTo(codedOutput);
  96. codedOutput.flush();
  97. TestPackedTypes message2 = TestPackedTypes.parseFrom(
  98. outputStream.toByteArray());
  99. TestUtil.assertPackedFieldsSet(message2);
  100. }
  101. public void testSerializeExtensionsLite() throws Exception {
  102. // TestAllTypes and TestAllExtensions should have compatible wire formats,
  103. // so if we serialize a TestAllExtensions then parse it as TestAllTypes
  104. // it should work.
  105. TestAllExtensionsLite message = TestUtil.getAllLiteExtensionsSet();
  106. ByteString rawBytes = message.toByteString();
  107. assertEquals(rawBytes.size(), message.getSerializedSize());
  108. TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
  109. TestUtil.assertAllFieldsSet(message2);
  110. }
  111. public void testSerializePackedExtensionsLite() throws Exception {
  112. // TestPackedTypes and TestPackedExtensions should have compatible wire
  113. // formats; check that they serialize to the same string.
  114. TestPackedExtensionsLite message = TestUtil.getLitePackedExtensionsSet();
  115. ByteString rawBytes = message.toByteString();
  116. TestPackedTypes message2 = TestUtil.getPackedSet();
  117. ByteString rawBytes2 = message2.toByteString();
  118. assertEquals(rawBytes, rawBytes2);
  119. }
  120. public void testParseExtensions() throws Exception {
  121. // TestAllTypes and TestAllExtensions should have compatible wire formats,
  122. // so if we serialize a TestAllTypes then parse it as TestAllExtensions
  123. // it should work.
  124. TestAllTypes message = TestUtil.getAllSet();
  125. ByteString rawBytes = message.toByteString();
  126. ExtensionRegistry registry = TestUtil.getExtensionRegistry();
  127. TestAllExtensions message2 =
  128. TestAllExtensions.parseFrom(rawBytes, registry);
  129. TestUtil.assertAllExtensionsSet(message2);
  130. }
  131. public void testParsePackedExtensions() throws Exception {
  132. // Ensure that packed extensions can be properly parsed.
  133. TestPackedExtensions message = TestUtil.getPackedExtensionsSet();
  134. ByteString rawBytes = message.toByteString();
  135. ExtensionRegistry registry = TestUtil.getExtensionRegistry();
  136. TestPackedExtensions message2 =
  137. TestPackedExtensions.parseFrom(rawBytes, registry);
  138. TestUtil.assertPackedExtensionsSet(message2);
  139. }
  140. public void testParseExtensionsLite() throws Exception {
  141. // TestAllTypes and TestAllExtensions should have compatible wire formats,
  142. // so if we serialize a TestAllTypes then parse it as TestAllExtensions
  143. // it should work.
  144. TestAllTypes message = TestUtil.getAllSet();
  145. ByteString rawBytes = message.toByteString();
  146. ExtensionRegistryLite registry_lite = TestUtil.getExtensionRegistryLite();
  147. TestAllExtensionsLite message2 =
  148. TestAllExtensionsLite.parseFrom(rawBytes, registry_lite);
  149. TestUtil.assertAllExtensionsSet(message2);
  150. // Try again using a full extension registry.
  151. ExtensionRegistry registry = TestUtil.getExtensionRegistry();
  152. TestAllExtensionsLite message3 =
  153. TestAllExtensionsLite.parseFrom(rawBytes, registry);
  154. TestUtil.assertAllExtensionsSet(message3);
  155. }
  156. public void testParsePackedExtensionsLite() throws Exception {
  157. // Ensure that packed extensions can be properly parsed.
  158. TestPackedExtensionsLite message = TestUtil.getLitePackedExtensionsSet();
  159. ByteString rawBytes = message.toByteString();
  160. ExtensionRegistryLite registry = TestUtil.getExtensionRegistryLite();
  161. TestPackedExtensionsLite message2 =
  162. TestPackedExtensionsLite.parseFrom(rawBytes, registry);
  163. TestUtil.assertPackedExtensionsSet(message2);
  164. }
  165. public void testExtensionsSerializedSize() throws Exception {
  166. assertEquals(TestUtil.getAllSet().getSerializedSize(),
  167. TestUtil.getAllExtensionsSet().getSerializedSize());
  168. }
  169. public void testSerializeDelimited() throws Exception {
  170. ByteArrayOutputStream output = new ByteArrayOutputStream();
  171. TestUtil.getAllSet().writeDelimitedTo(output);
  172. output.write(12);
  173. TestUtil.getPackedSet().writeDelimitedTo(output);
  174. output.write(34);
  175. ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
  176. TestUtil.assertAllFieldsSet(TestAllTypes.parseDelimitedFrom(input));
  177. assertEquals(12, input.read());
  178. TestUtil.assertPackedFieldsSet(TestPackedTypes.parseDelimitedFrom(input));
  179. assertEquals(34, input.read());
  180. assertEquals(-1, input.read());
  181. // We're at EOF, so parsing again should return null.
  182. assertTrue(TestAllTypes.parseDelimitedFrom(input) == null);
  183. }
  184. private void assertFieldsInOrder(ByteString data) throws Exception {
  185. CodedInputStream input = data.newCodedInput();
  186. int previousTag = 0;
  187. while (true) {
  188. int tag = input.readTag();
  189. if (tag == 0) {
  190. break;
  191. }
  192. assertTrue(tag > previousTag);
  193. previousTag = tag;
  194. input.skipField(tag);
  195. }
  196. }
  197. public void testInterleavedFieldsAndExtensions() throws Exception {
  198. // Tests that fields are written in order even when extension ranges
  199. // are interleaved with field numbers.
  200. ByteString data =
  201. TestFieldOrderings.newBuilder()
  202. .setMyInt(1)
  203. .setMyString("foo")
  204. .setMyFloat(1.0F)
  205. .setExtension(UnittestProto.myExtensionInt, 23)
  206. .setExtension(UnittestProto.myExtensionString, "bar")
  207. .build().toByteString();
  208. assertFieldsInOrder(data);
  209. Descriptors.Descriptor descriptor = TestFieldOrderings.getDescriptor();
  210. ByteString dynamic_data =
  211. DynamicMessage.newBuilder(TestFieldOrderings.getDescriptor())
  212. .setField(descriptor.findFieldByName("my_int"), 1L)
  213. .setField(descriptor.findFieldByName("my_string"), "foo")
  214. .setField(descriptor.findFieldByName("my_float"), 1.0F)
  215. .setField(UnittestProto.myExtensionInt.getDescriptor(), 23)
  216. .setField(UnittestProto.myExtensionString.getDescriptor(), "bar")
  217. .build().toByteString();
  218. assertFieldsInOrder(dynamic_data);
  219. }
  220. private ExtensionRegistry getTestFieldOrderingsRegistry() {
  221. ExtensionRegistry result = ExtensionRegistry.newInstance();
  222. result.add(UnittestProto.myExtensionInt);
  223. result.add(UnittestProto.myExtensionString);
  224. return result;
  225. }
  226. public void testParseMultipleExtensionRanges() throws Exception {
  227. // Make sure we can parse a message that contains multiple extensions
  228. // ranges.
  229. TestFieldOrderings source =
  230. TestFieldOrderings.newBuilder()
  231. .setMyInt(1)
  232. .setMyString("foo")
  233. .setMyFloat(1.0F)
  234. .setExtension(UnittestProto.myExtensionInt, 23)
  235. .setExtension(UnittestProto.myExtensionString, "bar")
  236. .build();
  237. TestFieldOrderings dest =
  238. TestFieldOrderings.parseFrom(source.toByteString(),
  239. getTestFieldOrderingsRegistry());
  240. assertEquals(source, dest);
  241. }
  242. public void testParseMultipleExtensionRangesDynamic() throws Exception {
  243. // Same as above except with DynamicMessage.
  244. Descriptors.Descriptor descriptor = TestFieldOrderings.getDescriptor();
  245. DynamicMessage source =
  246. DynamicMessage.newBuilder(TestFieldOrderings.getDescriptor())
  247. .setField(descriptor.findFieldByName("my_int"), 1L)
  248. .setField(descriptor.findFieldByName("my_string"), "foo")
  249. .setField(descriptor.findFieldByName("my_float"), 1.0F)
  250. .setField(UnittestProto.myExtensionInt.getDescriptor(), 23)
  251. .setField(UnittestProto.myExtensionString.getDescriptor(), "bar")
  252. .build();
  253. DynamicMessage dest =
  254. DynamicMessage.parseFrom(descriptor, source.toByteString(),
  255. getTestFieldOrderingsRegistry());
  256. assertEquals(source, dest);
  257. }
  258. private static final int UNKNOWN_TYPE_ID = 1550055;
  259. private static final int TYPE_ID_1 =
  260. TestMessageSetExtension1.getDescriptor().getExtensions().get(0).getNumber();
  261. private static final int TYPE_ID_2 =
  262. TestMessageSetExtension2.getDescriptor().getExtensions().get(0).getNumber();
  263. public void testSerializeMessageSet() throws Exception {
  264. // Set up a TestMessageSet with two known messages and an unknown one.
  265. TestMessageSet messageSet =
  266. TestMessageSet.newBuilder()
  267. .setExtension(
  268. TestMessageSetExtension1.messageSetExtension,
  269. TestMessageSetExtension1.newBuilder().setI(123).build())
  270. .setExtension(
  271. TestMessageSetExtension2.messageSetExtension,
  272. TestMessageSetExtension2.newBuilder().setStr("foo").build())
  273. .setUnknownFields(
  274. UnknownFieldSet.newBuilder()
  275. .addField(UNKNOWN_TYPE_ID,
  276. UnknownFieldSet.Field.newBuilder()
  277. .addLengthDelimited(ByteString.copyFromUtf8("bar"))
  278. .build())
  279. .build())
  280. .build();
  281. ByteString data = messageSet.toByteString();
  282. // Parse back using RawMessageSet and check the contents.
  283. RawMessageSet raw = RawMessageSet.parseFrom(data);
  284. assertTrue(raw.getUnknownFields().asMap().isEmpty());
  285. assertEquals(3, raw.getItemCount());
  286. assertEquals(TYPE_ID_1, raw.getItem(0).getTypeId());
  287. assertEquals(TYPE_ID_2, raw.getItem(1).getTypeId());
  288. assertEquals(UNKNOWN_TYPE_ID, raw.getItem(2).getTypeId());
  289. TestMessageSetExtension1 message1 =
  290. TestMessageSetExtension1.parseFrom(
  291. raw.getItem(0).getMessage().toByteArray());
  292. assertEquals(123, message1.getI());
  293. TestMessageSetExtension2 message2 =
  294. TestMessageSetExtension2.parseFrom(
  295. raw.getItem(1).getMessage().toByteArray());
  296. assertEquals("foo", message2.getStr());
  297. assertEquals("bar", raw.getItem(2).getMessage().toStringUtf8());
  298. }
  299. public void testParseMessageSet() throws Exception {
  300. ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();
  301. extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);
  302. extensionRegistry.add(TestMessageSetExtension2.messageSetExtension);
  303. // Set up a RawMessageSet with two known messages and an unknown one.
  304. RawMessageSet raw =
  305. RawMessageSet.newBuilder()
  306. .addItem(
  307. RawMessageSet.Item.newBuilder()
  308. .setTypeId(TYPE_ID_1)
  309. .setMessage(
  310. TestMessageSetExtension1.newBuilder()
  311. .setI(123)
  312. .build().toByteString())
  313. .build())
  314. .addItem(
  315. RawMessageSet.Item.newBuilder()
  316. .setTypeId(TYPE_ID_2)
  317. .setMessage(
  318. TestMessageSetExtension2.newBuilder()
  319. .setStr("foo")
  320. .build().toByteString())
  321. .build())
  322. .addItem(
  323. RawMessageSet.Item.newBuilder()
  324. .setTypeId(UNKNOWN_TYPE_ID)
  325. .setMessage(ByteString.copyFromUtf8("bar"))
  326. .build())
  327. .build();
  328. ByteString data = raw.toByteString();
  329. // Parse as a TestMessageSet and check the contents.
  330. TestMessageSet messageSet =
  331. TestMessageSet.parseFrom(data, extensionRegistry);
  332. assertEquals(123, messageSet.getExtension(
  333. TestMessageSetExtension1.messageSetExtension).getI());
  334. assertEquals("foo", messageSet.getExtension(
  335. TestMessageSetExtension2.messageSetExtension).getStr());
  336. // Check for unknown field with type LENGTH_DELIMITED,
  337. // number UNKNOWN_TYPE_ID, and contents "bar".
  338. UnknownFieldSet unknownFields = messageSet.getUnknownFields();
  339. assertEquals(1, unknownFields.asMap().size());
  340. assertTrue(unknownFields.hasField(UNKNOWN_TYPE_ID));
  341. UnknownFieldSet.Field field = unknownFields.getField(UNKNOWN_TYPE_ID);
  342. assertEquals(1, field.getLengthDelimitedList().size());
  343. assertEquals("bar", field.getLengthDelimitedList().get(0).toStringUtf8());
  344. }
  345. }