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.assertThat; 11 12 import com.google.protobuf.Descriptors.FieldDescriptor; 13 import protobuf_unittest.UnittestProto; 14 import protobuf_unittest.UnittestProto.TestAllExtensions; 15 import protobuf_unittest.UnittestProto.TestAllTypes; 16 import org.junit.Test; 17 import org.junit.runner.RunWith; 18 import org.junit.runners.JUnit4; 19 20 /** Unit tests for proto2 that treats unknown enum values as unknown fields. */ 21 @RunWith(JUnit4.class) 22 public class Proto2UnknownEnumValueTest { 23 FieldDescriptor singularField = 24 TestAllTypes.getDescriptor().findFieldByName("optional_nested_enum"); 25 FieldDescriptor repeatedField = 26 TestAllTypes.getDescriptor().findFieldByName("repeated_nested_enum"); 27 byte[] payload = buildPayloadWithUnknownEnumValues(); 28 buildPayloadWithUnknownEnumValues()29 private byte[] buildPayloadWithUnknownEnumValues() { 30 // Builds a payload with unknown enum values. 31 UnknownFieldSet.Builder builder = UnknownFieldSet.newBuilder(); 32 builder.addField( 33 singularField.getNumber(), 34 UnknownFieldSet.Field.newBuilder() 35 .addVarint(TestAllTypes.NestedEnum.BAR.getNumber()) 36 .addVarint(1901 /* unknown enum value */) 37 .build()); 38 builder.addField( 39 repeatedField.getNumber(), 40 UnknownFieldSet.Field.newBuilder() 41 .addVarint(TestAllTypes.NestedEnum.FOO.getNumber()) 42 .addVarint(1902 /* unknown enum value */) 43 .addVarint(TestAllTypes.NestedEnum.BAZ.getNumber()) 44 .addVarint(1903 /* unknown enum value */) 45 .build()); 46 return builder.build().toByteArray(); 47 } 48 49 @Test testUnknownEnumValues()50 public void testUnknownEnumValues() throws Exception { 51 TestAllTypes message = TestAllTypes.parseFrom(payload); 52 53 // Known enum values should be preserved. 54 assertThat(message.getOptionalNestedEnum()).isEqualTo(TestAllTypes.NestedEnum.BAR); 55 assertThat(message.getRepeatedNestedEnumList().size()).isEqualTo(2); 56 assertThat(message.getRepeatedNestedEnum(0)).isEqualTo(TestAllTypes.NestedEnum.FOO); 57 assertThat(message.getRepeatedNestedEnum(1)).isEqualTo(TestAllTypes.NestedEnum.BAZ); 58 59 // Unknown enum values should be found in UnknownFieldSet. 60 UnknownFieldSet unknown = message.getUnknownFields(); 61 assertThat(unknown.getField(singularField.getNumber()).getVarintList().get(0).longValue()) 62 .isEqualTo(1901); 63 assertThat(unknown.getField(repeatedField.getNumber()).getVarintList().get(0).longValue()) 64 .isEqualTo(1902); 65 assertThat(unknown.getField(repeatedField.getNumber()).getVarintList().get(1).longValue()) 66 .isEqualTo(1903); 67 } 68 69 @Test testExtensionUnknownEnumValues()70 public void testExtensionUnknownEnumValues() throws Exception { 71 ExtensionRegistry registry = ExtensionRegistry.newInstance(); 72 UnittestProto.registerAllExtensions(registry); 73 TestAllExtensions message = TestAllExtensions.parseFrom(payload, registry); 74 75 assertThat(message.getExtension(UnittestProto.optionalNestedEnumExtension)) 76 .isEqualTo(TestAllTypes.NestedEnum.BAR); 77 assertThat(message.getExtension(UnittestProto.repeatedNestedEnumExtension).size()).isEqualTo(2); 78 assertThat(message.getExtension(UnittestProto.repeatedNestedEnumExtension, 0)) 79 .isEqualTo(TestAllTypes.NestedEnum.FOO); 80 assertThat(message.getExtension(UnittestProto.repeatedNestedEnumExtension, 1)) 81 .isEqualTo(TestAllTypes.NestedEnum.BAZ); 82 83 // Unknown enum values should be found in UnknownFieldSet. 84 UnknownFieldSet unknown = message.getUnknownFields(); 85 assertThat(unknown.getField(singularField.getNumber()).getVarintList().get(0).longValue()) 86 .isEqualTo(1901); 87 assertThat(unknown.getField(repeatedField.getNumber()).getVarintList().get(0).longValue()) 88 .isEqualTo(1902); 89 assertThat(unknown.getField(repeatedField.getNumber()).getVarintList().get(1).longValue()) 90 .isEqualTo(1903); 91 } 92 } 93