瀏覽代碼

am d20f0a42: Merge "Fix NPE when clearing an extension in nano protos"

* commit 'd20f0a4260763531acf5de677e4830afe0bfc53e':
  Fix NPE when clearing an extension in nano protos
Jan-Willem Maarse 11 年之前
父節點
當前提交
3e46c9b5da

+ 1 - 1
java/src/main/java/com/google/protobuf/nano/Extension.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) {

+ 14 - 0
java/src/test/java/com/google/protobuf/NanoTest.java

@@ -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();