• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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