| Index: third_party/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java
|
| ===================================================================
|
| --- third_party/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java (revision 216642)
|
| +++ third_party/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java (working copy)
|
| @@ -31,6 +31,8 @@
|
| package com.google.protobuf;
|
|
|
| import com.google.protobuf.DescriptorProtos.DescriptorProto;
|
| +import com.google.protobuf.DescriptorProtos.EnumDescriptorProto;
|
| +import com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto;
|
| import com.google.protobuf.DescriptorProtos.FieldDescriptorProto;
|
| import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
|
| import com.google.protobuf.Descriptors.DescriptorValidationException;
|
| @@ -60,6 +62,7 @@
|
|
|
| import java.util.Arrays;
|
| import java.util.Collections;
|
| +import java.util.List;
|
|
|
| /**
|
| * Unit test for {@link Descriptors}.
|
| @@ -426,7 +429,7 @@
|
| UnittestEnormousDescriptor.getDescriptor()
|
| .toProto().getSerializedSize() > 65536);
|
| }
|
| -
|
| +
|
| /**
|
| * Tests that the DescriptorValidationException works as intended.
|
| */
|
| @@ -445,7 +448,7 @@
|
| .build())
|
| .build();
|
| try {
|
| - Descriptors.FileDescriptor.buildFrom(fileDescriptorProto,
|
| + Descriptors.FileDescriptor.buildFrom(fileDescriptorProto,
|
| new FileDescriptor[0]);
|
| fail("DescriptorValidationException expected");
|
| } catch (DescriptorValidationException e) {
|
| @@ -457,4 +460,189 @@
|
| assertTrue(e.getCause().getMessage().indexOf("invalid") != -1);
|
| }
|
| }
|
| +
|
| + /**
|
| + * Tests the translate/crosslink for an example where a message field's name
|
| + * and type name are the same.
|
| + */
|
| + public void testDescriptorComplexCrosslink() throws Exception {
|
| + FileDescriptorProto fileDescriptorProto = FileDescriptorProto.newBuilder()
|
| + .setName("foo.proto")
|
| + .addMessageType(DescriptorProto.newBuilder()
|
| + .setName("Foo")
|
| + .addField(FieldDescriptorProto.newBuilder()
|
| + .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
|
| + .setType(FieldDescriptorProto.Type.TYPE_INT32)
|
| + .setName("foo")
|
| + .setNumber(1)
|
| + .build())
|
| + .build())
|
| + .addMessageType(DescriptorProto.newBuilder()
|
| + .setName("Bar")
|
| + .addField(FieldDescriptorProto.newBuilder()
|
| + .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
|
| + .setTypeName("Foo")
|
| + .setName("Foo")
|
| + .setNumber(1)
|
| + .build())
|
| + .build())
|
| + .build();
|
| + // translate and crosslink
|
| + FileDescriptor file =
|
| + Descriptors.FileDescriptor.buildFrom(fileDescriptorProto,
|
| + new FileDescriptor[0]);
|
| + // verify resulting descriptors
|
| + assertNotNull(file);
|
| + List<Descriptor> msglist = file.getMessageTypes();
|
| + assertNotNull(msglist);
|
| + assertTrue(msglist.size() == 2);
|
| + boolean barFound = false;
|
| + for (Descriptor desc : msglist) {
|
| + if (desc.getName().equals("Bar")) {
|
| + barFound = true;
|
| + assertNotNull(desc.getFields());
|
| + List<FieldDescriptor> fieldlist = desc.getFields();
|
| + assertNotNull(fieldlist);
|
| + assertTrue(fieldlist.size() == 1);
|
| + assertTrue(fieldlist.get(0).getType() == FieldDescriptor.Type.MESSAGE);
|
| + assertTrue(fieldlist.get(0).getMessageType().getName().equals("Foo"));
|
| + }
|
| + }
|
| + assertTrue(barFound);
|
| + }
|
| +
|
| + public void testInvalidPublicDependency() throws Exception {
|
| + FileDescriptorProto fooProto = FileDescriptorProto.newBuilder()
|
| + .setName("foo.proto") .build();
|
| + FileDescriptorProto barProto = FileDescriptorProto.newBuilder()
|
| + .setName("boo.proto")
|
| + .addDependency("foo.proto")
|
| + .addPublicDependency(1) // Error, should be 0.
|
| + .build();
|
| + FileDescriptor fooFile = Descriptors.FileDescriptor.buildFrom(fooProto,
|
| + new FileDescriptor[0]);
|
| + try {
|
| + Descriptors.FileDescriptor.buildFrom(barProto,
|
| + new FileDescriptor[] {fooFile});
|
| + fail("DescriptorValidationException expected");
|
| + } catch (DescriptorValidationException e) {
|
| + assertTrue(
|
| + e.getMessage().indexOf("Invalid public dependency index.") != -1);
|
| + }
|
| + }
|
| +
|
| + public void testHiddenDependency() throws Exception {
|
| + FileDescriptorProto barProto = FileDescriptorProto.newBuilder()
|
| + .setName("bar.proto")
|
| + .addMessageType(DescriptorProto.newBuilder().setName("Bar"))
|
| + .build();
|
| + FileDescriptorProto forwardProto = FileDescriptorProto.newBuilder()
|
| + .setName("forward.proto")
|
| + .addDependency("bar.proto")
|
| + .build();
|
| + FileDescriptorProto fooProto = FileDescriptorProto.newBuilder()
|
| + .setName("foo.proto")
|
| + .addDependency("forward.proto")
|
| + .addMessageType(DescriptorProto.newBuilder()
|
| + .setName("Foo")
|
| + .addField(FieldDescriptorProto.newBuilder()
|
| + .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
|
| + .setTypeName("Bar")
|
| + .setName("bar")
|
| + .setNumber(1)))
|
| + .build();
|
| + FileDescriptor barFile = Descriptors.FileDescriptor.buildFrom(
|
| + barProto, new FileDescriptor[0]);
|
| + FileDescriptor forwardFile = Descriptors.FileDescriptor.buildFrom(
|
| + forwardProto, new FileDescriptor[] {barFile});
|
| +
|
| + try {
|
| + Descriptors.FileDescriptor.buildFrom(
|
| + fooProto, new FileDescriptor[] {forwardFile});
|
| + fail("DescriptorValidationException expected");
|
| + } catch (DescriptorValidationException e) {
|
| + assertTrue(e.getMessage().indexOf("Bar") != -1);
|
| + assertTrue(e.getMessage().indexOf("is not defined") != -1);
|
| + }
|
| + }
|
| +
|
| + public void testPublicDependency() throws Exception {
|
| + FileDescriptorProto barProto = FileDescriptorProto.newBuilder()
|
| + .setName("bar.proto")
|
| + .addMessageType(DescriptorProto.newBuilder().setName("Bar"))
|
| + .build();
|
| + FileDescriptorProto forwardProto = FileDescriptorProto.newBuilder()
|
| + .setName("forward.proto")
|
| + .addDependency("bar.proto")
|
| + .addPublicDependency(0)
|
| + .build();
|
| + FileDescriptorProto fooProto = FileDescriptorProto.newBuilder()
|
| + .setName("foo.proto")
|
| + .addDependency("forward.proto")
|
| + .addMessageType(DescriptorProto.newBuilder()
|
| + .setName("Foo")
|
| + .addField(FieldDescriptorProto.newBuilder()
|
| + .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
|
| + .setTypeName("Bar")
|
| + .setName("bar")
|
| + .setNumber(1)))
|
| + .build();
|
| + FileDescriptor barFile = Descriptors.FileDescriptor.buildFrom(
|
| + barProto, new FileDescriptor[0]);
|
| + FileDescriptor forwardFile = Descriptors.FileDescriptor.buildFrom(
|
| + forwardProto, new FileDescriptor[]{barFile});
|
| + Descriptors.FileDescriptor.buildFrom(
|
| + fooProto, new FileDescriptor[] {forwardFile});
|
| + }
|
| +
|
| + /**
|
| + * Tests the translate/crosslink for an example with a more complex namespace
|
| + * referencing.
|
| + */
|
| + public void testComplexNamespacePublicDependency() throws Exception {
|
| + FileDescriptorProto fooProto = FileDescriptorProto.newBuilder()
|
| + .setName("bar.proto")
|
| + .setPackage("a.b.c.d.bar.shared")
|
| + .addEnumType(EnumDescriptorProto.newBuilder()
|
| + .setName("MyEnum")
|
| + .addValue(EnumValueDescriptorProto.newBuilder()
|
| + .setName("BLAH")
|
| + .setNumber(1)))
|
| + .build();
|
| + FileDescriptorProto barProto = FileDescriptorProto.newBuilder()
|
| + .setName("foo.proto")
|
| + .addDependency("bar.proto")
|
| + .setPackage("a.b.c.d.foo.shared")
|
| + .addMessageType(DescriptorProto.newBuilder()
|
| + .setName("MyMessage")
|
| + .addField(FieldDescriptorProto.newBuilder()
|
| + .setLabel(FieldDescriptorProto.Label.LABEL_REPEATED)
|
| + .setTypeName("bar.shared.MyEnum")
|
| + .setName("MyField")
|
| + .setNumber(1)))
|
| + .build();
|
| + // translate and crosslink
|
| + FileDescriptor fooFile = Descriptors.FileDescriptor.buildFrom(
|
| + fooProto, new FileDescriptor[0]);
|
| + FileDescriptor barFile = Descriptors.FileDescriptor.buildFrom(
|
| + barProto, new FileDescriptor[]{fooFile});
|
| + // verify resulting descriptors
|
| + assertNotNull(barFile);
|
| + List<Descriptor> msglist = barFile.getMessageTypes();
|
| + assertNotNull(msglist);
|
| + assertTrue(msglist.size() == 1);
|
| + Descriptor desc = msglist.get(0);
|
| + if (desc.getName().equals("MyMessage")) {
|
| + assertNotNull(desc.getFields());
|
| + List<FieldDescriptor> fieldlist = desc.getFields();
|
| + assertNotNull(fieldlist);
|
| + assertTrue(fieldlist.size() == 1);
|
| + FieldDescriptor field = fieldlist.get(0);
|
| + assertTrue(field.getType() == FieldDescriptor.Type.ENUM);
|
| + assertTrue(field.getEnumType().getName().equals("MyEnum"));
|
| + assertTrue(field.getEnumType().getFile().getName().equals("bar.proto"));
|
| + assertTrue(field.getEnumType().getFile().getPackage().equals(
|
| + "a.b.c.d.bar.shared"));
|
| + }
|
| + }
|
| }
|
|
|