PageRenderTime 50ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/src/ProtocolBuffers.Test/DescriptorsTest.cs

https://code.google.com/p/protobuf-csharp-port/
C# | 352 lines | 257 code | 46 blank | 49 comment | 9 complexity | 03d524453697bf716f2797dda6ac6308 MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0, GPL-2.0
  1. #region Copyright notice and license
  2. // Protocol Buffers - Google's data interchange format
  3. // Copyright 2008 Google Inc. All rights reserved.
  4. // http://github.com/jskeet/dotnet-protobufs/
  5. // Original C++/Java/Python code:
  6. // http://code.google.com/p/protobuf/
  7. //
  8. // Redistribution and use in source and binary forms, with or without
  9. // modification, are permitted provided that the following conditions are
  10. // met:
  11. //
  12. // * Redistributions of source code must retain the above copyright
  13. // notice, this list of conditions and the following disclaimer.
  14. // * Redistributions in binary form must reproduce the above
  15. // copyright notice, this list of conditions and the following disclaimer
  16. // in the documentation and/or other materials provided with the
  17. // distribution.
  18. // * Neither the name of Google Inc. nor the names of its
  19. // contributors may be used to endorse or promote products derived from
  20. // this software without specific prior written permission.
  21. //
  22. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  25. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  26. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  27. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  28. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  29. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  30. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  31. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  32. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33. #endregion
  34. using System.Text;
  35. using Google.ProtocolBuffers.Descriptors;
  36. using Google.ProtocolBuffers.TestProtos;
  37. using Microsoft.VisualStudio.TestTools.UnitTesting;
  38. namespace Google.ProtocolBuffers
  39. {
  40. /// <summary>
  41. /// Tests for descriptors. (Not in its own namespace or broken up into individual classes as the
  42. /// size doesn't warrant it. On the other hand, this makes me feel a bit dirty...)
  43. /// </summary>
  44. [TestClass]
  45. public class DescriptorsTest
  46. {
  47. [TestMethod]
  48. public void FileDescriptor()
  49. {
  50. FileDescriptor file = UnitTestProtoFile.Descriptor;
  51. Assert.AreEqual("google/protobuf/unittest.proto", file.Name);
  52. Assert.AreEqual("protobuf_unittest", file.Package);
  53. Assert.AreEqual("UnittestProto", file.Options.JavaOuterClassname);
  54. Assert.AreEqual("google/protobuf/unittest.proto", file.Proto.Name);
  55. // TODO(jonskeet): Either change to expect 2 dependencies, or don't emit them.
  56. // Assert.AreEqual(2, file.Dependencies.Count);
  57. Assert.AreEqual(UnitTestImportProtoFile.Descriptor, file.Dependencies[1]);
  58. MessageDescriptor messageType = TestAllTypes.Descriptor;
  59. Assert.AreEqual(messageType, file.MessageTypes[0]);
  60. Assert.AreEqual(messageType, file.FindTypeByName<MessageDescriptor>("TestAllTypes"));
  61. Assert.IsNull(file.FindTypeByName<MessageDescriptor>("NoSuchType"));
  62. Assert.IsNull(file.FindTypeByName<MessageDescriptor>("protobuf_unittest.TestAllTypes"));
  63. for (int i = 0; i < file.MessageTypes.Count; i++)
  64. {
  65. Assert.AreEqual(i, file.MessageTypes[i].Index);
  66. }
  67. Assert.AreEqual(file.EnumTypes[0], file.FindTypeByName<EnumDescriptor>("ForeignEnum"));
  68. Assert.IsNull(file.FindTypeByName<EnumDescriptor>("NoSuchType"));
  69. Assert.IsNull(file.FindTypeByName<EnumDescriptor>("protobuf_unittest.ForeignEnum"));
  70. Assert.AreEqual(1, UnitTestImportProtoFile.Descriptor.EnumTypes.Count);
  71. Assert.AreEqual("ImportEnum", UnitTestImportProtoFile.Descriptor.EnumTypes[0].Name);
  72. for (int i = 0; i < file.EnumTypes.Count; i++)
  73. {
  74. Assert.AreEqual(i, file.EnumTypes[i].Index);
  75. }
  76. ServiceDescriptor service = TestGenericService.Descriptor;
  77. Assert.AreEqual(service, UnitTestGenericServices.Descriptor.Services[0]);
  78. Assert.AreEqual(service,
  79. UnitTestGenericServices.Descriptor.FindTypeByName<ServiceDescriptor>("TestGenericService"));
  80. Assert.IsNull(UnitTestGenericServices.Descriptor.FindTypeByName<ServiceDescriptor>("NoSuchType"));
  81. Assert.IsNull(
  82. UnitTestGenericServices.Descriptor.FindTypeByName<ServiceDescriptor>(
  83. "protobuf_unittest.TestGenericService"));
  84. Assert.AreEqual(0, UnitTestImportProtoFile.Descriptor.Services.Count);
  85. for (int i = 0; i < file.Services.Count; i++)
  86. {
  87. Assert.AreEqual(i, file.Services[i].Index);
  88. }
  89. FieldDescriptor extension = UnitTestProtoFile.OptionalInt32Extension.Descriptor;
  90. Assert.AreEqual(extension, file.Extensions[0]);
  91. Assert.AreEqual(extension, file.FindTypeByName<FieldDescriptor>("optional_int32_extension"));
  92. Assert.IsNull(file.FindTypeByName<FieldDescriptor>("no_such_ext"));
  93. Assert.IsNull(file.FindTypeByName<FieldDescriptor>("protobuf_unittest.optional_int32_extension"));
  94. Assert.AreEqual(0, UnitTestImportProtoFile.Descriptor.Extensions.Count);
  95. for (int i = 0; i < file.Extensions.Count; i++)
  96. {
  97. Assert.AreEqual(i, file.Extensions[i].Index);
  98. }
  99. }
  100. [TestMethod]
  101. public void MessageDescriptor()
  102. {
  103. MessageDescriptor messageType = TestAllTypes.Descriptor;
  104. MessageDescriptor nestedType = TestAllTypes.Types.NestedMessage.Descriptor;
  105. Assert.AreEqual("TestAllTypes", messageType.Name);
  106. Assert.AreEqual("protobuf_unittest.TestAllTypes", messageType.FullName);
  107. Assert.AreEqual(UnitTestProtoFile.Descriptor, messageType.File);
  108. Assert.IsNull(messageType.ContainingType);
  109. Assert.AreEqual(DescriptorProtos.MessageOptions.DefaultInstance, messageType.Options);
  110. Assert.AreEqual("TestAllTypes", messageType.Proto.Name);
  111. Assert.AreEqual("NestedMessage", nestedType.Name);
  112. Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedMessage", nestedType.FullName);
  113. Assert.AreEqual(UnitTestProtoFile.Descriptor, nestedType.File);
  114. Assert.AreEqual(messageType, nestedType.ContainingType);
  115. FieldDescriptor field = messageType.Fields[0];
  116. Assert.AreEqual("optional_int32", field.Name);
  117. Assert.AreEqual(field, messageType.FindDescriptor<FieldDescriptor>("optional_int32"));
  118. Assert.IsNull(messageType.FindDescriptor<FieldDescriptor>("no_such_field"));
  119. Assert.AreEqual(field, messageType.FindFieldByNumber(1));
  120. Assert.IsNull(messageType.FindFieldByNumber(571283));
  121. for (int i = 0; i < messageType.Fields.Count; i++)
  122. {
  123. Assert.AreEqual(i, messageType.Fields[i].Index);
  124. }
  125. Assert.AreEqual(nestedType, messageType.NestedTypes[0]);
  126. Assert.AreEqual(nestedType, messageType.FindDescriptor<MessageDescriptor>("NestedMessage"));
  127. Assert.IsNull(messageType.FindDescriptor<MessageDescriptor>("NoSuchType"));
  128. for (int i = 0; i < messageType.NestedTypes.Count; i++)
  129. {
  130. Assert.AreEqual(i, messageType.NestedTypes[i].Index);
  131. }
  132. Assert.AreEqual(messageType.EnumTypes[0], messageType.FindDescriptor<EnumDescriptor>("NestedEnum"));
  133. Assert.IsNull(messageType.FindDescriptor<EnumDescriptor>("NoSuchType"));
  134. for (int i = 0; i < messageType.EnumTypes.Count; i++)
  135. {
  136. Assert.AreEqual(i, messageType.EnumTypes[i].Index);
  137. }
  138. }
  139. [TestMethod]
  140. public void FieldDescriptor()
  141. {
  142. MessageDescriptor messageType = TestAllTypes.Descriptor;
  143. FieldDescriptor primitiveField = messageType.FindDescriptor<FieldDescriptor>("optional_int32");
  144. FieldDescriptor enumField = messageType.FindDescriptor<FieldDescriptor>("optional_nested_enum");
  145. FieldDescriptor messageField = messageType.FindDescriptor<FieldDescriptor>("optional_foreign_message");
  146. FieldDescriptor cordField = messageType.FindDescriptor<FieldDescriptor>("optional_cord");
  147. FieldDescriptor extension = UnitTestProtoFile.OptionalInt32Extension.Descriptor;
  148. FieldDescriptor nestedExtension = TestRequired.Single.Descriptor;
  149. Assert.AreEqual("optional_int32", primitiveField.Name);
  150. Assert.AreEqual("protobuf_unittest.TestAllTypes.optional_int32",
  151. primitiveField.FullName);
  152. Assert.AreEqual(1, primitiveField.FieldNumber);
  153. Assert.AreEqual(messageType, primitiveField.ContainingType);
  154. Assert.AreEqual(UnitTestProtoFile.Descriptor, primitiveField.File);
  155. Assert.AreEqual(FieldType.Int32, primitiveField.FieldType);
  156. Assert.AreEqual(MappedType.Int32, primitiveField.MappedType);
  157. Assert.AreEqual(DescriptorProtos.FieldOptions.DefaultInstance, primitiveField.Options);
  158. Assert.IsFalse(primitiveField.IsExtension);
  159. Assert.AreEqual("optional_int32", primitiveField.Proto.Name);
  160. Assert.AreEqual("optional_nested_enum", enumField.Name);
  161. Assert.AreEqual(FieldType.Enum, enumField.FieldType);
  162. Assert.AreEqual(MappedType.Enum, enumField.MappedType);
  163. // Assert.AreEqual(TestAllTypes.Types.NestedEnum.Descriptor, enumField.EnumType);
  164. Assert.AreEqual("optional_foreign_message", messageField.Name);
  165. Assert.AreEqual(FieldType.Message, messageField.FieldType);
  166. Assert.AreEqual(MappedType.Message, messageField.MappedType);
  167. Assert.AreEqual(ForeignMessage.Descriptor, messageField.MessageType);
  168. Assert.AreEqual("optional_cord", cordField.Name);
  169. Assert.AreEqual(FieldType.String, cordField.FieldType);
  170. Assert.AreEqual(MappedType.String, cordField.MappedType);
  171. Assert.AreEqual(DescriptorProtos.FieldOptions.Types.CType.CORD, cordField.Options.Ctype);
  172. Assert.AreEqual("optional_int32_extension", extension.Name);
  173. Assert.AreEqual("protobuf_unittest.optional_int32_extension", extension.FullName);
  174. Assert.AreEqual(1, extension.FieldNumber);
  175. Assert.AreEqual(TestAllExtensions.Descriptor, extension.ContainingType);
  176. Assert.AreEqual(UnitTestProtoFile.Descriptor, extension.File);
  177. Assert.AreEqual(FieldType.Int32, extension.FieldType);
  178. Assert.AreEqual(MappedType.Int32, extension.MappedType);
  179. Assert.AreEqual(DescriptorProtos.FieldOptions.DefaultInstance,
  180. extension.Options);
  181. Assert.IsTrue(extension.IsExtension);
  182. Assert.AreEqual(null, extension.ExtensionScope);
  183. Assert.AreEqual("optional_int32_extension", extension.Proto.Name);
  184. Assert.AreEqual("single", nestedExtension.Name);
  185. Assert.AreEqual("protobuf_unittest.TestRequired.single",
  186. nestedExtension.FullName);
  187. Assert.AreEqual(TestRequired.Descriptor,
  188. nestedExtension.ExtensionScope);
  189. }
  190. [TestMethod]
  191. public void FieldDescriptorLabel()
  192. {
  193. FieldDescriptor requiredField =
  194. TestRequired.Descriptor.FindDescriptor<FieldDescriptor>("a");
  195. FieldDescriptor optionalField =
  196. TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("optional_int32");
  197. FieldDescriptor repeatedField =
  198. TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("repeated_int32");
  199. Assert.IsTrue(requiredField.IsRequired);
  200. Assert.IsFalse(requiredField.IsRepeated);
  201. Assert.IsFalse(optionalField.IsRequired);
  202. Assert.IsFalse(optionalField.IsRepeated);
  203. Assert.IsFalse(repeatedField.IsRequired);
  204. Assert.IsTrue(repeatedField.IsRepeated);
  205. }
  206. #if !SILVERLIGHT
  207. [TestMethod]
  208. public void FieldDescriptorDefault()
  209. {
  210. MessageDescriptor d = TestAllTypes.Descriptor;
  211. Assert.IsFalse(d.FindDescriptor<FieldDescriptor>("optional_int32").HasDefaultValue);
  212. Assert.AreEqual<object>(0, d.FindDescriptor<FieldDescriptor>("optional_int32").DefaultValue);
  213. Assert.IsTrue(d.FindDescriptor<FieldDescriptor>("default_int32").HasDefaultValue);
  214. Assert.AreEqual<object>(41, d.FindDescriptor<FieldDescriptor>("default_int32").DefaultValue);
  215. d = TestExtremeDefaultValues.Descriptor;
  216. Assert.AreEqual<object>(
  217. ByteString.CopyFrom("\u0000\u0001\u0007\b\f\n\r\t\u000b\\\'\"\u00fe", Encoding.GetEncoding("iso-8859-1")),
  218. d.FindDescriptor<FieldDescriptor>("escaped_bytes").DefaultValue);
  219. Assert.AreEqual<object>(uint.MaxValue, d.FindDescriptor<FieldDescriptor>("large_uint32").DefaultValue);
  220. Assert.AreEqual<object>(ulong.MaxValue, d.FindDescriptor<FieldDescriptor>("large_uint64").DefaultValue);
  221. }
  222. #endif
  223. [TestMethod]
  224. public void EnumDescriptor()
  225. {
  226. // Note: this test is a bit different to the Java version because there's no static way of getting to the descriptor
  227. EnumDescriptor enumType = UnitTestProtoFile.Descriptor.FindTypeByName<EnumDescriptor>("ForeignEnum");
  228. EnumDescriptor nestedType = TestAllTypes.Descriptor.FindDescriptor<EnumDescriptor>("NestedEnum");
  229. Assert.AreEqual("ForeignEnum", enumType.Name);
  230. Assert.AreEqual("protobuf_unittest.ForeignEnum", enumType.FullName);
  231. Assert.AreEqual(UnitTestProtoFile.Descriptor, enumType.File);
  232. Assert.IsNull(enumType.ContainingType);
  233. Assert.AreEqual(DescriptorProtos.EnumOptions.DefaultInstance,
  234. enumType.Options);
  235. Assert.AreEqual("NestedEnum", nestedType.Name);
  236. Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedEnum",
  237. nestedType.FullName);
  238. Assert.AreEqual(UnitTestProtoFile.Descriptor, nestedType.File);
  239. Assert.AreEqual(TestAllTypes.Descriptor, nestedType.ContainingType);
  240. EnumValueDescriptor value = enumType.FindValueByName("FOREIGN_FOO");
  241. Assert.AreEqual(value, enumType.Values[0]);
  242. Assert.AreEqual("FOREIGN_FOO", value.Name);
  243. Assert.AreEqual(4, value.Number);
  244. Assert.AreEqual((int) ForeignEnum.FOREIGN_FOO, value.Number);
  245. Assert.AreEqual(value, enumType.FindValueByNumber(4));
  246. Assert.IsNull(enumType.FindValueByName("NO_SUCH_VALUE"));
  247. for (int i = 0; i < enumType.Values.Count; i++)
  248. {
  249. Assert.AreEqual(i, enumType.Values[i].Index);
  250. }
  251. }
  252. [TestMethod]
  253. public void ServiceDescriptor()
  254. {
  255. ServiceDescriptor service = TestGenericService.Descriptor;
  256. Assert.AreEqual("TestGenericService", service.Name);
  257. Assert.AreEqual("protobuf_unittest.TestGenericService", service.FullName);
  258. Assert.AreEqual(UnitTestGenericServices.Descriptor, service.File);
  259. Assert.AreEqual(2, service.Methods.Count);
  260. MethodDescriptor fooMethod = service.Methods[0];
  261. Assert.AreEqual("Foo", fooMethod.Name);
  262. Assert.AreEqual(FooRequest.Descriptor, fooMethod.InputType);
  263. Assert.AreEqual(FooResponse.Descriptor, fooMethod.OutputType);
  264. Assert.AreEqual(fooMethod, service.FindMethodByName("Foo"));
  265. MethodDescriptor barMethod = service.Methods[1];
  266. Assert.AreEqual("Bar", barMethod.Name);
  267. Assert.AreEqual(BarRequest.Descriptor, barMethod.InputType);
  268. Assert.AreEqual(BarResponse.Descriptor, barMethod.OutputType);
  269. Assert.AreEqual(barMethod, service.FindMethodByName("Bar"));
  270. Assert.IsNull(service.FindMethodByName("NoSuchMethod"));
  271. for (int i = 0; i < service.Methods.Count; i++)
  272. {
  273. Assert.AreEqual(i, service.Methods[i].Index);
  274. }
  275. }
  276. [TestMethod]
  277. public void CustomOptions()
  278. {
  279. MessageDescriptor descriptor = TestMessageWithCustomOptions.Descriptor;
  280. Assert.IsTrue(descriptor.Options.HasExtension(UnitTestCustomOptionsProtoFile.MessageOpt1));
  281. Assert.AreEqual(-56, descriptor.Options.GetExtension(UnitTestCustomOptionsProtoFile.MessageOpt1));
  282. FieldDescriptor field = descriptor.FindFieldByName("field1");
  283. Assert.IsNotNull(field);
  284. Assert.IsTrue(field.Options.HasExtension(UnitTestCustomOptionsProtoFile.FieldOpt1));
  285. Assert.AreEqual(8765432109uL, field.Options.GetExtension(UnitTestCustomOptionsProtoFile.FieldOpt1));
  286. // TODO: Write out enum descriptors
  287. /*
  288. EnumDescriptor enumType = TestMessageWithCustomOptions.Types.
  289. UnittestCustomOptions.TestMessageWithCustomOptions.AnEnum.getDescriptor();
  290. Assert.IsTrue(
  291. enumType.getOptions().hasExtension(UnittestCustomOptions.enumOpt1));
  292. Assert.AreEqual(Integer.valueOf(-789),
  293. enumType.getOptions().getExtension(UnittestCustomOptions.enumOpt1));
  294. */
  295. ServiceDescriptor service = TestGenericServiceWithCustomOptions.Descriptor;
  296. Assert.IsTrue(service.Options.HasExtension(UnitTestCustomOptionsProtoFile.ServiceOpt1));
  297. Assert.AreEqual(-9876543210L, service.Options.GetExtension(UnitTestCustomOptionsProtoFile.ServiceOpt1));
  298. MethodDescriptor method = service.FindMethodByName("Foo");
  299. Assert.IsNotNull(method);
  300. Assert.IsTrue(method.Options.HasExtension(UnitTestCustomOptionsProtoFile.MethodOpt1));
  301. Assert.AreEqual(MethodOpt1.METHODOPT1_VAL2,
  302. method.Options.GetExtension(UnitTestCustomOptionsProtoFile.MethodOpt1));
  303. }
  304. }
  305. }