diff options
author | Ulas Kirazci <ulas@google.com> | 2013-10-04 13:00:35 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-10-04 13:00:35 -0700 |
commit | 0255eb04c74f86b9bd482d65331d6d8bb4eb3d18 (patch) | |
tree | 448e713913e3013142d91fa187f7637c52c7af43 | |
parent | 8f93f123e2597ba9c02c2792abe180e63a0d9d5b (diff) | |
parent | 9827c718c45cfa1744a3b0f8fc27dac9cd415603 (diff) | |
download | external_protobuf-0255eb04c74f86b9bd482d65331d6d8bb4eb3d18.zip external_protobuf-0255eb04c74f86b9bd482d65331d6d8bb4eb3d18.tar.gz external_protobuf-0255eb04c74f86b9bd482d65331d6d8bb4eb3d18.tar.bz2 |
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.
3 files changed, 30 insertions, 2 deletions
diff --git a/java/src/main/java/com/google/protobuf/nano/WireFormatNano.java b/java/src/main/java/com/google/protobuf/nano/WireFormatNano.java index c901e59..301ff1d 100644 --- a/java/src/main/java/com/google/protobuf/nano/WireFormatNano.java +++ b/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; } /** diff --git a/java/src/test/java/com/google/protobuf/NanoTest.java b/java/src/test/java/com/google/protobuf/NanoTest.java index 8483619..ca0bcda 100644 --- a/java/src/test/java/com/google/protobuf/NanoTest.java +++ b/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(); diff --git a/src/google/protobuf/unittest_extension_nano.proto b/src/google/protobuf/unittest_extension_nano.proto index f2906f0..104cfa7 100644 --- a/src/google/protobuf/unittest_extension_nano.proto +++ b/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; + } +} |