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