1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This file makes extensive use of RFC 3092.  :)
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <algorithm>
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor_database.h>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.pb.h>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/text_format.h>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h>
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h>
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h>
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic void AddToDatabase(SimpleDescriptorDatabase* database,
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          const char* file_text) {
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FileDescriptorProto file_proto;
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(TextFormat::ParseFromString(file_text, &file_proto));
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  database->Add(file_proto);
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic void ExpectContainsType(const FileDescriptorProto& proto,
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               const string& type_name) {
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < proto.message_type_size(); i++) {
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (proto.message_type(i).name() == type_name) return;
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ADD_FAILURE() << "\"" << proto.name()
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                << "\" did not contain expected type \""
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                << type_name << "\".";
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if GTEST_HAS_PARAM_TEST
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SimpleDescriptorDatabase, EncodedDescriptorDatabase, and
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DescriptorPoolDatabase call for very similar tests.  Instead of writing
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// three nearly-identical sets of tests, we use parameterized tests to apply
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the same code to all three.
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The parameterized test runs against a DescriptarDatabaseTestCase.  We have
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// implementations for each of the three classes we want to test.
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorDatabaseTestCase {
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~DescriptorDatabaseTestCase() {}
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual DescriptorDatabase* GetDatabase() = 0;
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual bool AddToDatabase(const FileDescriptorProto& file) = 0;
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Factory function type.
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef DescriptorDatabaseTestCase* DescriptorDatabaseTestCaseFactory();
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Specialization for SimpleDescriptorDatabase.
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass SimpleDescriptorDatabaseTestCase : public DescriptorDatabaseTestCase {
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static DescriptorDatabaseTestCase* New() {
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new SimpleDescriptorDatabaseTestCase;
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~SimpleDescriptorDatabaseTestCase() {}
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual DescriptorDatabase* GetDatabase() {
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return &database_;
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual bool AddToDatabase(const FileDescriptorProto& file) {
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return database_.Add(file);
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SimpleDescriptorDatabase database_;
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Specialization for EncodedDescriptorDatabase.
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EncodedDescriptorDatabaseTestCase : public DescriptorDatabaseTestCase {
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static DescriptorDatabaseTestCase* New() {
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new EncodedDescriptorDatabaseTestCase;
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~EncodedDescriptorDatabaseTestCase() {}
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual DescriptorDatabase* GetDatabase() {
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return &database_;
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual bool AddToDatabase(const FileDescriptorProto& file) {
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string data;
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    file.SerializeToString(&data);
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return database_.AddCopy(data.data(), data.size());
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EncodedDescriptorDatabase database_;
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Specialization for DescriptorPoolDatabase.
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorPoolDatabaseTestCase : public DescriptorDatabaseTestCase {
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static DescriptorDatabaseTestCase* New() {
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new EncodedDescriptorDatabaseTestCase;
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DescriptorPoolDatabaseTestCase() : database_(pool_) {}
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~DescriptorPoolDatabaseTestCase() {}
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual DescriptorDatabase* GetDatabase() {
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return &database_;
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual bool AddToDatabase(const FileDescriptorProto& file) {
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return pool_.BuildFile(file);
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DescriptorPool pool_;
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DescriptorPoolDatabase database_;
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorDatabaseTest
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : public testing::TestWithParam<DescriptorDatabaseTestCaseFactory*> {
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected:
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void SetUp() {
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_case_.reset(GetParam()());
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    database_ = test_case_->GetDatabase();
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddToDatabase(const char* file_descriptor_text) {
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file_proto;
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(TextFormat::ParseFromString(file_descriptor_text, &file_proto));
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(test_case_->AddToDatabase(file_proto));
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddToDatabaseWithError(const char* file_descriptor_text) {
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file_proto;
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(TextFormat::ParseFromString(file_descriptor_text, &file_proto));
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(test_case_->AddToDatabase(file_proto));
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  scoped_ptr<DescriptorDatabaseTestCase> test_case_;
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DescriptorDatabase* database_;
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_P(DescriptorDatabaseTest, FindFileByName) {
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabase(
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"foo.proto\" "
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { name:\"Foo\" }");
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabase(
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"bar.proto\" "
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { name:\"Bar\" }");
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileByName("foo.proto", &file));
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "Foo");
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileByName("bar.proto", &file));
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("bar.proto", file.name());
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "Bar");
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Fails to find undefined files.
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(database_->FindFileByName("baz.proto", &file));
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_P(DescriptorDatabaseTest, FindFileContainingSymbol) {
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabase(
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"foo.proto\" "
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { "
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"Foo\" "
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"qux\" }"
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  nested_type { name: \"Grault\" } "
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  enum_type { name: \"Garply\" } "
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "} "
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum_type { "
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"Waldo\" "
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  value { name:\"FRED\" } "
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "} "
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name: \"plugh\" } "
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service { "
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"Xyzzy\" "
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  method { name: \"Thud\" } "
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}"
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    );
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabase(
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"bar.proto\" "
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "package: \"corge\" "
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { name: \"Bar\" }");
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingSymbol("Foo", &file));
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find fields.
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.qux", &file));
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find nested types.
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.Grault", &file));
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find nested enums.
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.Garply", &file));
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find enum types.
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingSymbol("Waldo", &file));
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find enum values.
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingSymbol("Waldo.FRED", &file));
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find extensions.
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingSymbol("plugh", &file));
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find services.
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingSymbol("Xyzzy", &file));
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find methods.
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingSymbol("Xyzzy.Thud", &file));
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find things in packages.
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingSymbol("corge.Bar", &file));
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("bar.proto", file.name());
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Fails to find undefined symbols.
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(database_->FindFileContainingSymbol("Baz", &file));
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Names must be fully-qualified.
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(database_->FindFileContainingSymbol("Bar", &file));
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_P(DescriptorDatabaseTest, FindFileContainingExtension) {
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabase(
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"foo.proto\" "
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { "
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"Foo\" "
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension_range { start: 1 end: 1000 } "
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "              extendee: \".Foo\" }"
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabase(
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"bar.proto\" "
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "package: \"corge\" "
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "dependency: \"foo.proto\" "
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { "
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"Bar\" "
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension_range { start: 1 end: 1000 } "
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "} "
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"grault\" extendee: \".Foo\"       number:32 } "
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } "
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"waldo\"  extendee: \"Bar\"        number:56 } ");
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingExtension("Foo", 5, &file));
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingExtension("Foo", 32, &file));
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("bar.proto", file.name());
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find extensions for qualified type names.
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindFileContainingExtension("corge.Bar", 70, &file));
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("bar.proto", file.name());
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can't find extensions whose extendee was not fully-qualified in the
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // FileDescriptorProto.
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(database_->FindFileContainingExtension("Bar", 56, &file));
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        database_->FindFileContainingExtension("corge.Bar", 56, &file));
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can't find non-existent extension numbers.
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(database_->FindFileContainingExtension("Foo", 12, &file));
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can't find extensions for non-existent types.
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        database_->FindFileContainingExtension("NoSuchType", 5, &file));
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can't find extensions for unqualified type names.
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(database_->FindFileContainingExtension("Bar", 70, &file));
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_P(DescriptorDatabaseTest, FindAllExtensionNumbers) {
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabase(
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"foo.proto\" "
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { "
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"Foo\" "
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension_range { start: 1 end: 1000 } "
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "              extendee: \".Foo\" }"
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabase(
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"bar.proto\" "
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "package: \"corge\" "
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "dependency: \"foo.proto\" "
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { "
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"Bar\" "
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension_range { start: 1 end: 1000 } "
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "} "
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"grault\" extendee: \".Foo\"       number:32 } "
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } "
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"waldo\"  extendee: \"Bar\"        number:56 } ");
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vector<int> numbers;
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindAllExtensionNumbers("Foo", &numbers));
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(2, numbers.size());
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    sort(numbers.begin(), numbers.end());
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(5, numbers[0]);
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(32, numbers[1]);
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vector<int> numbers;
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(database_->FindAllExtensionNumbers("corge.Bar", &numbers));
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Note: won't find extension 56 due to the name not being fully qualified.
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(1, numbers.size());
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(70, numbers[0]);
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can't find extensions for non-existent types.
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vector<int> numbers;
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(database_->FindAllExtensionNumbers("NoSuchType", &numbers));
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can't find extensions for unqualified types.
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vector<int> numbers;
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(database_->FindAllExtensionNumbers("Bar", &numbers));
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_P(DescriptorDatabaseTest, ConflictingFileError) {
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabase(
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"foo.proto\" "
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { "
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"Foo\" "
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabaseWithError(
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"foo.proto\" "
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { "
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"Bar\" "
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_P(DescriptorDatabaseTest, ConflictingTypeError) {
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabase(
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"foo.proto\" "
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { "
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"Foo\" "
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabaseWithError(
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"bar.proto\" "
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type { "
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"Foo\" "
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_P(DescriptorDatabaseTest, ConflictingExtensionError) {
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabase(
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"foo.proto\" "
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "            extendee: \".Foo\" }");
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddToDatabaseWithError(
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "name: \"bar.proto\" "
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "            extendee: \".Foo\" }");
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleINSTANTIATE_TEST_CASE_P(Simple, DescriptorDatabaseTest,
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    testing::Values(&SimpleDescriptorDatabaseTestCase::New));
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleINSTANTIATE_TEST_CASE_P(MemoryConserving, DescriptorDatabaseTest,
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    testing::Values(&EncodedDescriptorDatabaseTestCase::New));
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleINSTANTIATE_TEST_CASE_P(Pool, DescriptorDatabaseTest,
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    testing::Values(&DescriptorPoolDatabaseTestCase::New));
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GTEST_HAS_PARAM_TEST
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
483d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST(EncodedDescriptorDatabaseExtraTest, FindNameOfFileContainingSymbol) {
484d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Create two files, one of which is in two parts.
485d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  FileDescriptorProto file1, file2a, file2b;
486d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  file1.set_name("foo.proto");
487d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  file1.set_package("foo");
488d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  file1.add_message_type()->set_name("Foo");
489d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  file2a.set_name("bar.proto");
490d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  file2b.set_package("bar");
491d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  file2b.add_message_type()->set_name("Bar");
492d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
493d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Normal serialization allows our optimization to kick in.
494d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  string data1 = file1.SerializeAsString();
495d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
496d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Force out-of-order serialization to test slow path.
497d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  string data2 = file2b.SerializeAsString() + file2a.SerializeAsString();
498d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
499d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Create EncodedDescriptorDatabase containing both files.
500d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  EncodedDescriptorDatabase db;
501d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  db.Add(data1.data(), data1.size());
502d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  db.Add(data2.data(), data2.size());
503d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
504d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Test!
505d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  string filename;
506d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  EXPECT_TRUE(db.FindNameOfFileContainingSymbol("foo.Foo", &filename));
507d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  EXPECT_EQ("foo.proto", filename);
508d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  EXPECT_TRUE(db.FindNameOfFileContainingSymbol("foo.Foo.Blah", &filename));
509d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  EXPECT_EQ("foo.proto", filename);
510d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  EXPECT_TRUE(db.FindNameOfFileContainingSymbol("bar.Bar", &filename));
511d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  EXPECT_EQ("bar.proto", filename);
512d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  EXPECT_FALSE(db.FindNameOfFileContainingSymbol("foo", &filename));
513d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  EXPECT_FALSE(db.FindNameOfFileContainingSymbol("bar", &filename));
514d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  EXPECT_FALSE(db.FindNameOfFileContainingSymbol("baz.Baz", &filename));
515d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
516d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MergedDescriptorDatabaseTest : public testing::Test {
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected:
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MergedDescriptorDatabaseTest()
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : forward_merged_(&database1_, &database2_),
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      reverse_merged_(&database2_, &database1_) {}
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void SetUp() {
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    AddToDatabase(&database1_,
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "name: \"foo.proto\" "
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "message_type { name:\"Foo\" extension_range { start: 1 end: 100 } } "
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "extension { name:\"foo_ext\" extendee: \".Foo\" number:3 "
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    AddToDatabase(&database2_,
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "name: \"bar.proto\" "
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "message_type { name:\"Bar\" extension_range { start: 1 end: 100 } } "
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "extension { name:\"bar_ext\" extendee: \".Bar\" number:5 "
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // baz.proto exists in both pools, with different definitions.
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    AddToDatabase(&database1_,
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "name: \"baz.proto\" "
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } "
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "message_type { name:\"FromPool1\" } "
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 "
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "            label:LABEL_OPTIONAL type:TYPE_INT32 } "
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "extension { name:\"database1_only_ext\" extendee: \".Baz\" number:13 "
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    AddToDatabase(&database2_,
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "name: \"baz.proto\" "
548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } "
549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "message_type { name:\"FromPool2\" } "
550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 "
551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SimpleDescriptorDatabase database1_;
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SimpleDescriptorDatabase database2_;
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MergedDescriptorDatabase forward_merged_;
558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MergedDescriptorDatabase reverse_merged_;
559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(MergedDescriptorDatabaseTest, FindFileByName) {
562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find file that is only in database1_.
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(forward_merged_.FindFileByName("foo.proto", &file));
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "Foo");
568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find file that is only in database2_.
572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(forward_merged_.FindFileByName("bar.proto", &file));
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("bar.proto", file.name());
575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "Bar");
576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // In forward_merged_, database1_'s baz.proto takes precedence.
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(forward_merged_.FindFileByName("baz.proto", &file));
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("baz.proto", file.name());
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "FromPool1");
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // In reverse_merged_, database2_'s baz.proto takes precedence.
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(reverse_merged_.FindFileByName("baz.proto", &file));
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("baz.proto", file.name());
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "FromPool2");
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can't find non-existent file.
596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(forward_merged_.FindFileByName("no_such.proto", &file));
598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(MergedDescriptorDatabaseTest, FindFileContainingSymbol) {
602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find file that is only in database1_.
604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("Foo", &file));
606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "Foo");
608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find file that is only in database2_.
612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("Bar", &file));
614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("bar.proto", file.name());
615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "Bar");
616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // In forward_merged_, database1_'s baz.proto takes precedence.
620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("Baz", &file));
622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("baz.proto", file.name());
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "FromPool1");
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // In reverse_merged_, database2_'s baz.proto takes precedence.
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(reverse_merged_.FindFileContainingSymbol("Baz", &file));
630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("baz.proto", file.name());
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "FromPool2");
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // FromPool1 only shows up in forward_merged_ because it is masked by
636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // database2_'s baz.proto in reverse_merged_.
637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("FromPool1", &file));
639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(reverse_merged_.FindFileContainingSymbol("FromPool1", &file));
640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can't find non-existent symbol.
644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(
646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      forward_merged_.FindFileContainingSymbol("NoSuchType", &file));
647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(MergedDescriptorDatabaseTest, FindFileContainingExtension) {
651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find file that is only in database1_.
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      forward_merged_.FindFileContainingExtension("Foo", 3, &file));
656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("foo.proto", file.name());
657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "Foo");
658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can find file that is only in database2_.
662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(
664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      forward_merged_.FindFileContainingExtension("Bar", 5, &file));
665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("bar.proto", file.name());
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "Bar");
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // In forward_merged_, database1_'s baz.proto takes precedence.
671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      forward_merged_.FindFileContainingExtension("Baz", 12, &file));
674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("baz.proto", file.name());
675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "FromPool1");
676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // In reverse_merged_, database2_'s baz.proto takes precedence.
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(
682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      reverse_merged_.FindFileContainingExtension("Baz", 12, &file));
683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ("baz.proto", file.name());
684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectContainsType(file, "FromPool2");
685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Baz's extension 13 only shows up in forward_merged_ because it is
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // masked by database2_'s baz.proto in reverse_merged_.
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(forward_merged_.FindFileContainingExtension("Baz", 13, &file));
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(reverse_merged_.FindFileContainingExtension("Baz", 13, &file));
693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can't find non-existent extension.
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(
699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      forward_merged_.FindFileContainingExtension("Foo", 6, &file));
700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(MergedDescriptorDatabaseTest, FindAllExtensionNumbers) {
704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Message only has extension in database1_
706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vector<int> numbers;
707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Foo", &numbers));
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(1, numbers.size());
709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(3, numbers[0]);
710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Message only has extension in database2_
714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vector<int> numbers;
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Bar", &numbers));
716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(1, numbers.size());
717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(5, numbers[0]);
718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Merge results from the two databases.
722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vector<int> numbers;
723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Baz", &numbers));
724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(2, numbers.size());
725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    sort(numbers.begin(), numbers.end());
726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(12, numbers[0]);
727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(13, numbers[1]);
728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vector<int> numbers;
732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(reverse_merged_.FindAllExtensionNumbers("Baz", &numbers));
733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(2, numbers.size());
734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    sort(numbers.begin(), numbers.end());
735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(12, numbers[0]);
736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(13, numbers[1]);
737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Can't find extensions for a non-existent message.
741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vector<int> numbers;
742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_FALSE(reverse_merged_.FindAllExtensionNumbers("Blah", &numbers));
743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // anonymous namespace
747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
749