|
|
|
@ -352,12 +352,61 @@ public class DescriptorsTest { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testFieldDescriptorLegacyEnumFieldTreatedAsClosed() throws Exception { |
|
|
|
|
// Make an open enum definition.
|
|
|
|
|
public void testFieldDescriptorLegacyEnumFieldTreatedAsOpen() throws Exception { |
|
|
|
|
// Make an open enum definition and message that treats enum fields as open.
|
|
|
|
|
|
|
|
|
|
FileDescriptorProto openEnumFile = |
|
|
|
|
FileDescriptorProto.newBuilder() |
|
|
|
|
.setName("open_enum.proto") |
|
|
|
|
.setSyntax("proto3") |
|
|
|
|
.addEnumType( |
|
|
|
|
EnumDescriptorProto.newBuilder() |
|
|
|
|
.setName("TestEnumOpen") |
|
|
|
|
.addValue( |
|
|
|
|
EnumValueDescriptorProto.newBuilder() |
|
|
|
|
.setName("TestEnumOpen_VALUE0") |
|
|
|
|
.setNumber(0) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.addMessageType( |
|
|
|
|
DescriptorProto.newBuilder() |
|
|
|
|
.setName("TestOpenEnumField") |
|
|
|
|
.addField( |
|
|
|
|
FieldDescriptorProto.newBuilder() |
|
|
|
|
.setName("int_field") |
|
|
|
|
.setNumber(1) |
|
|
|
|
.setType(FieldDescriptorProto.Type.TYPE_INT32) |
|
|
|
|
.setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL) |
|
|
|
|
.build()) |
|
|
|
|
.addField( |
|
|
|
|
FieldDescriptorProto.newBuilder() |
|
|
|
|
.setName("open_enum") |
|
|
|
|
.setNumber(2) |
|
|
|
|
.setType(FieldDescriptorProto.Type.TYPE_ENUM) |
|
|
|
|
.setTypeName("TestEnumOpen") |
|
|
|
|
.setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.build(); |
|
|
|
|
FileDescriptor openEnumFileDescriptor = |
|
|
|
|
Descriptors.FileDescriptor.buildFrom(openEnumFile, new FileDescriptor[0]); |
|
|
|
|
Descriptor openMessage = openEnumFileDescriptor.getMessageTypes().get(0); |
|
|
|
|
EnumDescriptor openEnum = openEnumFileDescriptor.findEnumTypeByName("TestEnumOpen"); |
|
|
|
|
assertThat(openEnum.isClosed()).isFalse(); |
|
|
|
|
assertThat(openMessage.findFieldByName("int_field").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
.isFalse(); |
|
|
|
|
assertThat(openMessage.findFieldByName("open_enum").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
.isFalse(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testEditionFieldDescriptorLegacyEnumFieldTreatedAsClosedUnknown() throws Exception { |
|
|
|
|
// Make an open enum definition.
|
|
|
|
|
FileDescriptorProto openEnumFile = |
|
|
|
|
FileDescriptorProto.newBuilder() |
|
|
|
|
.setName("open_enum.proto") |
|
|
|
|
.setSyntax("editions") |
|
|
|
|
.setEdition(Edition.EDITION_2023) |
|
|
|
|
.addEnumType( |
|
|
|
|
EnumDescriptorProto.newBuilder() |
|
|
|
|
.setName("TestEnumOpen") |
|
|
|
@ -374,11 +423,19 @@ public class DescriptorsTest { |
|
|
|
|
assertThat(openEnum.isClosed()).isFalse(); |
|
|
|
|
|
|
|
|
|
// Create a message that treats enum fields as closed.
|
|
|
|
|
FileDescriptorProto closedEnumFile = |
|
|
|
|
FileDescriptorProto editionsClosedEnumFile = |
|
|
|
|
FileDescriptorProto.newBuilder() |
|
|
|
|
.setName("closed_enum_field.proto") |
|
|
|
|
.setName("editions_closed_enum_field.proto") |
|
|
|
|
.addDependency("open_enum.proto") |
|
|
|
|
.setSyntax("proto2") |
|
|
|
|
.setSyntax("editions") |
|
|
|
|
.setEdition(Edition.EDITION_2023) |
|
|
|
|
.setOptions( |
|
|
|
|
FileOptions.newBuilder() |
|
|
|
|
.setFeatures( |
|
|
|
|
DescriptorProtos.FeatureSet.newBuilder() |
|
|
|
|
.setEnumType(DescriptorProtos.FeatureSet.EnumType.CLOSED) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.addEnumType( |
|
|
|
|
EnumDescriptorProto.newBuilder() |
|
|
|
|
.setName("TestEnum") |
|
|
|
@ -405,6 +462,17 @@ public class DescriptorsTest { |
|
|
|
|
.setType(FieldDescriptorProto.Type.TYPE_ENUM) |
|
|
|
|
.setTypeName("TestEnumOpen") |
|
|
|
|
.setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL) |
|
|
|
|
.setOptions( |
|
|
|
|
DescriptorProtos.FieldOptions.newBuilder() |
|
|
|
|
.setFeatures( |
|
|
|
|
DescriptorProtos.FeatureSet.newBuilder() |
|
|
|
|
.setExtension( |
|
|
|
|
JavaFeaturesProto.java_, |
|
|
|
|
JavaFeaturesProto.JavaFeatures.newBuilder() |
|
|
|
|
.setLegacyClosedEnum(true) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.addField( |
|
|
|
|
FieldDescriptorProto.newBuilder() |
|
|
|
@ -416,27 +484,40 @@ public class DescriptorsTest { |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.build(); |
|
|
|
|
Descriptor closedMessage = |
|
|
|
|
// Ensure Java features are in unknown fields.
|
|
|
|
|
editionsClosedEnumFile = |
|
|
|
|
FileDescriptorProto.parseFrom( |
|
|
|
|
editionsClosedEnumFile.toByteString(), ExtensionRegistry.getEmptyRegistry()); |
|
|
|
|
Descriptor editionsClosedMessage = |
|
|
|
|
Descriptors.FileDescriptor.buildFrom( |
|
|
|
|
closedEnumFile, new FileDescriptor[] {openFileDescriptor}) |
|
|
|
|
editionsClosedEnumFile, new FileDescriptor[] {openFileDescriptor}) |
|
|
|
|
.getMessageTypes() |
|
|
|
|
.get(0); |
|
|
|
|
assertThat(closedMessage.findFieldByName("int_field").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
assertThat( |
|
|
|
|
editionsClosedMessage.findFieldByName("int_field").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
.isFalse(); |
|
|
|
|
|
|
|
|
|
assertThat(closedMessage.findFieldByName("closed_enum").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
assertThat( |
|
|
|
|
editionsClosedMessage.findFieldByName("closed_enum").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
.isTrue(); |
|
|
|
|
assertThat(closedMessage.findFieldByName("open_enum").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
assertThat( |
|
|
|
|
editionsClosedMessage.findFieldByName("open_enum").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
.isTrue(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testFieldDescriptorLegacyEnumFieldTreatedAsOpen() throws Exception { |
|
|
|
|
// Make an open enum definition and message that treats enum fields as open.
|
|
|
|
|
public void testEditionFieldDescriptorLegacyEnumFieldTreatedAsClosedCustomPool() |
|
|
|
|
throws Exception { |
|
|
|
|
|
|
|
|
|
FileDescriptor javaFeaturesDescriptor = |
|
|
|
|
Descriptors.FileDescriptor.buildFrom( |
|
|
|
|
JavaFeaturesProto.getDescriptor().toProto(), |
|
|
|
|
new FileDescriptor[] {DescriptorProtos.getDescriptor()}); |
|
|
|
|
// Make an open enum definition.
|
|
|
|
|
FileDescriptorProto openEnumFile = |
|
|
|
|
FileDescriptorProto.newBuilder() |
|
|
|
|
.setName("open_enum.proto") |
|
|
|
|
.setSyntax("proto3") |
|
|
|
|
.setSyntax("editions") |
|
|
|
|
.setEdition(Edition.EDITION_2023) |
|
|
|
|
.addEnumType( |
|
|
|
|
EnumDescriptorProto.newBuilder() |
|
|
|
|
.setName("TestEnumOpen") |
|
|
|
@ -446,9 +527,38 @@ public class DescriptorsTest { |
|
|
|
|
.setNumber(0) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.build(); |
|
|
|
|
FileDescriptor openFileDescriptor = |
|
|
|
|
Descriptors.FileDescriptor.buildFrom(openEnumFile, new FileDescriptor[0]); |
|
|
|
|
EnumDescriptor openEnum = openFileDescriptor.getEnumTypes().get(0); |
|
|
|
|
assertThat(openEnum.isClosed()).isFalse(); |
|
|
|
|
|
|
|
|
|
// Create a message that treats enum fields as closed.
|
|
|
|
|
FileDescriptorProto editionsClosedEnumFile = |
|
|
|
|
FileDescriptorProto.newBuilder() |
|
|
|
|
.setName("editions_closed_enum_field.proto") |
|
|
|
|
.addDependency("open_enum.proto") |
|
|
|
|
.setSyntax("editions") |
|
|
|
|
.setEdition(Edition.EDITION_2023) |
|
|
|
|
.setOptions( |
|
|
|
|
FileOptions.newBuilder() |
|
|
|
|
.setFeatures( |
|
|
|
|
DescriptorProtos.FeatureSet.newBuilder() |
|
|
|
|
.setEnumType(DescriptorProtos.FeatureSet.EnumType.CLOSED) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.addEnumType( |
|
|
|
|
EnumDescriptorProto.newBuilder() |
|
|
|
|
.setName("TestEnum") |
|
|
|
|
.addValue( |
|
|
|
|
EnumValueDescriptorProto.newBuilder() |
|
|
|
|
.setName("TestEnum_VALUE0") |
|
|
|
|
.setNumber(0) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.addMessageType( |
|
|
|
|
DescriptorProto.newBuilder() |
|
|
|
|
.setName("TestOpenEnumField") |
|
|
|
|
.setName("TestClosedEnumField") |
|
|
|
|
.addField( |
|
|
|
|
FieldDescriptorProto.newBuilder() |
|
|
|
|
.setName("int_field") |
|
|
|
@ -463,18 +573,53 @@ public class DescriptorsTest { |
|
|
|
|
.setType(FieldDescriptorProto.Type.TYPE_ENUM) |
|
|
|
|
.setTypeName("TestEnumOpen") |
|
|
|
|
.setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL) |
|
|
|
|
.setOptions( |
|
|
|
|
DescriptorProtos.FieldOptions.newBuilder() |
|
|
|
|
.setFeatures( |
|
|
|
|
DescriptorProtos.FeatureSet.newBuilder() |
|
|
|
|
.setExtension( |
|
|
|
|
// Extension cannot be directly set using custom
|
|
|
|
|
// descriptor, so set using generated for now.
|
|
|
|
|
JavaFeaturesProto.java_, |
|
|
|
|
JavaFeaturesProto.JavaFeatures.newBuilder() |
|
|
|
|
.setLegacyClosedEnum(true) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.addField( |
|
|
|
|
FieldDescriptorProto.newBuilder() |
|
|
|
|
.setName("closed_enum") |
|
|
|
|
.setNumber(3) |
|
|
|
|
.setType(FieldDescriptorProto.Type.TYPE_ENUM) |
|
|
|
|
.setTypeName("TestEnum") |
|
|
|
|
.setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL) |
|
|
|
|
.build()) |
|
|
|
|
.build()) |
|
|
|
|
.build(); |
|
|
|
|
FileDescriptor openEnumFileDescriptor = |
|
|
|
|
Descriptors.FileDescriptor.buildFrom(openEnumFile, new FileDescriptor[0]); |
|
|
|
|
Descriptor openMessage = openEnumFileDescriptor.getMessageTypes().get(0); |
|
|
|
|
EnumDescriptor openEnum = openEnumFileDescriptor.findEnumTypeByName("TestEnumOpen"); |
|
|
|
|
assertThat(openEnum.isClosed()).isFalse(); |
|
|
|
|
assertThat(openMessage.findFieldByName("int_field").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
.isFalse(); |
|
|
|
|
assertThat(openMessage.findFieldByName("open_enum").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
// Reparse using custom java features descriptor.
|
|
|
|
|
ExtensionRegistry registry = ExtensionRegistry.newInstance(); |
|
|
|
|
registry.add( |
|
|
|
|
javaFeaturesDescriptor.getExtensions().get(0), |
|
|
|
|
DynamicMessage.getDefaultInstance( |
|
|
|
|
javaFeaturesDescriptor.getExtensions().get(0).getMessageType())); |
|
|
|
|
editionsClosedEnumFile = |
|
|
|
|
FileDescriptorProto.parseFrom(editionsClosedEnumFile.toByteString(), registry); |
|
|
|
|
Descriptor editionsClosedMessage = |
|
|
|
|
Descriptors.FileDescriptor.buildFrom( |
|
|
|
|
editionsClosedEnumFile, |
|
|
|
|
new FileDescriptor[] {openFileDescriptor, javaFeaturesDescriptor}) |
|
|
|
|
.getMessageTypes() |
|
|
|
|
.get(0); |
|
|
|
|
assertThat( |
|
|
|
|
editionsClosedMessage.findFieldByName("int_field").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
.isFalse(); |
|
|
|
|
assertThat( |
|
|
|
|
editionsClosedMessage.findFieldByName("closed_enum").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
.isTrue(); |
|
|
|
|
assertThat( |
|
|
|
|
editionsClosedMessage.findFieldByName("open_enum").legacyEnumFieldTreatedAsClosed()) |
|
|
|
|
.isTrue(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|