aboutsummaryrefslogtreecommitdiff
path: root/java/src/test/java/com
diff options
context:
space:
mode:
authorjasonh+personal@google.com <jasonh+personal@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-12-01 18:05:21 +0000
committerjasonh+personal@google.com <jasonh+personal@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-12-01 18:05:21 +0000
commit9951233e9a5c23ad285b0286e7e896bfd46f8397 (patch)
tree08ea80c9fb0fe98c5011143f5123cab37e9cd364 /java/src/test/java/com
parent6493368285ce77792f6076954d4311a9a457a826 (diff)
downloadprotobuf-9951233e9a5c23ad285b0286e7e896bfd46f8397.tar.gz
protobuf-9951233e9a5c23ad285b0286e7e896bfd46f8397.tar.bz2
protobuf-9951233e9a5c23ad285b0286e7e896bfd46f8397.zip
Fix Issue 136: the memoized serialized size for packed fields may not
be properly set. writeTo() may be invoked without a call to getSerializedSize(), so the generated serialization methods would write a length of 0 for non-empty packed fields. Just call getSerializedSize() at the beginning of writeTo(): although this means that we may compute the byte size needlessly when there are no packed fields, in practice, getSerializedSize() will already have been called - all of the writeTo() wrappers in AbstractMessageLite invoke it. Tested: new unittest case in WireFormatTest.java now passes
Diffstat (limited to 'java/src/test/java/com')
-rw-r--r--java/src/test/java/com/google/protobuf/WireFormatTest.java22
1 files changed, 22 insertions, 0 deletions
diff --git a/java/src/test/java/com/google/protobuf/WireFormatTest.java b/java/src/test/java/com/google/protobuf/WireFormatTest.java
index bd1c6db1..6a5bd5de 100644
--- a/java/src/test/java/com/google/protobuf/WireFormatTest.java
+++ b/java/src/test/java/com/google/protobuf/WireFormatTest.java
@@ -102,6 +102,28 @@ public class WireFormatTest extends TestCase {
assertEquals(rawBytes, rawBytes2);
}
+ public void testSerializationPackedWithoutGetSerializedSize()
+ throws Exception {
+ // Write directly to an OutputStream, without invoking getSerializedSize()
+ // This used to be a bug where the size of a packed field was incorrect,
+ // since getSerializedSize() was never invoked.
+ TestPackedTypes message = TestUtil.getPackedSet();
+
+ // Directly construct a CodedOutputStream around the actual OutputStream,
+ // in case writeTo(OutputStream output) invokes getSerializedSize();
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ CodedOutputStream codedOutput = CodedOutputStream.newInstance(outputStream);
+
+ message.writeTo(codedOutput);
+
+ codedOutput.flush();
+
+ TestPackedTypes message2 = TestPackedTypes.parseFrom(
+ outputStream.toByteArray());
+
+ TestUtil.assertPackedFieldsSet(message2);
+ }
+
public void testSerializeExtensionsLite() throws Exception {
// TestAllTypes and TestAllExtensions should have compatible wire formats,
// so if we serialize a TestAllExtensions then parse it as TestAllTypes