@ -69,7 +69,6 @@
# include "google/protobuf/unittest.pb.h"
# include "google/protobuf/unittest_custom_options.pb.h"
# include "google/protobuf/unittest_features.pb.h"
# include "google/protobuf/unittest_invalid_features.pb.h"
# include "google/protobuf/unittest_lazy_dependencies.pb.h"
# include "google/protobuf/unittest_lazy_dependencies_custom_option.pb.h"
# include "google/protobuf/unittest_lazy_dependencies_enum.pb.h"
@ -7179,6 +7178,16 @@ const FeatureSet& GetFeatures(const T* descriptor) {
return internal : : InternalFeatureHelper : : GetFeatures < T > ( * descriptor ) ;
}
template < typename T >
FeatureSet GetCoreFeatures ( const T * descriptor ) {
FeatureSet features = GetFeatures ( descriptor ) ;
// Strip test features to avoid excessive brittleness.
features . ClearExtension ( pb : : test ) ;
features . ClearExtension ( pb : : TestMessage : : test_message ) ;
features . ClearExtension ( pb : : TestMessage : : Nested : : test_nested ) ;
return features ;
}
TEST_F ( FeaturesTest , InvalidProto2Features ) {
BuildDescriptorMessagesInTestPool ( ) ;
BuildFileWithErrors (
@ -7440,6 +7449,32 @@ TEST_F(FeaturesTest, Proto3Extensions) {
R " pb([bar_ext] { baz: 1 })pb " ) ) ;
}
TEST_F ( FeaturesTest , Edition2023Defaults ) {
FileDescriptorProto file_proto =
ParseTextOrDie ( R " pb(
name : " foo.proto " syntax : " editions " edition : " 2023 "
) pb " );
BuildDescriptorMessagesInTestPool ( ) ;
const FileDescriptor * file = ABSL_DIE_IF_NULL ( pool_ . BuildFile ( file_proto ) ) ;
EXPECT_THAT ( file - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT (
GetCoreFeatures ( file ) , EqualsProto ( R " pb(
field_presence : EXPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW
[ pb . cpp ] { legacy_closed_enum : false utf8_validation : VERIFY_PARSE }
) pb " ));
// Since pb::test is linked in, it should end up with defaults in our
// FeatureSet.
EXPECT_TRUE ( GetFeatures ( file ) . HasExtension ( pb : : test ) ) ;
EXPECT_EQ ( GetFeatures ( file ) . GetExtension ( pb : : test ) . int_file_feature ( ) , 1 ) ;
}
TEST_F ( FeaturesTest , ClearsOptions ) {
BuildDescriptorMessagesInTestPool ( ) ;
const FileDescriptor * file = BuildFile ( R " pb(
@ -7452,13 +7487,17 @@ TEST_F(FeaturesTest, ClearsOptions) {
}
) pb " );
EXPECT_THAT ( file - > options ( ) , EqualsProto ( " java_package: 'bar' " ) ) ;
EXPECT_THAT ( GetFeatures ( file ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( file ) , EqualsProto ( R " pb(
field_presence : IMPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , RestoresOptionsRoundTrip ) {
@ -7711,13 +7750,17 @@ TEST_F(FeaturesTest, NoOptions) {
name : " foo.proto " syntax : " editions " edition : " 2023 "
) pb " );
EXPECT_EQ ( & file - > options ( ) , & FileOptions : : default_instance ( ) ) ;
EXPECT_THAT ( GetFeatures ( file ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( file ) , EqualsProto ( R " pb(
field_presence : EXPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , InvalidEdition ) {
@ -7740,13 +7783,17 @@ TEST_F(FeaturesTest, FileFeatures) {
options { features { field_presence : IMPLICIT } }
) pb " );
EXPECT_THAT ( file - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( file ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( file ) , EqualsProto ( R " pb(
field_presence : IMPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , FileFeaturesExtension ) {
@ -7761,7 +7808,7 @@ TEST_F(FeaturesTest, FileFeaturesExtension) {
) pb " );
EXPECT_THAT ( file - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_EQ ( GetFeatures ( file ) . field_presence ( ) , FeatureSet : : IMPLICIT ) ;
EXPECT_EQ ( GetFeatures ( file ) . string_field_validation ( ) , FeatureSet : : MANDATORY ) ;
EXPECT_EQ ( GetFeatures ( file ) . enum_type ( ) , FeatureSet : : OPEN ) ;
EXPECT_EQ ( GetFeatures ( file ) . GetExtension ( pb : : test ) . int_file_feature ( ) , 4 ) ;
EXPECT_EQ ( GetFeatures ( file )
. GetExtension ( pb : : TestMessage : : test_message )
@ -7792,7 +7839,7 @@ TEST_F(FeaturesTest, FileFeaturesExtensionOverride) {
) pb " );
EXPECT_THAT ( file - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_EQ ( GetFeatures ( file ) . field_presence ( ) , FeatureSet : : IMPLICIT ) ;
EXPECT_EQ ( GetFeatures ( file ) . string_field_validation ( ) , FeatureSet : : MANDATORY ) ;
EXPECT_EQ ( GetFeatures ( file ) . enum_type ( ) , FeatureSet : : OPEN ) ;
EXPECT_EQ ( GetFeatures ( file ) . GetExtension ( pb : : test ) . int_file_feature ( ) , 9 ) ;
EXPECT_EQ ( GetFeatures ( file )
. GetExtension ( pb : : TestMessage : : test_message )
@ -7814,13 +7861,17 @@ TEST_F(FeaturesTest, MessageFeaturesDefault) {
) pb " );
const Descriptor * message = file - > message_type ( 0 ) ;
EXPECT_THAT ( message - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( message ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( message ) , EqualsProto ( R " pb(
field_presence : EXPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , MessageFeaturesInherit ) {
@ -7918,13 +7969,17 @@ TEST_F(FeaturesTest, FieldFeaturesDefault) {
) pb " );
const FieldDescriptor * field = file - > message_type ( 0 ) - > field ( 0 ) ;
EXPECT_THAT ( field - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( field ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( field ) , EqualsProto ( R " pb(
field_presence : EXPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , FieldFeaturesInherit ) {
@ -7968,7 +8023,7 @@ TEST_F(FeaturesTest, FieldFeaturesOverride) {
dependency : " google/protobuf/unittest_features.proto "
options {
features {
string_field_validation : HINT
enum_type : CLOSED
field_presence : IMPLICIT
[ pb . test ] { int_multiple_feature : 2 }
}
@ -7987,7 +8042,7 @@ TEST_F(FeaturesTest, FieldFeaturesOverride) {
type : TYPE_STRING
options {
features {
string_field_validation : NONE
field_presence : EXPLICIT
[ pb . test ] { int_multiple_feature : 9 }
}
}
@ -7996,8 +8051,8 @@ TEST_F(FeaturesTest, FieldFeaturesOverride) {
) pb " );
const FieldDescriptor * field = file - > message_type ( 0 ) - > field ( 0 ) ;
EXPECT_THAT ( field - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_EQ ( GetFeatures ( field ) . field_presence ( ) , FeatureSet : : IM PLICIT) ;
EXPECT_EQ ( GetFeatures ( field ) . string_field_validation ( ) , FeatureSet : : NONE ) ;
EXPECT_EQ ( GetFeatures ( field ) . field_presence ( ) , FeatureSet : : EX PLICIT) ;
EXPECT_EQ ( GetFeatures ( field ) . enum_type ( ) , FeatureSet : : CLOSED ) ;
EXPECT_EQ ( GetFeatures ( field ) . GetExtension ( pb : : test ) . int_multiple_feature ( ) ,
9 ) ;
}
@ -8074,7 +8129,6 @@ TEST_F(FeaturesTest, OneofFieldFeaturesOverride) {
type : TYPE_STRING
options {
features {
string_field_validation : NONE
[ pb . test ] { int_multiple_feature : 9 }
}
}
@ -8213,7 +8267,7 @@ TEST_F(FeaturesTest, RootExtensionFeaturesOverride) {
dependency : " google/protobuf/unittest_features.proto "
options {
features {
string_field_validation : HINT
enum_type : CLOSED
field_presence : IMPLICIT
[ pb . test ] { int_multiple_feature : 2 }
}
@ -8225,7 +8279,7 @@ TEST_F(FeaturesTest, RootExtensionFeaturesOverride) {
type : TYPE_STRING
options {
features {
string_field_validation : NONE
enum_type : OPEN
[ pb . test ] { int_multiple_feature : 9 }
}
}
@ -8239,7 +8293,7 @@ TEST_F(FeaturesTest, RootExtensionFeaturesOverride) {
const FieldDescriptor * field = file - > extension ( 0 ) ;
EXPECT_THAT ( field - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_EQ ( GetFeatures ( field ) . field_presence ( ) , FeatureSet : : IMPLICIT ) ;
EXPECT_EQ ( GetFeatures ( field ) . string_field_validation ( ) , FeatureSet : : NONE ) ;
EXPECT_EQ ( GetFeatures ( field ) . enum_type ( ) , FeatureSet : : OPEN ) ;
EXPECT_EQ ( GetFeatures ( field ) . GetExtension ( pb : : test ) . int_multiple_feature ( ) ,
9 ) ;
}
@ -8254,7 +8308,7 @@ TEST_F(FeaturesTest, MessageExtensionFeaturesOverride) {
dependency : " google/protobuf/unittest_features.proto "
options {
features {
string_field_validation : HINT
enum_type : CLOSED
field_presence : IMPLICIT
[ pb . test ] { int_multiple_feature : 2 }
}
@ -8271,7 +8325,7 @@ TEST_F(FeaturesTest, MessageExtensionFeaturesOverride) {
number : 1
label : LABEL_OPTIONAL
type : TYPE_STRING
options { features { string_field_validation : NONE } }
options { features { enum_type : OPEN } }
extendee : " Foo2 "
}
}
@ -8288,7 +8342,7 @@ TEST_F(FeaturesTest, MessageExtensionFeaturesOverride) {
const FieldDescriptor * field = file - > message_type ( 0 ) - > extension ( 0 ) ;
EXPECT_THAT ( field - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_EQ ( GetFeatures ( field ) . field_presence ( ) , FeatureSet : : IMPLICIT ) ;
EXPECT_EQ ( GetFeatures ( field ) . string_field_validation ( ) , FeatureSet : : NONE ) ;
EXPECT_EQ ( GetFeatures ( field ) . enum_type ( ) , FeatureSet : : OPEN ) ;
EXPECT_EQ ( GetFeatures ( field ) . GetExtension ( pb : : test ) . int_multiple_feature ( ) ,
3 ) ;
}
@ -8306,13 +8360,17 @@ TEST_F(FeaturesTest, EnumFeaturesDefault) {
) pb " );
const EnumDescriptor * enm = file - > enum_type ( 0 ) ;
EXPECT_THAT ( enm - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( enm ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( enm ) , EqualsProto ( R " pb(
field_presence : EXPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , EnumFeaturesInherit ) {
@ -8412,13 +8470,17 @@ TEST_F(FeaturesTest, EnumValueFeaturesDefault) {
) pb " );
const EnumValueDescriptor * value = file - > enum_type ( 0 ) - > value ( 0 ) ;
EXPECT_THAT ( value - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( value ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( value ) , EqualsProto ( R " pb(
field_presence : EXPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , EnumValueFeaturesInherit ) {
@ -8503,13 +8565,17 @@ TEST_F(FeaturesTest, OneofFeaturesDefault) {
) pb " );
const OneofDescriptor * oneof = file - > message_type ( 0 ) - > oneof_decl ( 0 ) ;
EXPECT_THAT ( oneof - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( oneof ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( oneof ) , EqualsProto ( R " pb(
field_presence : EXPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , OneofFeaturesInherit ) {
@ -8601,13 +8667,17 @@ TEST_F(FeaturesTest, ExtensionRangeFeaturesDefault) {
const Descriptor : : ExtensionRange * range =
file - > message_type ( 0 ) - > extension_range ( 0 ) ;
EXPECT_THAT ( range - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( range ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( range ) , EqualsProto ( R " pb(
field_presence : EXPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , ExtensionRangeFeaturesInherit ) {
@ -8684,13 +8754,17 @@ TEST_F(FeaturesTest, ServiceFeaturesDefault) {
) pb " );
const ServiceDescriptor * service = file - > service ( 0 ) ;
EXPECT_THAT ( service - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( service ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( service ) , EqualsProto ( R " pb(
field_presence : EXPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , ServiceFeaturesInherit ) {
@ -8749,13 +8823,17 @@ TEST_F(FeaturesTest, MethodFeaturesDefault) {
) pb " );
const MethodDescriptor * method = file - > service ( 0 ) - > method ( 0 ) ;
EXPECT_THAT ( method - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( method ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( method ) , EqualsProto ( R " pb(
field_presence : EXPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , MethodFeaturesInherit ) {
@ -9006,23 +9084,44 @@ TEST_F(FeaturesTest, FeaturesOutsideEditions) {
TEST_F ( FeaturesTest , InvalidExtensionNonMessage ) {
BuildDescriptorMessagesInTestPool ( ) ;
BuildFileInTestPool ( : : pb : : TestInvalid : : descriptor ( ) - > file ( ) ) ;
ASSERT_NE ( BuildFile ( R " pb(
name : " unittest_invalid_features.proto "
syntax : " proto2 "
package : " pb "
dependency : " google/protobuf/descriptor.proto "
message_type {
name : " TestInvalid "
extension {
name : " scalar_extension "
number : 9996
label : LABEL_OPTIONAL
type : TYPE_STRING
extendee : " .google.protobuf.FeatureSet "
}
}
) pb " ),
nullptr ) ;
BuildFileWithErrors (
R " pb(
name : " foo.proto "
syntax : " editions "
edition : " 2023 "
dependency : " google/protobuf/unittest_invalid_features.proto "
dependency : " unittest_invalid_features.proto "
options {
features {
[ pb . TestInvalid . scalar_extension ] : " hello "
uninterpreted_option {
name { name_part : " features " is_extension : false }
name {
name_part : " pb.TestInvalid.scalar_extension "
is_extension : true
}
identifier_value : " hello "
}
}
) pb " ,
" foo.proto: google/protobuf/unittest_invalid_features.proto: "
" EDITIONS: FeatureSet extension pb.TestInvalid.scalar_extension is not "
" of message type. Feature extensions should always use messages to "
" allow for evolution. \n " ) ;
" foo.proto: unittest_invalid_features.proto: EDITIONS: FeatureSet "
" extension pb.TestInvalid.scalar_extension is not of message type. "
" Feature extensions should always use messages to allow for "
" evolution. \n " ) ;
}
TEST_F ( FeaturesTest , InvalidFieldImplicitDefault ) {
@ -9416,13 +9515,17 @@ TEST_F(FeaturesTest, UninterpretedOptions) {
}
) pb " );
EXPECT_THAT ( file - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( file ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( file ) , EqualsProto ( R " pb(
field_presence : IMPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , UninterpretedOptionsMerge ) {
@ -9434,8 +9537,8 @@ TEST_F(FeaturesTest, UninterpretedOptionsMerge) {
options {
uninterpreted_option {
name { name_part : " features " is_extension : false }
name { name_part : " string_field_validation " is_extension : false }
identifier_value : " HINT "
name { name_part : " enum_type " is_extension : false }
identifier_value : " CLOSED "
}
}
message_type {
@ -9448,8 +9551,8 @@ TEST_F(FeaturesTest, UninterpretedOptionsMerge) {
options {
uninterpreted_option {
name { name_part : " features " is_extension : false }
name { name_part : " string_field_validation " is_extension : false }
identifier_value : " NONE "
name { name_part : " enum_type " is_extension : false }
identifier_value : " OPEN "
}
}
}
@ -9458,8 +9561,8 @@ TEST_F(FeaturesTest, UninterpretedOptionsMerge) {
const FieldDescriptor * field = file - > message_type ( 0 ) - > field ( 0 ) ;
EXPECT_THAT ( file - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( field - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_EQ ( GetFeatures ( file ) . string_field_validation ( ) , FeatureSet : : HINT ) ;
EXPECT_EQ ( GetFeatures ( field ) . string_field_validation ( ) , FeatureSet : : NONE ) ;
EXPECT_EQ ( GetFeatures ( file ) . enum_type ( ) , FeatureSet : : CLOSED ) ;
EXPECT_EQ ( GetFeatures ( field ) . enum_type ( ) , FeatureSet : : OPEN ) ;
}
TEST_F ( FeaturesTest , UninterpretedOptionsMergeExtension ) {
@ -9540,13 +9643,17 @@ TEST_F(FeaturesTest, RawFeatures) {
options { features { raw_features { field_presence : IMPLICIT } } }
) pb " );
EXPECT_THAT ( file - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( file ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( file ) , EqualsProto ( R " pb(
field_presence : IMPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , RawFeaturesConflict ) {
@ -9563,13 +9670,17 @@ TEST_F(FeaturesTest, RawFeaturesConflict) {
}
) pb " );
EXPECT_THAT ( file - > options ( ) , EqualsProto ( " " ) ) ;
EXPECT_THAT ( GetFeatures ( file ) , EqualsProto ( R " pb(
EXPECT_THAT ( GetCore Features ( file ) , EqualsProto ( R " pb(
field_presence : IMPLICIT
enum_type : OPEN
repeated_field_encoding : PACKED
string_field_validation : MANDATORY
message_encoding : LENGTH_PREFIXED
json_format : ALLOW ) pb " ));
json_format : ALLOW
[ pb . cpp ] {
legacy_closed_enum : false
utf8_validation : VERIFY_PARSE
} ) pb " ));
}
TEST_F ( FeaturesTest , InvalidJsonUniquenessDefaultWarning ) {