Fix NPE when clearing an extension in nano protos

If ExtendableMessageNano doesn't have any unknown fields, trying to
clear an extension by setting it to null would throw an NPE.

Change-Id: I6abcdfcc0193de44f97b21dd6cc2f40604938a1a
pull/91/head
Jan-Willem Maarse 11 years ago
parent a2724e7cf3
commit b24fdd476f
  1. 2
      java/src/main/java/com/google/protobuf/nano/Extension.java
  2. 14
      java/src/test/java/com/google/protobuf/NanoTest.java

@ -268,7 +268,7 @@ public class Extension<M extends ExtendableMessageNano<M>, T> {
// After deletion or no-op addition (due to 'value' being an array of empty or
// null-only elements), unknownFields may be empty. Discard the ArrayList if so.
return (unknownFields.size() == 0) ? null : unknownFields;
return (unknownFields == null || unknownFields.isEmpty()) ? null : unknownFields;
}
protected UnknownFieldData writeData(Object value) {

@ -2910,6 +2910,20 @@ public class NanoTest extends TestCase {
assertTrue(Arrays.equals(enums, message.getExtension(RepeatedExtensions.repeatedEnum)));
}
public void testNullExtensions() throws Exception {
// Check that clearing the extension on an empty message is a no-op.
Extensions.ExtendableMessage message = new Extensions.ExtendableMessage();
message.setExtension(SingularExtensions.someMessage, null);
assertEquals(0, MessageNano.toByteArray(message).length);
// Check that the message is empty after setting and clearing an extension.
AnotherMessage another = new AnotherMessage();
message.setExtension(SingularExtensions.someMessage, another);
assertTrue(MessageNano.toByteArray(message).length > 0);
message.setExtension(SingularExtensions.someMessage, null);
assertEquals(0, MessageNano.toByteArray(message).length);
}
public void testUnknownFields() throws Exception {
// Check that we roundtrip (serialize and deserialize) unrecognized fields.
AnotherMessage message = new AnotherMessage();

Loading…
Cancel
Save