37 #include <google/protobuf/descriptor_database.h>
42 #include <google/protobuf/stubs/logging.h>
43 #include <google/protobuf/stubs/common.h>
44 #include <google/protobuf/descriptor.pb.h>
45 #include <google/protobuf/descriptor.h>
46 #include <google/protobuf/text_format.h>
47 #include <gmock/gmock.h>
48 #include <google/protobuf/testing/googletest.h>
49 #include <gtest/gtest.h>
57 const char* file_text) {
68 ADD_FAILURE() <<
"\"" << proto.
name() <<
"\" did not contain expected type \""
74 #if GTEST_HAS_PARAM_TEST
83 class DescriptorDatabaseTestCase {
85 virtual ~DescriptorDatabaseTestCase() {}
92 typedef DescriptorDatabaseTestCase* DescriptorDatabaseTestCaseFactory();
95 class SimpleDescriptorDatabaseTestCase :
public DescriptorDatabaseTestCase {
97 static DescriptorDatabaseTestCase*
New() {
98 return new SimpleDescriptorDatabaseTestCase;
101 virtual ~SimpleDescriptorDatabaseTestCase() {}
105 return database_.Add(
file);
113 class EncodedDescriptorDatabaseTestCase :
public DescriptorDatabaseTestCase {
115 static DescriptorDatabaseTestCase*
New() {
116 return new EncodedDescriptorDatabaseTestCase;
119 virtual ~EncodedDescriptorDatabaseTestCase() {}
125 return database_.AddCopy(
data.data(),
data.size());
129 EncodedDescriptorDatabase database_;
133 class DescriptorPoolDatabaseTestCase :
public DescriptorDatabaseTestCase {
135 static DescriptorDatabaseTestCase*
New() {
136 return new EncodedDescriptorDatabaseTestCase;
139 DescriptorPoolDatabaseTestCase() : database_(
pool_) {}
140 virtual ~DescriptorPoolDatabaseTestCase() {}
154 class DescriptorDatabaseTest
157 virtual void SetUp() {
158 test_case_.reset(GetParam()());
159 database_ = test_case_->GetDatabase();
165 EXPECT_TRUE(test_case_->AddToDatabase(file_proto));
168 void AddToDatabaseWithError(
const char* file_descriptor_text) {
174 std::unique_ptr<DescriptorDatabaseTestCase> test_case_;
180 "name: \"foo.proto\" "
181 "message_type { name:\"Foo\" }");
183 "name: \"bar.proto\" "
184 "message_type { name:\"Bar\" }");
190 ExpectContainsType(
file,
"Foo");
197 ExpectContainsType(
file,
"Bar");
209 "name: \"foo.proto\" "
212 " field { name:\"qux\" }"
213 " nested_type { name: \"Grault\" } "
214 " enum_type { name: \"Garply\" } "
218 " value { name:\"FRED\" } "
220 "extension { name: \"plugh\" } "
223 " method { name: \"Thud\" } "
226 "name: \"bar.proto\" "
227 "package: \"corge\" "
228 "message_type { name: \"Bar\" }");
244 database_->FindFileContainingSymbol(
"Foo.none_field.none", &
file));
316 TEST_P(DescriptorDatabaseTest, FindFileContainingExtension) {
318 "name: \"foo.proto\" "
321 " extension_range { start: 1 end: 1000 } "
322 " extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 "
324 " extendee: \".Foo\" }"
327 "name: \"bar.proto\" "
328 "package: \"corge\" "
329 "dependency: \"foo.proto\" "
332 " extension_range { start: 1 end: 1000 } "
334 "extension { name:\"grault\" extendee: \".Foo\" number:32 } "
335 "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } "
336 "extension { name:\"waldo\" extendee: \"Bar\" number:56 } ");
353 EXPECT_TRUE(database_->FindFileContainingExtension(
"corge.Bar", 70, &
file));
363 database_->FindFileContainingExtension(
"corge.Bar", 56, &
file));
376 database_->FindFileContainingExtension(
"NoSuchType", 5, &
file));
386 TEST_P(DescriptorDatabaseTest, FindAllExtensionNumbers) {
388 "name: \"foo.proto\" "
391 " extension_range { start: 1 end: 1000 } "
392 " extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 "
394 " extendee: \".Foo\" }"
397 "name: \"bar.proto\" "
398 "package: \"corge\" "
399 "dependency: \"foo.proto\" "
402 " extension_range { start: 1 end: 1000 } "
404 "extension { name:\"grault\" extendee: \".Foo\" number:32 } "
405 "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } "
406 "extension { name:\"waldo\" extendee: \"Bar\" number:56 } ");
409 std::vector<int> numbers;
410 EXPECT_TRUE(database_->FindAllExtensionNumbers(
"Foo", &numbers));
412 std::sort(numbers.begin(), numbers.end());
418 std::vector<int> numbers;
419 EXPECT_TRUE(database_->FindAllExtensionNumbers(
"corge.Bar", &numbers));
427 std::vector<int> numbers;
428 EXPECT_FALSE(database_->FindAllExtensionNumbers(
"NoSuchType", &numbers));
433 std::vector<int> numbers;
434 EXPECT_FALSE(database_->FindAllExtensionNumbers(
"Bar", &numbers));
438 TEST_P(DescriptorDatabaseTest, ConflictingFileError) {
440 "name: \"foo.proto\" "
444 AddToDatabaseWithError(
445 "name: \"foo.proto\" "
451 TEST_P(DescriptorDatabaseTest, ConflictingTypeError) {
453 "name: \"foo.proto\" "
457 AddToDatabaseWithError(
458 "name: \"bar.proto\" "
464 TEST_P(DescriptorDatabaseTest, ConflictingExtensionError) {
466 "name: \"foo.proto\" "
467 "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
468 " extendee: \".Foo\" }");
469 AddToDatabaseWithError(
470 "name: \"bar.proto\" "
471 "extension { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
472 " extendee: \".Foo\" }");
476 Simple, DescriptorDatabaseTest,
479 MemoryConserving, DescriptorDatabaseTest,
484 #endif // GTEST_HAS_PARAM_TEST
486 TEST(EncodedDescriptorDatabaseExtraTest, FindNameOfFileContainingSymbol) {
500 std::string data2 = file2b.SerializeAsString() + file2a.SerializeAsString();
503 EncodedDescriptorDatabase db;
504 db.Add(data1.data(), data1.size());
505 db.Add(data2.data(), data2.size());
520 TEST(SimpleDescriptorDatabaseExtraTest, FindAllFileNames) {
522 f.set_name(
"foo.proto");
523 f.set_package(
"foo");
524 f.add_message_type()->set_name(
"Foo");
530 std::vector<std::string> all_files;
531 db.FindAllFileNames(&all_files);
535 TEST(SimpleDescriptorDatabaseExtraTest, FindAllPackageNames) {
537 f.set_name(
"foo.proto");
538 f.set_package(
"foo");
539 f.add_message_type()->set_name(
"Foo");
542 b.set_name(
"bar.proto");
544 b.add_message_type()->set_name(
"Bar");
555 TEST(SimpleDescriptorDatabaseExtraTest, FindAllMessageNames) {
557 f.set_name(
"foo.proto");
558 f.set_package(
"foo");
559 f.add_message_type()->set_name(
"Foo");
562 b.set_name(
"bar.proto");
564 b.add_message_type()->set_name(
"Bar");
570 std::vector<std::string> messages;
579 MergedDescriptorDatabaseTest()
583 virtual void SetUp() {
586 "name: \"foo.proto\" "
587 "message_type { name:\"Foo\" extension_range { start: 1 end: 100 } } "
588 "extension { name:\"foo_ext\" extendee: \".Foo\" number:3 "
589 " label:LABEL_OPTIONAL type:TYPE_INT32 } ");
592 "name: \"bar.proto\" "
593 "message_type { name:\"Bar\" extension_range { start: 1 end: 100 } } "
594 "extension { name:\"bar_ext\" extendee: \".Bar\" number:5 "
595 " label:LABEL_OPTIONAL type:TYPE_INT32 } ");
600 "name: \"baz.proto\" "
601 "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } "
602 "message_type { name:\"FromPool1\" } "
603 "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 "
604 " label:LABEL_OPTIONAL type:TYPE_INT32 } "
605 "extension { name:\"database1_only_ext\" extendee: \".Baz\" number:13 "
606 " label:LABEL_OPTIONAL type:TYPE_INT32 } ");
609 "name: \"baz.proto\" "
610 "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } "
611 "message_type { name:\"FromPool2\" } "
612 "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 "
613 " label:LABEL_OPTIONAL type:TYPE_INT32 } ");
629 ExpectContainsType(
file,
"Foo");
637 ExpectContainsType(
file,
"Bar");
645 ExpectContainsType(
file,
"FromPool1");
653 ExpectContainsType(
file,
"FromPool2");
669 ExpectContainsType(
file,
"Foo");
677 ExpectContainsType(
file,
"Bar");
685 ExpectContainsType(
file,
"FromPool1");
693 ExpectContainsType(
file,
"FromPool2");
711 TEST_F(MergedDescriptorDatabaseTest, FindFileContainingExtension) {
717 ExpectContainsType(
file,
"Foo");
725 ExpectContainsType(
file,
"Bar");
733 ExpectContainsType(
file,
"FromPool1");
741 ExpectContainsType(
file,
"FromPool2");
759 TEST_F(MergedDescriptorDatabaseTest, FindAllExtensionNumbers) {
762 std::vector<int> numbers;
770 std::vector<int> numbers;
778 std::vector<int> numbers;
781 std::sort(numbers.begin(), numbers.end());
787 std::vector<int> numbers;
790 std::sort(numbers.begin(), numbers.end());
797 std::vector<int> numbers;