diff --git a/java/src/main/java/com/google/protobuf/CodedOutputStream.java b/java/src/main/java/com/google/protobuf/CodedOutputStream.java index f3582e2d..ac5f2d30 100644 --- a/java/src/main/java/com/google/protobuf/CodedOutputStream.java +++ b/java/src/main/java/com/google/protobuf/CodedOutputStream.java @@ -751,7 +751,7 @@ public final class CodedOutputStream { * Caller is responsible for converting the enum value to its numeric value. */ public static int computeEnumSizeNoTag(final int value) { - return computeRawVarint32Size(value); + return computeInt32SizeNoTag(value); } /** diff --git a/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java b/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java index 48e54657..74476e36 100644 --- a/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java +++ b/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java @@ -300,4 +300,19 @@ public class CodedOutputStreamTest extends TestCase { assertEqualBytes(TestUtil.getGoldenPackedFieldsMessage().toByteArray(), rawBytes); } + + /** Test writing a message containing a negative enum value. This used to + * fail because the size was not properly computed as a sign-extended varint. */ + public void testWriteMessageWithNegativeEnumValue() throws Exception { + protobuf_unittest.UnittestProto.SparseEnumMessage message = + protobuf_unittest.UnittestProto.SparseEnumMessage.newBuilder() + .setSparseEnum(protobuf_unittest.UnittestProto.TestSparseEnum.SPARSE_E) + .build(); + assertTrue(message.getSparseEnum().getNumber() < 0); + byte[] rawBytes = message.toByteArray(); + protobuf_unittest.UnittestProto.SparseEnumMessage message2 = + protobuf_unittest.UnittestProto.SparseEnumMessage.parseFrom(rawBytes); + assertEquals(protobuf_unittest.UnittestProto.TestSparseEnum.SPARSE_E, + message2.getSparseEnum()); + } }