aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Skeet <jonskeet@google.com>2018-08-29 10:32:42 +0100
committerJon Skeet <skeet@pobox.com>2018-09-10 22:00:36 +0100
commitbaa4a21130a75aa80f928a827586b97400dfc3ba (patch)
tree07ad21537189ae4792fda434627ecd46cafec863
parentf8cd9b0faca6edc2bc0d52b72b2729001afd15ff (diff)
downloadprotobuf-baa4a21130a75aa80f928a827586b97400dfc3ba.tar.gz
protobuf-baa4a21130a75aa80f928a827586b97400dfc3ba.tar.bz2
protobuf-baa4a21130a75aa80f928a827586b97400dfc3ba.zip
Cross-link descriptor when building from byte strings
This performs more testing for field descriptors built from byte strings too, but that's mostly incidental. The chief intent is to check that cross-linking occurs.
-rw-r--r--csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs55
-rw-r--r--csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs1
2 files changed, 44 insertions, 12 deletions
diff --git a/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs b/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
index 9abee951..586ab47a 100644
--- a/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
@@ -71,7 +71,6 @@ namespace Google.Protobuf.Reflection
private void TestFileDescriptor(FileDescriptor file, FileDescriptor importedFile, FileDescriptor importedPublicFile)
{
-
Assert.AreEqual("unittest_proto3.proto", file.Name);
Assert.AreEqual("protobuf_unittest3", file.Package);
@@ -214,29 +213,61 @@ namespace Google.Protobuf.Reflection
}
[Test]
- public void FieldDescriptor()
+ public void FieldDescriptor_GeneratedCode()
{
- MessageDescriptor messageType = TestAllTypes.Descriptor;
- FieldDescriptor primitiveField = messageType.FindDescriptor<FieldDescriptor>("single_int32");
- FieldDescriptor enumField = messageType.FindDescriptor<FieldDescriptor>("single_nested_enum");
- FieldDescriptor messageField = messageType.FindDescriptor<FieldDescriptor>("single_foreign_message");
+ TestFieldDescriptor(UnittestProto3Reflection.Descriptor, TestAllTypes.Descriptor, ForeignMessage.Descriptor, ImportMessage.Descriptor);
+ }
+
+ [Test]
+ public void FieldDescriptor_BuildFromByteStrings()
+ {
+ // The descriptors have to be supplied in an order such that all the
+ // dependencies come before the descriptors depending on them.
+ var descriptorData = new List<ByteString>
+ {
+ UnittestImportPublicProto3Reflection.Descriptor.Proto.ToByteString(),
+ UnittestImportProto3Reflection.Descriptor.Proto.ToByteString(),
+ UnittestProto3Reflection.Descriptor.Proto.ToByteString()
+ };
+ var converted = FileDescriptor.BuildFromByteStrings(descriptorData);
+ TestFieldDescriptor(
+ converted[2],
+ converted[2].FindTypeByName<MessageDescriptor>("TestAllTypes"),
+ converted[2].FindTypeByName<MessageDescriptor>("ForeignMessage"),
+ converted[1].FindTypeByName<MessageDescriptor>("ImportMessage"));
+ }
+
+ public void TestFieldDescriptor(
+ FileDescriptor unitTestProto3Descriptor,
+ MessageDescriptor testAllTypesDescriptor,
+ MessageDescriptor foreignMessageDescriptor,
+ MessageDescriptor importMessageDescriptor)
+ {
+ FieldDescriptor primitiveField = testAllTypesDescriptor.FindDescriptor<FieldDescriptor>("single_int32");
+ FieldDescriptor enumField = testAllTypesDescriptor.FindDescriptor<FieldDescriptor>("single_nested_enum");
+ FieldDescriptor foreignMessageField = testAllTypesDescriptor.FindDescriptor<FieldDescriptor>("single_foreign_message");
+ FieldDescriptor importMessageField = testAllTypesDescriptor.FindDescriptor<FieldDescriptor>("single_import_message");
Assert.AreEqual("single_int32", primitiveField.Name);
Assert.AreEqual("protobuf_unittest3.TestAllTypes.single_int32",
primitiveField.FullName);
Assert.AreEqual(1, primitiveField.FieldNumber);
- Assert.AreEqual(messageType, primitiveField.ContainingType);
- Assert.AreEqual(UnittestProto3Reflection.Descriptor, primitiveField.File);
+ Assert.AreEqual(testAllTypesDescriptor, primitiveField.ContainingType);
+ Assert.AreEqual(unitTestProto3Descriptor, primitiveField.File);
Assert.AreEqual(FieldType.Int32, primitiveField.FieldType);
Assert.IsNull(primitiveField.Proto.Options);
Assert.AreEqual("single_nested_enum", enumField.Name);
Assert.AreEqual(FieldType.Enum, enumField.FieldType);
- Assert.AreEqual(messageType.EnumTypes[0], enumField.EnumType);
+ Assert.AreEqual(testAllTypesDescriptor.EnumTypes[0], enumField.EnumType);
+
+ Assert.AreEqual("single_foreign_message", foreignMessageField.Name);
+ Assert.AreEqual(FieldType.Message, foreignMessageField.FieldType);
+ Assert.AreEqual(foreignMessageDescriptor, foreignMessageField.MessageType);
- Assert.AreEqual("single_foreign_message", messageField.Name);
- Assert.AreEqual(FieldType.Message, messageField.FieldType);
- Assert.AreEqual(ForeignMessage.Descriptor, messageField.MessageType);
+ Assert.AreEqual("single_import_message", importMessageField.Name);
+ Assert.AreEqual(FieldType.Message, importMessageField.FieldType);
+ Assert.AreEqual(importMessageDescriptor, importMessageField.MessageType);
}
[Test]
diff --git a/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs
index 799f7291..216e03cc 100644
--- a/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs
@@ -344,6 +344,7 @@ namespace Google.Protobuf.Reflection
FileDescriptor descriptor = new FileDescriptor(
data, proto, dependencies, pool,
allowUnknownDependencies: false, generatedCodeInfo: null);
+ descriptor.CrossLink();
descriptors.Add(descriptor);
if (descriptorsByName.ContainsKey(descriptor.Name))
{