Browse Source

am 9827c718: Merge "Fix roundtrip failure with groups when unknown fields are enabled."

* commit '9827c718c45cfa1744a3b0f8fc27dac9cd415603':
  Fix roundtrip failure with groups when unknown fields are enabled.
Ulas Kirazci 12 years ago
parent
commit
ba1b8baf00

+ 7 - 2
java/src/main/java/com/google/protobuf/nano/WireFormatNano.java

@@ -119,6 +119,9 @@ public final class WireFormatNano {
    * <p>Generated messages will call this for unknown fields if the store_unknown_fields
    * option is on.
    *
+   * <p>Note that the tag might be a end-group tag (rather than the start of an unknown field) in
+   * which case we do not want to add an unknown field entry.
+   *
    * @param data a Collection in which to store the data.
    * @param input the input buffer.
    * @param tag the tag of the field.
@@ -130,11 +133,13 @@ public final class WireFormatNano {
       final CodedInputByteBufferNano input,
       final int tag) throws IOException {
     int startPos = input.getPosition();
-    boolean skip = input.skipField(tag);
+    if (!input.skipField(tag)) {
+      return false;  // This wasn't an unknown field, it's an end-group tag.
+    }
     int endPos = input.getPosition();
     byte[] bytes = input.getData(startPos, endPos - startPos);
     data.add(new UnknownFieldData(tag, bytes));
-    return skip;
+    return true;
   }
 
   /**

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

@@ -35,6 +35,7 @@ import com.google.protobuf.nano.EnumClassNanoMultiple;
 import com.google.protobuf.nano.EnumClassNanos;
 import com.google.protobuf.nano.Extensions;
 import com.google.protobuf.nano.Extensions.AnotherMessage;
+import com.google.protobuf.nano.Extensions.MessageWithGroup;
 import com.google.protobuf.nano.FileScopeEnumMultiple;
 import com.google.protobuf.nano.FileScopeEnumRefNano;
 import com.google.protobuf.nano.InternalNano;
@@ -505,6 +506,22 @@ public class NanoTest extends TestCase {
     assertEquals(1, newMsg.optionalGroup.a);
   }
 
+  public void testNanoOptionalGroupWithUnknownFieldsEnabled() throws Exception {
+    MessageWithGroup msg = new MessageWithGroup();
+    MessageWithGroup.Group grp = new MessageWithGroup.Group();
+    grp.a = 1;
+    msg.group = grp;
+    byte [] serialized = MessageNano.toByteArray(msg);
+
+    MessageWithGroup parsed = MessageWithGroup.parseFrom(serialized);
+    assertTrue(msg.group != null);
+    assertEquals(1, msg.group.a);
+
+    byte [] serialized2 = MessageNano.toByteArray(parsed);
+    assertEquals(serialized2.length, serialized.length);
+    MessageWithGroup parsed2 = MessageWithGroup.parseFrom(serialized2);
+  }
+
   public void testNanoOptionalNestedMessage() throws Exception {
     TestAllTypesNano msg = new TestAllTypesNano();
     TestAllTypesNano.NestedMessage nestedMsg = new TestAllTypesNano.NestedMessage();

+ 6 - 0
src/google/protobuf/unittest_extension_nano.proto

@@ -42,3 +42,9 @@ message ContainerMessage {
     optional bool another_thing = 100;
   }
 }
+
+message MessageWithGroup {
+  optional group Group = 1 {
+    optional int32 a = 2;
+  }
+}