PageRenderTime 59ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/src/google/protobuf/descriptor_unittest.cc

http://protobuf.googlecode.com/
C++ | 4656 lines | 3487 code | 698 blank | 471 comment | 216 complexity | 7280232872d931e5bd7f3d311cdaa6b9 MD5 | raw file
Possible License(s): BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc. All rights reserved.
  3. // http://code.google.com/p/protobuf/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. // Author: kenton@google.com (Kenton Varda)
  31. // Based on original Protocol Buffers design by
  32. // Sanjay Ghemawat, Jeff Dean, and others.
  33. //
  34. // This file makes extensive use of RFC 3092. :)
  35. #include <vector>
  36. #include <google/protobuf/compiler/importer.h>
  37. #include <google/protobuf/unittest.pb.h>
  38. #include <google/protobuf/unittest_custom_options.pb.h>
  39. #include <google/protobuf/io/zero_copy_stream_impl.h>
  40. #include <google/protobuf/descriptor.pb.h>
  41. #include <google/protobuf/descriptor.h>
  42. #include <google/protobuf/descriptor_database.h>
  43. #include <google/protobuf/dynamic_message.h>
  44. #include <google/protobuf/text_format.h>
  45. #include <google/protobuf/stubs/strutil.h>
  46. #include <google/protobuf/stubs/substitute.h>
  47. #include <google/protobuf/stubs/common.h>
  48. #include <google/protobuf/testing/googletest.h>
  49. #include <gtest/gtest.h>
  50. namespace google {
  51. namespace protobuf {
  52. // Can't use an anonymous namespace here due to brokenness of Tru64 compiler.
  53. namespace descriptor_unittest {
  54. // Some helpers to make assembling descriptors faster.
  55. DescriptorProto* AddMessage(FileDescriptorProto* file, const string& name) {
  56. DescriptorProto* result = file->add_message_type();
  57. result->set_name(name);
  58. return result;
  59. }
  60. DescriptorProto* AddNestedMessage(DescriptorProto* parent, const string& name) {
  61. DescriptorProto* result = parent->add_nested_type();
  62. result->set_name(name);
  63. return result;
  64. }
  65. EnumDescriptorProto* AddEnum(FileDescriptorProto* file, const string& name) {
  66. EnumDescriptorProto* result = file->add_enum_type();
  67. result->set_name(name);
  68. return result;
  69. }
  70. EnumDescriptorProto* AddNestedEnum(DescriptorProto* parent,
  71. const string& name) {
  72. EnumDescriptorProto* result = parent->add_enum_type();
  73. result->set_name(name);
  74. return result;
  75. }
  76. ServiceDescriptorProto* AddService(FileDescriptorProto* file,
  77. const string& name) {
  78. ServiceDescriptorProto* result = file->add_service();
  79. result->set_name(name);
  80. return result;
  81. }
  82. FieldDescriptorProto* AddField(DescriptorProto* parent,
  83. const string& name, int number,
  84. FieldDescriptorProto::Label label,
  85. FieldDescriptorProto::Type type) {
  86. FieldDescriptorProto* result = parent->add_field();
  87. result->set_name(name);
  88. result->set_number(number);
  89. result->set_label(label);
  90. result->set_type(type);
  91. return result;
  92. }
  93. FieldDescriptorProto* AddExtension(FileDescriptorProto* file,
  94. const string& extendee,
  95. const string& name, int number,
  96. FieldDescriptorProto::Label label,
  97. FieldDescriptorProto::Type type) {
  98. FieldDescriptorProto* result = file->add_extension();
  99. result->set_name(name);
  100. result->set_number(number);
  101. result->set_label(label);
  102. result->set_type(type);
  103. result->set_extendee(extendee);
  104. return result;
  105. }
  106. FieldDescriptorProto* AddNestedExtension(DescriptorProto* parent,
  107. const string& extendee,
  108. const string& name, int number,
  109. FieldDescriptorProto::Label label,
  110. FieldDescriptorProto::Type type) {
  111. FieldDescriptorProto* result = parent->add_extension();
  112. result->set_name(name);
  113. result->set_number(number);
  114. result->set_label(label);
  115. result->set_type(type);
  116. result->set_extendee(extendee);
  117. return result;
  118. }
  119. DescriptorProto::ExtensionRange* AddExtensionRange(DescriptorProto* parent,
  120. int start, int end) {
  121. DescriptorProto::ExtensionRange* result = parent->add_extension_range();
  122. result->set_start(start);
  123. result->set_end(end);
  124. return result;
  125. }
  126. EnumValueDescriptorProto* AddEnumValue(EnumDescriptorProto* enum_proto,
  127. const string& name, int number) {
  128. EnumValueDescriptorProto* result = enum_proto->add_value();
  129. result->set_name(name);
  130. result->set_number(number);
  131. return result;
  132. }
  133. MethodDescriptorProto* AddMethod(ServiceDescriptorProto* service,
  134. const string& name,
  135. const string& input_type,
  136. const string& output_type) {
  137. MethodDescriptorProto* result = service->add_method();
  138. result->set_name(name);
  139. result->set_input_type(input_type);
  140. result->set_output_type(output_type);
  141. return result;
  142. }
  143. // Empty enums technically aren't allowed. We need to insert a dummy value
  144. // into them.
  145. void AddEmptyEnum(FileDescriptorProto* file, const string& name) {
  146. AddEnumValue(AddEnum(file, name), name + "_DUMMY", 1);
  147. }
  148. // ===================================================================
  149. // Test simple files.
  150. class FileDescriptorTest : public testing::Test {
  151. protected:
  152. virtual void SetUp() {
  153. // Build descriptors for the following definitions:
  154. //
  155. // // in "foo.proto"
  156. // message FooMessage { extensions 1; }
  157. // enum FooEnum {FOO_ENUM_VALUE = 1;}
  158. // service FooService {}
  159. // extend FooMessage { optional int32 foo_extension = 1; }
  160. //
  161. // // in "bar.proto"
  162. // package bar_package;
  163. // message BarMessage { extensions 1; }
  164. // enum BarEnum {BAR_ENUM_VALUE = 1;}
  165. // service BarService {}
  166. // extend BarMessage { optional int32 bar_extension = 1; }
  167. //
  168. // Also, we have an empty file "baz.proto". This file's purpose is to
  169. // make sure that even though it has the same package as foo.proto,
  170. // searching it for members of foo.proto won't work.
  171. FileDescriptorProto foo_file;
  172. foo_file.set_name("foo.proto");
  173. AddExtensionRange(AddMessage(&foo_file, "FooMessage"), 1, 2);
  174. AddEnumValue(AddEnum(&foo_file, "FooEnum"), "FOO_ENUM_VALUE", 1);
  175. AddService(&foo_file, "FooService");
  176. AddExtension(&foo_file, "FooMessage", "foo_extension", 1,
  177. FieldDescriptorProto::LABEL_OPTIONAL,
  178. FieldDescriptorProto::TYPE_INT32);
  179. FileDescriptorProto bar_file;
  180. bar_file.set_name("bar.proto");
  181. bar_file.set_package("bar_package");
  182. bar_file.add_dependency("foo.proto");
  183. AddExtensionRange(AddMessage(&bar_file, "BarMessage"), 1, 2);
  184. AddEnumValue(AddEnum(&bar_file, "BarEnum"), "BAR_ENUM_VALUE", 1);
  185. AddService(&bar_file, "BarService");
  186. AddExtension(&bar_file, "bar_package.BarMessage", "bar_extension", 1,
  187. FieldDescriptorProto::LABEL_OPTIONAL,
  188. FieldDescriptorProto::TYPE_INT32);
  189. FileDescriptorProto baz_file;
  190. baz_file.set_name("baz.proto");
  191. // Build the descriptors and get the pointers.
  192. foo_file_ = pool_.BuildFile(foo_file);
  193. ASSERT_TRUE(foo_file_ != NULL);
  194. bar_file_ = pool_.BuildFile(bar_file);
  195. ASSERT_TRUE(bar_file_ != NULL);
  196. baz_file_ = pool_.BuildFile(baz_file);
  197. ASSERT_TRUE(baz_file_ != NULL);
  198. ASSERT_EQ(1, foo_file_->message_type_count());
  199. foo_message_ = foo_file_->message_type(0);
  200. ASSERT_EQ(1, foo_file_->enum_type_count());
  201. foo_enum_ = foo_file_->enum_type(0);
  202. ASSERT_EQ(1, foo_enum_->value_count());
  203. foo_enum_value_ = foo_enum_->value(0);
  204. ASSERT_EQ(1, foo_file_->service_count());
  205. foo_service_ = foo_file_->service(0);
  206. ASSERT_EQ(1, foo_file_->extension_count());
  207. foo_extension_ = foo_file_->extension(0);
  208. ASSERT_EQ(1, bar_file_->message_type_count());
  209. bar_message_ = bar_file_->message_type(0);
  210. ASSERT_EQ(1, bar_file_->enum_type_count());
  211. bar_enum_ = bar_file_->enum_type(0);
  212. ASSERT_EQ(1, bar_enum_->value_count());
  213. bar_enum_value_ = bar_enum_->value(0);
  214. ASSERT_EQ(1, bar_file_->service_count());
  215. bar_service_ = bar_file_->service(0);
  216. ASSERT_EQ(1, bar_file_->extension_count());
  217. bar_extension_ = bar_file_->extension(0);
  218. }
  219. DescriptorPool pool_;
  220. const FileDescriptor* foo_file_;
  221. const FileDescriptor* bar_file_;
  222. const FileDescriptor* baz_file_;
  223. const Descriptor* foo_message_;
  224. const EnumDescriptor* foo_enum_;
  225. const EnumValueDescriptor* foo_enum_value_;
  226. const ServiceDescriptor* foo_service_;
  227. const FieldDescriptor* foo_extension_;
  228. const Descriptor* bar_message_;
  229. const EnumDescriptor* bar_enum_;
  230. const EnumValueDescriptor* bar_enum_value_;
  231. const ServiceDescriptor* bar_service_;
  232. const FieldDescriptor* bar_extension_;
  233. };
  234. TEST_F(FileDescriptorTest, Name) {
  235. EXPECT_EQ("foo.proto", foo_file_->name());
  236. EXPECT_EQ("bar.proto", bar_file_->name());
  237. EXPECT_EQ("baz.proto", baz_file_->name());
  238. }
  239. TEST_F(FileDescriptorTest, Package) {
  240. EXPECT_EQ("", foo_file_->package());
  241. EXPECT_EQ("bar_package", bar_file_->package());
  242. }
  243. TEST_F(FileDescriptorTest, Dependencies) {
  244. EXPECT_EQ(0, foo_file_->dependency_count());
  245. EXPECT_EQ(1, bar_file_->dependency_count());
  246. EXPECT_EQ(foo_file_, bar_file_->dependency(0));
  247. }
  248. TEST_F(FileDescriptorTest, FindMessageTypeByName) {
  249. EXPECT_EQ(foo_message_, foo_file_->FindMessageTypeByName("FooMessage"));
  250. EXPECT_EQ(bar_message_, bar_file_->FindMessageTypeByName("BarMessage"));
  251. EXPECT_TRUE(foo_file_->FindMessageTypeByName("BarMessage") == NULL);
  252. EXPECT_TRUE(bar_file_->FindMessageTypeByName("FooMessage") == NULL);
  253. EXPECT_TRUE(baz_file_->FindMessageTypeByName("FooMessage") == NULL);
  254. EXPECT_TRUE(foo_file_->FindMessageTypeByName("NoSuchMessage") == NULL);
  255. EXPECT_TRUE(foo_file_->FindMessageTypeByName("FooEnum") == NULL);
  256. }
  257. TEST_F(FileDescriptorTest, FindEnumTypeByName) {
  258. EXPECT_EQ(foo_enum_, foo_file_->FindEnumTypeByName("FooEnum"));
  259. EXPECT_EQ(bar_enum_, bar_file_->FindEnumTypeByName("BarEnum"));
  260. EXPECT_TRUE(foo_file_->FindEnumTypeByName("BarEnum") == NULL);
  261. EXPECT_TRUE(bar_file_->FindEnumTypeByName("FooEnum") == NULL);
  262. EXPECT_TRUE(baz_file_->FindEnumTypeByName("FooEnum") == NULL);
  263. EXPECT_TRUE(foo_file_->FindEnumTypeByName("NoSuchEnum") == NULL);
  264. EXPECT_TRUE(foo_file_->FindEnumTypeByName("FooMessage") == NULL);
  265. }
  266. TEST_F(FileDescriptorTest, FindEnumValueByName) {
  267. EXPECT_EQ(foo_enum_value_, foo_file_->FindEnumValueByName("FOO_ENUM_VALUE"));
  268. EXPECT_EQ(bar_enum_value_, bar_file_->FindEnumValueByName("BAR_ENUM_VALUE"));
  269. EXPECT_TRUE(foo_file_->FindEnumValueByName("BAR_ENUM_VALUE") == NULL);
  270. EXPECT_TRUE(bar_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL);
  271. EXPECT_TRUE(baz_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL);
  272. EXPECT_TRUE(foo_file_->FindEnumValueByName("NO_SUCH_VALUE") == NULL);
  273. EXPECT_TRUE(foo_file_->FindEnumValueByName("FooMessage") == NULL);
  274. }
  275. TEST_F(FileDescriptorTest, FindServiceByName) {
  276. EXPECT_EQ(foo_service_, foo_file_->FindServiceByName("FooService"));
  277. EXPECT_EQ(bar_service_, bar_file_->FindServiceByName("BarService"));
  278. EXPECT_TRUE(foo_file_->FindServiceByName("BarService") == NULL);
  279. EXPECT_TRUE(bar_file_->FindServiceByName("FooService") == NULL);
  280. EXPECT_TRUE(baz_file_->FindServiceByName("FooService") == NULL);
  281. EXPECT_TRUE(foo_file_->FindServiceByName("NoSuchService") == NULL);
  282. EXPECT_TRUE(foo_file_->FindServiceByName("FooMessage") == NULL);
  283. }
  284. TEST_F(FileDescriptorTest, FindExtensionByName) {
  285. EXPECT_EQ(foo_extension_, foo_file_->FindExtensionByName("foo_extension"));
  286. EXPECT_EQ(bar_extension_, bar_file_->FindExtensionByName("bar_extension"));
  287. EXPECT_TRUE(foo_file_->FindExtensionByName("bar_extension") == NULL);
  288. EXPECT_TRUE(bar_file_->FindExtensionByName("foo_extension") == NULL);
  289. EXPECT_TRUE(baz_file_->FindExtensionByName("foo_extension") == NULL);
  290. EXPECT_TRUE(foo_file_->FindExtensionByName("no_such_extension") == NULL);
  291. EXPECT_TRUE(foo_file_->FindExtensionByName("FooMessage") == NULL);
  292. }
  293. TEST_F(FileDescriptorTest, FindExtensionByNumber) {
  294. EXPECT_EQ(foo_extension_, pool_.FindExtensionByNumber(foo_message_, 1));
  295. EXPECT_EQ(bar_extension_, pool_.FindExtensionByNumber(bar_message_, 1));
  296. EXPECT_TRUE(pool_.FindExtensionByNumber(foo_message_, 2) == NULL);
  297. }
  298. TEST_F(FileDescriptorTest, BuildAgain) {
  299. // Test that if te call BuildFile again on the same input we get the same
  300. // FileDescriptor back.
  301. FileDescriptorProto file;
  302. foo_file_->CopyTo(&file);
  303. EXPECT_EQ(foo_file_, pool_.BuildFile(file));
  304. // But if we change the file then it won't work.
  305. file.set_package("some.other.package");
  306. EXPECT_TRUE(pool_.BuildFile(file) == NULL);
  307. }
  308. // ===================================================================
  309. // Test simple flat messages and fields.
  310. class DescriptorTest : public testing::Test {
  311. protected:
  312. virtual void SetUp() {
  313. // Build descriptors for the following definitions:
  314. //
  315. // // in "foo.proto"
  316. // message TestForeign {}
  317. // enum TestEnum {}
  318. //
  319. // message TestMessage {
  320. // required string foo = 1;
  321. // optional TestEnum bar = 6;
  322. // repeated TestForeign baz = 500000000;
  323. // optional group qux = 15 {}
  324. // }
  325. //
  326. // // in "bar.proto"
  327. // package corge.grault;
  328. // message TestMessage2 {
  329. // required string foo = 1;
  330. // required string bar = 2;
  331. // required string quux = 6;
  332. // }
  333. //
  334. // We cheat and use TestForeign as the type for qux rather than create
  335. // an actual nested type.
  336. //
  337. // Since all primitive types (including string) use the same building
  338. // code, there's no need to test each one individually.
  339. //
  340. // TestMessage2 is primarily here to test FindFieldByName and friends.
  341. // All messages created from the same DescriptorPool share the same lookup
  342. // table, so we need to insure that they don't interfere.
  343. FileDescriptorProto foo_file;
  344. foo_file.set_name("foo.proto");
  345. AddMessage(&foo_file, "TestForeign");
  346. AddEmptyEnum(&foo_file, "TestEnum");
  347. DescriptorProto* message = AddMessage(&foo_file, "TestMessage");
  348. AddField(message, "foo", 1,
  349. FieldDescriptorProto::LABEL_REQUIRED,
  350. FieldDescriptorProto::TYPE_STRING);
  351. AddField(message, "bar", 6,
  352. FieldDescriptorProto::LABEL_OPTIONAL,
  353. FieldDescriptorProto::TYPE_ENUM)
  354. ->set_type_name("TestEnum");
  355. AddField(message, "baz", 500000000,
  356. FieldDescriptorProto::LABEL_REPEATED,
  357. FieldDescriptorProto::TYPE_MESSAGE)
  358. ->set_type_name("TestForeign");
  359. AddField(message, "qux", 15,
  360. FieldDescriptorProto::LABEL_OPTIONAL,
  361. FieldDescriptorProto::TYPE_GROUP)
  362. ->set_type_name("TestForeign");
  363. FileDescriptorProto bar_file;
  364. bar_file.set_name("bar.proto");
  365. bar_file.set_package("corge.grault");
  366. DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2");
  367. AddField(message2, "foo", 1,
  368. FieldDescriptorProto::LABEL_REQUIRED,
  369. FieldDescriptorProto::TYPE_STRING);
  370. AddField(message2, "bar", 2,
  371. FieldDescriptorProto::LABEL_REQUIRED,
  372. FieldDescriptorProto::TYPE_STRING);
  373. AddField(message2, "quux", 6,
  374. FieldDescriptorProto::LABEL_REQUIRED,
  375. FieldDescriptorProto::TYPE_STRING);
  376. // Build the descriptors and get the pointers.
  377. foo_file_ = pool_.BuildFile(foo_file);
  378. ASSERT_TRUE(foo_file_ != NULL);
  379. bar_file_ = pool_.BuildFile(bar_file);
  380. ASSERT_TRUE(bar_file_ != NULL);
  381. ASSERT_EQ(1, foo_file_->enum_type_count());
  382. enum_ = foo_file_->enum_type(0);
  383. ASSERT_EQ(2, foo_file_->message_type_count());
  384. foreign_ = foo_file_->message_type(0);
  385. message_ = foo_file_->message_type(1);
  386. ASSERT_EQ(4, message_->field_count());
  387. foo_ = message_->field(0);
  388. bar_ = message_->field(1);
  389. baz_ = message_->field(2);
  390. qux_ = message_->field(3);
  391. ASSERT_EQ(1, bar_file_->message_type_count());
  392. message2_ = bar_file_->message_type(0);
  393. ASSERT_EQ(3, message2_->field_count());
  394. foo2_ = message2_->field(0);
  395. bar2_ = message2_->field(1);
  396. quux2_ = message2_->field(2);
  397. }
  398. DescriptorPool pool_;
  399. const FileDescriptor* foo_file_;
  400. const FileDescriptor* bar_file_;
  401. const Descriptor* message_;
  402. const Descriptor* message2_;
  403. const Descriptor* foreign_;
  404. const EnumDescriptor* enum_;
  405. const FieldDescriptor* foo_;
  406. const FieldDescriptor* bar_;
  407. const FieldDescriptor* baz_;
  408. const FieldDescriptor* qux_;
  409. const FieldDescriptor* foo2_;
  410. const FieldDescriptor* bar2_;
  411. const FieldDescriptor* quux2_;
  412. };
  413. TEST_F(DescriptorTest, Name) {
  414. EXPECT_EQ("TestMessage", message_->name());
  415. EXPECT_EQ("TestMessage", message_->full_name());
  416. EXPECT_EQ(foo_file_, message_->file());
  417. EXPECT_EQ("TestMessage2", message2_->name());
  418. EXPECT_EQ("corge.grault.TestMessage2", message2_->full_name());
  419. EXPECT_EQ(bar_file_, message2_->file());
  420. }
  421. TEST_F(DescriptorTest, ContainingType) {
  422. EXPECT_TRUE(message_->containing_type() == NULL);
  423. EXPECT_TRUE(message2_->containing_type() == NULL);
  424. }
  425. TEST_F(DescriptorTest, FieldsByIndex) {
  426. ASSERT_EQ(4, message_->field_count());
  427. EXPECT_EQ(foo_, message_->field(0));
  428. EXPECT_EQ(bar_, message_->field(1));
  429. EXPECT_EQ(baz_, message_->field(2));
  430. EXPECT_EQ(qux_, message_->field(3));
  431. }
  432. TEST_F(DescriptorTest, FindFieldByName) {
  433. // All messages in the same DescriptorPool share a single lookup table for
  434. // fields. So, in addition to testing that FindFieldByName finds the fields
  435. // of the message, we need to test that it does *not* find the fields of
  436. // *other* messages.
  437. EXPECT_EQ(foo_, message_->FindFieldByName("foo"));
  438. EXPECT_EQ(bar_, message_->FindFieldByName("bar"));
  439. EXPECT_EQ(baz_, message_->FindFieldByName("baz"));
  440. EXPECT_EQ(qux_, message_->FindFieldByName("qux"));
  441. EXPECT_TRUE(message_->FindFieldByName("no_such_field") == NULL);
  442. EXPECT_TRUE(message_->FindFieldByName("quux") == NULL);
  443. EXPECT_EQ(foo2_ , message2_->FindFieldByName("foo" ));
  444. EXPECT_EQ(bar2_ , message2_->FindFieldByName("bar" ));
  445. EXPECT_EQ(quux2_, message2_->FindFieldByName("quux"));
  446. EXPECT_TRUE(message2_->FindFieldByName("baz") == NULL);
  447. EXPECT_TRUE(message2_->FindFieldByName("qux") == NULL);
  448. }
  449. TEST_F(DescriptorTest, FindFieldByNumber) {
  450. EXPECT_EQ(foo_, message_->FindFieldByNumber(1));
  451. EXPECT_EQ(bar_, message_->FindFieldByNumber(6));
  452. EXPECT_EQ(baz_, message_->FindFieldByNumber(500000000));
  453. EXPECT_EQ(qux_, message_->FindFieldByNumber(15));
  454. EXPECT_TRUE(message_->FindFieldByNumber(837592) == NULL);
  455. EXPECT_TRUE(message_->FindFieldByNumber(2) == NULL);
  456. EXPECT_EQ(foo2_ , message2_->FindFieldByNumber(1));
  457. EXPECT_EQ(bar2_ , message2_->FindFieldByNumber(2));
  458. EXPECT_EQ(quux2_, message2_->FindFieldByNumber(6));
  459. EXPECT_TRUE(message2_->FindFieldByNumber(15) == NULL);
  460. EXPECT_TRUE(message2_->FindFieldByNumber(500000000) == NULL);
  461. }
  462. TEST_F(DescriptorTest, FieldName) {
  463. EXPECT_EQ("foo", foo_->name());
  464. EXPECT_EQ("bar", bar_->name());
  465. EXPECT_EQ("baz", baz_->name());
  466. EXPECT_EQ("qux", qux_->name());
  467. }
  468. TEST_F(DescriptorTest, FieldFullName) {
  469. EXPECT_EQ("TestMessage.foo", foo_->full_name());
  470. EXPECT_EQ("TestMessage.bar", bar_->full_name());
  471. EXPECT_EQ("TestMessage.baz", baz_->full_name());
  472. EXPECT_EQ("TestMessage.qux", qux_->full_name());
  473. EXPECT_EQ("corge.grault.TestMessage2.foo", foo2_->full_name());
  474. EXPECT_EQ("corge.grault.TestMessage2.bar", bar2_->full_name());
  475. EXPECT_EQ("corge.grault.TestMessage2.quux", quux2_->full_name());
  476. }
  477. TEST_F(DescriptorTest, FieldFile) {
  478. EXPECT_EQ(foo_file_, foo_->file());
  479. EXPECT_EQ(foo_file_, bar_->file());
  480. EXPECT_EQ(foo_file_, baz_->file());
  481. EXPECT_EQ(foo_file_, qux_->file());
  482. EXPECT_EQ(bar_file_, foo2_->file());
  483. EXPECT_EQ(bar_file_, bar2_->file());
  484. EXPECT_EQ(bar_file_, quux2_->file());
  485. }
  486. TEST_F(DescriptorTest, FieldIndex) {
  487. EXPECT_EQ(0, foo_->index());
  488. EXPECT_EQ(1, bar_->index());
  489. EXPECT_EQ(2, baz_->index());
  490. EXPECT_EQ(3, qux_->index());
  491. }
  492. TEST_F(DescriptorTest, FieldNumber) {
  493. EXPECT_EQ( 1, foo_->number());
  494. EXPECT_EQ( 6, bar_->number());
  495. EXPECT_EQ(500000000, baz_->number());
  496. EXPECT_EQ( 15, qux_->number());
  497. }
  498. TEST_F(DescriptorTest, FieldType) {
  499. EXPECT_EQ(FieldDescriptor::TYPE_STRING , foo_->type());
  500. EXPECT_EQ(FieldDescriptor::TYPE_ENUM , bar_->type());
  501. EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_->type());
  502. EXPECT_EQ(FieldDescriptor::TYPE_GROUP , qux_->type());
  503. }
  504. TEST_F(DescriptorTest, FieldLabel) {
  505. EXPECT_EQ(FieldDescriptor::LABEL_REQUIRED, foo_->label());
  506. EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->label());
  507. EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, baz_->label());
  508. EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, qux_->label());
  509. EXPECT_TRUE (foo_->is_required());
  510. EXPECT_FALSE(foo_->is_optional());
  511. EXPECT_FALSE(foo_->is_repeated());
  512. EXPECT_FALSE(bar_->is_required());
  513. EXPECT_TRUE (bar_->is_optional());
  514. EXPECT_FALSE(bar_->is_repeated());
  515. EXPECT_FALSE(baz_->is_required());
  516. EXPECT_FALSE(baz_->is_optional());
  517. EXPECT_TRUE (baz_->is_repeated());
  518. }
  519. TEST_F(DescriptorTest, FieldHasDefault) {
  520. EXPECT_FALSE(foo_->has_default_value());
  521. EXPECT_FALSE(bar_->has_default_value());
  522. EXPECT_FALSE(baz_->has_default_value());
  523. EXPECT_FALSE(qux_->has_default_value());
  524. }
  525. TEST_F(DescriptorTest, FieldContainingType) {
  526. EXPECT_EQ(message_, foo_->containing_type());
  527. EXPECT_EQ(message_, bar_->containing_type());
  528. EXPECT_EQ(message_, baz_->containing_type());
  529. EXPECT_EQ(message_, qux_->containing_type());
  530. EXPECT_EQ(message2_, foo2_ ->containing_type());
  531. EXPECT_EQ(message2_, bar2_ ->containing_type());
  532. EXPECT_EQ(message2_, quux2_->containing_type());
  533. }
  534. TEST_F(DescriptorTest, FieldMessageType) {
  535. EXPECT_TRUE(foo_->message_type() == NULL);
  536. EXPECT_TRUE(bar_->message_type() == NULL);
  537. EXPECT_EQ(foreign_, baz_->message_type());
  538. EXPECT_EQ(foreign_, qux_->message_type());
  539. }
  540. TEST_F(DescriptorTest, FieldEnumType) {
  541. EXPECT_TRUE(foo_->enum_type() == NULL);
  542. EXPECT_TRUE(baz_->enum_type() == NULL);
  543. EXPECT_TRUE(qux_->enum_type() == NULL);
  544. EXPECT_EQ(enum_, bar_->enum_type());
  545. }
  546. // ===================================================================
  547. class StylizedFieldNamesTest : public testing::Test {
  548. protected:
  549. void SetUp() {
  550. FileDescriptorProto file;
  551. file.set_name("foo.proto");
  552. AddExtensionRange(AddMessage(&file, "ExtendableMessage"), 1, 1000);
  553. DescriptorProto* message = AddMessage(&file, "TestMessage");
  554. AddField(message, "foo_foo", 1,
  555. FieldDescriptorProto::LABEL_OPTIONAL,
  556. FieldDescriptorProto::TYPE_INT32);
  557. AddField(message, "FooBar", 2,
  558. FieldDescriptorProto::LABEL_OPTIONAL,
  559. FieldDescriptorProto::TYPE_INT32);
  560. AddField(message, "fooBaz", 3,
  561. FieldDescriptorProto::LABEL_OPTIONAL,
  562. FieldDescriptorProto::TYPE_INT32);
  563. AddField(message, "fooFoo", 4, // Camel-case conflict with foo_foo.
  564. FieldDescriptorProto::LABEL_OPTIONAL,
  565. FieldDescriptorProto::TYPE_INT32);
  566. AddField(message, "foobar", 5, // Lower-case conflict with FooBar.
  567. FieldDescriptorProto::LABEL_OPTIONAL,
  568. FieldDescriptorProto::TYPE_INT32);
  569. AddNestedExtension(message, "ExtendableMessage", "bar_foo", 1,
  570. FieldDescriptorProto::LABEL_OPTIONAL,
  571. FieldDescriptorProto::TYPE_INT32);
  572. AddNestedExtension(message, "ExtendableMessage", "BarBar", 2,
  573. FieldDescriptorProto::LABEL_OPTIONAL,
  574. FieldDescriptorProto::TYPE_INT32);
  575. AddNestedExtension(message, "ExtendableMessage", "BarBaz", 3,
  576. FieldDescriptorProto::LABEL_OPTIONAL,
  577. FieldDescriptorProto::TYPE_INT32);
  578. AddNestedExtension(message, "ExtendableMessage", "barFoo", 4, // Conflict
  579. FieldDescriptorProto::LABEL_OPTIONAL,
  580. FieldDescriptorProto::TYPE_INT32);
  581. AddNestedExtension(message, "ExtendableMessage", "barbar", 5, // Conflict
  582. FieldDescriptorProto::LABEL_OPTIONAL,
  583. FieldDescriptorProto::TYPE_INT32);
  584. AddExtension(&file, "ExtendableMessage", "baz_foo", 11,
  585. FieldDescriptorProto::LABEL_OPTIONAL,
  586. FieldDescriptorProto::TYPE_INT32);
  587. AddExtension(&file, "ExtendableMessage", "BazBar", 12,
  588. FieldDescriptorProto::LABEL_OPTIONAL,
  589. FieldDescriptorProto::TYPE_INT32);
  590. AddExtension(&file, "ExtendableMessage", "BazBaz", 13,
  591. FieldDescriptorProto::LABEL_OPTIONAL,
  592. FieldDescriptorProto::TYPE_INT32);
  593. AddExtension(&file, "ExtendableMessage", "bazFoo", 14, // Conflict
  594. FieldDescriptorProto::LABEL_OPTIONAL,
  595. FieldDescriptorProto::TYPE_INT32);
  596. AddExtension(&file, "ExtendableMessage", "bazbar", 15, // Conflict
  597. FieldDescriptorProto::LABEL_OPTIONAL,
  598. FieldDescriptorProto::TYPE_INT32);
  599. file_ = pool_.BuildFile(file);
  600. ASSERT_TRUE(file_ != NULL);
  601. ASSERT_EQ(2, file_->message_type_count());
  602. message_ = file_->message_type(1);
  603. ASSERT_EQ("TestMessage", message_->name());
  604. ASSERT_EQ(5, message_->field_count());
  605. ASSERT_EQ(5, message_->extension_count());
  606. ASSERT_EQ(5, file_->extension_count());
  607. }
  608. DescriptorPool pool_;
  609. const FileDescriptor* file_;
  610. const Descriptor* message_;
  611. };
  612. TEST_F(StylizedFieldNamesTest, LowercaseName) {
  613. EXPECT_EQ("foo_foo", message_->field(0)->lowercase_name());
  614. EXPECT_EQ("foobar" , message_->field(1)->lowercase_name());
  615. EXPECT_EQ("foobaz" , message_->field(2)->lowercase_name());
  616. EXPECT_EQ("foofoo" , message_->field(3)->lowercase_name());
  617. EXPECT_EQ("foobar" , message_->field(4)->lowercase_name());
  618. EXPECT_EQ("bar_foo", message_->extension(0)->lowercase_name());
  619. EXPECT_EQ("barbar" , message_->extension(1)->lowercase_name());
  620. EXPECT_EQ("barbaz" , message_->extension(2)->lowercase_name());
  621. EXPECT_EQ("barfoo" , message_->extension(3)->lowercase_name());
  622. EXPECT_EQ("barbar" , message_->extension(4)->lowercase_name());
  623. EXPECT_EQ("baz_foo", file_->extension(0)->lowercase_name());
  624. EXPECT_EQ("bazbar" , file_->extension(1)->lowercase_name());
  625. EXPECT_EQ("bazbaz" , file_->extension(2)->lowercase_name());
  626. EXPECT_EQ("bazfoo" , file_->extension(3)->lowercase_name());
  627. EXPECT_EQ("bazbar" , file_->extension(4)->lowercase_name());
  628. }
  629. TEST_F(StylizedFieldNamesTest, CamelcaseName) {
  630. EXPECT_EQ("fooFoo", message_->field(0)->camelcase_name());
  631. EXPECT_EQ("fooBar", message_->field(1)->camelcase_name());
  632. EXPECT_EQ("fooBaz", message_->field(2)->camelcase_name());
  633. EXPECT_EQ("fooFoo", message_->field(3)->camelcase_name());
  634. EXPECT_EQ("foobar", message_->field(4)->camelcase_name());
  635. EXPECT_EQ("barFoo", message_->extension(0)->camelcase_name());
  636. EXPECT_EQ("barBar", message_->extension(1)->camelcase_name());
  637. EXPECT_EQ("barBaz", message_->extension(2)->camelcase_name());
  638. EXPECT_EQ("barFoo", message_->extension(3)->camelcase_name());
  639. EXPECT_EQ("barbar", message_->extension(4)->camelcase_name());
  640. EXPECT_EQ("bazFoo", file_->extension(0)->camelcase_name());
  641. EXPECT_EQ("bazBar", file_->extension(1)->camelcase_name());
  642. EXPECT_EQ("bazBaz", file_->extension(2)->camelcase_name());
  643. EXPECT_EQ("bazFoo", file_->extension(3)->camelcase_name());
  644. EXPECT_EQ("bazbar", file_->extension(4)->camelcase_name());
  645. }
  646. TEST_F(StylizedFieldNamesTest, FindByLowercaseName) {
  647. EXPECT_EQ(message_->field(0),
  648. message_->FindFieldByLowercaseName("foo_foo"));
  649. EXPECT_EQ(message_->field(1),
  650. message_->FindFieldByLowercaseName("foobar"));
  651. EXPECT_EQ(message_->field(2),
  652. message_->FindFieldByLowercaseName("foobaz"));
  653. EXPECT_TRUE(message_->FindFieldByLowercaseName("FooBar") == NULL);
  654. EXPECT_TRUE(message_->FindFieldByLowercaseName("fooBaz") == NULL);
  655. EXPECT_TRUE(message_->FindFieldByLowercaseName("bar_foo") == NULL);
  656. EXPECT_TRUE(message_->FindFieldByLowercaseName("nosuchfield") == NULL);
  657. EXPECT_EQ(message_->extension(0),
  658. message_->FindExtensionByLowercaseName("bar_foo"));
  659. EXPECT_EQ(message_->extension(1),
  660. message_->FindExtensionByLowercaseName("barbar"));
  661. EXPECT_EQ(message_->extension(2),
  662. message_->FindExtensionByLowercaseName("barbaz"));
  663. EXPECT_TRUE(message_->FindExtensionByLowercaseName("BarBar") == NULL);
  664. EXPECT_TRUE(message_->FindExtensionByLowercaseName("barBaz") == NULL);
  665. EXPECT_TRUE(message_->FindExtensionByLowercaseName("foo_foo") == NULL);
  666. EXPECT_TRUE(message_->FindExtensionByLowercaseName("nosuchfield") == NULL);
  667. EXPECT_EQ(file_->extension(0),
  668. file_->FindExtensionByLowercaseName("baz_foo"));
  669. EXPECT_EQ(file_->extension(1),
  670. file_->FindExtensionByLowercaseName("bazbar"));
  671. EXPECT_EQ(file_->extension(2),
  672. file_->FindExtensionByLowercaseName("bazbaz"));
  673. EXPECT_TRUE(file_->FindExtensionByLowercaseName("BazBar") == NULL);
  674. EXPECT_TRUE(file_->FindExtensionByLowercaseName("bazBaz") == NULL);
  675. EXPECT_TRUE(file_->FindExtensionByLowercaseName("nosuchfield") == NULL);
  676. }
  677. TEST_F(StylizedFieldNamesTest, FindByCamelcaseName) {
  678. EXPECT_EQ(message_->field(0),
  679. message_->FindFieldByCamelcaseName("fooFoo"));
  680. EXPECT_EQ(message_->field(1),
  681. message_->FindFieldByCamelcaseName("fooBar"));
  682. EXPECT_EQ(message_->field(2),
  683. message_->FindFieldByCamelcaseName("fooBaz"));
  684. EXPECT_TRUE(message_->FindFieldByCamelcaseName("foo_foo") == NULL);
  685. EXPECT_TRUE(message_->FindFieldByCamelcaseName("FooBar") == NULL);
  686. EXPECT_TRUE(message_->FindFieldByCamelcaseName("barFoo") == NULL);
  687. EXPECT_TRUE(message_->FindFieldByCamelcaseName("nosuchfield") == NULL);
  688. EXPECT_EQ(message_->extension(0),
  689. message_->FindExtensionByCamelcaseName("barFoo"));
  690. EXPECT_EQ(message_->extension(1),
  691. message_->FindExtensionByCamelcaseName("barBar"));
  692. EXPECT_EQ(message_->extension(2),
  693. message_->FindExtensionByCamelcaseName("barBaz"));
  694. EXPECT_TRUE(message_->FindExtensionByCamelcaseName("bar_foo") == NULL);
  695. EXPECT_TRUE(message_->FindExtensionByCamelcaseName("BarBar") == NULL);
  696. EXPECT_TRUE(message_->FindExtensionByCamelcaseName("fooFoo") == NULL);
  697. EXPECT_TRUE(message_->FindExtensionByCamelcaseName("nosuchfield") == NULL);
  698. EXPECT_EQ(file_->extension(0),
  699. file_->FindExtensionByCamelcaseName("bazFoo"));
  700. EXPECT_EQ(file_->extension(1),
  701. file_->FindExtensionByCamelcaseName("bazBar"));
  702. EXPECT_EQ(file_->extension(2),
  703. file_->FindExtensionByCamelcaseName("bazBaz"));
  704. EXPECT_TRUE(file_->FindExtensionByCamelcaseName("baz_foo") == NULL);
  705. EXPECT_TRUE(file_->FindExtensionByCamelcaseName("BazBar") == NULL);
  706. EXPECT_TRUE(file_->FindExtensionByCamelcaseName("nosuchfield") == NULL);
  707. }
  708. // ===================================================================
  709. // Test enum descriptors.
  710. class EnumDescriptorTest : public testing::Test {
  711. protected:
  712. virtual void SetUp() {
  713. // Build descriptors for the following definitions:
  714. //
  715. // // in "foo.proto"
  716. // enum TestEnum {
  717. // FOO = 1;
  718. // BAR = 2;
  719. // }
  720. //
  721. // // in "bar.proto"
  722. // package corge.grault;
  723. // enum TestEnum2 {
  724. // FOO = 1;
  725. // BAZ = 3;
  726. // }
  727. //
  728. // TestEnum2 is primarily here to test FindValueByName and friends.
  729. // All enums created from the same DescriptorPool share the same lookup
  730. // table, so we need to insure that they don't interfere.
  731. // TestEnum
  732. FileDescriptorProto foo_file;
  733. foo_file.set_name("foo.proto");
  734. EnumDescriptorProto* enum_proto = AddEnum(&foo_file, "TestEnum");
  735. AddEnumValue(enum_proto, "FOO", 1);
  736. AddEnumValue(enum_proto, "BAR", 2);
  737. // TestEnum2
  738. FileDescriptorProto bar_file;
  739. bar_file.set_name("bar.proto");
  740. bar_file.set_package("corge.grault");
  741. EnumDescriptorProto* enum2_proto = AddEnum(&bar_file, "TestEnum2");
  742. AddEnumValue(enum2_proto, "FOO", 1);
  743. AddEnumValue(enum2_proto, "BAZ", 3);
  744. // Build the descriptors and get the pointers.
  745. foo_file_ = pool_.BuildFile(foo_file);
  746. ASSERT_TRUE(foo_file_ != NULL);
  747. bar_file_ = pool_.BuildFile(bar_file);
  748. ASSERT_TRUE(bar_file_ != NULL);
  749. ASSERT_EQ(1, foo_file_->enum_type_count());
  750. enum_ = foo_file_->enum_type(0);
  751. ASSERT_EQ(2, enum_->value_count());
  752. foo_ = enum_->value(0);
  753. bar_ = enum_->value(1);
  754. ASSERT_EQ(1, bar_file_->enum_type_count());
  755. enum2_ = bar_file_->enum_type(0);
  756. ASSERT_EQ(2, enum2_->value_count());
  757. foo2_ = enum2_->value(0);
  758. baz2_ = enum2_->value(1);
  759. }
  760. DescriptorPool pool_;
  761. const FileDescriptor* foo_file_;
  762. const FileDescriptor* bar_file_;
  763. const EnumDescriptor* enum_;
  764. const EnumDescriptor* enum2_;
  765. const EnumValueDescriptor* foo_;
  766. const EnumValueDescriptor* bar_;
  767. const EnumValueDescriptor* foo2_;
  768. const EnumValueDescriptor* baz2_;
  769. };
  770. TEST_F(EnumDescriptorTest, Name) {
  771. EXPECT_EQ("TestEnum", enum_->name());
  772. EXPECT_EQ("TestEnum", enum_->full_name());
  773. EXPECT_EQ(foo_file_, enum_->file());
  774. EXPECT_EQ("TestEnum2", enum2_->name());
  775. EXPECT_EQ("corge.grault.TestEnum2", enum2_->full_name());
  776. EXPECT_EQ(bar_file_, enum2_->file());
  777. }
  778. TEST_F(EnumDescriptorTest, ContainingType) {
  779. EXPECT_TRUE(enum_->containing_type() == NULL);
  780. EXPECT_TRUE(enum2_->containing_type() == NULL);
  781. }
  782. TEST_F(EnumDescriptorTest, ValuesByIndex) {
  783. ASSERT_EQ(2, enum_->value_count());
  784. EXPECT_EQ(foo_, enum_->value(0));
  785. EXPECT_EQ(bar_, enum_->value(1));
  786. }
  787. TEST_F(EnumDescriptorTest, FindValueByName) {
  788. EXPECT_EQ(foo_ , enum_ ->FindValueByName("FOO"));
  789. EXPECT_EQ(bar_ , enum_ ->FindValueByName("BAR"));
  790. EXPECT_EQ(foo2_, enum2_->FindValueByName("FOO"));
  791. EXPECT_EQ(baz2_, enum2_->FindValueByName("BAZ"));
  792. EXPECT_TRUE(enum_ ->FindValueByName("NO_SUCH_VALUE") == NULL);
  793. EXPECT_TRUE(enum_ ->FindValueByName("BAZ" ) == NULL);
  794. EXPECT_TRUE(enum2_->FindValueByName("BAR" ) == NULL);
  795. }
  796. TEST_F(EnumDescriptorTest, FindValueByNumber) {
  797. EXPECT_EQ(foo_ , enum_ ->FindValueByNumber(1));
  798. EXPECT_EQ(bar_ , enum_ ->FindValueByNumber(2));
  799. EXPECT_EQ(foo2_, enum2_->FindValueByNumber(1));
  800. EXPECT_EQ(baz2_, enum2_->FindValueByNumber(3));
  801. EXPECT_TRUE(enum_ ->FindValueByNumber(416) == NULL);
  802. EXPECT_TRUE(enum_ ->FindValueByNumber(3) == NULL);
  803. EXPECT_TRUE(enum2_->FindValueByNumber(2) == NULL);
  804. }
  805. TEST_F(EnumDescriptorTest, ValueName) {
  806. EXPECT_EQ("FOO", foo_->name());
  807. EXPECT_EQ("BAR", bar_->name());
  808. }
  809. TEST_F(EnumDescriptorTest, ValueFullName) {
  810. EXPECT_EQ("FOO", foo_->full_name());
  811. EXPECT_EQ("BAR", bar_->full_name());
  812. EXPECT_EQ("corge.grault.FOO", foo2_->full_name());
  813. EXPECT_EQ("corge.grault.BAZ", baz2_->full_name());
  814. }
  815. TEST_F(EnumDescriptorTest, ValueIndex) {
  816. EXPECT_EQ(0, foo_->index());
  817. EXPECT_EQ(1, bar_->index());
  818. }
  819. TEST_F(EnumDescriptorTest, ValueNumber) {
  820. EXPECT_EQ(1, foo_->number());
  821. EXPECT_EQ(2, bar_->number());
  822. }
  823. TEST_F(EnumDescriptorTest, ValueType) {
  824. EXPECT_EQ(enum_ , foo_ ->type());
  825. EXPECT_EQ(enum_ , bar_ ->type());
  826. EXPECT_EQ(enum2_, foo2_->type());
  827. EXPECT_EQ(enum2_, baz2_->type());
  828. }
  829. // ===================================================================
  830. // Test service descriptors.
  831. class ServiceDescriptorTest : public testing::Test {
  832. protected:
  833. virtual void SetUp() {
  834. // Build descriptors for the following messages and service:
  835. // // in "foo.proto"
  836. // message FooRequest {}
  837. // message FooResponse {}
  838. // message BarRequest {}
  839. // message BarResponse {}
  840. // message BazRequest {}
  841. // message BazResponse {}
  842. //
  843. // service TestService {
  844. // rpc Foo(FooRequest) returns (FooResponse);
  845. // rpc Bar(BarRequest) returns (BarResponse);
  846. // }
  847. //
  848. // // in "bar.proto"
  849. // package corge.grault
  850. // service TestService2 {
  851. // rpc Foo(FooRequest) returns (FooResponse);
  852. // rpc Baz(BazRequest) returns (BazResponse);
  853. // }
  854. FileDescriptorProto foo_file;
  855. foo_file.set_name("foo.proto");
  856. AddMessage(&foo_file, "FooRequest");
  857. AddMessage(&foo_file, "FooResponse");
  858. AddMessage(&foo_file, "BarRequest");
  859. AddMessage(&foo_file, "BarResponse");
  860. AddMessage(&foo_file, "BazRequest");
  861. AddMessage(&foo_file, "BazResponse");
  862. ServiceDescriptorProto* service = AddService(&foo_file, "TestService");
  863. AddMethod(service, "Foo", "FooRequest", "FooResponse");
  864. AddMethod(service, "Bar", "BarRequest", "BarResponse");
  865. FileDescriptorProto bar_file;
  866. bar_file.set_name("bar.proto");
  867. bar_file.set_package("corge.grault");
  868. bar_file.add_dependency("foo.proto");
  869. ServiceDescriptorProto* service2 = AddService(&bar_file, "TestService2");
  870. AddMethod(service2, "Foo", "FooRequest", "FooResponse");
  871. AddMethod(service2, "Baz", "BazRequest", "BazResponse");
  872. // Build the descriptors and get the pointers.
  873. foo_file_ = pool_.BuildFile(foo_file);
  874. ASSERT_TRUE(foo_file_ != NULL);
  875. bar_file_ = pool_.BuildFile(bar_file);
  876. ASSERT_TRUE(bar_file_ != NULL);
  877. ASSERT_EQ(6, foo_file_->message_type_count());
  878. foo_request_ = foo_file_->message_type(0);
  879. foo_response_ = foo_file_->message_type(1);
  880. bar_request_ = foo_file_->message_type(2);
  881. bar_response_ = foo_file_->message_type(3);
  882. baz_request_ = foo_file_->message_type(4);
  883. baz_response_ = foo_file_->message_type(5);
  884. ASSERT_EQ(1, foo_file_->service_count());
  885. service_ = foo_file_->service(0);
  886. ASSERT_EQ(2, service_->method_count());
  887. foo_ = service_->method(0);
  888. bar_ = service_->method(1);
  889. ASSERT_EQ(1, bar_file_->service_count());
  890. service2_ = bar_file_->service(0);
  891. ASSERT_EQ(2, service2_->method_count());
  892. foo2_ = service2_->method(0);
  893. baz2_ = service2_->method(1);
  894. }
  895. DescriptorPool pool_;
  896. const FileDescriptor* foo_file_;
  897. const FileDescriptor* bar_file_;
  898. const Descriptor* foo_request_;
  899. const Descriptor* foo_response_;
  900. const Descriptor* bar_request_;
  901. const Descriptor* bar_response_;
  902. const Descriptor* baz_request_;
  903. const Descriptor* baz_response_;
  904. const ServiceDescriptor* service_;
  905. const ServiceDescriptor* service2_;
  906. const MethodDescriptor* foo_;
  907. const MethodDescriptor* bar_;
  908. const MethodDescriptor* foo2_;
  909. const MethodDescriptor* baz2_;
  910. };
  911. TEST_F(ServiceDescriptorTest, Name) {
  912. EXPECT_EQ("TestService", service_->name());
  913. EXPECT_EQ("TestService", service_->full_name());
  914. EXPECT_EQ(foo_file_, service_->file());
  915. EXPECT_EQ("TestService2", service2_->name());
  916. EXPECT_EQ("corge.grault.TestService2", service2_->full_name());
  917. EXPECT_EQ(bar_file_, service2_->file());
  918. }
  919. TEST_F(ServiceDescriptorTest, MethodsByIndex) {
  920. ASSERT_EQ(2, service_->method_count());
  921. EXPECT_EQ(foo_, service_->method(0));
  922. EXPECT_EQ(bar_, service_->method(1));
  923. }
  924. TEST_F(ServiceDescriptorTest, FindMethodByName) {
  925. EXPECT_EQ(foo_ , service_ ->FindMethodByName("Foo"));
  926. EXPECT_EQ(bar_ , service_ ->FindMethodByName("Bar"));
  927. EXPECT_EQ(foo2_, service2_->FindMethodByName("Foo"));
  928. EXPECT_EQ(baz2_, service2_->FindMethodByName("Baz"));
  929. EXPECT_TRUE(service_ ->FindMethodByName("NoSuchMethod") == NULL);
  930. EXPECT_TRUE(service_ ->FindMethodByName("Baz" ) == NULL);
  931. EXPECT_TRUE(service2_->FindMethodByName("Bar" ) == NULL);
  932. }
  933. TEST_F(ServiceDescriptorTest, MethodName) {
  934. EXPECT_EQ("Foo", foo_->name());
  935. EXPECT_EQ("Bar", bar_->name());
  936. }
  937. TEST_F(ServiceDescriptorTest, MethodFullName) {
  938. EXPECT_EQ("TestService.Foo", foo_->full_name());
  939. EXPECT_EQ("TestService.Bar", bar_->full_name());
  940. EXPECT_EQ("corge.grault.TestService2.Foo", foo2_->full_name());
  941. EXPECT_EQ("corge.grault.TestService2.Baz", baz2_->full_name());
  942. }
  943. TEST_F(ServiceDescriptorTest, MethodIndex) {
  944. EXPECT_EQ(0, foo_->index());
  945. EXPECT_EQ(1, bar_->index());
  946. }
  947. TEST_F(ServiceDescriptorTest, MethodParent) {
  948. EXPECT_EQ(service_, foo_->service());
  949. EXPECT_EQ(service_, bar_->service());
  950. }
  951. TEST_F(ServiceDescriptorTest, MethodInputType) {
  952. EXPECT_EQ(foo_request_, foo_->input_type());
  953. EXPECT_EQ(bar_request_, bar_->input_type());
  954. }
  955. TEST_F(ServiceDescriptorTest, MethodOutputType) {
  956. EXPECT_EQ(foo_response_, foo_->output_type());
  957. EXPECT_EQ(bar_response_, bar_->output_type());
  958. }
  959. // ===================================================================
  960. // Test nested types.
  961. class NestedDescriptorTest : public testing::Test {
  962. protected:
  963. virtual void SetUp() {
  964. // Build descriptors for the following definitions:
  965. //
  966. // // in "foo.proto"
  967. // message TestMessage {
  968. // message Foo {}
  969. // message Bar {}
  970. // enum Baz { A = 1; }
  971. // enum Qux { B = 1; }
  972. // }
  973. //
  974. // // in "bar.proto"
  975. // package corge.grault;
  976. // message TestMessage2 {
  977. // message Foo {}
  978. // message Baz {}
  979. // enum Qux { A = 1; }
  980. // enum Quux { C = 1; }
  981. // }
  982. //
  983. // TestMessage2 is primarily here to test FindNestedTypeByName and friends.
  984. // All messages created from the same DescriptorPool share the same lookup
  985. // table, so we need to insure that they don't interfere.
  986. //
  987. // We add enum values to the enums in order to test searching for enum
  988. // values across a message's scope.
  989. FileDescriptorProto foo_file;
  990. foo_file.set_name("foo.proto");
  991. DescriptorProto* message = AddMessage(&foo_file, "TestMessage");
  992. AddNestedMessage(message, "Foo");
  993. AddNestedMessage(message, "Bar");
  994. EnumDescriptorProto* baz = AddNestedEnum(message, "Baz");
  995. AddEnumValue(baz, "A", 1);
  996. EnumDescriptorProto* qux = AddNestedEnum(message, "Qux");
  997. AddEnumValue(qux, "B", 1);
  998. FileDescriptorProto bar_file;
  999. bar_file.set_name("bar.proto");
  1000. bar_file.set_package("corge.grault");
  1001. DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2");
  1002. AddNestedMessage(message2, "Foo");
  1003. AddNestedMessage(message2, "Baz");
  1004. EnumDescriptorProto* qux2 = AddNestedEnum(message2, "Qux");
  1005. AddEnumValue(qux2, "A", 1);
  1006. EnumDescriptorProto* quux2 = AddNestedEnum(message2, "Quux");
  1007. AddEnumValue(quux2, "C", 1);
  1008. // Build the descriptors and get the pointers.
  1009. foo_file_ = pool_.BuildFile(foo_file);
  1010. ASSERT_TRUE(foo_file_ != NULL);
  1011. bar_file_ = pool_.BuildFile(bar_file);
  1012. ASSERT_TRUE(bar_file_ != NULL);
  1013. ASSERT_EQ(1, foo_file_->message_type_count());
  1014. message_ = foo_file_->message_type(0);
  1015. ASSERT_EQ(2, message_->nested_type_count());
  1016. foo_ = message_->nested_type(0);
  1017. bar_ = message_->nested_type(1);
  1018. ASSERT_EQ(2, message_->enum_type_count());
  1019. baz_ = message_->enum_type(0);
  1020. qux_ = message_->enum_type(1);
  1021. ASSERT_EQ(1, baz_->value_count());
  1022. a_ = baz_->value(0);
  1023. ASSERT_EQ(1, qux_->value_count());
  1024. b_ = qux_->value(0);
  1025. ASSERT_EQ(1, bar_file_->message_type_count());
  1026. message2_ = bar_file_->message_type(0);
  1027. ASSERT_EQ(2, message2_->nested_type_count());
  1028. foo2_ = message2_->nested_type(0);
  1029. baz2_ = message2_->nested_type(1);
  1030. ASSERT_EQ(2, message2_->enum_type_count());
  1031. qux2_ = message2_->enum_type(0);
  1032. quux2_ = message2_->enum_type(1);
  1033. ASSERT_EQ(1, qux2_->value_count());
  1034. a2_ = qux2_->value(0);
  1035. ASSERT_EQ(1, quux2_->value_count());
  1036. c2_ = quux2_->value(0);
  1037. }
  1038. DescriptorPool pool_;
  1039. const FileDescriptor* foo_file_;
  1040. const FileDescriptor* bar_file_;
  1041. const Descriptor* message_;
  1042. const Descriptor* message2_;
  1043. const Descriptor* foo_;
  1044. const Descriptor* bar_;
  1045. const EnumDescriptor* baz_;
  1046. const EnumDescriptor* qux_;
  1047. const EnumValueDescriptor* a_;
  1048. const EnumValueDescriptor* b_;
  1049. const Descriptor* foo2_;
  1050. const Descriptor* baz2_;
  1051. const EnumDescriptor* qux2_;
  1052. const EnumDescriptor* quux2_;
  1053. const EnumValueDescriptor* a2_;
  1054. const EnumValueDescriptor* c2_;
  1055. };
  1056. TEST_F(NestedDescriptorTest, MessageName) {
  1057. EXPECT_EQ("Foo", foo_ ->name());
  1058. EXPECT_EQ("Bar", bar_ ->name());
  1059. EXPECT_EQ("Foo", foo2_->name());
  1060. EXPECT_EQ("Baz", baz2_->name());
  1061. EXPECT_EQ("TestMessage.Foo", foo_->full_name());
  1062. EXPECT_EQ("TestMessage.Bar", bar_->full_name());
  1063. EXPECT_EQ("corge.grault.TestMessage2.Foo", foo2_->full_name());
  1064. EXPECT_EQ("corge.grault.TestMessage2.Baz", baz2_->full_name());
  1065. }
  1066. TEST_F(NestedDescriptorTest, MessageContainingType) {
  1067. EXPECT_EQ(message_ , foo_ ->containing_type());
  1068. EXPECT_EQ(message_ , bar_ ->containing_type());
  1069. EXPECT_EQ(message2_, foo2_->containing_type());
  1070. EXPECT_EQ(message2_, baz2_->containing_type());
  1071. }
  1072. TEST_F(NestedDescriptorTest, NestedMessagesByIndex) {
  1073. ASSERT_EQ(2, message_->nested_type_count());
  1074. EXPECT_EQ(foo_, message_->nested_type(0));
  1075. EXPECT_EQ(bar_, message_->nested_type(1));
  1076. }
  1077. TEST_F(NestedDescriptorTest, FindFieldByNameDoesntFindNestedTypes) {
  1078. EXPECT_TRUE(message_->FindFieldByName("Foo") == NULL);
  1079. EXPECT_TRUE(message_->FindFieldByName("Qux") == NULL);
  1080. EXPECT_TRUE(message_->FindExtensionByName("Foo") == NULL);
  1081. EXPECT_TRUE(message_->FindExtensionByName("Qux") == NULL);
  1082. }
  1083. TEST_F(NestedDescriptorTest, FindNestedTypeByName) {
  1084. EXPECT_EQ(foo_ , message_ ->FindNestedTypeByName("Foo"));
  1085. EXPECT_EQ(bar_ , message_ ->FindNestedTypeByName("Bar"));
  1086. EXPECT_EQ(foo2_, message2_->FindNestedTypeByName("Foo"));
  1087. EXPECT_EQ(baz2_, message2_->FindNestedTypeByName("Baz"));
  1088. EXPECT_TRUE(message_ ->FindNestedTypeByName("NoSuchType") == NULL);
  1089. EXPECT_TRUE(message_ ->FindNestedTypeByName("Baz" ) == NULL);
  1090. EXPECT_TRUE(message2_->FindNestedTypeByName("Bar" ) == NULL);
  1091. EXPECT_TRUE(message_->FindNestedTypeByName("Qux") == NULL);
  1092. }
  1093. TEST_F(NestedDescriptorTest, EnumName) {
  1094. EXPECT_EQ("Baz" , baz_ ->name());
  1095. EXPECT_EQ("Qux" , qux_ ->name());
  1096. EXPECT_EQ("Qux" , qux2_->name());
  1097. EXPECT_EQ("Quux", quux2_->name());
  1098. EXPECT_EQ("TestMessage.Baz", baz_->full_name());
  1099. EXPECT_EQ("TestMessage.Qux", qux_->full_name());
  1100. EXPECT_EQ("corge.grault.TestMessage2.Qux" , qux2_ ->full_name());
  1101. EXPECT_EQ("corge.grault.TestMessage2.Quux", quux2_->full_name());
  1102. }
  1103. TEST_F(NestedDescriptorTest, EnumContainingType) {
  1104. EXPECT_EQ(message_ , baz_ ->containing_type());
  1105. EXPECT_EQ(message_ , qux_ ->containing_type());
  1106. EXPECT_EQ(message2_, qux2_ ->containing_type());
  1107. EXPECT_EQ(message2_, quux2_->containing_type());
  1108. }
  1109. TEST_F(NestedDescriptorTest, NestedEnumsByIndex) {
  1110. ASSERT_EQ(2, message_->nested_type_count());
  1111. EXPECT_EQ(foo_, message_->nested_type(0));
  1112. EXPECT_EQ(bar_, message_->nested_type(1));
  1113. }
  1114. TEST_F(NestedDescriptorTest, FindEnumTypeByName) {
  1115. EXPECT_EQ(baz_ , message_ ->FindEnumTypeByName("Baz" ));
  1116. EXPECT_EQ(qux_ , message_ ->FindEnumTypeByName("Qux" ));
  1117. EXPECT_EQ(qux2_ , message2_->FindEnumTypeByName("Qux" ));
  1118. EXPECT_EQ(quux2_, message2_->FindEnumTypeByName("Quux"));
  1119. EXPECT_TRUE(message_ ->FindEnumTypeByName("NoSuchType") == NULL);
  1120. EXPECT_TRUE(message_ ->FindEnumTypeByName("Quux" ) == NULL);
  1121. EXPECT_TRUE(message2_->FindEnumTypeByName("Baz" ) == NULL);
  1122. EXPECT_TRUE(message_->FindEnumTypeByName("Foo") == NULL);
  1123. }
  1124. TEST_F(NestedDescriptorTest, FindEnumValueByName) {
  1125. EXPECT_EQ(a_ , message_ ->FindEnumValueByName("A"));
  1126. EXPECT_EQ(b_ , message_ ->FindEnumValueByName("B"));
  1127. EXPECT_EQ(a2_, message2_->FindEnumValueByName("A"));
  1128. EXPECT_EQ(c2_, message2_->FindEnumValueByName("C"));
  1129. EXPECT_TRUE(message_ ->FindEnumValueByName("NO_SUCH_VALUE") == NULL);
  1130. EXPECT_TRUE(message_ ->FindEnumValueByName("C" ) == NULL);
  1131. EXPECT_TRUE(message2_->FindEnumValueByName("B" ) == NULL);
  1132. EXPECT_TRUE(message_->FindEnumValueByName("Foo") == NULL);
  1133. }
  1134. // ===================================================================
  1135. // Test extensions.
  1136. class ExtensionDescriptorTest : public testing::Test {
  1137. protected:
  1138. virtual void SetUp() {
  1139. // Build descriptors for the following definitions:
  1140. //
  1141. // enum Baz {}
  1142. // message Qux {}
  1143. //
  1144. // message Foo {
  1145. // extensions 10 to 19;
  1146. // extensions 30 to 39;
  1147. // }
  1148. // extends Foo with optional int32 foo_int32 = 10;
  1149. // extends Foo with repeated TestEnum foo_enum = 19;
  1150. // message Bar {
  1151. // extends Foo with optional Qux foo_message = 30;
  1152. // // (using Qux as the group type)
  1153. // extends Foo with repeated group foo_group = 39;
  1154. // }
  1155. FileDescriptorProto foo_file;
  1156. foo_file.set_name("foo.proto");
  1157. AddEmptyEnum(&foo_file, "Baz");
  1158. AddMessage(&foo_file, "Qux");
  1159. Desc

Large files files are truncated, but you can click here to view the full file