PageRenderTime 61ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/thirdparty/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_unittest.cc

http://github.com/tomahawk-player/tomahawk
C++ | 1748 lines | 1249 code | 287 blank | 212 comment | 122 complexity | 7c1ca12f3da94d978fb5097cf54ef868 MD5 | raw file
Possible License(s): LGPL-2.1, BSD-3-Clause, GPL-3.0, GPL-2.0
  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/descriptor.h>
  37. #include <google/protobuf/descriptor_database.h>
  38. #include <google/protobuf/dynamic_message.h>
  39. #include <google/protobuf/descriptor.pb.h>
  40. #include <google/protobuf/text_format.h>
  41. #include <google/protobuf/unittest.pb.h>
  42. #include <google/protobuf/unittest_custom_options.pb.h>
  43. #include <google/protobuf/stubs/strutil.h>
  44. #include <google/protobuf/stubs/substitute.h>
  45. #include <google/protobuf/stubs/common.h>
  46. #include <google/protobuf/testing/googletest.h>
  47. #include <gtest/gtest.h>
  48. namespace google {
  49. namespace protobuf {
  50. // Can't use an anonymous namespace here due to brokenness of Tru64 compiler.
  51. namespace descriptor_unittest {
  52. // Some helpers to make assembling descriptors faster.
  53. DescriptorProto* AddMessage(FileDescriptorProto* file, const string& name) {
  54. DescriptorProto* result = file->add_message_type();
  55. result->set_name(name);
  56. return result;
  57. }
  58. DescriptorProto* AddNestedMessage(DescriptorProto* parent, const string& name) {
  59. DescriptorProto* result = parent->add_nested_type();
  60. result->set_name(name);
  61. return result;
  62. }
  63. EnumDescriptorProto* AddEnum(FileDescriptorProto* file, const string& name) {
  64. EnumDescriptorProto* result = file->add_enum_type();
  65. result->set_name(name);
  66. return result;
  67. }
  68. EnumDescriptorProto* AddNestedEnum(DescriptorProto* parent,
  69. const string& name) {
  70. EnumDescriptorProto* result = parent->add_enum_type();
  71. result->set_name(name);
  72. return result;
  73. }
  74. ServiceDescriptorProto* AddService(FileDescriptorProto* file,
  75. const string& name) {
  76. ServiceDescriptorProto* result = file->add_service();
  77. result->set_name(name);
  78. return result;
  79. }
  80. FieldDescriptorProto* AddField(DescriptorProto* parent,
  81. const string& name, int number,
  82. FieldDescriptorProto::Label label,
  83. FieldDescriptorProto::Type type) {
  84. FieldDescriptorProto* result = parent->add_field();
  85. result->set_name(name);
  86. result->set_number(number);
  87. result->set_label(label);
  88. result->set_type(type);
  89. return result;
  90. }
  91. FieldDescriptorProto* AddExtension(FileDescriptorProto* file,
  92. const string& extendee,
  93. const string& name, int number,
  94. FieldDescriptorProto::Label label,
  95. FieldDescriptorProto::Type type) {
  96. FieldDescriptorProto* result = file->add_extension();
  97. result->set_name(name);
  98. result->set_number(number);
  99. result->set_label(label);
  100. result->set_type(type);
  101. result->set_extendee(extendee);
  102. return result;
  103. }
  104. FieldDescriptorProto* AddNestedExtension(DescriptorProto* parent,
  105. const string& extendee,
  106. const string& name, int number,
  107. FieldDescriptorProto::Label label,
  108. FieldDescriptorProto::Type type) {
  109. FieldDescriptorProto* result = parent->add_extension();
  110. result->set_name(name);
  111. result->set_number(number);
  112. result->set_label(label);
  113. result->set_type(type);
  114. result->set_extendee(extendee);
  115. return result;
  116. }
  117. DescriptorProto::ExtensionRange* AddExtensionRange(DescriptorProto* parent,
  118. int start, int end) {
  119. DescriptorProto::ExtensionRange* result = parent->add_extension_range();
  120. result->set_start(start);
  121. result->set_end(end);
  122. return result;
  123. }
  124. EnumValueDescriptorProto* AddEnumValue(EnumDescriptorProto* enum_proto,
  125. const string& name, int number) {
  126. EnumValueDescriptorProto* result = enum_proto->add_value();
  127. result->set_name(name);
  128. result->set_number(number);
  129. return result;
  130. }
  131. MethodDescriptorProto* AddMethod(ServiceDescriptorProto* service,
  132. const string& name,
  133. const string& input_type,
  134. const string& output_type) {
  135. MethodDescriptorProto* result = service->add_method();
  136. result->set_name(name);
  137. result->set_input_type(input_type);
  138. result->set_output_type(output_type);
  139. return result;
  140. }
  141. // Empty enums technically aren't allowed. We need to insert a dummy value
  142. // into them.
  143. void AddEmptyEnum(FileDescriptorProto* file, const string& name) {
  144. AddEnumValue(AddEnum(file, name), name + "_DUMMY", 1);
  145. }
  146. // ===================================================================
  147. // Test simple files.
  148. class FileDescriptorTest : public testing::Test {
  149. protected:
  150. virtual void SetUp() {
  151. // Build descriptors for the following definitions:
  152. //
  153. // // in "foo.proto"
  154. // message FooMessage { extensions 1; }
  155. // enum FooEnum {FOO_ENUM_VALUE = 1;}
  156. // service FooService {}
  157. // extend FooMessage { optional int32 foo_extension = 1; }
  158. //
  159. // // in "bar.proto"
  160. // package bar_package;
  161. // message BarMessage { extensions 1; }
  162. // enum BarEnum {BAR_ENUM_VALUE = 1;}
  163. // service BarService {}
  164. // extend BarMessage { optional int32 bar_extension = 1; }
  165. //
  166. // Also, we have an empty file "baz.proto". This file's purpose is to
  167. // make sure that even though it has the same package as foo.proto,
  168. // searching it for members of foo.proto won't work.
  169. FileDescriptorProto foo_file;
  170. foo_file.set_name("foo.proto");
  171. AddExtensionRange(AddMessage(&foo_file, "FooMessage"), 1, 2);
  172. AddEnumValue(AddEnum(&foo_file, "FooEnum"), "FOO_ENUM_VALUE", 1);
  173. AddService(&foo_file, "FooService");
  174. AddExtension(&foo_file, "FooMessage", "foo_extension", 1,
  175. FieldDescriptorProto::LABEL_OPTIONAL,
  176. FieldDescriptorProto::TYPE_INT32);
  177. FileDescriptorProto bar_file;
  178. bar_file.set_name("bar.proto");
  179. bar_file.set_package("bar_package");
  180. bar_file.add_dependency("foo.proto");
  181. AddExtensionRange(AddMessage(&bar_file, "BarMessage"), 1, 2);
  182. AddEnumValue(AddEnum(&bar_file, "BarEnum"), "BAR_ENUM_VALUE", 1);
  183. AddService(&bar_file, "BarService");
  184. AddExtension(&bar_file, "bar_package.BarMessage", "bar_extension", 1,
  185. FieldDescriptorProto::LABEL_OPTIONAL,
  186. FieldDescriptorProto::TYPE_INT32);
  187. FileDescriptorProto baz_file;
  188. baz_file.set_name("baz.proto");
  189. // Build the descriptors and get the pointers.
  190. foo_file_ = pool_.BuildFile(foo_file);
  191. ASSERT_TRUE(foo_file_ != NULL);
  192. bar_file_ = pool_.BuildFile(bar_file);
  193. ASSERT_TRUE(bar_file_ != NULL);
  194. baz_file_ = pool_.BuildFile(baz_file);
  195. ASSERT_TRUE(baz_file_ != NULL);
  196. ASSERT_EQ(1, foo_file_->message_type_count());
  197. foo_message_ = foo_file_->message_type(0);
  198. ASSERT_EQ(1, foo_file_->enum_type_count());
  199. foo_enum_ = foo_file_->enum_type(0);
  200. ASSERT_EQ(1, foo_enum_->value_count());
  201. foo_enum_value_ = foo_enum_->value(0);
  202. ASSERT_EQ(1, foo_file_->service_count());
  203. foo_service_ = foo_file_->service(0);
  204. ASSERT_EQ(1, foo_file_->extension_count());
  205. foo_extension_ = foo_file_->extension(0);
  206. ASSERT_EQ(1, bar_file_->message_type_count());
  207. bar_message_ = bar_file_->message_type(0);
  208. ASSERT_EQ(1, bar_file_->enum_type_count());
  209. bar_enum_ = bar_file_->enum_type(0);
  210. ASSERT_EQ(1, bar_enum_->value_count());
  211. bar_enum_value_ = bar_enum_->value(0);
  212. ASSERT_EQ(1, bar_file_->service_count());
  213. bar_service_ = bar_file_->service(0);
  214. ASSERT_EQ(1, bar_file_->extension_count());
  215. bar_extension_ = bar_file_->extension(0);
  216. }
  217. DescriptorPool pool_;
  218. const FileDescriptor* foo_file_;
  219. const FileDescriptor* bar_file_;
  220. const FileDescriptor* baz_file_;
  221. const Descriptor* foo_message_;
  222. const EnumDescriptor* foo_enum_;
  223. const EnumValueDescriptor* foo_enum_value_;
  224. const ServiceDescriptor* foo_service_;
  225. const FieldDescriptor* foo_extension_;
  226. const Descriptor* bar_message_;
  227. const EnumDescriptor* bar_enum_;
  228. const EnumValueDescriptor* bar_enum_value_;
  229. const ServiceDescriptor* bar_service_;
  230. const FieldDescriptor* bar_extension_;
  231. };
  232. TEST_F(FileDescriptorTest, Name) {
  233. EXPECT_EQ("foo.proto", foo_file_->name());
  234. EXPECT_EQ("bar.proto", bar_file_->name());
  235. EXPECT_EQ("baz.proto", baz_file_->name());
  236. }
  237. TEST_F(FileDescriptorTest, Package) {
  238. EXPECT_EQ("", foo_file_->package());
  239. EXPECT_EQ("bar_package", bar_file_->package());
  240. }
  241. TEST_F(FileDescriptorTest, Dependencies) {
  242. EXPECT_EQ(0, foo_file_->dependency_count());
  243. EXPECT_EQ(1, bar_file_->dependency_count());
  244. EXPECT_EQ(foo_file_, bar_file_->dependency(0));
  245. }
  246. TEST_F(FileDescriptorTest, FindMessageTypeByName) {
  247. EXPECT_EQ(foo_message_, foo_file_->FindMessageTypeByName("FooMessage"));
  248. EXPECT_EQ(bar_message_, bar_file_->FindMessageTypeByName("BarMessage"));
  249. EXPECT_TRUE(foo_file_->FindMessageTypeByName("BarMessage") == NULL);
  250. EXPECT_TRUE(bar_file_->FindMessageTypeByName("FooMessage") == NULL);
  251. EXPECT_TRUE(baz_file_->FindMessageTypeByName("FooMessage") == NULL);
  252. EXPECT_TRUE(foo_file_->FindMessageTypeByName("NoSuchMessage") == NULL);
  253. EXPECT_TRUE(foo_file_->FindMessageTypeByName("FooEnum") == NULL);
  254. }
  255. TEST_F(FileDescriptorTest, FindEnumTypeByName) {
  256. EXPECT_EQ(foo_enum_, foo_file_->FindEnumTypeByName("FooEnum"));
  257. EXPECT_EQ(bar_enum_, bar_file_->FindEnumTypeByName("BarEnum"));
  258. EXPECT_TRUE(foo_file_->FindEnumTypeByName("BarEnum") == NULL);
  259. EXPECT_TRUE(bar_file_->FindEnumTypeByName("FooEnum") == NULL);
  260. EXPECT_TRUE(baz_file_->FindEnumTypeByName("FooEnum") == NULL);
  261. EXPECT_TRUE(foo_file_->FindEnumTypeByName("NoSuchEnum") == NULL);
  262. EXPECT_TRUE(foo_file_->FindEnumTypeByName("FooMessage") == NULL);
  263. }
  264. TEST_F(FileDescriptorTest, FindEnumValueByName) {
  265. EXPECT_EQ(foo_enum_value_, foo_file_->FindEnumValueByName("FOO_ENUM_VALUE"));
  266. EXPECT_EQ(bar_enum_value_, bar_file_->FindEnumValueByName("BAR_ENUM_VALUE"));
  267. EXPECT_TRUE(foo_file_->FindEnumValueByName("BAR_ENUM_VALUE") == NULL);
  268. EXPECT_TRUE(bar_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL);
  269. EXPECT_TRUE(baz_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL);
  270. EXPECT_TRUE(foo_file_->FindEnumValueByName("NO_SUCH_VALUE") == NULL);
  271. EXPECT_TRUE(foo_file_->FindEnumValueByName("FooMessage") == NULL);
  272. }
  273. TEST_F(FileDescriptorTest, FindServiceByName) {
  274. EXPECT_EQ(foo_service_, foo_file_->FindServiceByName("FooService"));
  275. EXPECT_EQ(bar_service_, bar_file_->FindServiceByName("BarService"));
  276. EXPECT_TRUE(foo_file_->FindServiceByName("BarService") == NULL);
  277. EXPECT_TRUE(bar_file_->FindServiceByName("FooService") == NULL);
  278. EXPECT_TRUE(baz_file_->FindServiceByName("FooService") == NULL);
  279. EXPECT_TRUE(foo_file_->FindServiceByName("NoSuchService") == NULL);
  280. EXPECT_TRUE(foo_file_->FindServiceByName("FooMessage") == NULL);
  281. }
  282. TEST_F(FileDescriptorTest, FindExtensionByName) {
  283. EXPECT_EQ(foo_extension_, foo_file_->FindExtensionByName("foo_extension"));
  284. EXPECT_EQ(bar_extension_, bar_file_->FindExtensionByName("bar_extension"));
  285. EXPECT_TRUE(foo_file_->FindExtensionByName("bar_extension") == NULL);
  286. EXPECT_TRUE(bar_file_->FindExtensionByName("foo_extension") == NULL);
  287. EXPECT_TRUE(baz_file_->FindExtensionByName("foo_extension") == NULL);
  288. EXPECT_TRUE(foo_file_->FindExtensionByName("no_such_extension") == NULL);
  289. EXPECT_TRUE(foo_file_->FindExtensionByName("FooMessage") == NULL);
  290. }
  291. TEST_F(FileDescriptorTest, FindExtensionByNumber) {
  292. EXPECT_EQ(foo_extension_, pool_.FindExtensionByNumber(foo_message_, 1));
  293. EXPECT_EQ(bar_extension_, pool_.FindExtensionByNumber(bar_message_, 1));
  294. EXPECT_TRUE(pool_.FindExtensionByNumber(foo_message_, 2) == NULL);
  295. }
  296. TEST_F(FileDescriptorTest, BuildAgain) {
  297. // Test that if te call BuildFile again on the same input we get the same
  298. // FileDescriptor back.
  299. FileDescriptorProto file;
  300. foo_file_->CopyTo(&file);
  301. EXPECT_EQ(foo_file_, pool_.BuildFile(file));
  302. // But if we change the file then it won't work.
  303. file.set_package("some.other.package");
  304. EXPECT_TRUE(pool_.BuildFile(file) == NULL);
  305. }
  306. // ===================================================================
  307. // Test simple flat messages and fields.
  308. class DescriptorTest : public testing::Test {
  309. protected:
  310. virtual void SetUp() {
  311. // Build descriptors for the following definitions:
  312. //
  313. // // in "foo.proto"
  314. // message TestForeign {}
  315. // enum TestEnum {}
  316. //
  317. // message TestMessage {
  318. // required string foo = 1;
  319. // optional TestEnum bar = 6;
  320. // repeated TestForeign baz = 500000000;
  321. // optional group qux = 15 {}
  322. // }
  323. //
  324. // // in "bar.proto"
  325. // package corge.grault;
  326. // message TestMessage2 {
  327. // required string foo = 1;
  328. // required string bar = 2;
  329. // required string quux = 6;
  330. // }
  331. //
  332. // We cheat and use TestForeign as the type for qux rather than create
  333. // an actual nested type.
  334. //
  335. // Since all primitive types (including string) use the same building
  336. // code, there's no need to test each one individually.
  337. //
  338. // TestMessage2 is primarily here to test FindFieldByName and friends.
  339. // All messages created from the same DescriptorPool share the same lookup
  340. // table, so we need to insure that they don't interfere.
  341. FileDescriptorProto foo_file;
  342. foo_file.set_name("foo.proto");
  343. AddMessage(&foo_file, "TestForeign");
  344. AddEmptyEnum(&foo_file, "TestEnum");
  345. DescriptorProto* message = AddMessage(&foo_file, "TestMessage");
  346. AddField(message, "foo", 1,
  347. FieldDescriptorProto::LABEL_REQUIRED,
  348. FieldDescriptorProto::TYPE_STRING);
  349. AddField(message, "bar", 6,
  350. FieldDescriptorProto::LABEL_OPTIONAL,
  351. FieldDescriptorProto::TYPE_ENUM)
  352. ->set_type_name("TestEnum");
  353. AddField(message, "baz", 500000000,
  354. FieldDescriptorProto::LABEL_REPEATED,
  355. FieldDescriptorProto::TYPE_MESSAGE)
  356. ->set_type_name("TestForeign");
  357. AddField(message, "qux", 15,
  358. FieldDescriptorProto::LABEL_OPTIONAL,
  359. FieldDescriptorProto::TYPE_GROUP)
  360. ->set_type_name("TestForeign");
  361. FileDescriptorProto bar_file;
  362. bar_file.set_name("bar.proto");
  363. bar_file.set_package("corge.grault");
  364. DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2");
  365. AddField(message2, "foo", 1,
  366. FieldDescriptorProto::LABEL_REQUIRED,
  367. FieldDescriptorProto::TYPE_STRING);
  368. AddField(message2, "bar", 2,
  369. FieldDescriptorProto::LABEL_REQUIRED,
  370. FieldDescriptorProto::TYPE_STRING);
  371. AddField(message2, "quux", 6,
  372. FieldDescriptorProto::LABEL_REQUIRED,
  373. FieldDescriptorProto::TYPE_STRING);
  374. // Build the descriptors and get the pointers.
  375. foo_file_ = pool_.BuildFile(foo_file);
  376. ASSERT_TRUE(foo_file_ != NULL);
  377. bar_file_ = pool_.BuildFile(bar_file);
  378. ASSERT_TRUE(bar_file_ != NULL);
  379. ASSERT_EQ(1, foo_file_->enum_type_count());
  380. enum_ = foo_file_->enum_type(0);
  381. ASSERT_EQ(2, foo_file_->message_type_count());
  382. foreign_ = foo_file_->message_type(0);
  383. message_ = foo_file_->message_type(1);
  384. ASSERT_EQ(4, message_->field_count());
  385. foo_ = message_->field(0);
  386. bar_ = message_->field(1);
  387. baz_ = message_->field(2);
  388. qux_ = message_->field(3);
  389. ASSERT_EQ(1, bar_file_->message_type_count());
  390. message2_ = bar_file_->message_type(0);
  391. ASSERT_EQ(3, message2_->field_count());
  392. foo2_ = message2_->field(0);
  393. bar2_ = message2_->field(1);
  394. quux2_ = message2_->field(2);
  395. }
  396. DescriptorPool pool_;
  397. const FileDescriptor* foo_file_;
  398. const FileDescriptor* bar_file_;
  399. const Descriptor* message_;
  400. const Descriptor* message2_;
  401. const Descriptor* foreign_;
  402. const EnumDescriptor* enum_;
  403. const FieldDescriptor* foo_;
  404. const FieldDescriptor* bar_;
  405. const FieldDescriptor* baz_;
  406. const FieldDescriptor* qux_;
  407. const FieldDescriptor* foo2_;
  408. const FieldDescriptor* bar2_;
  409. const FieldDescriptor* quux2_;
  410. };
  411. TEST_F(DescriptorTest, Name) {
  412. EXPECT_EQ("TestMessage", message_->name());
  413. EXPECT_EQ("TestMessage", message_->full_name());
  414. EXPECT_EQ(foo_file_, message_->file());
  415. EXPECT_EQ("TestMessage2", message2_->name());
  416. EXPECT_EQ("corge.grault.TestMessage2", message2_->full_name());
  417. EXPECT_EQ(bar_file_, message2_->file());
  418. }
  419. TEST_F(DescriptorTest, ContainingType) {
  420. EXPECT_TRUE(message_->containing_type() == NULL);
  421. EXPECT_TRUE(message2_->containing_type() == NULL);
  422. }
  423. TEST_F(DescriptorTest, FieldsByIndex) {
  424. ASSERT_EQ(4, message_->field_count());
  425. EXPECT_EQ(foo_, message_->field(0));
  426. EXPECT_EQ(bar_, message_->field(1));
  427. EXPECT_EQ(baz_, message_->field(2));
  428. EXPECT_EQ(qux_, message_->field(3));
  429. }
  430. TEST_F(DescriptorTest, FindFieldByName) {
  431. // All messages in the same DescriptorPool share a single lookup table for
  432. // fields. So, in addition to testing that FindFieldByName finds the fields
  433. // of the message, we need to test that it does *not* find the fields of
  434. // *other* messages.
  435. EXPECT_EQ(foo_, message_->FindFieldByName("foo"));
  436. EXPECT_EQ(bar_, message_->FindFieldByName("bar"));
  437. EXPECT_EQ(baz_, message_->FindFieldByName("baz"));
  438. EXPECT_EQ(qux_, message_->FindFieldByName("qux"));
  439. EXPECT_TRUE(message_->FindFieldByName("no_such_field") == NULL);
  440. EXPECT_TRUE(message_->FindFieldByName("quux") == NULL);
  441. EXPECT_EQ(foo2_ , message2_->FindFieldByName("foo" ));
  442. EXPECT_EQ(bar2_ , message2_->FindFieldByName("bar" ));
  443. EXPECT_EQ(quux2_, message2_->FindFieldByName("quux"));
  444. EXPECT_TRUE(message2_->FindFieldByName("baz") == NULL);
  445. EXPECT_TRUE(message2_->FindFieldByName("qux") == NULL);
  446. }
  447. TEST_F(DescriptorTest, FindFieldByNumber) {
  448. EXPECT_EQ(foo_, message_->FindFieldByNumber(1));
  449. EXPECT_EQ(bar_, message_->FindFieldByNumber(6));
  450. EXPECT_EQ(baz_, message_->FindFieldByNumber(500000000));
  451. EXPECT_EQ(qux_, message_->FindFieldByNumber(15));
  452. EXPECT_TRUE(message_->FindFieldByNumber(837592) == NULL);
  453. EXPECT_TRUE(message_->FindFieldByNumber(2) == NULL);
  454. EXPECT_EQ(foo2_ , message2_->FindFieldByNumber(1));
  455. EXPECT_EQ(bar2_ , message2_->FindFieldByNumber(2));
  456. EXPECT_EQ(quux2_, message2_->FindFieldByNumber(6));
  457. EXPECT_TRUE(message2_->FindFieldByNumber(15) == NULL);
  458. EXPECT_TRUE(message2_->FindFieldByNumber(500000000) == NULL);
  459. }
  460. TEST_F(DescriptorTest, FieldName) {
  461. EXPECT_EQ("foo", foo_->name());
  462. EXPECT_EQ("bar", bar_->name());
  463. EXPECT_EQ("baz", baz_->name());
  464. EXPECT_EQ("qux", qux_->name());
  465. }
  466. TEST_F(DescriptorTest, FieldFullName) {
  467. EXPECT_EQ("TestMessage.foo", foo_->full_name());
  468. EXPECT_EQ("TestMessage.bar", bar_->full_name());
  469. EXPECT_EQ("TestMessage.baz", baz_->full_name());
  470. EXPECT_EQ("TestMessage.qux", qux_->full_name());
  471. EXPECT_EQ("corge.grault.TestMessage2.foo", foo2_->full_name());
  472. EXPECT_EQ("corge.grault.TestMessage2.bar", bar2_->full_name());
  473. EXPECT_EQ("corge.grault.TestMessage2.quux", quux2_->full_name());
  474. }
  475. TEST_F(DescriptorTest, FieldFile) {
  476. EXPECT_EQ(foo_file_, foo_->file());
  477. EXPECT_EQ(foo_file_, bar_->file());
  478. EXPECT_EQ(foo_file_, baz_->file());
  479. EXPECT_EQ(foo_file_, qux_->file());
  480. EXPECT_EQ(bar_file_, foo2_->file());
  481. EXPECT_EQ(bar_file_, bar2_->file());
  482. EXPECT_EQ(bar_file_, quux2_->file());
  483. }
  484. TEST_F(DescriptorTest, FieldIndex) {
  485. EXPECT_EQ(0, foo_->index());
  486. EXPECT_EQ(1, bar_->index());
  487. EXPECT_EQ(2, baz_->index());
  488. EXPECT_EQ(3, qux_->index());
  489. }
  490. TEST_F(DescriptorTest, FieldNumber) {
  491. EXPECT_EQ( 1, foo_->number());
  492. EXPECT_EQ( 6, bar_->number());
  493. EXPECT_EQ(500000000, baz_->number());
  494. EXPECT_EQ( 15, qux_->number());
  495. }
  496. TEST_F(DescriptorTest, FieldType) {
  497. EXPECT_EQ(FieldDescriptor::TYPE_STRING , foo_->type());
  498. EXPECT_EQ(FieldDescriptor::TYPE_ENUM , bar_->type());
  499. EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_->type());
  500. EXPECT_EQ(FieldDescriptor::TYPE_GROUP , qux_->type());
  501. }
  502. TEST_F(DescriptorTest, FieldLabel) {
  503. EXPECT_EQ(FieldDescriptor::LABEL_REQUIRED, foo_->label());
  504. EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->label());
  505. EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, baz_->label());
  506. EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, qux_->label());
  507. EXPECT_TRUE (foo_->is_required());
  508. EXPECT_FALSE(foo_->is_optional());
  509. EXPECT_FALSE(foo_->is_repeated());
  510. EXPECT_FALSE(bar_->is_required());
  511. EXPECT_TRUE (bar_->is_optional());
  512. EXPECT_FALSE(bar_->is_repeated());
  513. EXPECT_FALSE(baz_->is_required());
  514. EXPECT_FALSE(baz_->is_optional());
  515. EXPECT_TRUE (baz_->is_repeated());
  516. }
  517. TEST_F(DescriptorTest, FieldHasDefault) {
  518. EXPECT_FALSE(foo_->has_default_value());
  519. EXPECT_FALSE(bar_->has_default_value());
  520. EXPECT_FALSE(baz_->has_default_value());
  521. EXPECT_FALSE(qux_->has_default_value());
  522. }
  523. TEST_F(DescriptorTest, FieldContainingType) {
  524. EXPECT_EQ(message_, foo_->containing_type());
  525. EXPECT_EQ(message_, bar_->containing_type());
  526. EXPECT_EQ(message_, baz_->containing_type());
  527. EXPECT_EQ(message_, qux_->containing_type());
  528. EXPECT_EQ(message2_, foo2_ ->containing_type());
  529. EXPECT_EQ(message2_, bar2_ ->containing_type());
  530. EXPECT_EQ(message2_, quux2_->containing_type());
  531. }
  532. TEST_F(DescriptorTest, FieldMessageType) {
  533. EXPECT_TRUE(foo_->message_type() == NULL);
  534. EXPECT_TRUE(bar_->message_type() == NULL);
  535. EXPECT_EQ(foreign_, baz_->message_type());
  536. EXPECT_EQ(foreign_, qux_->message_type());
  537. }
  538. TEST_F(DescriptorTest, FieldEnumType) {
  539. EXPECT_TRUE(foo_->enum_type() == NULL);
  540. EXPECT_TRUE(baz_->enum_type() == NULL);
  541. EXPECT_TRUE(qux_->enum_type() == NULL);
  542. EXPECT_EQ(enum_, bar_->enum_type());
  543. }
  544. // ===================================================================
  545. class StylizedFieldNamesTest : public testing::Test {
  546. protected:
  547. void SetUp() {
  548. FileDescriptorProto file;
  549. file.set_name("foo.proto");
  550. AddExtensionRange(AddMessage(&file, "ExtendableMessage"), 1, 1000);
  551. DescriptorProto* message = AddMessage(&file, "TestMessage");
  552. AddField(message, "foo_foo", 1,
  553. FieldDescriptorProto::LABEL_OPTIONAL,
  554. FieldDescriptorProto::TYPE_INT32);
  555. AddField(message, "FooBar", 2,
  556. FieldDescriptorProto::LABEL_OPTIONAL,
  557. FieldDescriptorProto::TYPE_INT32);
  558. AddField(message, "fooBaz", 3,
  559. FieldDescriptorProto::LABEL_OPTIONAL,
  560. FieldDescriptorProto::TYPE_INT32);
  561. AddField(message, "fooFoo", 4, // Camel-case conflict with foo_foo.
  562. FieldDescriptorProto::LABEL_OPTIONAL,
  563. FieldDescriptorProto::TYPE_INT32);
  564. AddField(message, "foobar", 5, // Lower-case conflict with FooBar.
  565. FieldDescriptorProto::LABEL_OPTIONAL,
  566. FieldDescriptorProto::TYPE_INT32);
  567. AddNestedExtension(message, "ExtendableMessage", "bar_foo", 1,
  568. FieldDescriptorProto::LABEL_OPTIONAL,
  569. FieldDescriptorProto::TYPE_INT32);
  570. AddNestedExtension(message, "ExtendableMessage", "BarBar", 2,
  571. FieldDescriptorProto::LABEL_OPTIONAL,
  572. FieldDescriptorProto::TYPE_INT32);
  573. AddNestedExtension(message, "ExtendableMessage", "BarBaz", 3,
  574. FieldDescriptorProto::LABEL_OPTIONAL,
  575. FieldDescriptorProto::TYPE_INT32);
  576. AddNestedExtension(message, "ExtendableMessage", "barFoo", 4, // Conflict
  577. FieldDescriptorProto::LABEL_OPTIONAL,
  578. FieldDescriptorProto::TYPE_INT32);
  579. AddNestedExtension(message, "ExtendableMessage", "barbar", 5, // Conflict
  580. FieldDescriptorProto::LABEL_OPTIONAL,
  581. FieldDescriptorProto::TYPE_INT32);
  582. AddExtension(&file, "ExtendableMessage", "baz_foo", 11,
  583. FieldDescriptorProto::LABEL_OPTIONAL,
  584. FieldDescriptorProto::TYPE_INT32);
  585. AddExtension(&file, "ExtendableMessage", "BazBar", 12,
  586. FieldDescriptorProto::LABEL_OPTIONAL,
  587. FieldDescriptorProto::TYPE_INT32);
  588. AddExtension(&file, "ExtendableMessage", "BazBaz", 13,
  589. FieldDescriptorProto::LABEL_OPTIONAL,
  590. FieldDescriptorProto::TYPE_INT32);
  591. AddExtension(&file, "ExtendableMessage", "bazFoo", 14, // Conflict
  592. FieldDescriptorProto::LABEL_OPTIONAL,
  593. FieldDescriptorProto::TYPE_INT32);
  594. AddExtension(&file, "ExtendableMessage", "bazbar", 15, // Conflict
  595. FieldDescriptorProto::LABEL_OPTIONAL,
  596. FieldDescriptorProto::TYPE_INT32);
  597. file_ = pool_.BuildFile(file);
  598. ASSERT_TRUE(file_ != NULL);
  599. ASSERT_EQ(2, file_->message_type_count());
  600. message_ = file_->message_type(1);
  601. ASSERT_EQ("TestMessage", message_->name());
  602. ASSERT_EQ(5, message_->field_count());
  603. ASSERT_EQ(5, message_->extension_count());
  604. ASSERT_EQ(5, file_->extension_count());
  605. }
  606. DescriptorPool pool_;
  607. const FileDescriptor* file_;
  608. const Descriptor* message_;
  609. };
  610. TEST_F(StylizedFieldNamesTest, LowercaseName) {
  611. EXPECT_EQ("foo_foo", message_->field(0)->lowercase_name());
  612. EXPECT_EQ("foobar" , message_->field(1)->lowercase_name());
  613. EXPECT_EQ("foobaz" , message_->field(2)->lowercase_name());
  614. EXPECT_EQ("foofoo" , message_->field(3)->lowercase_name());
  615. EXPECT_EQ("foobar" , message_->field(4)->lowercase_name());
  616. EXPECT_EQ("bar_foo", message_->extension(0)->lowercase_name());
  617. EXPECT_EQ("barbar" , message_->extension(1)->lowercase_name());
  618. EXPECT_EQ("barbaz" , message_->extension(2)->lowercase_name());
  619. EXPECT_EQ("barfoo" , message_->extension(3)->lowercase_name());
  620. EXPECT_EQ("barbar" , message_->extension(4)->lowercase_name());
  621. EXPECT_EQ("baz_foo", file_->extension(0)->lowercase_name());
  622. EXPECT_EQ("bazbar" , file_->extension(1)->lowercase_name());
  623. EXPECT_EQ("bazbaz" , file_->extension(2)->lowercase_name());
  624. EXPECT_EQ("bazfoo" , file_->extension(3)->lowercase_name());
  625. EXPECT_EQ("bazbar" , file_->extension(4)->lowercase_name());
  626. }
  627. TEST_F(StylizedFieldNamesTest, CamelcaseName) {
  628. EXPECT_EQ("fooFoo", message_->field(0)->camelcase_name());
  629. EXPECT_EQ("fooBar", message_->field(1)->camelcase_name());
  630. EXPECT_EQ("fooBaz", message_->field(2)->camelcase_name());
  631. EXPECT_EQ("fooFoo", message_->field(3)->camelcase_name());
  632. EXPECT_EQ("foobar", message_->field(4)->camelcase_name());
  633. EXPECT_EQ("barFoo", message_->extension(0)->camelcase_name());
  634. EXPECT_EQ("barBar", message_->extension(1)->camelcase_name());
  635. EXPECT_EQ("barBaz", message_->extension(2)->camelcase_name());
  636. EXPECT_EQ("barFoo", message_->extension(3)->camelcase_name());
  637. EXPECT_EQ("barbar", message_->extension(4)->camelcase_name());
  638. EXPECT_EQ("bazFoo", file_->extension(0)->camelcase_name());
  639. EXPECT_EQ("bazBar", file_->extension(1)->camelcase_name());
  640. EXPECT_EQ("bazBaz", file_->extension(2)->camelcase_name());
  641. EXPECT_EQ("bazFoo", file_->extension(3)->camelcase_name());
  642. EXPECT_EQ("bazbar", file_->extension(4)->camelcase_name());
  643. }
  644. TEST_F(StylizedFieldNamesTest, FindByLowercaseName) {
  645. EXPECT_EQ(message_->field(0),
  646. message_->FindFieldByLowercaseName("foo_foo"));
  647. EXPECT_EQ(message_->field(1),
  648. message_->FindFieldByLowercaseName("foobar"));
  649. EXPECT_EQ(message_->field(2),
  650. message_->FindFieldByLowercaseName("foobaz"));
  651. EXPECT_TRUE(message_->FindFieldByLowercaseName("FooBar") == NULL);
  652. EXPECT_TRUE(message_->FindFieldByLowercaseName("fooBaz") == NULL);
  653. EXPECT_TRUE(message_->FindFieldByLowercaseName("bar_foo") == NULL);
  654. EXPECT_TRUE(message_->FindFieldByLowercaseName("nosuchfield") == NULL);
  655. EXPECT_EQ(message_->extension(0),
  656. message_->FindExtensionByLowercaseName("bar_foo"));
  657. EXPECT_EQ(message_->extension(1),
  658. message_->FindExtensionByLowercaseName("barbar"));
  659. EXPECT_EQ(message_->extension(2),
  660. message_->FindExtensionByLowercaseName("barbaz"));
  661. EXPECT_TRUE(message_->FindExtensionByLowercaseName("BarBar") == NULL);
  662. EXPECT_TRUE(message_->FindExtensionByLowercaseName("barBaz") == NULL);
  663. EXPECT_TRUE(message_->FindExtensionByLowercaseName("foo_foo") == NULL);
  664. EXPECT_TRUE(message_->FindExtensionByLowercaseName("nosuchfield") == NULL);
  665. EXPECT_EQ(file_->extension(0),
  666. file_->FindExtensionByLowercaseName("baz_foo"));
  667. EXPECT_EQ(file_->extension(1),
  668. file_->FindExtensionByLowercaseName("bazbar"));
  669. EXPECT_EQ(file_->extension(2),
  670. file_->FindExtensionByLowercaseName("bazbaz"));
  671. EXPECT_TRUE(file_->FindExtensionByLowercaseName("BazBar") == NULL);
  672. EXPECT_TRUE(file_->FindExtensionByLowercaseName("bazBaz") == NULL);
  673. EXPECT_TRUE(file_->FindExtensionByLowercaseName("nosuchfield") == NULL);
  674. }
  675. TEST_F(StylizedFieldNamesTest, FindByCamelcaseName) {
  676. EXPECT_EQ(message_->field(0),
  677. message_->FindFieldByCamelcaseName("fooFoo"));
  678. EXPECT_EQ(message_->field(1),
  679. message_->FindFieldByCamelcaseName("fooBar"));
  680. EXPECT_EQ(message_->field(2),
  681. message_->FindFieldByCamelcaseName("fooBaz"));
  682. EXPECT_TRUE(message_->FindFieldByCamelcaseName("foo_foo") == NULL);
  683. EXPECT_TRUE(message_->FindFieldByCamelcaseName("FooBar") == NULL);
  684. EXPECT_TRUE(message_->FindFieldByCamelcaseName("barFoo") == NULL);
  685. EXPECT_TRUE(message_->FindFieldByCamelcaseName("nosuchfield") == NULL);
  686. EXPECT_EQ(message_->extension(0),
  687. message_->FindExtensionByCamelcaseName("barFoo"));
  688. EXPECT_EQ(message_->extension(1),
  689. message_->FindExtensionByCamelcaseName("barBar"));
  690. EXPECT_EQ(message_->extension(2),
  691. message_->FindExtensionByCamelcaseName("barBaz"));
  692. EXPECT_TRUE(message_->FindExtensionByCamelcaseName("bar_foo") == NULL);
  693. EXPECT_TRUE(message_->FindExtensionByCamelcaseName("BarBar") == NULL);
  694. EXPECT_TRUE(message_->FindExtensionByCamelcaseName("fooFoo") == NULL);
  695. EXPECT_TRUE(message_->FindExtensionByCamelcaseName("nosuchfield") == NULL);
  696. EXPECT_EQ(file_->extension(0),
  697. file_->FindExtensionByCamelcaseName("bazFoo"));
  698. EXPECT_EQ(file_->extension(1),
  699. file_->FindExtensionByCamelcaseName("bazBar"));
  700. EXPECT_EQ(file_->extension(2),
  701. file_->FindExtensionByCamelcaseName("bazBaz"));
  702. EXPECT_TRUE(file_->FindExtensionByCamelcaseName("baz_foo") == NULL);
  703. EXPECT_TRUE(file_->FindExtensionByCamelcaseName("BazBar") == NULL);
  704. EXPECT_TRUE(file_->FindExtensionByCamelcaseName("nosuchfield") == NULL);
  705. }
  706. // ===================================================================
  707. // Test enum descriptors.
  708. class EnumDescriptorTest : public testing::Test {
  709. protected:
  710. virtual void SetUp() {
  711. // Build descriptors for the following definitions:
  712. //
  713. // // in "foo.proto"
  714. // enum TestEnum {
  715. // FOO = 1;
  716. // BAR = 2;
  717. // }
  718. //
  719. // // in "bar.proto"
  720. // package corge.grault;
  721. // enum TestEnum2 {
  722. // FOO = 1;
  723. // BAZ = 3;
  724. // }
  725. //
  726. // TestEnum2 is primarily here to test FindValueByName and friends.
  727. // All enums created from the same DescriptorPool share the same lookup
  728. // table, so we need to insure that they don't interfere.
  729. // TestEnum
  730. FileDescriptorProto foo_file;
  731. foo_file.set_name("foo.proto");
  732. EnumDescriptorProto* enum_proto = AddEnum(&foo_file, "TestEnum");
  733. AddEnumValue(enum_proto, "FOO", 1);
  734. AddEnumValue(enum_proto, "BAR", 2);
  735. // TestEnum2
  736. FileDescriptorProto bar_file;
  737. bar_file.set_name("bar.proto");
  738. bar_file.set_package("corge.grault");
  739. EnumDescriptorProto* enum2_proto = AddEnum(&bar_file, "TestEnum2");
  740. AddEnumValue(enum2_proto, "FOO", 1);
  741. AddEnumValue(enum2_proto, "BAZ", 3);
  742. // Build the descriptors and get the pointers.
  743. foo_file_ = pool_.BuildFile(foo_file);
  744. ASSERT_TRUE(foo_file_ != NULL);
  745. bar_file_ = pool_.BuildFile(bar_file);
  746. ASSERT_TRUE(bar_file_ != NULL);
  747. ASSERT_EQ(1, foo_file_->enum_type_count());
  748. enum_ = foo_file_->enum_type(0);
  749. ASSERT_EQ(2, enum_->value_count());
  750. foo_ = enum_->value(0);
  751. bar_ = enum_->value(1);
  752. ASSERT_EQ(1, bar_file_->enum_type_count());
  753. enum2_ = bar_file_->enum_type(0);
  754. ASSERT_EQ(2, enum2_->value_count());
  755. foo2_ = enum2_->value(0);
  756. baz2_ = enum2_->value(1);
  757. }
  758. DescriptorPool pool_;
  759. const FileDescriptor* foo_file_;
  760. const FileDescriptor* bar_file_;
  761. const EnumDescriptor* enum_;
  762. const EnumDescriptor* enum2_;
  763. const EnumValueDescriptor* foo_;
  764. const EnumValueDescriptor* bar_;
  765. const EnumValueDescriptor* foo2_;
  766. const EnumValueDescriptor* baz2_;
  767. };
  768. TEST_F(EnumDescriptorTest, Name) {
  769. EXPECT_EQ("TestEnum", enum_->name());
  770. EXPECT_EQ("TestEnum", enum_->full_name());
  771. EXPECT_EQ(foo_file_, enum_->file());
  772. EXPECT_EQ("TestEnum2", enum2_->name());
  773. EXPECT_EQ("corge.grault.TestEnum2", enum2_->full_name());
  774. EXPECT_EQ(bar_file_, enum2_->file());
  775. }
  776. TEST_F(EnumDescriptorTest, ContainingType) {
  777. EXPECT_TRUE(enum_->containing_type() == NULL);
  778. EXPECT_TRUE(enum2_->containing_type() == NULL);
  779. }
  780. TEST_F(EnumDescriptorTest, ValuesByIndex) {
  781. ASSERT_EQ(2, enum_->value_count());
  782. EXPECT_EQ(foo_, enum_->value(0));
  783. EXPECT_EQ(bar_, enum_->value(1));
  784. }
  785. TEST_F(EnumDescriptorTest, FindValueByName) {
  786. EXPECT_EQ(foo_ , enum_ ->FindValueByName("FOO"));
  787. EXPECT_EQ(bar_ , enum_ ->FindValueByName("BAR"));
  788. EXPECT_EQ(foo2_, enum2_->FindValueByName("FOO"));
  789. EXPECT_EQ(baz2_, enum2_->FindValueByName("BAZ"));
  790. EXPECT_TRUE(enum_ ->FindValueByName("NO_SUCH_VALUE") == NULL);
  791. EXPECT_TRUE(enum_ ->FindValueByName("BAZ" ) == NULL);
  792. EXPECT_TRUE(enum2_->FindValueByName("BAR" ) == NULL);
  793. }
  794. TEST_F(EnumDescriptorTest, FindValueByNumber) {
  795. EXPECT_EQ(foo_ , enum_ ->FindValueByNumber(1));
  796. EXPECT_EQ(bar_ , enum_ ->FindValueByNumber(2));
  797. EXPECT_EQ(foo2_, enum2_->FindValueByNumber(1));
  798. EXPECT_EQ(baz2_, enum2_->FindValueByNumber(3));
  799. EXPECT_TRUE(enum_ ->FindValueByNumber(416) == NULL);
  800. EXPECT_TRUE(enum_ ->FindValueByNumber(3) == NULL);
  801. EXPECT_TRUE(enum2_->FindValueByNumber(2) == NULL);
  802. }
  803. TEST_F(EnumDescriptorTest, ValueName) {
  804. EXPECT_EQ("FOO", foo_->name());
  805. EXPECT_EQ("BAR", bar_->name());
  806. }
  807. TEST_F(EnumDescriptorTest, ValueFullName) {
  808. EXPECT_EQ("FOO", foo_->full_name());
  809. EXPECT_EQ("BAR", bar_->full_name());
  810. EXPECT_EQ("corge.grault.FOO", foo2_->full_name());
  811. EXPECT_EQ("corge.grault.BAZ", baz2_->full_name());
  812. }
  813. TEST_F(EnumDescriptorTest, ValueIndex) {
  814. EXPECT_EQ(0, foo_->index());
  815. EXPECT_EQ(1, bar_->index());
  816. }
  817. TEST_F(EnumDescriptorTest, ValueNumber) {
  818. EXPECT_EQ(1, foo_->number());
  819. EXPECT_EQ(2, bar_->number());
  820. }
  821. TEST_F(EnumDescriptorTest, ValueType) {
  822. EXPECT_EQ(enum_ , foo_ ->type());
  823. EXPECT_EQ(enum_ , bar_ ->type());
  824. EXPECT_EQ(enum2_, foo2_->type());
  825. EXPECT_EQ(enum2_, baz2_->type());
  826. }
  827. // ===================================================================
  828. // Test service descriptors.
  829. class ServiceDescriptorTest : public testing::Test {
  830. protected:
  831. virtual void SetUp() {
  832. // Build descriptors for the following messages and service:
  833. // // in "foo.proto"
  834. // message FooRequest {}
  835. // message FooResponse {}
  836. // message BarRequest {}
  837. // message BarResponse {}
  838. // message BazRequest {}
  839. // message BazResponse {}
  840. //
  841. // service TestService {
  842. // rpc Foo(FooRequest) returns (FooResponse);
  843. // rpc Bar(BarRequest) returns (BarResponse);
  844. // }
  845. //
  846. // // in "bar.proto"
  847. // package corge.grault
  848. // service TestService2 {
  849. // rpc Foo(FooRequest) returns (FooResponse);
  850. // rpc Baz(BazRequest) returns (BazResponse);
  851. // }
  852. FileDescriptorProto foo_file;
  853. foo_file.set_name("foo.proto");
  854. AddMessage(&foo_file, "FooRequest");
  855. AddMessage(&foo_file, "FooResponse");
  856. AddMessage(&foo_file, "BarRequest");
  857. AddMessage(&foo_file, "BarResponse");
  858. AddMessage(&foo_file, "BazRequest");
  859. AddMessage(&foo_file, "BazResponse");
  860. ServiceDescriptorProto* service = AddService(&foo_file, "TestService");
  861. AddMethod(service, "Foo", "FooRequest", "FooResponse");
  862. AddMethod(service, "Bar", "BarRequest", "BarResponse");
  863. FileDescriptorProto bar_file;
  864. bar_file.set_name("bar.proto");
  865. bar_file.set_package("corge.grault");
  866. bar_file.add_dependency("foo.proto");
  867. ServiceDescriptorProto* service2 = AddService(&bar_file, "TestService2");
  868. AddMethod(service2, "Foo", "FooRequest", "FooResponse");
  869. AddMethod(service2, "Baz", "BazRequest", "BazResponse");
  870. // Build the descriptors and get the pointers.
  871. foo_file_ = pool_.BuildFile(foo_file);
  872. ASSERT_TRUE(foo_file_ != NULL);
  873. bar_file_ = pool_.BuildFile(bar_file);
  874. ASSERT_TRUE(bar_file_ != NULL);
  875. ASSERT_EQ(6, foo_file_->message_type_count());
  876. foo_request_ = foo_file_->message_type(0);
  877. foo_response_ = foo_file_->message_type(1);
  878. bar_request_ = foo_file_->message_type(2);
  879. bar_response_ = foo_file_->message_type(3);
  880. baz_request_ = foo_file_->message_type(4);
  881. baz_response_ = foo_file_->message_type(5);
  882. ASSERT_EQ(1, foo_file_->service_count());
  883. service_ = foo_file_->service(0);
  884. ASSERT_EQ(2, service_->method_count());
  885. foo_ = service_->method(0);
  886. bar_ = service_->method(1);
  887. ASSERT_EQ(1, bar_file_->service_count());
  888. service2_ = bar_file_->service(0);
  889. ASSERT_EQ(2, service2_->method_count());
  890. foo2_ = service2_->method(0);
  891. baz2_ = service2_->method(1);
  892. }
  893. DescriptorPool pool_;
  894. const FileDescriptor* foo_file_;
  895. const FileDescriptor* bar_file_;
  896. const Descriptor* foo_request_;
  897. const Descriptor* foo_response_;
  898. const Descriptor* bar_request_;
  899. const Descriptor* bar_response_;
  900. const Descriptor* baz_request_;
  901. const Descriptor* baz_response_;
  902. const ServiceDescriptor* service_;
  903. const ServiceDescriptor* service2_;
  904. const MethodDescriptor* foo_;
  905. const MethodDescriptor* bar_;
  906. const MethodDescriptor* foo2_;
  907. const MethodDescriptor* baz2_;
  908. };
  909. TEST_F(ServiceDescriptorTest, Name) {
  910. EXPECT_EQ("TestService", service_->name());
  911. EXPECT_EQ("TestService", service_->full_name());
  912. EXPECT_EQ(foo_file_, service_->file());
  913. EXPECT_EQ("TestService2", service2_->name());
  914. EXPECT_EQ("corge.grault.TestService2", service2_->full_name());
  915. EXPECT_EQ(bar_file_, service2_->file());
  916. }
  917. TEST_F(ServiceDescriptorTest, MethodsByIndex) {
  918. ASSERT_EQ(2, service_->method_count());
  919. EXPECT_EQ(foo_, service_->method(0));
  920. EXPECT_EQ(bar_, service_->method(1));
  921. }
  922. TEST_F(ServiceDescriptorTest, FindMethodByName) {
  923. EXPECT_EQ(foo_ , service_ ->FindMethodByName("Foo"));
  924. EXPECT_EQ(bar_ , service_ ->FindMethodByName("Bar"));
  925. EXPECT_EQ(foo2_, service2_->FindMethodByName("Foo"));
  926. EXPECT_EQ(baz2_, service2_->FindMethodByName("Baz"));
  927. EXPECT_TRUE(service_ ->FindMethodByName("NoSuchMethod") == NULL);
  928. EXPECT_TRUE(service_ ->FindMethodByName("Baz" ) == NULL);
  929. EXPECT_TRUE(service2_->FindMethodByName("Bar" ) == NULL);
  930. }
  931. TEST_F(ServiceDescriptorTest, MethodName) {
  932. EXPECT_EQ("Foo", foo_->name());
  933. EXPECT_EQ("Bar", bar_->name());
  934. }
  935. TEST_F(ServiceDescriptorTest, MethodFullName) {
  936. EXPECT_EQ("TestService.Foo", foo_->full_name());
  937. EXPECT_EQ("TestService.Bar", bar_->full_name());
  938. EXPECT_EQ("corge.grault.TestService2.Foo", foo2_->full_name());
  939. EXPECT_EQ("corge.grault.TestService2.Baz", baz2_->full_name());
  940. }
  941. TEST_F(ServiceDescriptorTest, MethodIndex) {
  942. EXPECT_EQ(0, foo_->index());
  943. EXPECT_EQ(1, bar_->index());
  944. }
  945. TEST_F(ServiceDescriptorTest, MethodParent) {
  946. EXPECT_EQ(service_, foo_->service());
  947. EXPECT_EQ(service_, bar_->service());
  948. }
  949. TEST_F(ServiceDescriptorTest, MethodInputType) {
  950. EXPECT_EQ(foo_request_, foo_->input_type());
  951. EXPECT_EQ(bar_request_, bar_->input_type());
  952. }
  953. TEST_F(ServiceDescriptorTest, MethodOutputType) {
  954. EXPECT_EQ(foo_response_, foo_->output_type());
  955. EXPECT_EQ(bar_response_, bar_->output_type());
  956. }
  957. // ===================================================================
  958. // Test nested types.
  959. class NestedDescriptorTest : public testing::Test {
  960. protected:
  961. virtual void SetUp() {
  962. // Build descriptors for the following definitions:
  963. //
  964. // // in "foo.proto"
  965. // message TestMessage {
  966. // message Foo {}
  967. // message Bar {}
  968. // enum Baz { A = 1; }
  969. // enum Qux { B = 1; }
  970. // }
  971. //
  972. // // in "bar.proto"
  973. // package corge.grault;
  974. // message TestMessage2 {
  975. // message Foo {}
  976. // message Baz {}
  977. // enum Qux { A = 1; }
  978. // enum Quux { C = 1; }
  979. // }
  980. //
  981. // TestMessage2 is primarily here to test FindNestedTypeByName and friends.
  982. // All messages created from the same DescriptorPool share the same lookup
  983. // table, so we need to insure that they don't interfere.
  984. //
  985. // We add enum values to the enums in order to test searching for enum
  986. // values across a message's scope.
  987. FileDescriptorProto foo_file;
  988. foo_file.set_name("foo.proto");
  989. DescriptorProto* message = AddMessage(&foo_file, "TestMessage");
  990. AddNestedMessage(message, "Foo");
  991. AddNestedMessage(message, "Bar");
  992. EnumDescriptorProto* baz = AddNestedEnum(message, "Baz");
  993. AddEnumValue(baz, "A", 1);
  994. EnumDescriptorProto* qux = AddNestedEnum(message, "Qux");
  995. AddEnumValue(qux, "B", 1);
  996. FileDescriptorProto bar_file;
  997. bar_file.set_name("bar.proto");
  998. bar_file.set_package("corge.grault");
  999. DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2");
  1000. AddNestedMessage(message2, "Foo");
  1001. AddNestedMessage(message2, "Baz");
  1002. EnumDescriptorProto* qux2 = AddNestedEnum(message2, "Qux");
  1003. AddEnumValue(qux2, "A", 1);
  1004. EnumDescriptorProto* quux2 = AddNestedEnum(message2, "Quux");
  1005. AddEnumValue(quux2, "C", 1);
  1006. // Build the descriptors and get the pointers.
  1007. foo_file_ = pool_.BuildFile(foo_file);
  1008. ASSERT_TRUE(foo_file_ != NULL);
  1009. bar_file_ = pool_.BuildFile(bar_file);
  1010. ASSERT_TRUE(bar_file_ != NULL);
  1011. ASSERT_EQ(1, foo_file_->message_type_count());
  1012. message_ = foo_file_->message_type(0);
  1013. ASSERT_EQ(2, message_->nested_type_count());
  1014. foo_ = message_->nested_type(0);
  1015. bar_ = message_->nested_type(1);
  1016. ASSERT_EQ(2, message_->enum_type_count());
  1017. baz_ = message_->enum_type(0);
  1018. qux_ = message_->enum_type(1);
  1019. ASSERT_EQ(1, baz_->value_count());
  1020. a_ = baz_->value(0);
  1021. ASSERT_EQ(1, qux_->value_count());
  1022. b_ = qux_->value(0);
  1023. ASSERT_EQ(1, bar_file_->message_type_count());
  1024. message2_ = bar_file_->message_type(0);
  1025. ASSERT_EQ(2, message2_->nested_type_count());
  1026. foo2_ = message2_->nested_type(0);
  1027. baz2_ = message2_->nested_type(1);
  1028. ASSERT_EQ(2, message2_->enum_type_count());
  1029. qux2_ = message2_->enum_type(0);
  1030. quux2_ = message2_->enum_type(1);
  1031. ASSERT_EQ(1, qux2_->value_count());
  1032. a2_ = qux2_->value(0);
  1033. ASSERT_EQ(1, quux2_->value_count());
  1034. c2_ = quux2_->value(0);
  1035. }
  1036. DescriptorPool pool_;
  1037. const FileDescriptor* foo_file_;
  1038. const FileDescriptor* bar_file_;
  1039. const Descriptor* message_;
  1040. const Descriptor* message2_;
  1041. const Descriptor* foo_;
  1042. const Descriptor* bar_;
  1043. const EnumDescriptor* baz_;
  1044. const EnumDescriptor* qux_;
  1045. const EnumValueDescriptor* a_;
  1046. const EnumValueDescriptor* b_;
  1047. const Descriptor* foo2_;
  1048. const Descriptor* baz2_;
  1049. const EnumDescriptor* qux2_;
  1050. const EnumDescriptor* quux2_;
  1051. const EnumValueDescriptor* a2_;
  1052. const EnumValueDescriptor* c2_;
  1053. };
  1054. TEST_F(NestedDescriptorTest, MessageName) {
  1055. EXPECT_EQ("Foo", foo_ ->name());
  1056. EXPECT_EQ("Bar", bar_ ->name());
  1057. EXPECT_EQ("Foo", foo2_->name());
  1058. EXPECT_EQ("Baz", baz2_->name());
  1059. EXPECT_EQ("TestMessage.Foo", foo_->full_name());
  1060. EXPECT_EQ("TestMessage.Bar", bar_->full_name());
  1061. EXPECT_EQ("corge.grault.TestMessage2.Foo", foo2_->full_name());
  1062. EXPECT_EQ("corge.grault.TestMessage2.Baz", baz2_->full_name());
  1063. }
  1064. TEST_F(NestedDescriptorTest, MessageContainingType) {
  1065. EXPECT_EQ(message_ , foo_ ->containing_type());
  1066. EXPECT_EQ(message_ , bar_ ->containing_type());
  1067. EXPECT_EQ(message2_, foo2_->containing_type());
  1068. EXPECT_EQ(message2_, baz2_->containing_type());
  1069. }
  1070. TEST_F(NestedDescriptorTest, NestedMessagesByIndex) {
  1071. ASSERT_EQ(2, message_->nested_type_count());
  1072. EXPECT_EQ(foo_, message_->nested_type(0));
  1073. EXPECT_EQ(bar_, message_->nested_type(1));
  1074. }
  1075. TEST_F(NestedDescriptorTest, FindFieldByNameDoesntFindNestedTypes) {
  1076. EXPECT_TRUE(message_->FindFieldByName("Foo") == NULL);
  1077. EXPECT_TRUE(message_->FindFieldByName("Qux") == NULL);
  1078. EXPECT_TRUE(message_->FindExtensionByName("Foo") == NULL);
  1079. EXPECT_TRUE(message_->FindExtensionByName("Qux") == NULL);
  1080. }
  1081. TEST_F(NestedDescriptorTest, FindNestedTypeByName) {
  1082. EXPECT_EQ(foo_ , message_ ->FindNestedTypeByName("Foo"));
  1083. EXPECT_EQ(bar_ , message_ ->FindNestedTypeByName("Bar"));
  1084. EXPECT_EQ(foo2_, message2_->FindNestedTypeByName("Foo"));
  1085. EXPECT_EQ(baz2_, message2_->FindNestedTypeByName("Baz"));
  1086. EXPECT_TRUE(message_ ->FindNestedTypeByName("NoSuchType") == NULL);
  1087. EXPECT_TRUE(message_ ->FindNestedTypeByName("Baz" ) == NULL);
  1088. EXPECT_TRUE(message2_->FindNestedTypeByName("Bar" ) == NULL);
  1089. EXPECT_TRUE(message_->FindNestedTypeByName("Qux") == NULL);
  1090. }
  1091. TEST_F(NestedDescriptorTest, EnumName) {
  1092. EXPECT_EQ("Baz" , baz_ ->name());
  1093. EXPECT_EQ("Qux" , qux_ ->name());
  1094. EXPECT_EQ("Qux" , qux2_->name());
  1095. EXPECT_EQ("Quux", quux2_->name());
  1096. EXPECT_EQ("TestMessage.Baz", baz_->full_name());
  1097. EXPECT_EQ("TestMessage.Qux", qux_->full_name());
  1098. EXPECT_EQ("corge.grault.TestMessage2.Qux" , qux2_ ->full_name());
  1099. EXPECT_EQ("corge.grault.TestMessage2.Quux", quux2_->full_name());
  1100. }
  1101. TEST_F(NestedDescriptorTest, EnumContainingType) {
  1102. EXPECT_EQ(message_ , baz_ ->containing_type());
  1103. EXPECT_EQ(message_ , qux_ ->containing_type());
  1104. EXPECT_EQ(message2_, qux2_ ->containing_type());
  1105. EXPECT_EQ(message2_, quux2_->containing_type());
  1106. }
  1107. TEST_F(NestedDescriptorTest, NestedEnumsByIndex) {
  1108. ASSERT_EQ(2, message_->nested_type_count());
  1109. EXPECT_EQ(foo_, message_->nested_type(0));
  1110. EXPECT_EQ(bar_, message_->nested_type(1));
  1111. }
  1112. TEST_F(NestedDescriptorTest, FindEnumTypeByName) {
  1113. EXPECT_EQ(baz_ , message_ ->FindEnumTypeByName("Baz" ));
  1114. EXPECT_EQ(qux_ , message_ ->FindEnumTypeByName("Qux" ));
  1115. EXPECT_EQ(qux2_ , message2_->FindEnumTypeByName("Qux" ));
  1116. EXPECT_EQ(quux2_, message2_->FindEnumTypeByName("Quux"));
  1117. EXPECT_TRUE(message_ ->FindEnumTypeByName("NoSuchType") == NULL);
  1118. EXPECT_TRUE(message_ ->FindEnumTypeByName("Quux" ) == NULL);
  1119. EXPECT_TRUE(message2_->FindEnumTypeByName("Baz" ) == NULL);
  1120. EXPECT_TRUE(message_->FindEnumTypeByName("Foo") == NULL);
  1121. }
  1122. TEST_F(NestedDescriptorTest, FindEnumValueByName) {
  1123. EXPECT_EQ(a_ , message_ ->FindEnumValueByName("A"));
  1124. EXPECT_EQ(b_ , message_ ->FindEnumValueByName("B"));
  1125. EXPECT_EQ(a2_, message2_->FindEnumValueByName("A"));
  1126. EXPECT_EQ(c2_, message2_->FindEnumValueByName("C"));
  1127. EXPECT_TRUE(message_ ->FindEnumValueByName("NO_SUCH_VALUE") == NULL);
  1128. EXPECT_TRUE(message_ ->FindEnumValueByName("C" ) == NULL);
  1129. EXPECT_TRUE(message2_->FindEnumValueByName("B" ) == NULL);
  1130. EXPECT_TRUE(message_->FindEnumValueByName("Foo") == NULL);
  1131. }
  1132. // ===================================================================
  1133. // Test extensions.
  1134. class ExtensionDescriptorTest : public testing::Test {
  1135. protected:
  1136. virtual void SetUp() {
  1137. // Build descriptors for the following definitions:
  1138. //
  1139. // enum Baz {}
  1140. // message Qux {}
  1141. //
  1142. // message Foo {
  1143. // extensions 10 to 19;
  1144. // extensions 30 to 39;
  1145. // }
  1146. // extends Foo with optional int32 foo_int32 = 10;
  1147. // extends Foo with repeated TestEnum foo_enum = 19;
  1148. // message Bar {
  1149. // extends Foo with optional Qux foo_message = 30;
  1150. // // (using Qux as the group type)
  1151. // extends Foo with repeated group foo_group = 39;
  1152. // }
  1153. FileDescriptorProto foo_file;
  1154. foo_file.set_name("foo.proto");
  1155. AddEmptyEnum(&foo_file, "Baz");
  1156. AddMessage(&foo_file, "Qux");
  1157. DescriptorProto* foo = AddMessage(&foo_file, "Foo");
  1158. AddExtensionRange(foo, 10, 20);
  1159. AddExtensionRange(foo, 30, 40);
  1160. AddExtension(&foo_file, "Foo", "foo_int32", 10,
  1161. FieldDescriptorProto::LABEL_OPTIONAL,
  1162. FieldDescriptorProto::TYPE_INT32);
  1163. AddExtension(&foo_file, "Foo", "foo_enum", 19,
  1164. FieldDescriptorProto::LABEL_REPEATED,
  1165. FieldDescriptorProto::TYPE_ENUM)
  1166. ->set_type_name("Baz");
  1167. DescriptorProto* bar = AddMessage(&foo_file, "Bar");
  1168. AddNestedExtension(bar, "Foo", "foo_message", 30,
  1169. FieldDescriptorProto::LABEL_OPTIONAL,
  1170. FieldDescriptorProto::TYPE_MESSAGE)
  1171. ->set_type_name("Qux");
  1172. AddNestedExtension(bar, "Foo", "foo_group", 39,
  1173. FieldDescriptorProto::LABEL_REPEATED,
  1174. FieldDescriptorProto::TYPE_GROUP)
  1175. ->set_type_name("Qux");
  1176. // Build the descriptors and get the pointers.
  1177. foo_file_ = pool_.BuildFile(foo_file);
  1178. ASSERT_TRUE(foo_file_ != NULL);
  1179. ASSERT_EQ(1, foo_file_->enum_type_count());
  1180. baz_ = foo_file_->enum_type(0);
  1181. ASSERT_EQ(3, foo_file_->message_type_count());
  1182. qux_ = foo_file_->message_type(0);
  1183. foo_ = foo_file_->message_type(1);
  1184. bar_ = foo_file_->message_type(2);
  1185. }
  1186. DescriptorPool pool_;
  1187. const FileDescriptor* foo_file_;
  1188. const Descriptor* foo_;
  1189. const Descriptor* bar_;
  1190. const EnumDescriptor* baz_;
  1191. const Descriptor* qux_;
  1192. };
  1193. TEST_F(ExtensionDescriptorTest, ExtensionRanges) {
  1194. EXPECT_EQ(0, bar_->extension_range_count());
  1195. ASSERT_EQ(2, foo_->extension_range_count());
  1196. EXPECT_EQ(10, foo_->extension_range(0)->start);
  1197. EXPECT_EQ(30, foo_->extension_range(1)->start);
  1198. EXPECT_EQ(20, foo_->extension_range(0)->end);
  1199. EXPECT_EQ(40, foo_->extension_range(1)->end);
  1200. };
  1201. TEST_F(ExtensionDescriptorTest, Extensions) {
  1202. EXPECT_EQ(0, foo_->extension_count());
  1203. ASSERT_EQ(2, foo_file_->extension_count());
  1204. ASSERT_EQ(2, bar_->extension_count());
  1205. EXPECT_TRUE(foo_file_->extension(0)->is_extension());
  1206. EXPECT_TRUE(foo_file_->extension(1)->is_extension());
  1207. EXPECT_TRUE(bar_->extension(0)->is_extension());
  1208. EXPECT_TRUE(bar_->extension(1)->is_extension());
  1209. EXPECT_EQ("foo_int32" , foo_file_->extension(0)->name());
  1210. EXPECT_EQ("foo_enum" , foo_file_->extension(1)->name());
  1211. EXPECT_EQ("foo_message", bar_->extension(0)->name());
  1212. EXPECT_EQ("foo_group" , bar_->extension(1)->name());
  1213. EXPECT_EQ(10, foo_file_->extension(0)->number());
  1214. EXPECT_EQ(19, foo_file_->extension(1)->number());
  1215. EXPECT_EQ(30, bar_->extension(0)->number());
  1216. EXPECT_EQ(39, bar_->extension(1)->number());
  1217. EXPECT_EQ(FieldDescriptor::TYPE_INT32 , foo_file_->extension(0)->type());
  1218. EXPECT_EQ(FieldDescriptor::TYPE_ENUM , foo_file_->extension(1)->type());
  1219. EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_->extension(0)->type());
  1220. EXPECT_EQ(FieldDescriptor::TYPE_GROUP , bar_->extension(1)->type());
  1221. EXPECT_EQ(baz_, foo_file_->extension(1)->enum_type());
  1222. EXPECT_EQ(qux_, bar_->extension(0)->message_type());
  1223. EXPECT_EQ(qux_, bar_->extension(1)->message_type());
  1224. EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, foo_file_->extension(0)->label());
  1225. EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, foo_file_->extension(1)->label());
  1226. EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->extension(0)->label());
  1227. EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, bar_->extension(1)->label());
  1228. EXPECT_EQ(foo_, foo_file_->extension(0)->containing_type());
  1229. EXPECT_EQ(foo_, foo_file_->extension(1)->containing_type());
  1230. EXPECT_EQ(foo_, bar_->extension(0)->containing_type());
  1231. EXPECT_EQ(foo_, bar_->extension(1)->containing_type());
  1232. EXPECT_TRUE(foo_file_->extension(0)->extension_scope() == NULL);
  1233. EXPECT_TRUE(foo_file_->extension(1)->extension_scope() == NULL);
  1234. EXPECT_EQ(bar_, bar_->extension(0)->extension_scope());
  1235. EXPECT_EQ(bar_, bar_->extension(1)->extension_scope());
  1236. };
  1237. TEST_F(ExtensionDescriptorTest, IsExtensionNumber) {
  1238. EXPECT_FALSE(foo_->IsExtensionNumber( 9));
  1239. EXPECT_TRUE (foo_->IsExtensionNumber(10));
  1240. EXPECT_TRUE (foo_->IsExtensionNumber(19));
  1241. EXPECT_FALSE(foo_->IsExtensionNumber(20));
  1242. EXPECT_FALSE(foo_->IsExtensionNumber(29));
  1243. EXPECT_TRUE (foo_->IsExtensionNumber(30));
  1244. EXPECT_TRUE (foo_->IsExtensionNumber(39));
  1245. EXPECT_FALSE(foo_->IsExtensionNumber(40));
  1246. }
  1247. TEST_F(ExtensionDescriptorTest, FindExtensionByName) {
  1248. // Note that FileDescriptor::FindExtensionByName() is tested by
  1249. // FileDescriptorTest.
  1250. ASSERT_EQ(2, bar_->extension_count());
  1251. EXPECT_EQ(bar_->extension(0), bar_->FindExtensionByName("foo_message"));
  1252. EXPECT_EQ(bar_->extension(1), bar_->FindExtensionByName("foo_group" ));
  1253. EXPECT_TRUE(bar_->FindExtensionByName("no_such_extension") == NULL);
  1254. EXPECT_TRUE(foo_->FindExtensionByName("foo_int32") == NULL);
  1255. EXPECT_TRUE(foo_->FindExtensionByName("foo_message") == NULL);
  1256. }
  1257. TEST_F(ExtensionDescriptorTest, FindAllExtensions) {
  1258. vector<const FieldDescriptor*> extensions;
  1259. pool_.FindAllExtensions(foo_, &extensions);
  1260. ASSERT_EQ(4, extensions.size());
  1261. EXPECT_EQ(10, extensions[0]->number());
  1262. EXPECT_EQ(19, extensions[1]->number());
  1263. EXPECT_EQ(30, extensions[2]->number());
  1264. EXPECT_EQ(39, extensions[3]->number());
  1265. }
  1266. // ===================================================================
  1267. class MiscTest : public testing::Test {
  1268. protected:
  1269. // Function which makes a field of the given type just to find out what its
  1270. // cpp_type is.
  1271. FieldDescriptor::CppType GetCppTypeForFieldType(FieldDescriptor::Type type) {
  1272. FileDescriptorProto file_proto;
  1273. file_proto.set_name("foo.proto");
  1274. AddEmptyEnum(&file_proto, "DummyEnum");
  1275. DescriptorProto* message = AddMessage(&file_proto, "TestMessage");
  1276. FieldDescriptorProto* field =
  1277. AddField(message, "foo", 1, FieldDescriptorProto::LABEL_OPTIONAL,
  1278. static_cast<FieldDescriptorProto::Type>(static_cast<int>(type)));
  1279. if (type == FieldDescriptor::TYPE_MESSAGE ||
  1280. type == FieldDescriptor::TYPE_GROUP) {
  1281. field->set_type_name("TestMessage");
  1282. } else if (type == FieldDescriptor::TYPE_ENUM) {
  1283. field->set_type_name("DummyEnum");
  1284. }
  1285. // Build the descriptors and get the pointers.
  1286. DescriptorPool pool;
  1287. const FileDescriptor* file = pool.BuildFile(file_proto);
  1288. if (file != NULL &&
  1289. file->message_type_count() == 1 &&
  1290. file->message_type(0)->field_count() == 1) {
  1291. return file->message_type(0)->field(0)->cpp_type();
  1292. } else {
  1293. return static_cast<FieldDescriptor::CppType>(0);
  1294. }
  1295. }
  1296. };
  1297. TEST_F(MiscTest, CppTypes) {
  1298. // Test that CPP types are assigned correctly.
  1299. typedef FieldDescriptor FD; // avoid ugly line wrapping
  1300. EXPECT_EQ(FD::CPPTYPE_DOUBLE , GetCppTypeForFieldType(FD::TYPE_DOUBLE ));
  1301. EXPECT_EQ(FD::CPPTYPE_FLOAT , GetCppTypeForFieldType(FD::TYPE_FLOAT ));
  1302. EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_INT64 ));
  1303. EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_UINT64 ));
  1304. EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_INT32 ));
  1305. EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_FIXED64 ));
  1306. EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_FIXED32 ));
  1307. EXPECT_EQ(FD::CPPTYPE_BOOL , GetCppTypeForFieldType(FD::TYPE_BOOL ));
  1308. EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_STRING ));
  1309. EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_GROUP ));
  1310. EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_MESSAGE ));
  1311. EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_BYTES ));
  1312. EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_UINT32 ));
  1313. EXPECT_EQ(FD::CPPTYPE_ENUM , GetCppTypeForFieldType(FD::TYPE_ENUM ));
  1314. EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_SFIXED32));
  1315. EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_SFIXED64));
  1316. EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_SINT32 ));
  1317. EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_SINT64 ));
  1318. }
  1319. TEST_F(MiscTest, DefaultValues) {
  1320. // Test that setting default values works.
  1321. FileDescriptorProto file_proto;
  1322. file_proto.set_name("foo.proto");
  1323. EnumDescriptorProto* enum_type_proto = AddEnum(&file_proto, "DummyEnum");
  1324. AddEnumValue(enum_type_proto, "A", 1);
  1325. AddEnumValue(enum_type_proto, "B", 2);
  1326. DescriptorProto* message_proto = AddMessage(&file_proto, "TestMessage");
  1327. typedef FieldDescriptorProto FD; // avoid ugly line wrapping
  1328. const FD::Label label = FD::LABEL_OPTIONAL;
  1329. // Create fields of every CPP type with default values.
  1330. AddField(message_proto, "int32" , 1, label, FD::TYPE_INT32 )
  1331. ->set_default_value("-1");
  1332. AddField(message_proto, "int64" , 2, label, FD::TYPE_INT64 )
  1333. ->set_default_value("-1000000000000");
  1334. AddField(message_proto, "uint32", 3, label, FD::TYPE_UINT32)
  1335. ->set_default_value("42");
  1336. AddField(message_proto, "uint64", 4, label, FD::TYPE_UINT64)
  1337. ->set_default_value("2000000000000");
  1338. AddField(message_proto, "float" , 5, label, FD::TYPE_FLOAT )
  1339. ->set_default_value("4.5");
  1340. AddField(message_proto, "double", 6, label, FD::TYPE_DOUBLE)
  1341. ->set_default_value("10e100");
  1342. AddField(message_proto, "bool" , 7, label, FD::TYPE_BOOL )
  1343. ->set_default_value("true");
  1344. AddField(message_proto, "string", 8, label, FD::TYPE_STRING)
  1345. ->set_default_value("hello");
  1346. AddField(message_proto, "data" , 9, label, FD::TYPE_BYTES )
  1347. ->set_default_value("\\001\\002\\003");
  1348. FieldDescriptorProto* enum_field =
  1349. AddField(message_proto, "enum", 10, label, FD::TYPE_ENUM);
  1350. enum_field->set_type_name("DummyEnum");
  1351. enum_field->set_default_value("B");
  1352. // Strings are allowed to have empty defaults. (At one point, due to
  1353. // a bug, empty defaults for strings were rejected. Oops.)
  1354. AddField(message_proto, "empty_string", 11, label, FD::TYPE_STRING)
  1355. ->set_default_value("");
  1356. // Add a second set of fields with implicit defalut values.
  1357. AddField(message_proto, "implicit_int32" , 21, label, FD::TYPE_INT32 );
  1358. AddField(message_proto, "implicit_int64" , 22, label, FD::TYPE_INT64 );
  1359. AddField(message_proto, "implicit_uint32", 23, label, FD::TYPE_UINT32);
  1360. AddField(message_proto, "implicit_uint64", 24, label, FD::TYPE_UINT64);
  1361. AddField(message_proto, "implicit_float" , 25, label, FD::TYPE_FLOAT );
  1362. AddField(message_proto, "implicit_double", 26, label, FD::TYPE_DOUBLE);
  1363. AddField(message_proto, "implicit_bool" , 27, label, FD::TYPE_BOOL );
  1364. AddField(message_proto, "implicit_string", 28, label, FD::TYPE_STRING);
  1365. AddField(message_proto, "implicit_data" , 29, label, FD::TYPE_BYTES );
  1366. AddField(message_proto, "implicit_enum" , 30, label, FD::TYPE_ENUM)
  1367. ->set_type_name("DummyEnum");
  1368. // Build it.
  1369. DescriptorPool pool;
  1370. const FileDescriptor* file = pool.BuildFile(file_proto);
  1371. ASSERT_TRUE(file != NULL);
  1372. ASSERT_EQ(1, file->enum_type_count());
  1373. const EnumDescriptor* enum_type = file->enum_type(0);
  1374. ASSERT_EQ(2, enum_type->value_count());
  1375. const EnumValueDescriptor* enum_value_a = enum_type->value(0);
  1376. const EnumValueDescriptor* enum_value_b = enum_type->value(1);
  1377. ASSERT_EQ(1, file->message_type_count());
  1378. const Descriptor* message = file->message_type(0);
  1379. ASSERT_EQ(21, message->field_count());
  1380. // Check the default values.
  1381. ASSERT_TRUE(message->field(0)->has_default_value());
  1382. ASSERT_TRUE(message->field(1)->has_default_value());
  1383. ASSERT_TRUE(message->field(2)->has_default_value());
  1384. ASSERT_TRUE(message->field(3)->has_default_value());
  1385. ASSERT_TRUE(message->field(4)->has_default_value());
  1386. ASSERT_TRUE(message->field(5)->has_default_value());
  1387. ASSERT_TRUE(message->field(6)->has_default_value());
  1388. ASSERT_TRUE(message->field(7)->has_default_value());
  1389. ASSERT_TRUE(message->field(8)->has_default_value());
  1390. ASSERT_TRUE(message->field(9)->has_default_value());
  1391. ASSERT_TRUE(message->field(10)->has_default_value());
  1392. EXPECT_EQ(-1 , message->field(0)->default_value_int32 ());
  1393. EXPECT_EQ(-GOOGLE_ULONGLONG(1000000000000),
  1394. message->field(1)->default_value_int64 ());
  1395. EXPECT_EQ(42 , message->field(2)->default_value_uint32());
  1396. EXPECT_EQ(GOOGLE_ULONGLONG(2000000000000),
  1397. message->field(3)->default_value_uint64());
  1398. EXPECT_EQ(4.5 , message->field(4)->default_value_float ());
  1399. EXPECT_EQ(10e100 , message->field(5)->default_value_double());
  1400. EXPECT_EQ(true , message->field(6)->default_value_bool ());
  1401. EXPECT_EQ("hello" , message->field(7)->default_value_string());
  1402. EXPECT_EQ("\001\002\003" , message->field(8)->default_value_string());
  1403. EXPECT_EQ(enum_value_b , message->field(9)->default_value_enum ());
  1404. EXPECT_EQ("" , message->field(10)->default_value_string());
  1405. ASSERT_FALSE(message->field(11)->has_default_value());
  1406. ASSERT_FALSE(message->field(12)->has_default_value());
  1407. ASSERT_FALSE(message->field(13)->has_default_value());
  1408. ASSERT_FALSE(message->field(14)->has_default_value());
  1409. ASSERT_FALSE(message->field(15)->has_default_value());
  1410. ASSERT_FALSE(message->field(16)->has_default_value());
  1411. ASSERT_FALSE(message->field(17)->has_default_value());
  1412. ASSERT_FALSE(message->field(18)->has_default_value());
  1413. ASSERT_FALSE(message->field(19)->has_default_value());
  1414. ASSERT_FALSE(message->field(20)->has_default_value());
  1415. EXPECT_EQ(0 , message->field(11)->default_value_int32 ());
  1416. EXPECT_EQ(0 , message->field(12)->default_value_int64 ());
  1417. EXPECT_EQ(0 , message->field(13)->default_value_uint32());
  1418. EXPECT_EQ(0 , message->field(14)->default_value_uint64());
  1419. EXPECT_EQ(0.0f , message->field(15)->default_value_float ());
  1420. EXPECT_EQ(0.0 , message->field(16)->default_value_double());
  1421. EXPECT_EQ(false, message->field(17)->default_value_bool ());
  1422. EXPECT_EQ("" , message->field(18)->default_value_string());
  1423. EXPECT_EQ("" , message->field(19)->default_value_string());
  1424. EXPECT_EQ(enum_value_a, message->field(20)->default_value_enum());
  1425. }
  1426. TEST_F(MiscTest, FieldOptions) {
  1427. // Try setting field options.
  1428. FileDescriptorProto file_proto;
  1429. file_proto.set_name("foo.proto");
  1430. DescriptorProto* message_proto = AddMessage(&file_proto, "TestMessage");
  1431. AddField(message_proto, "foo", 1,
  1432. FieldDescriptorProto::LABEL_OPTIONAL,
  1433. FieldDescriptorProto::TYPE_INT32);
  1434. FieldDescriptorProto* bar_proto =
  1435. AddField(message_proto, "bar", 2,
  1436. FieldDescriptorProto::LABEL_OPTIONAL,
  1437. FieldDescriptorProto::TYPE_INT32);
  1438. FieldOptions* options = bar_proto->mutable_options();
  1439. options->set_ctype(FieldOptions::CORD);
  1440. // Build the descriptors and get the pointers.
  1441. DescriptorPool pool;
  1442. const FileDescriptor* file = pool.BuildFile(file_proto);
  1443. ASSERT_TRUE(file != NULL);
  1444. ASSERT_EQ(1, file->message_type_count());
  1445. const Descriptor* message = file->message_type(0);
  1446. ASSERT_EQ(2, message->field_count());
  1447. const FieldDescriptor* foo = message->field(0);
  1448. const FieldDescriptor* bar = message->field(1);
  1449. // "foo" had no options set, so it should return the default options.
  1450. EXPECT_EQ(&FieldOptions::default_instance(), &foo->options());
  1451. // "bar" had options set.
  1452. EXPECT_NE(&FieldOptions::default_instance(), options);
  1453. EXPECT_TRUE(bar->options().has_ctype());
  1454. EXPECT_EQ(FieldOptions::CORD, bar->options().ctype());
  1455. }
  1456. // ===================================================================
  1457. class AllowUnknownDependenciesTest : public testing::Test {
  1458. protected:
  1459. virtual void SetUp() {
  1460. FileDescriptorProto foo_proto, bar_proto;
  1461. pool_.AllowUnknownDepend