1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file or at 6 // https://developers.google.com/open-source/licenses/bsd 7 8 package com.google.protobuf; 9 10 import static com.google.common.truth.Truth.assertWithMessage; 11 12 import protobuf_unittest.UnittestProto; 13 import proto3_unittest.UnittestProto3; 14 import org.junit.Test; 15 import org.junit.runner.RunWith; 16 import org.junit.runners.JUnit4; 17 18 /** Unit tests for discard or preserve unknown fields. */ 19 @RunWith(JUnit4.class) 20 public class DiscardUnknownFieldsTest { 21 @Test testProto2()22 public void testProto2() throws Exception { 23 testProto2Message(UnittestProto.TestEmptyMessage.getDefaultInstance()); 24 testProto2Message(UnittestProto.TestEmptyMessageWithExtensions.getDefaultInstance()); 25 testProto2Message( 26 DynamicMessage.getDefaultInstance(UnittestProto.TestEmptyMessage.getDescriptor())); 27 testProto2Message( 28 DynamicMessage.getDefaultInstance( 29 UnittestProto.TestEmptyMessageWithExtensions.getDescriptor())); 30 } 31 32 @Test testProto3()33 public void testProto3() throws Exception { 34 testProto3Message(UnittestProto3.TestEmptyMessage.getDefaultInstance()); 35 testProto3Message( 36 DynamicMessage.getDefaultInstance(UnittestProto3.TestEmptyMessage.getDescriptor())); 37 } 38 testProto2Message(Message message)39 private static void testProto2Message(Message message) throws Exception { 40 assertUnknownFieldsPreserved(message); 41 assertUnknownFieldsExplicitlyDiscarded(message); 42 assertReuseCodedInputStreamPreserve(message); 43 assertUnknownFieldsInUnknownFieldSetArePreserve(message); 44 } 45 testProto3Message(Message message)46 private static void testProto3Message(Message message) throws Exception { 47 assertUnknownFieldsPreserved(message); 48 assertUnknownFieldsExplicitlyDiscarded(message); 49 assertReuseCodedInputStreamPreserve(message); 50 assertUnknownFieldsInUnknownFieldSetArePreserve(message); 51 } 52 assertReuseCodedInputStreamPreserve(Message message)53 private static void assertReuseCodedInputStreamPreserve(Message message) throws Exception { 54 final int messageSize = payload.size(); 55 byte[] copied = new byte[messageSize * 2]; 56 payload.copyTo(copied, 0); 57 payload.copyTo(copied, messageSize); 58 CodedInputStream input = CodedInputStream.newInstance(copied); 59 60 // Use DiscardUnknownFieldsParser to parse the first payload. 61 int oldLimit = input.pushLimit(messageSize); 62 Message parsed = DiscardUnknownFieldsParser.wrap(message.getParserForType()).parseFrom(input); 63 assertWithMessage(message.getClass().getName()).that(parsed.getSerializedSize()).isEqualTo(0); 64 input.popLimit(oldLimit); 65 66 // Use the normal parser to parse the remaining payload should have unknown fields preserved. 67 parsed = message.getParserForType().parseFrom(input); 68 assertWithMessage(message.getClass().getName()).that(parsed.toByteString()).isEqualTo(payload); 69 } 70 71 /** 72 * {@link Message.Builder#setUnknownFields(UnknownFieldSet)} and {@link 73 * Message.Builder#mergeUnknownFields(UnknownFieldSet)} should preserve the unknown fields. 74 */ assertUnknownFieldsInUnknownFieldSetArePreserve(Message message)75 private static void assertUnknownFieldsInUnknownFieldSetArePreserve(Message message) 76 throws Exception { 77 UnknownFieldSet unknownFields = UnknownFieldSet.newBuilder().mergeFrom(payload).build(); 78 Message built = message.newBuilderForType().setUnknownFields(unknownFields).build(); 79 assertWithMessage(message.getClass().getName()).that(built.toByteString()).isEqualTo(payload); 80 } 81 assertUnknownFieldsPreserved(MessageLite message)82 private static void assertUnknownFieldsPreserved(MessageLite message) throws Exception { 83 MessageLite parsed = message.getParserForType().parseFrom(payload); 84 assertWithMessage(message.getClass().getName()).that(parsed.toByteString()).isEqualTo(payload); 85 86 parsed = message.newBuilderForType().mergeFrom(payload).build(); 87 assertWithMessage(message.getClass().getName()).that(parsed.toByteString()).isEqualTo(payload); 88 } 89 assertUnknownFieldsExplicitlyDiscarded(Message message)90 private static void assertUnknownFieldsExplicitlyDiscarded(Message message) throws Exception { 91 Message parsed = DiscardUnknownFieldsParser.wrap(message.getParserForType()).parseFrom(payload); 92 assertWithMessage(message.getClass().getName()).that(parsed.getSerializedSize()).isEqualTo(0); 93 } 94 95 private static final ByteString payload = 96 TestUtilLite.getAllLiteSetBuilder().build().toByteString(); 97 } 98