1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/ 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 <vector> 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 39a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/importer.h> 40a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/unittest.pb.h> 41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/unittest_custom_options.pb.h> 42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/io/zero_copy_stream_impl.h> 43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/descriptor.pb.h> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h> 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor_database.h> 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/dynamic_message.h> 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/text_format.h> 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h> 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/substitute.h> 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h> 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Can't use an anonymous namespace here due to brokenness of Tru64 compiler. 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace descriptor_unittest { 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Some helpers to make assembling descriptors faster. 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDescriptorProto* AddMessage(FileDescriptorProto* file, const string& name) { 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* result = file->add_message_type(); 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDescriptorProto* AddNestedMessage(DescriptorProto* parent, const string& name) { 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* result = parent->add_nested_type(); 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleEnumDescriptorProto* AddEnum(FileDescriptorProto* file, const string& name) { 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* result = file->add_enum_type(); 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleEnumDescriptorProto* AddNestedEnum(DescriptorProto* parent, 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name) { 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* result = parent->add_enum_type(); 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleServiceDescriptorProto* AddService(FileDescriptorProto* file, 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name) { 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ServiceDescriptorProto* result = file->add_service(); 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleFieldDescriptorProto* AddField(DescriptorProto* parent, 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name, int number, 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Label label, 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Type type) { 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* result = parent->add_field(); 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_number(number); 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_label(label); 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_type(type); 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleFieldDescriptorProto* AddExtension(FileDescriptorProto* file, 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& extendee, 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name, int number, 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Label label, 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Type type) { 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* result = file->add_extension(); 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_number(number); 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_label(label); 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_type(type); 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_extendee(extendee); 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleFieldDescriptorProto* AddNestedExtension(DescriptorProto* parent, 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& extendee, 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name, int number, 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Label label, 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Type type) { 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* result = parent->add_extension(); 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_number(number); 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_label(label); 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_type(type); 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_extendee(extendee); 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDescriptorProto::ExtensionRange* AddExtensionRange(DescriptorProto* parent, 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int start, int end) { 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto::ExtensionRange* result = parent->add_extension_range(); 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_start(start); 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_end(end); 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleEnumValueDescriptorProto* AddEnumValue(EnumDescriptorProto* enum_proto, 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name, int number) { 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumValueDescriptorProto* result = enum_proto->add_value(); 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_number(number); 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMethodDescriptorProto* AddMethod(ServiceDescriptorProto* service, 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name, 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& input_type, 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& output_type) { 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MethodDescriptorProto* result = service->add_method(); 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_input_type(input_type); 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_output_type(output_type); 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Empty enums technically aren't allowed. We need to insert a dummy value 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// into them. 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid AddEmptyEnum(FileDescriptorProto* file, const string& name) { 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(AddEnum(file, name), name + "_DUMMY", 1); 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test simple files. 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FileDescriptorTest : public testing::Test { 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following definitions: 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "foo.proto" 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message FooMessage { extensions 1; } 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum FooEnum {FOO_ENUM_VALUE = 1;} 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // service FooService {} 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extend FooMessage { optional int32 foo_extension = 1; } 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "bar.proto" 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package bar_package; 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message BarMessage { extensions 1; } 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum BarEnum {BAR_ENUM_VALUE = 1;} 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // service BarService {} 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extend BarMessage { optional int32 bar_extension = 1; } 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Also, we have an empty file "baz.proto". This file's purpose is to 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // make sure that even though it has the same package as foo.proto, 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // searching it for members of foo.proto won't work. 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtensionRange(AddMessage(&foo_file, "FooMessage"), 1, 2); 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(AddEnum(&foo_file, "FooEnum"), "FOO_ENUM_VALUE", 1); 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddService(&foo_file, "FooService"); 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&foo_file, "FooMessage", "foo_extension", 1, 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto bar_file; 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_name("bar.proto"); 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_package("bar_package"); 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.add_dependency("foo.proto"); 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtensionRange(AddMessage(&bar_file, "BarMessage"), 1, 2); 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(AddEnum(&bar_file, "BarEnum"), "BAR_ENUM_VALUE", 1); 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddService(&bar_file, "BarService"); 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&bar_file, "bar_package.BarMessage", "bar_extension", 1, 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto baz_file; 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_file.set_name("baz.proto"); 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file_ = pool_.BuildFile(bar_file); 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_file_ = pool_.BuildFile(baz_file); 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(baz_file_ != NULL); 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->message_type_count()); 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_message_ = foo_file_->message_type(0); 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->enum_type_count()); 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_enum_ = foo_file_->enum_type(0); 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_enum_->value_count()); 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_enum_value_ = foo_enum_->value(0); 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->service_count()); 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_service_ = foo_file_->service(0); 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->extension_count()); 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_extension_ = foo_file_->extension(0); 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->message_type_count()); 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_message_ = bar_file_->message_type(0); 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->enum_type_count()); 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_enum_ = bar_file_->enum_type(0); 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_enum_->value_count()); 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_enum_value_ = bar_enum_->value(0); 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->service_count()); 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_service_ = bar_file_->service(0); 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->extension_count()); 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_extension_ = bar_file_->extension(0); 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* baz_file_; 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_message_; 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* foo_enum_; 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* foo_enum_value_; 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* foo_service_; 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* foo_extension_; 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_message_; 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* bar_enum_; 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* bar_enum_value_; 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* bar_service_; 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* bar_extension_; 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, Name) { 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo.proto", foo_file_->name()); 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar.proto", bar_file_->name()); 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz.proto", baz_file_->name()); 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, Package) { 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("", foo_file_->package()); 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar_package", bar_file_->package()); 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, Dependencies) { 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, foo_file_->dependency_count()); 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, bar_file_->dependency_count()); 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, bar_file_->dependency(0)); 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindMessageTypeByName) { 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_message_, foo_file_->FindMessageTypeByName("FooMessage")); 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_message_, bar_file_->FindMessageTypeByName("BarMessage")); 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindMessageTypeByName("BarMessage") == NULL); 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_file_->FindMessageTypeByName("FooMessage") == NULL); 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_file_->FindMessageTypeByName("FooMessage") == NULL); 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindMessageTypeByName("NoSuchMessage") == NULL); 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindMessageTypeByName("FooEnum") == NULL); 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindEnumTypeByName) { 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_enum_, foo_file_->FindEnumTypeByName("FooEnum")); 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_enum_, bar_file_->FindEnumTypeByName("BarEnum")); 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumTypeByName("BarEnum") == NULL); 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_file_->FindEnumTypeByName("FooEnum") == NULL); 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_file_->FindEnumTypeByName("FooEnum") == NULL); 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumTypeByName("NoSuchEnum") == NULL); 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumTypeByName("FooMessage") == NULL); 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindEnumValueByName) { 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_enum_value_, foo_file_->FindEnumValueByName("FOO_ENUM_VALUE")); 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_enum_value_, bar_file_->FindEnumValueByName("BAR_ENUM_VALUE")); 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumValueByName("BAR_ENUM_VALUE") == NULL); 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL); 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL); 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumValueByName("NO_SUCH_VALUE") == NULL); 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumValueByName("FooMessage") == NULL); 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindServiceByName) { 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_service_, foo_file_->FindServiceByName("FooService")); 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_service_, bar_file_->FindServiceByName("BarService")); 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindServiceByName("BarService") == NULL); 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_file_->FindServiceByName("FooService") == NULL); 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_file_->FindServiceByName("FooService") == NULL); 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindServiceByName("NoSuchService") == NULL); 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindServiceByName("FooMessage") == NULL); 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindExtensionByName) { 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_extension_, foo_file_->FindExtensionByName("foo_extension")); 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_extension_, bar_file_->FindExtensionByName("bar_extension")); 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindExtensionByName("bar_extension") == NULL); 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_file_->FindExtensionByName("foo_extension") == NULL); 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_file_->FindExtensionByName("foo_extension") == NULL); 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindExtensionByName("no_such_extension") == NULL); 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindExtensionByName("FooMessage") == NULL); 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindExtensionByNumber) { 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_extension_, pool_.FindExtensionByNumber(foo_message_, 1)); 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_extension_, pool_.FindExtensionByNumber(bar_message_, 1)); 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool_.FindExtensionByNumber(foo_message_, 2) == NULL); 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, BuildAgain) { 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that if te call BuildFile again on the same input we get the same 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FileDescriptor back. 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file; 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_->CopyTo(&file); 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, pool_.BuildFile(file)); 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // But if we change the file then it won't work. 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file.set_package("some.other.package"); 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool_.BuildFile(file) == NULL); 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test simple flat messages and fields. 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorTest : public testing::Test { 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following definitions: 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "foo.proto" 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message TestForeign {} 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum TestEnum {} 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message TestMessage { 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required string foo = 1; 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // optional TestEnum bar = 6; 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // repeated TestForeign baz = 500000000; 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // optional group qux = 15 {} 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "bar.proto" 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package corge.grault; 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message TestMessage2 { 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required string foo = 1; 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required string bar = 2; 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required string quux = 6; 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We cheat and use TestForeign as the type for qux rather than create 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // an actual nested type. 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Since all primitive types (including string) use the same building 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // code, there's no need to test each one individually. 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TestMessage2 is primarily here to test FindFieldByName and friends. 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // All messages created from the same DescriptorPool share the same lookup 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // table, so we need to insure that they don't interfere. 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "TestForeign"); 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEmptyEnum(&foo_file, "TestEnum"); 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message = AddMessage(&foo_file, "TestMessage"); 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "foo", 1, 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REQUIRED, 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_STRING); 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "bar", 6, 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_ENUM) 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("TestEnum"); 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "baz", 500000000, 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REPEATED, 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_MESSAGE) 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("TestForeign"); 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "qux", 15, 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_GROUP) 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("TestForeign"); 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto bar_file; 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_name("bar.proto"); 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_package("corge.grault"); 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2"); 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message2, "foo", 1, 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REQUIRED, 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_STRING); 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message2, "bar", 2, 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REQUIRED, 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_STRING); 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message2, "quux", 6, 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REQUIRED, 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_STRING); 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file_ = pool_.BuildFile(bar_file); 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->enum_type_count()); 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_ = foo_file_->enum_type(0); 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, foo_file_->message_type_count()); 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_ = foo_file_->message_type(0); 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_ = foo_file_->message_type(1); 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(4, message_->field_count()); 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_ = message_->field(0); 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_ = message_->field(1); 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_ = message_->field(2); 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_ = message_->field(3); 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->message_type_count()); 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2_ = bar_file_->message_type(0); 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(3, message2_->field_count()); 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo2_ = message2_->field(0); 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar2_ = message2_->field(1); 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville quux2_ = message2_->field(2); 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message_; 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message2_; 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foreign_; 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum_; 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* foo_; 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* bar_; 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* baz_; 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* qux_; 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* foo2_; 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* bar2_; 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* quux2_; 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, Name) { 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage", message_->name()); 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage", message_->full_name()); 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, message_->file()); 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage2", message2_->name()); 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2", message2_->full_name()); 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, message2_->file()); 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, ContainingType) { 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->containing_type() == NULL); 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->containing_type() == NULL); 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldsByIndex) { 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(4, message_->field_count()); 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, message_->field(0)); 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, message_->field(1)); 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz_, message_->field(2)); 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_, message_->field(3)); 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FindFieldByName) { 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // All messages in the same DescriptorPool share a single lookup table for 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fields. So, in addition to testing that FindFieldByName finds the fields 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of the message, we need to test that it does *not* find the fields of 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // *other* messages. 514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, message_->FindFieldByName("foo")); 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, message_->FindFieldByName("bar")); 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz_, message_->FindFieldByName("baz")); 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_, message_->FindFieldByName("qux")); 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByName("no_such_field") == NULL); 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByName("quux") == NULL); 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_ , message2_->FindFieldByName("foo" )); 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar2_ , message2_->FindFieldByName("bar" )); 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(quux2_, message2_->FindFieldByName("quux")); 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindFieldByName("baz") == NULL); 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindFieldByName("qux") == NULL); 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FindFieldByNumber) { 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, message_->FindFieldByNumber(1)); 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, message_->FindFieldByNumber(6)); 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz_, message_->FindFieldByNumber(500000000)); 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_, message_->FindFieldByNumber(15)); 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByNumber(837592) == NULL); 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByNumber(2) == NULL); 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_ , message2_->FindFieldByNumber(1)); 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar2_ , message2_->FindFieldByNumber(2)); 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(quux2_, message2_->FindFieldByNumber(6)); 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindFieldByNumber(15) == NULL); 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindFieldByNumber(500000000) == NULL); 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldName) { 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo", foo_->name()); 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar", bar_->name()); 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz", baz_->name()); 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("qux", qux_->name()); 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldFullName) { 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.foo", foo_->full_name()); 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.bar", bar_->full_name()); 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.baz", baz_->full_name()); 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.qux", qux_->full_name()); 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.foo", foo2_->full_name()); 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.bar", bar2_->full_name()); 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.quux", quux2_->full_name()); 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldFile) { 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, foo_->file()); 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, bar_->file()); 565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, baz_->file()); 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, qux_->file()); 567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, foo2_->file()); 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, bar2_->file()); 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, quux2_->file()); 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldIndex) { 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, foo_->index()); 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, bar_->index()); 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, baz_->index()); 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(3, qux_->index()); 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldNumber) { 581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 1, foo_->number()); 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 6, bar_->number()); 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(500000000, baz_->number()); 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 15, qux_->number()); 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldType) { 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_STRING , foo_->type()); 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_ENUM , bar_->type()); 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_->type()); 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_GROUP , qux_->type()); 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldLabel) { 595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_REQUIRED, foo_->label()); 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->label()); 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, baz_->label()); 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, qux_->label()); 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (foo_->is_required()); 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->is_optional()); 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->is_repeated()); 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(bar_->is_required()); 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (bar_->is_optional()); 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(bar_->is_repeated()); 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(baz_->is_required()); 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(baz_->is_optional()); 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (baz_->is_repeated()); 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldHasDefault) { 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->has_default_value()); 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(bar_->has_default_value()); 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(baz_->has_default_value()); 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(qux_->has_default_value()); 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldContainingType) { 621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_, foo_->containing_type()); 622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_, bar_->containing_type()); 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_, baz_->containing_type()); 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_, qux_->containing_type()); 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, foo2_ ->containing_type()); 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, bar2_ ->containing_type()); 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, quux2_->containing_type()); 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldMessageType) { 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_->message_type() == NULL); 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_->message_type() == NULL); 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foreign_, baz_->message_type()); 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foreign_, qux_->message_type()); 637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldEnumType) { 640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_->enum_type() == NULL); 641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_->enum_type() == NULL); 642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(qux_->enum_type() == NULL); 643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum_, bar_->enum_type()); 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 649a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Test simple flat messages and fields. 650a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass OneofDescriptorTest : public testing::Test { 651a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protected: 652a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson virtual void SetUp() { 653a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Build descriptors for the following definitions: 654a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 655a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // package garply; 656a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message TestOneof { 657a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // optional int32 a = 1; 658a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // oneof foo { 659a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // string b = 2; 660a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // TestOneof c = 3; 661a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 662a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // oneof bar { 663a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // float d = 4; 664a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 665a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 666a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 667a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto baz_file; 668a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson baz_file.set_name("baz.proto"); 669a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson baz_file.set_package("garply"); 670a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 671a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorProto* oneof_message = AddMessage(&baz_file, "TestOneof"); 672a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof_message->add_oneof_decl()->set_name("foo"); 673a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof_message->add_oneof_decl()->set_name("bar"); 674a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson AddField(oneof_message, "a", 1, 676a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::LABEL_OPTIONAL, 677a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::TYPE_INT32); 678a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson AddField(oneof_message, "b", 2, 679a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::LABEL_OPTIONAL, 680a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::TYPE_STRING); 681a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof_message->mutable_field(1)->set_oneof_index(0); 682a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson AddField(oneof_message, "c", 3, 683a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::LABEL_OPTIONAL, 684a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::TYPE_MESSAGE); 685a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof_message->mutable_field(2)->set_oneof_index(0); 686a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof_message->mutable_field(2)->set_type_name("TestOneof"); 687a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 688a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson AddField(oneof_message, "d", 4, 689a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::LABEL_OPTIONAL, 690a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::TYPE_FLOAT); 691a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof_message->mutable_field(3)->set_oneof_index(1); 692a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 693a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Build the descriptors and get the pointers. 694a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson baz_file_ = pool_.BuildFile(baz_file); 695a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(baz_file_ != NULL); 696a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 697a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(1, baz_file_->message_type_count()); 698a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof_message_ = baz_file_->message_type(0); 699a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 700a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(2, oneof_message_->oneof_decl_count()); 701a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof_ = oneof_message_->oneof_decl(0); 702a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof2_ = oneof_message_->oneof_decl(1); 703a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(4, oneof_message_->field_count()); 705a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson a_ = oneof_message_->field(0); 706a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson b_ = oneof_message_->field(1); 707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson c_ = oneof_message_->field(2); 708a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson d_ = oneof_message_->field(3); 709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool pool_; 712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 713a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* baz_file_; 714a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 715a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* oneof_message_; 716a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 717a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor* oneof_; 718a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor* oneof2_; 719a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* a_; 720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* b_; 721a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* c_; 722a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* d_; 723a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* e_; 724a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* f_; 725a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(OneofDescriptorTest, Normal) { 728a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("foo", oneof_->name()); 729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("garply.TestOneof.foo", oneof_->full_name()); 730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(0, oneof_->index()); 731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(2, oneof_->field_count()); 732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(b_, oneof_->field(0)); 733a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(c_, oneof_->field(1)); 734a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(a_->containing_oneof() == NULL); 735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(oneof_, b_->containing_oneof()); 736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(oneof_, c_->containing_oneof()); 737a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 738a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 739a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(OneofDescriptorTest, FindByName) { 740a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(oneof_, oneof_message_->FindOneofByName("foo")); 741a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(oneof2_, oneof_message_->FindOneofByName("bar")); 742a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(oneof_message_->FindOneofByName("no_such_oneof") == NULL); 743a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 744a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 745a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// =================================================================== 746a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass StylizedFieldNamesTest : public testing::Test { 748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetUp() { 750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file; 751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file.set_name("foo.proto"); 752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtensionRange(AddMessage(&file, "ExtendableMessage"), 1, 1000); 754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message = AddMessage(&file, "TestMessage"); 756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "foo_foo", 1, 757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "FooBar", 2, 760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "fooBaz", 3, 763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "fooFoo", 4, // Camel-case conflict with foo_foo. 766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "foobar", 5, // Lower-case conflict with FooBar. 769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(message, "ExtendableMessage", "bar_foo", 1, 773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(message, "ExtendableMessage", "BarBar", 2, 776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(message, "ExtendableMessage", "BarBaz", 3, 779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(message, "ExtendableMessage", "barFoo", 4, // Conflict 782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(message, "ExtendableMessage", "barbar", 5, // Conflict 785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&file, "ExtendableMessage", "baz_foo", 11, 789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&file, "ExtendableMessage", "BazBar", 12, 792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&file, "ExtendableMessage", "BazBaz", 13, 795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&file, "ExtendableMessage", "bazFoo", 14, // Conflict 798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&file, "ExtendableMessage", "bazbar", 15, // Conflict 801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_ = pool_.BuildFile(file); 805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file_ != NULL); 806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, file_->message_type_count()); 807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_ = file_->message_type(1); 808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ("TestMessage", message_->name()); 809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(5, message_->field_count()); 810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(5, message_->extension_count()); 811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(5, file_->extension_count()); 812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file_; 816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message_; 817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(StylizedFieldNamesTest, LowercaseName) { 820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_foo", message_->field(0)->lowercase_name()); 821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foobar" , message_->field(1)->lowercase_name()); 822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foobaz" , message_->field(2)->lowercase_name()); 823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foofoo" , message_->field(3)->lowercase_name()); 824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foobar" , message_->field(4)->lowercase_name()); 825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar_foo", message_->extension(0)->lowercase_name()); 827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barbar" , message_->extension(1)->lowercase_name()); 828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barbaz" , message_->extension(2)->lowercase_name()); 829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barfoo" , message_->extension(3)->lowercase_name()); 830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barbar" , message_->extension(4)->lowercase_name()); 831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz_foo", file_->extension(0)->lowercase_name()); 833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazbar" , file_->extension(1)->lowercase_name()); 834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazbaz" , file_->extension(2)->lowercase_name()); 835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazfoo" , file_->extension(3)->lowercase_name()); 836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazbar" , file_->extension(4)->lowercase_name()); 837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(StylizedFieldNamesTest, CamelcaseName) { 840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("fooFoo", message_->field(0)->camelcase_name()); 841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("fooBar", message_->field(1)->camelcase_name()); 842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("fooBaz", message_->field(2)->camelcase_name()); 843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("fooFoo", message_->field(3)->camelcase_name()); 844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foobar", message_->field(4)->camelcase_name()); 845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barFoo", message_->extension(0)->camelcase_name()); 847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barBar", message_->extension(1)->camelcase_name()); 848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barBaz", message_->extension(2)->camelcase_name()); 849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barFoo", message_->extension(3)->camelcase_name()); 850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barbar", message_->extension(4)->camelcase_name()); 851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazFoo", file_->extension(0)->camelcase_name()); 853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazBar", file_->extension(1)->camelcase_name()); 854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazBaz", file_->extension(2)->camelcase_name()); 855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazFoo", file_->extension(3)->camelcase_name()); 856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazbar", file_->extension(4)->camelcase_name()); 857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(StylizedFieldNamesTest, FindByLowercaseName) { 860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(0), 861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByLowercaseName("foo_foo")); 862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(1), 863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByLowercaseName("foobar")); 864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(2), 865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByLowercaseName("foobaz")); 866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByLowercaseName("FooBar") == NULL); 867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByLowercaseName("fooBaz") == NULL); 868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByLowercaseName("bar_foo") == NULL); 869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByLowercaseName("nosuchfield") == NULL); 870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(0), 872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByLowercaseName("bar_foo")); 873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(1), 874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByLowercaseName("barbar")); 875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(2), 876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByLowercaseName("barbaz")); 877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByLowercaseName("BarBar") == NULL); 878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByLowercaseName("barBaz") == NULL); 879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByLowercaseName("foo_foo") == NULL); 880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByLowercaseName("nosuchfield") == NULL); 881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(0), 883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByLowercaseName("baz_foo")); 884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(1), 885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByLowercaseName("bazbar")); 886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(2), 887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByLowercaseName("bazbaz")); 888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByLowercaseName("BazBar") == NULL); 889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByLowercaseName("bazBaz") == NULL); 890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByLowercaseName("nosuchfield") == NULL); 891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(StylizedFieldNamesTest, FindByCamelcaseName) { 894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(0), 895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByCamelcaseName("fooFoo")); 896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(1), 897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByCamelcaseName("fooBar")); 898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(2), 899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByCamelcaseName("fooBaz")); 900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByCamelcaseName("foo_foo") == NULL); 901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByCamelcaseName("FooBar") == NULL); 902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByCamelcaseName("barFoo") == NULL); 903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByCamelcaseName("nosuchfield") == NULL); 904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(0), 906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByCamelcaseName("barFoo")); 907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(1), 908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByCamelcaseName("barBar")); 909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(2), 910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByCamelcaseName("barBaz")); 911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByCamelcaseName("bar_foo") == NULL); 912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByCamelcaseName("BarBar") == NULL); 913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByCamelcaseName("fooFoo") == NULL); 914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByCamelcaseName("nosuchfield") == NULL); 915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(0), 917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByCamelcaseName("bazFoo")); 918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(1), 919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByCamelcaseName("bazBar")); 920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(2), 921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByCamelcaseName("bazBaz")); 922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByCamelcaseName("baz_foo") == NULL); 923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByCamelcaseName("BazBar") == NULL); 924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByCamelcaseName("nosuchfield") == NULL); 925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test enum descriptors. 930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumDescriptorTest : public testing::Test { 931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following definitions: 934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "foo.proto" 936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum TestEnum { 937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FOO = 1; 938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // BAR = 2; 939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "bar.proto" 942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package corge.grault; 943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum TestEnum2 { 944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FOO = 1; 945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // BAZ = 3; 946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TestEnum2 is primarily here to test FindValueByName and friends. 949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // All enums created from the same DescriptorPool share the same lookup 950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // table, so we need to insure that they don't interfere. 951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TestEnum 953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* enum_proto = AddEnum(&foo_file, "TestEnum"); 957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum_proto, "FOO", 1); 958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum_proto, "BAR", 2); 959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TestEnum2 961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto bar_file; 962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_name("bar.proto"); 963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_package("corge.grault"); 964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* enum2_proto = AddEnum(&bar_file, "TestEnum2"); 966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum2_proto, "FOO", 1); 967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum2_proto, "BAZ", 3); 968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file_ = pool_.BuildFile(bar_file); 974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->enum_type_count()); 977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_ = foo_file_->enum_type(0); 978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, enum_->value_count()); 980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_ = enum_->value(0); 981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_ = enum_->value(1); 982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->enum_type_count()); 984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum2_ = bar_file_->enum_type(0); 985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, enum2_->value_count()); 987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo2_ = enum2_->value(0); 988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz2_ = enum2_->value(1); 989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum_; 997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum2_; 998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* foo_; 1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* bar_; 1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* foo2_; 1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* baz2_; 1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, Name) { 1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestEnum", enum_->name()); 1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestEnum", enum_->full_name()); 1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, enum_->file()); 1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestEnum2", enum2_->name()); 1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestEnum2", enum2_->full_name()); 1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, enum2_->file()); 1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ContainingType) { 1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum_->containing_type() == NULL); 1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum2_->containing_type() == NULL); 1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValuesByIndex) { 1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, enum_->value_count()); 1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, enum_->value(0)); 1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, enum_->value(1)); 1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, FindValueByName) { 1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_ , enum_ ->FindValueByName("FOO")); 1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_ , enum_ ->FindValueByName("BAR")); 1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_, enum2_->FindValueByName("FOO")); 1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz2_, enum2_->FindValueByName("BAZ")); 1032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum_ ->FindValueByName("NO_SUCH_VALUE") == NULL); 1034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum_ ->FindValueByName("BAZ" ) == NULL); 1035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum2_->FindValueByName("BAR" ) == NULL); 1036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, FindValueByNumber) { 1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_ , enum_ ->FindValueByNumber(1)); 1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_ , enum_ ->FindValueByNumber(2)); 1041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_, enum2_->FindValueByNumber(1)); 1042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz2_, enum2_->FindValueByNumber(3)); 1043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum_ ->FindValueByNumber(416) == NULL); 1045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum_ ->FindValueByNumber(3) == NULL); 1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum2_->FindValueByNumber(2) == NULL); 1047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValueName) { 1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("FOO", foo_->name()); 1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("BAR", bar_->name()); 1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValueFullName) { 1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("FOO", foo_->full_name()); 1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("BAR", bar_->full_name()); 1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.FOO", foo2_->full_name()); 1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.BAZ", baz2_->full_name()); 1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValueIndex) { 1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, foo_->index()); 1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, bar_->index()); 1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValueNumber) { 1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, foo_->number()); 1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, bar_->number()); 1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValueType) { 1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum_ , foo_ ->type()); 1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum_ , bar_ ->type()); 1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum2_, foo2_->type()); 1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum2_, baz2_->type()); 1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test service descriptors. 1081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ServiceDescriptorTest : public testing::Test { 1082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 1083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 1084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following messages and service: 1085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "foo.proto" 1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message FooRequest {} 1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message FooResponse {} 1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message BarRequest {} 1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message BarResponse {} 1090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message BazRequest {} 1091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message BazResponse {} 1092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // service TestService { 1094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // rpc Foo(FooRequest) returns (FooResponse); 1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // rpc Bar(BarRequest) returns (BarResponse); 1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "bar.proto" 1099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package corge.grault 1100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // service TestService2 { 1101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // rpc Foo(FooRequest) returns (FooResponse); 1102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // rpc Baz(BazRequest) returns (BazResponse); 1103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "FooRequest"); 1109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "FooResponse"); 1110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "BarRequest"); 1111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "BarResponse"); 1112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "BazRequest"); 1113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "BazResponse"); 1114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ServiceDescriptorProto* service = AddService(&foo_file, "TestService"); 1116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMethod(service, "Foo", "FooRequest", "FooResponse"); 1117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMethod(service, "Bar", "BarRequest", "BarResponse"); 1118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto bar_file; 1120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_name("bar.proto"); 1121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_package("corge.grault"); 1122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.add_dependency("foo.proto"); 1123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ServiceDescriptorProto* service2 = AddService(&bar_file, "TestService2"); 1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMethod(service2, "Foo", "FooRequest", "FooResponse"); 1126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMethod(service2, "Baz", "BazRequest", "BazResponse"); 1127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 1129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 1130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 1131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file_ = pool_.BuildFile(bar_file); 1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(6, foo_file_->message_type_count()); 1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_request_ = foo_file_->message_type(0); 1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_response_ = foo_file_->message_type(1); 1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_request_ = foo_file_->message_type(2); 1139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_response_ = foo_file_->message_type(3); 1140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_request_ = foo_file_->message_type(4); 1141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_response_ = foo_file_->message_type(5); 1142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->service_count()); 1144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville service_ = foo_file_->service(0); 1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, service_->method_count()); 1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_ = service_->method(0); 1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_ = service_->method(1); 1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->service_count()); 1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville service2_ = bar_file_->service(0); 1152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, service2_->method_count()); 1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo2_ = service2_->method(0); 1155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz2_ = service2_->method(1); 1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_request_; 1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_response_; 1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_request_; 1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_response_; 1167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* baz_request_; 1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* baz_response_; 1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* service_; 1171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* service2_; 1172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* foo_; 1174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* bar_; 1175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* foo2_; 1177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* baz2_; 1178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, Name) { 1181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestService", service_->name()); 1182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestService", service_->full_name()); 1183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, service_->file()); 1184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestService2", service2_->name()); 1186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestService2", service2_->full_name()); 1187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, service2_->file()); 1188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodsByIndex) { 1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, service_->method_count()); 1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, service_->method(0)); 1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, service_->method(1)); 1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, FindMethodByName) { 1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_ , service_ ->FindMethodByName("Foo")); 1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_ , service_ ->FindMethodByName("Bar")); 1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_, service2_->FindMethodByName("Foo")); 1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz2_, service2_->FindMethodByName("Baz")); 1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(service_ ->FindMethodByName("NoSuchMethod") == NULL); 1203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(service_ ->FindMethodByName("Baz" ) == NULL); 1204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(service2_->FindMethodByName("Bar" ) == NULL); 1205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodName) { 1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", foo_->name()); 1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Bar", bar_->name()); 1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodFullName) { 1213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestService.Foo", foo_->full_name()); 1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestService.Bar", bar_->full_name()); 1215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestService2.Foo", foo2_->full_name()); 1216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestService2.Baz", baz2_->full_name()); 1217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodIndex) { 1220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, foo_->index()); 1221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, bar_->index()); 1222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodParent) { 1225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(service_, foo_->service()); 1226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(service_, bar_->service()); 1227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodInputType) { 1230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_request_, foo_->input_type()); 1231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_request_, bar_->input_type()); 1232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodOutputType) { 1235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_response_, foo_->output_type()); 1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_response_, bar_->output_type()); 1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test nested types. 1242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass NestedDescriptorTest : public testing::Test { 1243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 1244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 1245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following definitions: 1246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "foo.proto" 1248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message TestMessage { 1249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Foo {} 1250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Bar {} 1251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum Baz { A = 1; } 1252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum Qux { B = 1; } 1253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 1254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "bar.proto" 1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package corge.grault; 1257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message TestMessage2 { 1258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Foo {} 1259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Baz {} 1260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum Qux { A = 1; } 1261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum Quux { C = 1; } 1262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 1263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TestMessage2 is primarily here to test FindNestedTypeByName and friends. 1265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // All messages created from the same DescriptorPool share the same lookup 1266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // table, so we need to insure that they don't interfere. 1267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We add enum values to the enums in order to test searching for enum 1269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // values across a message's scope. 1270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 1272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 1273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message = AddMessage(&foo_file, "TestMessage"); 1275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedMessage(message, "Foo"); 1276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedMessage(message, "Bar"); 1277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* baz = AddNestedEnum(message, "Baz"); 1278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(baz, "A", 1); 1279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* qux = AddNestedEnum(message, "Qux"); 1280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(qux, "B", 1); 1281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto bar_file; 1283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_name("bar.proto"); 1284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_package("corge.grault"); 1285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2"); 1287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedMessage(message2, "Foo"); 1288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedMessage(message2, "Baz"); 1289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* qux2 = AddNestedEnum(message2, "Qux"); 1290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(qux2, "A", 1); 1291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* quux2 = AddNestedEnum(message2, "Quux"); 1292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(quux2, "C", 1); 1293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 1295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 1296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 1297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file_ = pool_.BuildFile(bar_file); 1299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 1300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->message_type_count()); 1302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_ = foo_file_->message_type(0); 1303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message_->nested_type_count()); 1305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_ = message_->nested_type(0); 1306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_ = message_->nested_type(1); 1307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message_->enum_type_count()); 1309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_ = message_->enum_type(0); 1310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_ = message_->enum_type(1); 1311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, baz_->value_count()); 1313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville a_ = baz_->value(0); 1314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, qux_->value_count()); 1315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b_ = qux_->value(0); 1316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->message_type_count()); 1318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2_ = bar_file_->message_type(0); 1319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message2_->nested_type_count()); 1321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo2_ = message2_->nested_type(0); 1322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz2_ = message2_->nested_type(1); 1323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message2_->enum_type_count()); 1325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux2_ = message2_->enum_type(0); 1326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville quux2_ = message2_->enum_type(1); 1327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, qux2_->value_count()); 1329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville a2_ = qux2_->value(0); 1330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, quux2_->value_count()); 1331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville c2_ = quux2_->value(0); 1332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 1335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 1337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 1338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message_; 1340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message2_; 1341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_; 1343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_; 1344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* baz_; 1345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* qux_; 1346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* a_; 1347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* b_; 1348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo2_; 1350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* baz2_; 1351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* qux2_; 1352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* quux2_; 1353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* a2_; 1354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* c2_; 1355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, MessageName) { 1358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", foo_ ->name()); 1359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Bar", bar_ ->name()); 1360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", foo2_->name()); 1361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Baz", baz2_->name()); 1362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.Foo", foo_->full_name()); 1364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.Bar", bar_->full_name()); 1365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.Foo", foo2_->full_name()); 1366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.Baz", baz2_->full_name()); 1367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, MessageContainingType) { 1370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_ , foo_ ->containing_type()); 1371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_ , bar_ ->containing_type()); 1372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, foo2_->containing_type()); 1373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, baz2_->containing_type()); 1374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, NestedMessagesByIndex) { 1377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message_->nested_type_count()); 1378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, message_->nested_type(0)); 1379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, message_->nested_type(1)); 1380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, FindFieldByNameDoesntFindNestedTypes) { 1383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByName("Foo") == NULL); 1384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByName("Qux") == NULL); 1385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByName("Foo") == NULL); 1386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByName("Qux") == NULL); 1387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, FindNestedTypeByName) { 1390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_ , message_ ->FindNestedTypeByName("Foo")); 1391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_ , message_ ->FindNestedTypeByName("Bar")); 1392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_, message2_->FindNestedTypeByName("Foo")); 1393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz2_, message2_->FindNestedTypeByName("Baz")); 1394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindNestedTypeByName("NoSuchType") == NULL); 1396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindNestedTypeByName("Baz" ) == NULL); 1397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindNestedTypeByName("Bar" ) == NULL); 1398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindNestedTypeByName("Qux") == NULL); 1400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, EnumName) { 1403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Baz" , baz_ ->name()); 1404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Qux" , qux_ ->name()); 1405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Qux" , qux2_->name()); 1406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Quux", quux2_->name()); 1407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.Baz", baz_->full_name()); 1409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.Qux", qux_->full_name()); 1410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.Qux" , qux2_ ->full_name()); 1411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.Quux", quux2_->full_name()); 1412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, EnumContainingType) { 1415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_ , baz_ ->containing_type()); 1416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_ , qux_ ->containing_type()); 1417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, qux2_ ->containing_type()); 1418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, quux2_->containing_type()); 1419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, NestedEnumsByIndex) { 1422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message_->nested_type_count()); 1423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, message_->nested_type(0)); 1424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, message_->nested_type(1)); 1425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, FindEnumTypeByName) { 1428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz_ , message_ ->FindEnumTypeByName("Baz" )); 1429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_ , message_ ->FindEnumTypeByName("Qux" )); 1430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux2_ , message2_->FindEnumTypeByName("Qux" )); 1431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(quux2_, message2_->FindEnumTypeByName("Quux")); 1432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindEnumTypeByName("NoSuchType") == NULL); 1434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindEnumTypeByName("Quux" ) == NULL); 1435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindEnumTypeByName("Baz" ) == NULL); 1436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindEnumTypeByName("Foo") == NULL); 1438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, FindEnumValueByName) { 1441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(a_ , message_ ->FindEnumValueByName("A")); 1442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(b_ , message_ ->FindEnumValueByName("B")); 1443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(a2_, message2_->FindEnumValueByName("A")); 1444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(c2_, message2_->FindEnumValueByName("C")); 1445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindEnumValueByName("NO_SUCH_VALUE") == NULL); 1447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindEnumValueByName("C" ) == NULL); 1448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindEnumValueByName("B" ) == NULL); 1449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindEnumValueByName("Foo") == NULL); 1451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test extensions. 1456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ExtensionDescriptorTest : public testing::Test { 1457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 1458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 1459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following definitions: 1460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum Baz {} 1462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Qux {} 1463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Foo { 1465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extensions 10 to 19; 1466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extensions 30 to 39; 1467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 1468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extends Foo with optional int32 foo_int32 = 10; 1469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extends Foo with repeated TestEnum foo_enum = 19; 1470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Bar { 1471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extends Foo with optional Qux foo_message = 30; 1472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // (using Qux as the group type) 1473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extends Foo with repeated group foo_group = 39; 1474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 1475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 1477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 1478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEmptyEnum(&foo_file, "Baz"); 1480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "Qux"); 1481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* foo = AddMessage(&foo_file, "Foo"); 1483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtensionRange(foo, 10, 20); 1484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtensionRange(foo, 30, 40); 1485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&foo_file, "Foo", "foo_int32", 10, 1487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 1488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 1489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&foo_file, "Foo", "foo_enum", 19, 1490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REPEATED, 1491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_ENUM) 1492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("Baz"); 1493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* bar = AddMessage(&foo_file, "Bar"); 1495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(bar, "Foo", "foo_message", 30, 1496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 1497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_MESSAGE) 1498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("Qux"); 1499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(bar, "Foo", "foo_group", 39, 1500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REPEATED, 1501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_GROUP) 1502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("Qux"); 1503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 1505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 1506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 1507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->enum_type_count()); 1509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_ = foo_file_->enum_type(0); 1510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(3, foo_file_->message_type_count()); 1512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_ = foo_file_->message_type(0); 1513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_ = foo_file_->message_type(1); 1514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_ = foo_file_->message_type(2); 1515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 1518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 1520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_; 1522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_; 1523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* baz_; 1524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* qux_; 1525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ExtensionDescriptorTest, ExtensionRanges) { 1528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, bar_->extension_range_count()); 1529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, foo_->extension_range_count()); 1530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(10, foo_->extension_range(0)->start); 1532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(30, foo_->extension_range(1)->start); 1533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(20, foo_->extension_range(0)->end); 1535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(40, foo_->extension_range(1)->end); 1536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ExtensionDescriptorTest, Extensions) { 1539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, foo_->extension_count()); 1540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, foo_file_->extension_count()); 1541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, bar_->extension_count()); 1542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->extension(0)->is_extension()); 1544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->extension(1)->is_extension()); 1545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_->extension(0)->is_extension()); 1546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_->extension(1)->is_extension()); 1547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_int32" , foo_file_->extension(0)->name()); 1549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_enum" , foo_file_->extension(1)->name()); 1550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_message", bar_->extension(0)->name()); 1551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_group" , bar_->extension(1)->name()); 1552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(10, foo_file_->extension(0)->number()); 1554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(19, foo_file_->extension(1)->number()); 1555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(30, bar_->extension(0)->number()); 1556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(39, bar_->extension(1)->number()); 1557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_INT32 , foo_file_->extension(0)->type()); 1559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_ENUM , foo_file_->extension(1)->type()); 1560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_->extension(0)->type()); 1561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_GROUP , bar_->extension(1)->type()); 1562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz_, foo_file_->extension(1)->enum_type()); 1564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_, bar_->extension(0)->message_type()); 1565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_, bar_->extension(1)->message_type()); 1566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, foo_file_->extension(0)->label()); 1568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, foo_file_->extension(1)->label()); 1569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->extension(0)->label()); 1570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, bar_->extension(1)->label()); 1571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, foo_file_->extension(0)->containing_type()); 1573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, foo_file_->extension(1)->containing_type()); 1574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, bar_->extension(0)->containing_type()); 1575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, bar_->extension(1)->containing_type()); 1576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->extension(0)->extension_scope() == NULL); 1578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->extension(1)->extension_scope() == NULL); 1579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, bar_->extension(0)->extension_scope()); 1580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, bar_->extension(1)->extension_scope()); 1581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ExtensionDescriptorTest, IsExtensionNumber) { 1584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->IsExtensionNumber( 9)); 1585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (foo_->IsExtensionNumber(10)); 1586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (foo_->IsExtensionNumber(19)); 1587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->IsExtensionNumber(20)); 1588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->IsExtensionNumber(29)); 1589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (foo_->IsExtensionNumber(30)); 1590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (foo_->IsExtensionNumber(39)); 1591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->IsExtensionNumber(40)); 1592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ExtensionDescriptorTest, FindExtensionByName) { 1595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note that FileDescriptor::FindExtensionByName() is tested by 1596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FileDescriptorTest. 1597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, bar_->extension_count()); 1598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_->extension(0), bar_->FindExtensionByName("foo_message")); 1600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_->extension(1), bar_->FindExtensionByName("foo_group" )); 1601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_->FindExtensionByName("no_such_extension") == NULL); 1603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_->FindExtensionByName("foo_int32") == NULL); 1604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_->FindExtensionByName("foo_message") == NULL); 1605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ExtensionDescriptorTest, FindAllExtensions) { 1608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<const FieldDescriptor*> extensions; 1609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pool_.FindAllExtensions(foo_, &extensions); 1610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(4, extensions.size()); 1611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(10, extensions[0]->number()); 1612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(19, extensions[1]->number()); 1613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(30, extensions[2]->number()); 1614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(39, extensions[3]->number()); 1615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ExtensionDescriptorTest, DuplicateFieldNumber) { 1618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool pool; 1619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto file_proto; 1620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Add "google/protobuf/descriptor.proto". 1621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); 1622a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 1623a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Add "foo.proto": 1624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "google/protobuf/descriptor.proto"; 1625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // extend google.protobuf.FieldOptions { 1626a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // optional int32 option1 = 1000; 1627a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 1628a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_proto.Clear(); 1629a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_proto.set_name("foo.proto"); 1630a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_proto.add_dependency("google/protobuf/descriptor.proto"); 1631a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson AddExtension(&file_proto, "google.protobuf.FieldOptions", "option1", 1000, 1632a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::LABEL_OPTIONAL, 1633a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::TYPE_INT32); 1634a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 1635a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Add "bar.proto": 1636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "google/protobuf/descriptor.proto"; 1637a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // extend google.protobuf.FieldOptions { 1638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // optional int32 option2 = 1000; 1639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 1640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_proto.Clear(); 1641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_proto.set_name("bar.proto"); 1642a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_proto.add_dependency("google/protobuf/descriptor.proto"); 1643a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson AddExtension(&file_proto, "google.protobuf.FieldOptions", "option2", 1000, 1644a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::LABEL_OPTIONAL, 1645a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto::TYPE_INT32); 1646a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Currently we only generate a warning for conflicting extension numbers. 1647a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // TODO(xiaofeng): Change it to an error. 1648a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 1649a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1650a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MiscTest : public testing::Test { 1654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 1655a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Function which makes a field descriptor of the given type. 1656a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* GetFieldDescriptorOfType(FieldDescriptor::Type type) { 1657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 1658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_proto.set_name("foo.proto"); 1659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEmptyEnum(&file_proto, "DummyEnum"); 1660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message = AddMessage(&file_proto, "TestMessage"); 1662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* field = 1663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "foo", 1, FieldDescriptorProto::LABEL_OPTIONAL, 1664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static_cast<FieldDescriptorProto::Type>(static_cast<int>(type))); 1665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (type == FieldDescriptor::TYPE_MESSAGE || 1667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville type == FieldDescriptor::TYPE_GROUP) { 1668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->set_type_name("TestMessage"); 1669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else if (type == FieldDescriptor::TYPE_ENUM) { 1670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->set_type_name("DummyEnum"); 1671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 1674a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool_.reset(new DescriptorPool()); 1675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* file = pool_->BuildFile(file_proto); 1676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (file != NULL && 1678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->message_type_count() == 1 && 1679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->message_type(0)->field_count() == 1) { 1680a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return file->message_type(0)->field(0); 1681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1682a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return NULL; 1683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1685a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1686a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const char* GetTypeNameForFieldType(FieldDescriptor::Type type) { 1687a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field = GetFieldDescriptorOfType(type); 1688a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return field != NULL ? field->type_name() : ""; 1689a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1690a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1691a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptor::CppType GetCppTypeForFieldType(FieldDescriptor::Type type) { 1692a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field = GetFieldDescriptorOfType(type); 1693a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return field != NULL ? field->cpp_type() : 1694a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson static_cast<FieldDescriptor::CppType>(0); 1695a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1696a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1697a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const char* GetCppTypeNameForFieldType(FieldDescriptor::Type type) { 1698a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field = GetFieldDescriptorOfType(type); 1699a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return field != NULL ? field->cpp_type_name() : ""; 1700a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1701a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1702a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* GetMessageDescriptorForFieldType( 1703a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptor::Type type) { 1704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field = GetFieldDescriptorOfType(type); 1705a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return field != NULL ? field->message_type() : NULL; 1706a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1708a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const EnumDescriptor* GetEnumDescriptorForFieldType( 1709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptor::Type type) { 1710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field = GetFieldDescriptorOfType(type); 1711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return field != NULL ? field->enum_type() : NULL; 1712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 1713a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1714a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson scoped_ptr<DescriptorPool> pool_; 1715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1717a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(MiscTest, TypeNames) { 1718a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test that correct type names are returned. 1719a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson typedef FieldDescriptor FD; // avoid ugly line wrapping 1721a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1722a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("double" , GetTypeNameForFieldType(FD::TYPE_DOUBLE )); 1723a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("float" , GetTypeNameForFieldType(FD::TYPE_FLOAT )); 1724a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int64" , GetTypeNameForFieldType(FD::TYPE_INT64 )); 1725a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("uint64" , GetTypeNameForFieldType(FD::TYPE_UINT64 )); 1726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int32" , GetTypeNameForFieldType(FD::TYPE_INT32 )); 1727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("fixed64" , GetTypeNameForFieldType(FD::TYPE_FIXED64 )); 1728a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("fixed32" , GetTypeNameForFieldType(FD::TYPE_FIXED32 )); 1729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("bool" , GetTypeNameForFieldType(FD::TYPE_BOOL )); 1730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("string" , GetTypeNameForFieldType(FD::TYPE_STRING )); 1731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("group" , GetTypeNameForFieldType(FD::TYPE_GROUP )); 1732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("message" , GetTypeNameForFieldType(FD::TYPE_MESSAGE )); 1733a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("bytes" , GetTypeNameForFieldType(FD::TYPE_BYTES )); 1734a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("uint32" , GetTypeNameForFieldType(FD::TYPE_UINT32 )); 1735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("enum" , GetTypeNameForFieldType(FD::TYPE_ENUM )); 1736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("sfixed32", GetTypeNameForFieldType(FD::TYPE_SFIXED32)); 1737a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("sfixed64", GetTypeNameForFieldType(FD::TYPE_SFIXED64)); 1738a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("sint32" , GetTypeNameForFieldType(FD::TYPE_SINT32 )); 1739a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("sint64" , GetTypeNameForFieldType(FD::TYPE_SINT64 )); 1740a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1741a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1742a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(MiscTest, StaticTypeNames) { 1743a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test that correct type names are returned. 1744a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1745a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson typedef FieldDescriptor FD; // avoid ugly line wrapping 1746a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1747a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("double" , FD::TypeName(FD::TYPE_DOUBLE )); 1748a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("float" , FD::TypeName(FD::TYPE_FLOAT )); 1749a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int64" , FD::TypeName(FD::TYPE_INT64 )); 1750a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("uint64" , FD::TypeName(FD::TYPE_UINT64 )); 1751a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int32" , FD::TypeName(FD::TYPE_INT32 )); 1752a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("fixed64" , FD::TypeName(FD::TYPE_FIXED64 )); 1753a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("fixed32" , FD::TypeName(FD::TYPE_FIXED32 )); 1754a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("bool" , FD::TypeName(FD::TYPE_BOOL )); 1755a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("string" , FD::TypeName(FD::TYPE_STRING )); 1756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("group" , FD::TypeName(FD::TYPE_GROUP )); 1757a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("message" , FD::TypeName(FD::TYPE_MESSAGE )); 1758a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("bytes" , FD::TypeName(FD::TYPE_BYTES )); 1759a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("uint32" , FD::TypeName(FD::TYPE_UINT32 )); 1760a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("enum" , FD::TypeName(FD::TYPE_ENUM )); 1761a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("sfixed32", FD::TypeName(FD::TYPE_SFIXED32)); 1762a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("sfixed64", FD::TypeName(FD::TYPE_SFIXED64)); 1763a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("sint32" , FD::TypeName(FD::TYPE_SINT32 )); 1764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("sint64" , FD::TypeName(FD::TYPE_SINT64 )); 1765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(MiscTest, CppTypes) { 1768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that CPP types are assigned correctly. 1769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef FieldDescriptor FD; // avoid ugly line wrapping 1771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_DOUBLE , GetCppTypeForFieldType(FD::TYPE_DOUBLE )); 1773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_FLOAT , GetCppTypeForFieldType(FD::TYPE_FLOAT )); 1774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_INT64 )); 1775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_UINT64 )); 1776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_INT32 )); 1777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_FIXED64 )); 1778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_FIXED32 )); 1779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_BOOL , GetCppTypeForFieldType(FD::TYPE_BOOL )); 1780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_STRING )); 1781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_GROUP )); 1782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_MESSAGE )); 1783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_BYTES )); 1784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_UINT32 )); 1785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_ENUM , GetCppTypeForFieldType(FD::TYPE_ENUM )); 1786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_SFIXED32)); 1787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_SFIXED64)); 1788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_SINT32 )); 1789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_SINT64 )); 1790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1792a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(MiscTest, CppTypeNames) { 1793a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test that correct CPP type names are returned. 1794a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1795a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson typedef FieldDescriptor FD; // avoid ugly line wrapping 1796a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1797a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("double" , GetCppTypeNameForFieldType(FD::TYPE_DOUBLE )); 1798a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("float" , GetCppTypeNameForFieldType(FD::TYPE_FLOAT )); 1799a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int64" , GetCppTypeNameForFieldType(FD::TYPE_INT64 )); 1800a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("uint64" , GetCppTypeNameForFieldType(FD::TYPE_UINT64 )); 1801a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int32" , GetCppTypeNameForFieldType(FD::TYPE_INT32 )); 1802a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("uint64" , GetCppTypeNameForFieldType(FD::TYPE_FIXED64 )); 1803a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("uint32" , GetCppTypeNameForFieldType(FD::TYPE_FIXED32 )); 1804a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("bool" , GetCppTypeNameForFieldType(FD::TYPE_BOOL )); 1805a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("string" , GetCppTypeNameForFieldType(FD::TYPE_STRING )); 1806a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("message", GetCppTypeNameForFieldType(FD::TYPE_GROUP )); 1807a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("message", GetCppTypeNameForFieldType(FD::TYPE_MESSAGE )); 1808a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("string" , GetCppTypeNameForFieldType(FD::TYPE_BYTES )); 1809a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("uint32" , GetCppTypeNameForFieldType(FD::TYPE_UINT32 )); 1810a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("enum" , GetCppTypeNameForFieldType(FD::TYPE_ENUM )); 1811a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int32" , GetCppTypeNameForFieldType(FD::TYPE_SFIXED32)); 1812a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int64" , GetCppTypeNameForFieldType(FD::TYPE_SFIXED64)); 1813a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int32" , GetCppTypeNameForFieldType(FD::TYPE_SINT32 )); 1814a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int64" , GetCppTypeNameForFieldType(FD::TYPE_SINT64 )); 1815a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1816a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1817a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(MiscTest, StaticCppTypeNames) { 1818a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test that correct CPP type names are returned. 1819a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1820a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson typedef FieldDescriptor FD; // avoid ugly line wrapping 1821a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1822a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int32" , FD::CppTypeName(FD::CPPTYPE_INT32 )); 1823a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("int64" , FD::CppTypeName(FD::CPPTYPE_INT64 )); 1824a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("uint32" , FD::CppTypeName(FD::CPPTYPE_UINT32 )); 1825a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("uint64" , FD::CppTypeName(FD::CPPTYPE_UINT64 )); 1826a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("double" , FD::CppTypeName(FD::CPPTYPE_DOUBLE )); 1827a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("float" , FD::CppTypeName(FD::CPPTYPE_FLOAT )); 1828a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("bool" , FD::CppTypeName(FD::CPPTYPE_BOOL )); 1829a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("enum" , FD::CppTypeName(FD::CPPTYPE_ENUM )); 1830a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("string" , FD::CppTypeName(FD::CPPTYPE_STRING )); 1831a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_STREQ("message", FD::CppTypeName(FD::CPPTYPE_MESSAGE)); 1832a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1833a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1834a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(MiscTest, MessageType) { 1835a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test that message_type() is NULL for non-aggregate fields 1836a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1837a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson typedef FieldDescriptor FD; // avoid ugly line wrapping 1838a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1839a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_DOUBLE )); 1840a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FLOAT )); 1841a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_INT64 )); 1842a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_UINT64 )); 1843a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_INT32 )); 1844a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FIXED64 )); 1845a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FIXED32 )); 1846a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_BOOL )); 1847a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_STRING )); 1848a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL != GetMessageDescriptorForFieldType(FD::TYPE_GROUP )); 1849a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL != GetMessageDescriptorForFieldType(FD::TYPE_MESSAGE )); 1850a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_BYTES )); 1851a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_UINT32 )); 1852a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_ENUM )); 1853a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SFIXED32)); 1854a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SFIXED64)); 1855a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SINT32 )); 1856a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SINT64 )); 1857a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1858a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1859a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(MiscTest, EnumType) { 1860a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test that enum_type() is NULL for non-enum fields 1861a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1862a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson typedef FieldDescriptor FD; // avoid ugly line wrapping 1863a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1864a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_DOUBLE )); 1865a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FLOAT )); 1866a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_INT64 )); 1867a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_UINT64 )); 1868a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_INT32 )); 1869a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FIXED64 )); 1870a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FIXED32 )); 1871a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_BOOL )); 1872a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_STRING )); 1873a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_GROUP )); 1874a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_MESSAGE )); 1875a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_BYTES )); 1876a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_UINT32 )); 1877a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL != GetEnumDescriptorForFieldType(FD::TYPE_ENUM )); 1878a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SFIXED32)); 1879a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SFIXED64)); 1880a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SINT32 )); 1881a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SINT64 )); 1882a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1883a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1884a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(MiscTest, DefaultValues) { 1886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that setting default values works. 1887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 1888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_proto.set_name("foo.proto"); 1889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* enum_type_proto = AddEnum(&file_proto, "DummyEnum"); 1891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum_type_proto, "A", 1); 1892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum_type_proto, "B", 2); 1893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message_proto = AddMessage(&file_proto, "TestMessage"); 1895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef FieldDescriptorProto FD; // avoid ugly line wrapping 1897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FD::Label label = FD::LABEL_OPTIONAL; 1898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Create fields of every CPP type with default values. 1900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "int32" , 1, label, FD::TYPE_INT32 ) 1901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("-1"); 1902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "int64" , 2, label, FD::TYPE_INT64 ) 1903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("-1000000000000"); 1904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "uint32", 3, label, FD::TYPE_UINT32) 1905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("42"); 1906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "uint64", 4, label, FD::TYPE_UINT64) 1907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("2000000000000"); 1908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "float" , 5, label, FD::TYPE_FLOAT ) 1909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("4.5"); 1910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "double", 6, label, FD::TYPE_DOUBLE) 1911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("10e100"); 1912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "bool" , 7, label, FD::TYPE_BOOL ) 1913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("true"); 1914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "string", 8, label, FD::TYPE_STRING) 1915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("hello"); 1916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "data" , 9, label, FD::TYPE_BYTES ) 1917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("\\001\\002\\003"); 1918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* enum_field = 1920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "enum", 10, label, FD::TYPE_ENUM); 1921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_field->set_type_name("DummyEnum"); 1922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_field->set_default_value("B"); 1923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Strings are allowed to have empty defaults. (At one point, due to 1925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // a bug, empty defaults for strings were rejected. Oops.) 1926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "empty_string", 11, label, FD::TYPE_STRING) 1927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value(""); 1928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Add a second set of fields with implicit defalut values. 1930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_int32" , 21, label, FD::TYPE_INT32 ); 1931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_int64" , 22, label, FD::TYPE_INT64 ); 1932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_uint32", 23, label, FD::TYPE_UINT32); 1933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_uint64", 24, label, FD::TYPE_UINT64); 1934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_float" , 25, label, FD::TYPE_FLOAT ); 1935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_double", 26, label, FD::TYPE_DOUBLE); 1936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_bool" , 27, label, FD::TYPE_BOOL ); 1937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_string", 28, label, FD::TYPE_STRING); 1938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_data" , 29, label, FD::TYPE_BYTES ); 1939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_enum" , 30, label, FD::TYPE_ENUM) 1940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("DummyEnum"); 1941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build it. 1943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool; 1944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.BuildFile(file_proto); 1945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 1946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, file->enum_type_count()); 1948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum_type = file->enum_type(0); 1949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, enum_type->value_count()); 1950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* enum_value_a = enum_type->value(0); 1951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* enum_value_b = enum_type->value(1); 1952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, file->message_type_count()); 1954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message = file->message_type(0); 1955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(21, message->field_count()); 1957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check the default values. 1959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(0)->has_default_value()); 1960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(1)->has_default_value()); 1961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(2)->has_default_value()); 1962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(3)->has_default_value()); 1963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(4)->has_default_value()); 1964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(5)->has_default_value()); 1965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(6)->has_default_value()); 1966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(7)->has_default_value()); 1967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(8)->has_default_value()); 1968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(9)->has_default_value()); 1969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(10)->has_default_value()); 1970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-1 , message->field(0)->default_value_int32 ()); 1972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-GOOGLE_ULONGLONG(1000000000000), 1973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message->field(1)->default_value_int64 ()); 1974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(42 , message->field(2)->default_value_uint32()); 1975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(GOOGLE_ULONGLONG(2000000000000), 1976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message->field(3)->default_value_uint64()); 1977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(4.5 , message->field(4)->default_value_float ()); 1978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(10e100 , message->field(5)->default_value_double()); 1979a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE( message->field(6)->default_value_bool ()); 1980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("hello" , message->field(7)->default_value_string()); 1981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("\001\002\003" , message->field(8)->default_value_string()); 1982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum_value_b , message->field(9)->default_value_enum ()); 1983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("" , message->field(10)->default_value_string()); 1984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(11)->has_default_value()); 1986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(12)->has_default_value()); 1987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(13)->has_default_value()); 1988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(14)->has_default_value()); 1989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(15)->has_default_value()); 1990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(16)->has_default_value()); 1991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(17)->has_default_value()); 1992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(18)->has_default_value()); 1993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(19)->has_default_value()); 1994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(20)->has_default_value()); 1995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , message->field(11)->default_value_int32 ()); 1997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , message->field(12)->default_value_int64 ()); 1998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , message->field(13)->default_value_uint32()); 1999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , message->field(14)->default_value_uint64()); 2000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0.0f , message->field(15)->default_value_float ()); 2001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0.0 , message->field(16)->default_value_double()); 2002a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE( message->field(17)->default_value_bool ()); 2003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("" , message->field(18)->default_value_string()); 2004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("" , message->field(19)->default_value_string()); 2005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum_value_a, message->field(20)->default_value_enum()); 2006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(MiscTest, FieldOptions) { 2009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try setting field options. 2010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 2012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_proto.set_name("foo.proto"); 2013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message_proto = AddMessage(&file_proto, "TestMessage"); 2015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "foo", 1, 2016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 2017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 2018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* bar_proto = 2019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "bar", 2, 2020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 2021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 2022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldOptions* options = bar_proto->mutable_options(); 2024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->set_ctype(FieldOptions::CORD); 2025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 2027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool; 2028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.BuildFile(file_proto); 2029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 2030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, file->message_type_count()); 2032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message = file->message_type(0); 2033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message->field_count()); 2035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* foo = message->field(0); 2036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* bar = message->field(1); 2037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // "foo" had no options set, so it should return the default options. 2039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&FieldOptions::default_instance(), &foo->options()); 2040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // "bar" had options set. 2042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(&FieldOptions::default_instance(), options); 2043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar->options().has_ctype()); 2044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldOptions::CORD, bar->options().ctype()); 2045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 2048a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonenum DescriptorPoolMode { 2049a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson NO_DATABASE, 2050a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FALLBACK_DATABASE 2051a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 2052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2053a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass AllowUnknownDependenciesTest 2054a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : public testing::TestWithParam<DescriptorPoolMode> { 2055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 2056a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPoolMode mode() { 2057a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return GetParam(); 2058a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 2059a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 2061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_proto, bar_proto; 2062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2063a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (mode()) { 2064a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case NO_DATABASE: 2065a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool_.reset(new DescriptorPool); 2066a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 2067a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FALLBACK_DATABASE: 2068a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool_.reset(new DescriptorPool(&db_)); 2069a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 2070a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 2071a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2072a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool_->AllowUnknownDependencies(); 2073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 2075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: 'foo.proto'" 2076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: 'bar.proto'" 2077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: 'baz.proto'" 2078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: 'Foo'" 2080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'Bar' }" 2081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:'baz' number:2 label:LABEL_OPTIONAL type_name:'Baz' }" 2082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:'qux' number:3 label:LABEL_OPTIONAL" 2083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: '.corge.Qux'" 2084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_ENUM" 2085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options {" 2086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option {" 2087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name {" 2088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: 'grault'" 2089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true" 2090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 2091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234" 2092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 2093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 2094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 2095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &foo_proto)); 2097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 2098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: 'bar.proto'" 2099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: 'Bar' }", 2100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &bar_proto)); 2101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Collect pointers to stuff. 2103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bar_file_ = BuildFile(bar_proto); 2104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 2105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->message_type_count()); 2107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_type_ = bar_file_->message_type(0); 2108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson foo_file_ = BuildFile(foo_proto); 2110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 2111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->message_type_count()); 2113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_type_ = foo_file_->message_type(0); 2114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(3, foo_type_->field_count()); 2116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_field_ = foo_type_->field(0); 2117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_field_ = foo_type_->field(1); 2118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_field_ = foo_type_->field(2); 2119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* BuildFile(const FileDescriptorProto& proto) { 2122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (mode()) { 2123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case NO_DATABASE: 2124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return pool_->BuildFile(proto); 2125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 2126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FALLBACK_DATABASE: { 2127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(db_.Add(proto)); 2128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return pool_->FindFileByName(proto.name()); 2129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 2130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 2131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_LOG(FATAL) << "Can't get here."; 2132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return NULL; 2133a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 2134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 2136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_type_; 2137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 2138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_type_; 2139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* bar_field_; 2140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* baz_field_; 2141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* qux_field_; 2142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SimpleDescriptorDatabase db_; // used if in FALLBACK_DATABASE mode. 2144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson scoped_ptr<DescriptorPool> pool_; 2145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 2146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2147a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_P(AllowUnknownDependenciesTest, PlaceholderFile) { 2148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, foo_file_->dependency_count()); 2149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, foo_file_->dependency(0)); 2150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(bar_file_->is_placeholder()); 2151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* baz_file = foo_file_->dependency(1); 2153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz.proto", baz_file->name()); 2154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, baz_file->message_type_count()); 2155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(baz_file->is_placeholder()); 2156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Placeholder files should not be findable. 2158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(bar_file_, pool_->FindFileByName(bar_file_->name())); 2159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool_->FindFileByName(baz_file->name()) == NULL); 2160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_P(AllowUnknownDependenciesTest, PlaceholderTypes) { 2163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_field_->type()); 2164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_type_, bar_field_->message_type()); 2165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(bar_type_->is_placeholder()); 2166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_field_->type()); 2168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* baz_type = baz_field_->message_type(); 2169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Baz", baz_type->name()); 2170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Baz", baz_type->full_name()); 2171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, baz_type->extension_range_count()); 2172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(baz_type->is_placeholder()); 2173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(FieldDescriptor::TYPE_ENUM, qux_field_->type()); 2175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* qux_type = qux_field_->enum_type(); 2176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Qux", qux_type->name()); 2177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.Qux", qux_type->full_name()); 2178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(qux_type->is_placeholder()); 2179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Placeholder types should not be findable. 2181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(bar_type_, pool_->FindMessageTypeByName(bar_type_->full_name())); 2182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool_->FindMessageTypeByName(baz_type->full_name()) == NULL); 2183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool_->FindEnumTypeByName(qux_type->full_name()) == NULL); 2184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_P(AllowUnknownDependenciesTest, CopyTo) { 2187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FieldDescriptor::CopyTo() should write non-fully-qualified type names 2188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // for placeholder types which were not originally fully-qualified. 2189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto proto; 2190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Bar is not a placeholder, so it is fully-qualified. 2192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_field_->CopyTo(&proto); 2193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(".Bar", proto.type_name()); 2194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptorProto::TYPE_MESSAGE, proto.type()); 2195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Baz is an unqualified placeholder. 2197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Clear(); 2198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_field_->CopyTo(&proto); 2199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Baz", proto.type_name()); 2200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(proto.has_type()); 2201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Qux is a fully-qualified placeholder. 2203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Clear(); 2204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_field_->CopyTo(&proto); 2205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(".corge.Qux", proto.type_name()); 2206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptorProto::TYPE_ENUM, proto.type()); 2207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_P(AllowUnknownDependenciesTest, CustomOptions) { 2210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Qux should still have the uninterpreted option attached. 2211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, qux_field_->options().uninterpreted_option_size()); 2212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const UninterpretedOption& option = 2213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_field_->options().uninterpreted_option(0); 2214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, option.name_size()); 2215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("grault", option.name(0).name_part()); 2216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_P(AllowUnknownDependenciesTest, UnknownExtendee) { 2219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that we can extend an unknown type. This is slightly tricky because 2220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // it means that the placeholder type must have an extension range. 2221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto extension_proto; 2223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 2225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: 'extension.proto'" 2226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { extendee: 'UnknownType' name:'some_extension' number:123" 2227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " label:LABEL_OPTIONAL type:TYPE_INT32 }", 2228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &extension_proto)); 2229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* file = BuildFile(extension_proto); 2230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 2232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, file->extension_count()); 2234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* extendee = file->extension(0)->containing_type(); 2235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("UnknownType", extendee->name()); 2236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(extendee->is_placeholder()); 2237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, extendee->extension_range_count()); 2238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, extendee->extension_range(0)->start); 2239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::kMaxNumber + 1, extendee->extension_range(0)->end); 2240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_P(AllowUnknownDependenciesTest, CustomOption) { 2243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that we can use a custom option without having parsed 2244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // descriptor.proto. 2245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto option_proto; 2247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 2249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"unknown_custom_options.proto\" " 2250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 2251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { " 2252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"google.protobuf.FileOptions\" " 2253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"some_option\" " 2254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " number: 123456 " 2255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " label: LABEL_OPTIONAL " 2256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 " 2257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "} " 2258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { " 2259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"some_option\" " 2262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 2263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 2265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"unknown_option\" " 2269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 2270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 2272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"optimize_for\" " 2276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 2277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"SPEED\" " 2279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &option_proto)); 2282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* file = BuildFile(option_proto); 2284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 2285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Verify that no extension options were set, but they were left as 2287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // uninterpreted_options. 2288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<const FieldDescriptor*> fields; 2289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->options().GetReflection()->ListFields(file->options(), &fields); 2290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, fields.size()); 2291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->options().has_optimize_for()); 2292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, file->options().uninterpreted_option_size()); 2293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_P(AllowUnknownDependenciesTest, 2296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson UndeclaredDependencyTriggersBuildOfDependency) { 2297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Crazy case: suppose foo.proto refers to a symbol without declaring the 2298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // dependency that finds it. In the event that the pool is backed by a 2299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // DescriptorDatabase, the pool will attempt to find the symbol in the 2300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // database. If successful, it will build the undeclared dependency to verify 2301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // that the file does indeed contain the symbol. If that file fails to build, 2302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // then its descriptors must be rolled back. However, we still want foo.proto 2303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // to build successfully, since we are allowing unknown dependencies. 2304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto undeclared_dep_proto; 2306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // We make this file fail to build by giving it two fields with tag 1. 2307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(TextFormat::ParseFromString( 2308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"invalid_file_as_undeclared_dep.proto\" " 2309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "package: \"undeclared\" " 2310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type: { " 2311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Quux\" " 2312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { " 2313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name:'qux' number:1 label:LABEL_OPTIONAL type: TYPE_INT32 " 2314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }" 2315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { " 2316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name:'quux' number:1 label:LABEL_OPTIONAL type: TYPE_INT64 " 2317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }" 2318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 2319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &undeclared_dep_proto)); 2320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // We can't use the BuildFile() helper because we don't actually want to build 2321a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // it into the descriptor pool in the fallback database case: it just needs to 2322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // be sitting in the database so that it gets built during the building of 2323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // test.proto below. 2324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (mode()) { 2325a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case NO_DATABASE: { 2326a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(pool_->BuildFile(undeclared_dep_proto) == NULL); 2327a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson break; 2328a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 2329a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FALLBACK_DATABASE: { 2330a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(db_.Add(undeclared_dep_proto)); 2331a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 2332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 2333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto test_proto; 2335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(TextFormat::ParseFromString( 2336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"test.proto\" " 2337a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type: { " 2338a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Corge\" " 2339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { " 2340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name:'quux' number:1 label: LABEL_OPTIONAL " 2341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " type_name:'undeclared.Quux' type: TYPE_MESSAGE " 2342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }" 2343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 2344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &test_proto)); 2345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* file = BuildFile(test_proto); 2347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(file != NULL); 2348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_LOG(INFO) << file->DebugString(); 2349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(0, file->dependency_count()); 2351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(1, file->message_type_count()); 2352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* corge_desc = file->message_type(0); 2353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ("Corge", corge_desc->name()); 2354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(1, corge_desc->field_count()); 2355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(corge_desc->is_placeholder()); 2356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* quux_field = corge_desc->field(0); 2358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, quux_field->type()); 2359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ("Quux", quux_field->message_type()->name()); 2360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ("undeclared.Quux", quux_field->message_type()->full_name()); 2361a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(quux_field->message_type()->is_placeholder()); 2362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The place holder type should not be findable. 2363a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(pool_->FindMessageTypeByName("undeclared.Quux") == NULL); 2364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 2365a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonINSTANTIATE_TEST_CASE_P(DatabaseSource, 2367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson AllowUnknownDependenciesTest, 2368a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson testing::Values(NO_DATABASE, FALLBACK_DATABASE)); 2369a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 2371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(CustomOptions, OptionLocations) { 2373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message = 2374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageWithCustomOptions::descriptor(); 2375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = message->file(); 2376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field = message->FindFieldByName("field1"); 2377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enm = message->FindEnumTypeByName("AnEnum"); 2378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TODO(benjy): Support EnumValue options, once the compiler does. 2379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* service = 2380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->FindServiceByName("TestServiceWithCustomOptions"); 2381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* method = service->FindMethodByName("Foo"); 2382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(GOOGLE_LONGLONG(9876543210), 2384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->options().GetExtension(protobuf_unittest::file_opt1)); 2385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-56, 2386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message->options().GetExtension(protobuf_unittest::message_opt1)); 2387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(GOOGLE_LONGLONG(8765432109), 2388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->options().GetExtension(protobuf_unittest::field_opt1)); 2389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(42, // Check that we get the default for an option we don't set. 2390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->options().GetExtension(protobuf_unittest::field_opt2)); 2391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-789, 2392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enm->options().GetExtension(protobuf_unittest::enum_opt1)); 2393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(123, 2394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enm->value(1)->options().GetExtension( 2395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::enum_value_opt1)); 2396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(GOOGLE_LONGLONG(-9876543210), 2397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville service->options().GetExtension(protobuf_unittest::service_opt1)); 2398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(protobuf_unittest::METHODOPT1_VAL2, 2399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville method->options().GetExtension(protobuf_unittest::method_opt1)); 2400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See that the regular options went through unscathed. 2402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message->options().has_message_set_wire_format()); 2403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldOptions::CORD, field->options().ctype()); 2404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(CustomOptions, OptionTypes) { 2407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageOptions* options = NULL; 2408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options = 2410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::CustomOptionMinIntegerValues::descriptor()->options(); 2411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(false , options->GetExtension(protobuf_unittest::bool_opt)); 2412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::int32_opt)); 2413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::int64_opt)); 2414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::uint32_opt)); 2415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::uint64_opt)); 2416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sint32_opt)); 2417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sint64_opt)); 2418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::fixed32_opt)); 2419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::fixed64_opt)); 2420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sfixed32_opt)); 2421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sfixed64_opt)); 2422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options = 2424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::CustomOptionMaxIntegerValues::descriptor()->options(); 2425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(true , options->GetExtension(protobuf_unittest::bool_opt)); 2426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::int32_opt)); 2427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::int64_opt)); 2428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::uint32_opt)); 2429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::uint64_opt)); 2430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sint32_opt)); 2431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sint64_opt)); 2432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::fixed32_opt)); 2433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::fixed64_opt)); 2434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sfixed32_opt)); 2435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sfixed64_opt)); 2436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options = 2438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::CustomOptionOtherValues::descriptor()->options(); 2439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-100, options->GetExtension(protobuf_unittest::int32_opt)); 2440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FLOAT_EQ(12.3456789, 2441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->GetExtension(protobuf_unittest::float_opt)); 2442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_EQ(1.234567890123456789, 2443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->GetExtension(protobuf_unittest::double_opt)); 2444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Hello, \"World\"", 2445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->GetExtension(protobuf_unittest::string_opt)); 2446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(string("Hello\0World", 11), 2448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->GetExtension(protobuf_unittest::bytes_opt)); 2449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(protobuf_unittest::DummyMessageContainingEnum::TEST_OPTION_ENUM_TYPE2, 2451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->GetExtension(protobuf_unittest::enum_opt)); 2452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options = 2454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::SettingRealsFromPositiveInts::descriptor()->options(); 2455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FLOAT_EQ(12, options->GetExtension(protobuf_unittest::float_opt)); 2456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_EQ(154, options->GetExtension(protobuf_unittest::double_opt)); 2457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options = 2459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::SettingRealsFromNegativeInts::descriptor()->options(); 2460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FLOAT_EQ(-12, options->GetExtension(protobuf_unittest::float_opt)); 2461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_EQ(-154, options->GetExtension(protobuf_unittest::double_opt)); 2462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(CustomOptions, ComplexExtensionOptions) { 2465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageOptions* options = 2466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::VariousComplexOptions::descriptor()->options(); 2467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1).foo(), 42); 2468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1). 2469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::quux), 324); 2470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1). 2471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::corge).qux(), 876); 2472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).baz(), 987); 2473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). 2474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::grault), 654); 2475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar().foo(), 2476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 743); 2477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar(). 2478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::quux), 1999); 2479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar(). 2480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::corge).qux(), 2008); 2481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). 2482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::garply).foo(), 741); 2483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). 2484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::garply). 2485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::quux), 1998); 2486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). 2487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::garply). 2488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::corge).qux(), 2121); 2489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension( 2490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::ComplexOptionType2::ComplexOptionType4::complex_opt4). 2491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville waldo(), 1971); 2492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). 2493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fred().waldo(), 321); 2494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(9, options->GetExtension(protobuf_unittest::complex_opt3).qux()); 2495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(22, options->GetExtension(protobuf_unittest::complex_opt3). 2496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville complexoptiontype5().plugh()); 2497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(24, options->GetExtension(protobuf_unittest::complexopt6).xyzzy()); 2498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(CustomOptions, OptionsFromOtherFile) { 2501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that to use a custom option, we only need to import the file 2502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // defining the option; we do not also have to import descriptor.proto. 2503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool; 2504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 2506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); 2507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageWithCustomOptions::descriptor() 2510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->file()->CopyTo(&file_proto); 2511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 2514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"custom_options_import.proto\" " 2515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"protobuf_unittest\" " 2516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/unittest_custom_options.proto\" " 2517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { " 2518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"file_opt1\" " 2521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 2522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 2524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test a non-extension option too. (At one point this failed due to a 2526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // bug.) 2527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"java_package\" " 2530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 2531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"foo\" " 2533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that enum-typed options still work too. (At one point this also 2535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // failed due to a bug.) 2536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"optimize_for\" " 2539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 2540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"SPEED\" " 2542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 2544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville , 2545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &file_proto)); 2546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.BuildFile(file_proto); 2548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 2549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1234, file->options().GetExtension(protobuf_unittest::file_opt1)); 2550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->options().has_java_package()); 2551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo", file->options().java_package()); 2552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->options().has_optimize_for()); 2553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FileOptions::SPEED, file->options().optimize_for()); 2554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(CustomOptions, MessageOptionThreeFieldsSet) { 2557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This tests a bug which previously existed in custom options parsing. The 2558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // bug occurred when you defined a custom option with message type and then 2559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // set three fields of that option on a single definition (see the example 2560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // below). The bug is a bit hard to explain, so check the change history if 2561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // you want to know more. 2562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool; 2563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 2565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); 2566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageWithCustomOptions::descriptor() 2569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->file()->CopyTo(&file_proto); 2570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The following represents the definition: 2573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 2574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // import "google/protobuf/unittest_custom_options.proto" 2575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package protobuf_unittest; 2576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Foo { 2577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // option (complex_opt1).foo = 1234; 2578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // option (complex_opt1).foo2 = 1234; 2579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // option (complex_opt1).foo3 = 1234; 2580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 2581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 2582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"custom_options_import.proto\" " 2583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"protobuf_unittest\" " 2584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/unittest_custom_options.proto\" " 2585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 2586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\" " 2587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { " 2588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"complex_opt1\" " 2591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 2592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"foo\" " 2595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 2596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 2598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"complex_opt1\" " 2602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 2603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"foo2\" " 2606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 2607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 2609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"complex_opt1\" " 2613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 2614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"foo3\" " 2617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 2618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 2620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &file_proto)); 2624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.BuildFile(file_proto); 2626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 2627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, file->message_type_count()); 2628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageOptions& options = file->message_type(0)->options(); 2630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1234, options.GetExtension(protobuf_unittest::complex_opt1).foo()); 2631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2633a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(CustomOptions, MessageOptionRepeatedLeafFieldSet) { 2634a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // This test verifies that repeated fields in custom options can be 2635a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // given multiple values by repeating the option with a different value. 2636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // This test checks repeated leaf values. Each repeated custom value 2637a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // appears in a different uninterpreted_option, which will be concatenated 2638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // when they are merged into the final option value. 2639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool pool; 2640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto file_proto; 2642a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); 2643a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2644a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2645a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protobuf_unittest::TestMessageWithCustomOptions::descriptor() 2646a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ->file()->CopyTo(&file_proto); 2647a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2648a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2649a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The following represents the definition: 2650a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 2651a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "google/protobuf/unittest_custom_options.proto" 2652a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // package protobuf_unittest; 2653a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Foo { 2654a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // option (complex_opt1).foo4 = 12; 2655a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // option (complex_opt1).foo4 = 34; 2656a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // option (complex_opt1).foo4 = 56; 2657a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 2658a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(TextFormat::ParseFromString( 2659a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"custom_options_import.proto\" " 2660a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "package: \"protobuf_unittest\" " 2661a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"google/protobuf/unittest_custom_options.proto\" " 2662a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { " 2663a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\" " 2664a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " options { " 2665a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " uninterpreted_option { " 2666a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2667a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"complex_opt1\" " 2668a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: true " 2669a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2670a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2671a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"foo4\" " 2672a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: false " 2673a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2674a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " positive_int_value: 12 " 2675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2676a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " uninterpreted_option { " 2677a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2678a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"complex_opt1\" " 2679a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: true " 2680a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2681a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2682a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"foo4\" " 2683a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: false " 2684a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2685a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " positive_int_value: 34 " 2686a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2687a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " uninterpreted_option { " 2688a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2689a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"complex_opt1\" " 2690a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: true " 2691a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2692a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2693a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"foo4\" " 2694a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: false " 2695a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2696a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " positive_int_value: 56 " 2697a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2698a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2699a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 2700a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &file_proto)); 2701a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2702a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* file = pool.BuildFile(file_proto); 2703a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(file != NULL); 2704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(1, file->message_type_count()); 2705a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2706a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const MessageOptions& options = file->message_type(0)->options(); 2707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(3, options.GetExtension(protobuf_unittest::complex_opt1).foo4_size()); 2708a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(12, options.GetExtension(protobuf_unittest::complex_opt1).foo4(0)); 2709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(34, options.GetExtension(protobuf_unittest::complex_opt1).foo4(1)); 2710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(56, options.GetExtension(protobuf_unittest::complex_opt1).foo4(2)); 2711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 2712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2713a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(CustomOptions, MessageOptionRepeatedMsgFieldSet) { 2714a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // This test verifies that repeated fields in custom options can be 2715a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // given multiple values by repeating the option with a different value. 2716a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // This test checks repeated message values. Each repeated custom value 2717a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // appears in a different uninterpreted_option, which will be concatenated 2718a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // when they are merged into the final option value. 2719a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool pool; 2720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2721a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto file_proto; 2722a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); 2723a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2724a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2725a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protobuf_unittest::TestMessageWithCustomOptions::descriptor() 2726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ->file()->CopyTo(&file_proto); 2727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2728a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The following represents the definition: 2730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 2731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "google/protobuf/unittest_custom_options.proto" 2732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // package protobuf_unittest; 2733a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Foo { 2734a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // option (complex_opt2).barney = {waldo: 1}; 2735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // option (complex_opt2).barney = {waldo: 10}; 2736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // option (complex_opt2).barney = {waldo: 100}; 2737a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 2738a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(TextFormat::ParseFromString( 2739a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"custom_options_import.proto\" " 2740a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "package: \"protobuf_unittest\" " 2741a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"google/protobuf/unittest_custom_options.proto\" " 2742a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { " 2743a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\" " 2744a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " options { " 2745a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " uninterpreted_option { " 2746a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2747a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"complex_opt2\" " 2748a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: true " 2749a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2750a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2751a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"barney\" " 2752a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: false " 2753a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2754a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " aggregate_value: \"waldo: 1\" " 2755a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " uninterpreted_option { " 2757a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2758a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"complex_opt2\" " 2759a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: true " 2760a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2761a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2762a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"barney\" " 2763a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: false " 2764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " aggregate_value: \"waldo: 10\" " 2766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2767a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " uninterpreted_option { " 2768a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2769a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"complex_opt2\" " 2770a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: true " 2771a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2772a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { " 2773a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name_part: \"barney\" " 2774a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: false " 2775a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2776a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " aggregate_value: \"waldo: 100\" " 2777a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2778a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } " 2779a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 2780a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &file_proto)); 2781a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2782a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* file = pool.BuildFile(file_proto); 2783a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(file != NULL); 2784a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(1, file->message_type_count()); 2785a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2786a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const MessageOptions& options = file->message_type(0)->options(); 2787a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(3, options.GetExtension( 2788a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protobuf_unittest::complex_opt2).barney_size()); 2789a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(1,options.GetExtension( 2790a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protobuf_unittest::complex_opt2).barney(0).waldo()); 2791a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(10, options.GetExtension( 2792a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protobuf_unittest::complex_opt2).barney(1).waldo()); 2793a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(100, options.GetExtension( 2794a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protobuf_unittest::complex_opt2).barney(2).waldo()); 2795a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 2796a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2797a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Check that aggregate options were parsed and saved correctly in 2798a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// the appropriate descriptors. 2799a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(CustomOptions, AggregateOptions) { 2800a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* msg = protobuf_unittest::AggregateMessage::descriptor(); 2801a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* file = msg->file(); 2802a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field = msg->FindFieldByName("fieldname"); 2803a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const EnumDescriptor* enumd = file->FindEnumTypeByName("AggregateEnum"); 2804a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const EnumValueDescriptor* enumv = enumd->FindValueByName("VALUE"); 2805a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const ServiceDescriptor* service = file->FindServiceByName( 2806a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "AggregateService"); 2807a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const MethodDescriptor* method = service->FindMethodByName("Method"); 2808a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2809a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Tests for the different types of data embedded in fileopt 2810a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const protobuf_unittest::Aggregate& file_options = 2811a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file->options().GetExtension(protobuf_unittest::fileopt); 2812a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(100, file_options.i()); 2813a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("FileAnnotation", file_options.s()); 2814a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("NestedFileAnnotation", file_options.sub().s()); 2815a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("FileExtensionAnnotation", 2816a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_options.file().GetExtension(protobuf_unittest::fileopt).s()); 2817a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("EmbeddedMessageSetElement", 2818a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_options.mset().GetExtension( 2819a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protobuf_unittest::AggregateMessageSetElement 2820a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ::message_set_extension).s()); 2821a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2822a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Simple tests for all the other types of annotations 2823a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("MessageAnnotation", 2824a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson msg->options().GetExtension(protobuf_unittest::msgopt).s()); 2825a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("FieldAnnotation", 2826a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->options().GetExtension(protobuf_unittest::fieldopt).s()); 2827a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("EnumAnnotation", 2828a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enumd->options().GetExtension(protobuf_unittest::enumopt).s()); 2829a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("EnumValueAnnotation", 2830a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enumv->options().GetExtension(protobuf_unittest::enumvalopt).s()); 2831a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("ServiceAnnotation", 2832a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson service->options().GetExtension(protobuf_unittest::serviceopt).s()); 2833a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("MethodAnnotation", 2834a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson method->options().GetExtension(protobuf_unittest::methodopt).s()); 2835a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 2836a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2837a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(CustomOptions, UnusedImportWarning) { 2838a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool pool; 2839a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2840a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto file_proto; 2841a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); 2842a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2843a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2844a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protobuf_unittest::TestMessageWithCustomOptions::descriptor() 2845a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ->file()->CopyTo(&file_proto); 2846a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2847a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2848a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2849a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool.AddUnusedImportTrackFile("custom_options_import.proto"); 2850a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(TextFormat::ParseFromString( 2851a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"custom_options_import.proto\" " 2852a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "package: \"protobuf_unittest\" " 2853a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"google/protobuf/unittest_custom_options.proto\" ", 2854a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &file_proto)); 2855a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool.BuildFile(file_proto); 2856a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 2857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 2859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The tests below trigger every unique call to AddError() in descriptor.cc, 2861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the order in which they appear in that file. I'm using TextFormat here 2862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to specify the input descriptors because building them using code would 2863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// be too bulky. 2864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MockErrorCollector : public DescriptorPool::ErrorCollector { 2866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 2867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector() {} 2868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~MockErrorCollector() {} 2869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string text_; 2871a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson string warning_text_; 2872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implements ErrorCollector --------------------------------------- 2874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void AddError(const string& filename, 2875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& element_name, const Message* descriptor, 2876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorLocation location, const string& message) { 2877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* location_name = NULL; 2878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville switch (location) { 2879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case NAME : location_name = "NAME" ; break; 2880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case NUMBER : location_name = "NUMBER" ; break; 2881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case TYPE : location_name = "TYPE" ; break; 2882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case EXTENDEE : location_name = "EXTENDEE" ; break; 2883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case DEFAULT_VALUE: location_name = "DEFAULT_VALUE"; break; 2884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case OPTION_NAME : location_name = "OPTION_NAME" ; break; 2885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case OPTION_VALUE : location_name = "OPTION_VALUE" ; break; 2886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case INPUT_TYPE : location_name = "INPUT_TYPE" ; break; 2887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case OUTPUT_TYPE : location_name = "OUTPUT_TYPE" ; break; 2888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case OTHER : location_name = "OTHER" ; break; 2889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville strings::SubstituteAndAppend( 2892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &text_, "$0: $1: $2: $3\n", 2893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville filename, element_name, location_name, message); 2894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2896a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // implements ErrorCollector --------------------------------------- 2897a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void AddWarning(const string& filename, const string& element_name, 2898a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message* descriptor, ErrorLocation location, 2899a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string& message) { 2900a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const char* location_name = NULL; 2901a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (location) { 2902a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case NAME : location_name = "NAME" ; break; 2903a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case NUMBER : location_name = "NUMBER" ; break; 2904a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case TYPE : location_name = "TYPE" ; break; 2905a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case EXTENDEE : location_name = "EXTENDEE" ; break; 2906a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case DEFAULT_VALUE: location_name = "DEFAULT_VALUE"; break; 2907a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case OPTION_NAME : location_name = "OPTION_NAME" ; break; 2908a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case OPTION_VALUE : location_name = "OPTION_VALUE" ; break; 2909a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case INPUT_TYPE : location_name = "INPUT_TYPE" ; break; 2910a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case OUTPUT_TYPE : location_name = "OUTPUT_TYPE" ; break; 2911a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case OTHER : location_name = "OTHER" ; break; 2912a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 2913a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2914a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson strings::SubstituteAndAppend( 2915a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &warning_text_, "$0: $1: $2: $3\n", 2916a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson filename, element_name, location_name, message); 2917a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 2918a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 2919a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2920a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass ValidationErrorTest : public testing::Test { 2921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 2922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse file_text as a FileDescriptorProto in text format and add it 2923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to the DescriptorPool. Expect no errors. 2924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void BuildFile(const string& file_text) { 2925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 2926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); 2927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool_.BuildFile(file_proto) != NULL); 2928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse file_text as a FileDescriptorProto in text format and add it 2931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to the DescriptorPool. Expect errors to be produced which match the 2932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // given error text. 2933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void BuildFileWithErrors(const string& file_text, 2934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& expected_errors) { 2935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 2936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); 2937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector error_collector; 2939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE( 2940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pool_.BuildFileCollectingErrors(file_proto, &error_collector) == NULL); 2941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(expected_errors, error_collector.text_); 2942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2944a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Parse file_text as a FileDescriptorProto in text format and add it 2945a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // to the DescriptorPool. Expect errors to be produced which match the 2946a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // given warning text. 2947a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void BuildFileWithWarnings(const string& file_text, 2948a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string& expected_warnings) { 2949a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto file_proto; 2950a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); 2951a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2952a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MockErrorCollector error_collector; 2953a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool_.BuildFileCollectingErrors(file_proto, &error_collector)); 2954a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(expected_warnings, error_collector.warning_text_); 2955a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 2956a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 2957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Builds some already-parsed file in our test pool. 2958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void BuildFileInTestPool(const FileDescriptor* file) { 2959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 2960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->CopyTo(&file_proto); 2961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool_.BuildFile(file_proto) != NULL); 2962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptor.proto in our test pool. This allows us to extend it in 2965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the test pool, so we can test custom options. 2966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void BuildDescriptorMessagesInTestPool() { 2967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileInTestPool(DescriptorProto::descriptor()->file()); 2968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 2971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 2972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, AlreadyDefined) { 2974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }" 2977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }", 2978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NAME: \"Foo\" is already defined.\n"); 2980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, AlreadyDefinedInPackage) { 2983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.bar\" " 2986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }" 2987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }", 2988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.bar.Foo: NAME: \"Foo\" is already defined in " 2990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"foo.bar\".\n"); 2991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, AlreadyDefinedInOtherFile) { 2994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 2995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }"); 2997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 3000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }", 3001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: Foo: NAME: \"Foo\" is already defined in file " 3003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"foo.proto\".\n"); 3004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, PackageAlreadyDefined) { 3007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"foo\" }"); 3010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 3012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.bar\"", 3013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: foo: NAME: \"foo\" is already defined (as something other " 3015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "than a package) in file \"foo.proto\".\n"); 3016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParent) { 3019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } " 3022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ", 3023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: FOO: NAME: \"FOO\" is already defined.\n" 3025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: FOO: NAME: Note that enum values use C++ scoping rules, " 3026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "meaning that enum values are siblings of their type, not children of " 3027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "it. Therefore, \"FOO\" must be unique within the global scope, not " 3028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "just within \"Bar\".\n"); 3029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParentNonGlobal) { 3032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"pkg\" " 3035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } " 3036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ", 3037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: pkg.FOO: NAME: \"FOO\" is already defined in \"pkg\".\n" 3039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: pkg.FOO: NAME: Note that enum values use C++ scoping rules, " 3040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "meaning that enum values are siblings of their type, not children of " 3041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "it. Therefore, \"FOO\" must be unique within \"pkg\", not just within " 3042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"Bar\".\n"); 3043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, MissingName) { 3046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { }", 3049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: : NAME: Missing name.\n"); 3051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InvalidName) { 3054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"$\" }", 3057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: $: NAME: \"$\" is not a valid identifier.\n"); 3059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InvalidPackageName) { 3062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.$\"", 3065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.$: NAME: \"$\" is not a valid identifier.\n"); 3067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, MissingFileName) { 3070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "", 3072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ": : OTHER: Missing field: FileDescriptorProto.name.\n"); 3074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, DupeDependency) { 3077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile("name: \"foo.proto\""); 3078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 3080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"foo.proto\" " 3081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"foo.proto\" ", 3082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: bar.proto: OTHER: Import \"foo.proto\" was listed twice.\n"); 3084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UnknownDependency) { 3087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 3089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"foo.proto\" ", 3090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: bar.proto: OTHER: Import \"foo.proto\" has not been loaded.\n"); 3092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3094a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, InvalidPublicDependencyIndex) { 3095a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile("name: \"foo.proto\""); 3096a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 3097a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"bar.proto\" " 3098a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"foo.proto\" " 3099a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "public_dependency: 1", 3100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "bar.proto: bar.proto: OTHER: Invalid public dependency index.\n"); 3101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, ForeignUnimportedPackageNoCrash) { 3104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Used to crash: If we depend on a non-existent file and then refer to a 3105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package defined in a file that we didn't import, and that package is 3106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // nested within a parent package which this file is also in, and we don't 3107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // include that parent package in the name (i.e. we do a relative lookup)... 3108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Yes, really. 3109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: 'foo.proto' " 3111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: 'outer.foo' "); 3112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: 'bar.proto' " 3114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: 'baz.proto' " 3115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: 'outer.bar' " 3116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 3117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: 'Bar' " 3118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'foo.Foo' }" 3119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: bar.proto: OTHER: Import \"baz.proto\" has not been loaded.\n" 3122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: outer.bar.Bar.bar: TYPE: \"outer.foo\" seems to be defined in " 3123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"foo.proto\", which is not imported by \"bar.proto\". To use it here, " 3124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "please add the necessary import.\n"); 3125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, DupeFile) { 3128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }"); 3131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: We should *not* get redundant errors about "Foo" already being 3132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // defined. 3133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 3136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Add another type so that the files aren't identical (in which case there 3137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // would be no error). 3138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" }", 3139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OTHER: A file with this name is already in the " 3141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "pool.\n"); 3142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldInExtensionRange) { 3145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 9 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"bar\" number: 10 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"baz\" number: 19 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"qux\" number: 20 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 10 end: 20 }" 3154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.bar: NUMBER: Extension range 10 to 19 includes field " 3157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"bar\" (10).\n" 3158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.baz: NUMBER: Extension range 10 to 19 includes field " 3159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"baz\" (19).\n"); 3160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, OverlappingExtensionRanges) { 3163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 10 end: 20 }" 3168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 20 end: 30 }" 3169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 19 end: 21 }" 3170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with " 3173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "already-defined range 10 to 19.\n" 3174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with " 3175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "already-defined range 20 to 29.\n"); 3176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InvalidDefaults) { 3179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Invalid number. 3185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32" 3186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"abc\" }" 3187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Empty default value. 3189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"bar\" number: 2 label: LABEL_OPTIONAL type: TYPE_INT32" 3190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"\" }" 3191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Invalid boolean. 3193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"baz\" number: 3 label: LABEL_OPTIONAL type: TYPE_BOOL" 3194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"abc\" }" 3195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Messages can't have defaults. 3197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"qux\" number: 4 label: LABEL_OPTIONAL type: TYPE_MESSAGE" 3198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"abc\" type_name: \"Foo\" }" 3199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Same thing, but we don't know that this field has message type until 3201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // we look up the type name. 3202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"quux\" number: 5 label: LABEL_OPTIONAL" 3203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"abc\" type_name: \"Foo\" }" 3204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Repeateds can't have defaults. 3206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"corge\" number: 6 label: LABEL_REPEATED type: TYPE_INT32" 3207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"1\" }" 3208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.foo: DEFAULT_VALUE: Couldn't parse default value \"abc\".\n" 3211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.bar: DEFAULT_VALUE: Couldn't parse default value \"\".\n" 3212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.baz: DEFAULT_VALUE: Boolean default must be true or " 3213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "false.\n" 3214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.qux: DEFAULT_VALUE: Messages can't have default values.\n" 3215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.corge: DEFAULT_VALUE: Repeated fields can't have default " 3216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "values.\n" 3217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This ends up being reported later because the error is detected at 3218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // cross-linking time. 3219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.quux: DEFAULT_VALUE: Messages can't have default " 3220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "values.\n"); 3221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NegativeFieldNumber) { 3224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: -1 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: NUMBER: Field numbers must be positive integers.\n"); 3232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, HugeFieldNumber) { 3235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 0x70000000 " 3240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " label:LABEL_OPTIONAL type:TYPE_INT32 }" 3241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: NUMBER: Field numbers cannot be greater than " 3244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "536870911.\n"); 3245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, ReservedFieldNumber) { 3248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field {name:\"foo\" number: 18999 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field {name:\"bar\" number: 19000 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field {name:\"baz\" number: 19999 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field {name:\"qux\" number: 20000 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.bar: NUMBER: Field numbers 19000 through 19999 are " 3259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "reserved for the protocol buffer library implementation.\n" 3260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.baz: NUMBER: Field numbers 19000 through 19999 are " 3261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "reserved for the protocol buffer library implementation.\n"); 3262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, ExtensionMissingExtendee) { 3265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name: \"foo\" number: 1 label: LABEL_OPTIONAL" 3270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: \"Foo\" }" 3271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee not set for " 3274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension field.\n"); 3275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NonExtensionWithExtendee) { 3278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 3282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 1 end: 2 }" 3283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 3284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 1 label: LABEL_OPTIONAL" 3287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: \"Foo\" extendee: \"Bar\" }" 3288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee set for " 3291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "non-extension field.\n"); 3292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, FieldOneofIndexTooLarge) { 3295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 3296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32 " 3300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " oneof_index: 1 }" 3301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"dummy\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 " 3302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " oneof_index: 0 }" 3303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " oneof_decl { name:\"bar\" }" 3304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 3305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.foo: OTHER: FieldDescriptorProto.oneof_index 1 is out of " 3307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "range for type \"Foo\".\n"); 3308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, FieldOneofIndexNegative) { 3311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 3312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32 " 3316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " oneof_index: -1 }" 3317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"dummy\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 " 3318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " oneof_index: 0 }" 3319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " oneof_decl { name:\"bar\" }" 3320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 3321a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.foo: OTHER: FieldDescriptorProto.oneof_index -1 is out of " 3323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "range for type \"Foo\".\n"); 3324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3325a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldNumberConflict) { 3327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"bar\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.bar: NUMBER: Field number 1 has already been used in " 3336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"Foo\" by field \"foo\".\n"); 3337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, BadMessageSetExtensionType) { 3340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"MessageSet\"" 3344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { message_set_wire_format: true }" 3345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 4 end: 5 }" 3346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 3347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"foo\" number:4 label:LABEL_OPTIONAL type:TYPE_INT32" 3350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"MessageSet\" }" 3351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional " 3354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "messages.\n"); 3355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, BadMessageSetExtensionLabel) { 3358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"MessageSet\"" 3362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { message_set_wire_format: true }" 3363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 4 end: 5 }" 3364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 3365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"foo\" number:4 label:LABEL_REPEATED type:TYPE_MESSAGE" 3368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: \"Foo\" extendee: \"MessageSet\" }" 3369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional " 3372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "messages.\n"); 3373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldInMessageSet) { 3376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { message_set_wire_format: true }" 3381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: NAME: MessageSets cannot have fields, only " 3385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extensions.\n"); 3386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NegativeExtensionRangeNumber) { 3389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: -10 end: -1 }" 3394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension numbers must be positive integers.\n"); 3397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, HugeExtensionRangeNumber) { 3400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 1 end: 0x70000000 }" 3405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension numbers cannot be greater than " 3408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "536870911.\n"); 3409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, ExtensionRangeEndBeforeStart) { 3412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 10 end: 10 }" 3417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 10 end: 5 }" 3418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension range end number must be greater than " 3421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "start number.\n" 3422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension range end number must be greater than " 3423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "start number.\n"); 3424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EmptyEnum) { 3427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Foo\" }" 3430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Also use the empty enum in a message to make sure there are no crashes 3431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // during validation (possible if the code attempts to derive a default 3432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // value for the field). 3433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 3435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type_name:\"Foo\" }" 3436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"bar\" number: 2 label:LABEL_OPTIONAL type_name:\"Foo\" " 3437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"NO_SUCH_VALUE\" }" 3438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NAME: Enums must contain at least one value.\n" 3441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Bar.bar: DEFAULT_VALUE: Enum type \"Foo\" has no value named " 3442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"NO_SUCH_VALUE\".\n"); 3443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UndefinedExtendee) { 3446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" 3451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"Bar\" }" 3452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not defined.\n"); 3455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NonMessageExtendee) { 3458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } }" 3461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" 3464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"Bar\" }" 3465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not a message type.\n"); 3468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NotAnExtensionNumber) { 3471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 3475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 3476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" 3479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"Bar\" }" 3480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: NUMBER: \"Bar\" does not declare 1 as an extension " 3483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "number.\n"); 3484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, RequiredExtension) { 3487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 3488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Bar\"" 3491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " extension_range { start: 1000 end: 10000 }" 3492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}" 3493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " extension {" 3496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name:\"foo\"" 3497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " number:1000" 3498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " label:LABEL_REQUIRED" 3499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " type:TYPE_INT32" 3500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " extendee: \"Bar\"" 3501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }" 3502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 3503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.foo: TYPE: Message extensions cannot have required " 3505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "fields.\n"); 3506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UndefinedFieldType) { 3509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" 3514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \"Bar\" is not defined.\n"); 3517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, UndefinedFieldTypeWithDefault) { 3520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // See b/12533582. Previously this failed because the default value was not 3521a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // accepted by the parser, which assumed an enum type, leading to an unclear 3522a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // error message. We want this input to yield a validation error instead, 3523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // since the unknown type is the primary problem. 3524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 3525a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3527a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"int\" " 3529a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " default_value:\"1\" }" 3530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 3531a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3532a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.foo: TYPE: \"int\" is not defined.\n"); 3533a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3534a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3535a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, UndefinedNestedFieldType) { 3536a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 3537a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3540a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " nested_type { name:\"Baz\" }" 3541a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"foo\" number:1" 3542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " label:LABEL_OPTIONAL" 3543a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " type_name:\"Foo.Baz.Bar\" }" 3544a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 3545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.foo: TYPE: \"Foo.Baz.Bar\" is not defined.\n"); 3547a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldTypeDefinedInUndeclaredDependency) { 3550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 3552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Bar\" } "); 3553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" 3559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", " 3561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "which is not imported by \"foo.proto\". To use it here, please add the " 3562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "necessary import.\n"); 3563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, FieldTypeDefinedInIndirectDependency) { 3566a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test for hidden dependencies. 3567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // bar.proto 3569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Bar{} 3570a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // forward.proto 3572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "bar.proto" 3573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // foo.proto 3575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "forward.proto" 3576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Foo { 3577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // optional Bar foo = 1; // Error, needs to import bar.proto explicitly. 3578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 3579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"bar.proto\" " 3582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { name: \"Bar\" }"); 3583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"forward.proto\"" 3586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"bar.proto\""); 3587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 3589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"forward.proto\" " 3591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" 3594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 3595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", " 3596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "which is not imported by \"foo.proto\". To use it here, please add the " 3597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "necessary import.\n"); 3598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3599a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, FieldTypeDefinedInPublicDependency) { 3601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test for public dependencies. 3602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3603a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // bar.proto 3604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Bar{} 3605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // forward.proto 3607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import public "bar.proto" 3608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // foo.proto 3610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "forward.proto" 3611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Foo { 3612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // optional Bar foo = 1; // Correct. "bar.proto" is public imported into 3613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // forward.proto, so when "foo.proto" imports 3614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // "forward.proto", it imports "bar.proto" too. 3615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 3616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"bar.proto\" " 3619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { name: \"Bar\" }"); 3620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3622a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"forward.proto\"" 3623a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"bar.proto\" " 3624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "public_dependency: 0"); 3625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3626a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3627a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3628a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"forward.proto\" " 3629a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3630a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3631a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" 3632a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}"); 3633a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3634a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3635a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, FieldTypeDefinedInTransitivePublicDependency) { 3636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test for public dependencies. 3637a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // bar.proto 3639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Bar{} 3640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // forward.proto 3642a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import public "bar.proto" 3643a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3644a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // forward2.proto 3645a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import public "forward.proto" 3646a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3647a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // foo.proto 3648a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "forward2.proto" 3649a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Foo { 3650a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // optional Bar foo = 1; // Correct, public imports are transitive. 3651a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 3652a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3653a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3654a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"bar.proto\" " 3655a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { name: \"Bar\" }"); 3656a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3657a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3658a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"forward.proto\"" 3659a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"bar.proto\" " 3660a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "public_dependency: 0"); 3661a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3662a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3663a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"forward2.proto\"" 3664a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"forward.proto\" " 3665a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "public_dependency: 0"); 3666a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3667a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3668a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3669a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"forward2.proto\" " 3670a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3671a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3672a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" 3673a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}"); 3674a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3676a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, 3677a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldTypeDefinedInPrivateDependencyOfPublicDependency) { 3678a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test for public dependencies. 3679a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3680a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // bar.proto 3681a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Bar{} 3682a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3683a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // forward.proto 3684a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "bar.proto" 3685a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3686a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // forward2.proto 3687a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import public "forward.proto" 3688a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3689a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // foo.proto 3690a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "forward2.proto" 3691a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Foo { 3692a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // optional Bar foo = 1; // Error, the "bar.proto" is not public imported 3693a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // into "forward.proto", so will not be imported 3694a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // into either "forward2.proto" or "foo.proto". 3695a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 3696a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 3697a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3698a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"bar.proto\" " 3699a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { name: \"Bar\" }"); 3700a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3701a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3702a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"forward.proto\"" 3703a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"bar.proto\""); 3704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3705a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 3706a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"forward2.proto\"" 3707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"forward.proto\" " 3708a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "public_dependency: 0"); 3709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 3711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"forward2.proto\" " 3713a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3714a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3715a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" 3716a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 3717a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", " 3718a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "which is not imported by \"foo.proto\". To use it here, please add the " 3719a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "necessary import.\n"); 3720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3721a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3722a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, SearchMostLocalFirst) { 3724a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The following should produce an error that Bar.Baz is resolved but 3725a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // not defined: 3726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Bar { message Baz {} } 3727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Foo { 3728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Bar { 3729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // Placing "message Baz{}" here, or removing Foo.Bar altogether, 3730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // would fix the error. 3731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 3732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // optional Bar.Baz baz = 1; 3733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 3734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // An one point the lookup code incorrectly did not produce an error in this 3735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // case, because when looking for Bar.Baz, it would try "Foo.Bar.Baz" first, 3736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fail, and ten try "Bar.Baz" and succeed, even though "Bar" should actually 3737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // refer to the inner Bar, not the outer one. 3738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 3742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " nested_type { name: \"Baz\" }" 3743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 3744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " nested_type { name: \"Bar\" }" 3747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"baz\" number:1 label:LABEL_OPTIONAL" 3748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Bar.Baz\" }" 3749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3751a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.baz: TYPE: \"Bar.Baz\" is resolved to \"Foo.Bar.Baz\"," 3752a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " which is not defined. The innermost scope is searched first in name " 3753a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "resolution. Consider using a leading '.'(i.e., \".Bar.Baz\") to start " 3754a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "from the outermost scope.\n"); 3755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, SearchMostLocalFirst2) { 3758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This test would find the most local "Bar" first, and does, but 3759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // proceeds to find the outer one because the inner one's not an 3760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // aggregate. 3761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 3765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " nested_type { name: \"Baz\" }" 3766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 3767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"Bar\" number:1 type:TYPE_BYTES } " 3770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"baz\" number:2 label:LABEL_OPTIONAL" 3771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Bar.Baz\" }" 3772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 3773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, PackageOriginallyDeclaredInTransitiveDependent) { 3776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Imagine we have the following: 3777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 3778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // foo.proto: 3779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package foo.bar; 3780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // bar.proto: 3781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package foo.bar; 3782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // import "foo.proto"; 3783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Bar {} 3784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // baz.proto: 3785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package foo; 3786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // import "bar.proto" 3787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Baz { optional bar.Bar qux = 1; } 3788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 3789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // When validating baz.proto, we will look up "bar.Bar". As part of this 3790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // lookup, we first lookup "bar" then try to find "Bar" within it. "bar" 3791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // should resolve to "foo.bar". Note, though, that "foo.bar" was originally 3792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // defined in foo.proto, which is not a direct dependency of baz.proto. The 3793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implementation of FindSymbol() normally only returns symbols in direct 3794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // dependencies, not indirect ones. This test insures that this does not 3795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // prevent it from finding "foo.bar". 3796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.bar\" "); 3800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 3802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.bar\" " 3803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"foo.proto\" " 3804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Bar\" }"); 3805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"baz.proto\" " 3807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo\" " 3808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"bar.proto\" " 3809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 3810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Baz\" " 3811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"qux\" number:1 label:LABEL_OPTIONAL " 3812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"bar.Bar\" }" 3813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 3814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldTypeNotAType) { 3817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL " 3822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\".Foo.bar\" }" 3823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"bar\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \".Foo.bar\" is not a type.\n"); 3827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, RelativeFieldTypeNotAType) { 3830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " nested_type {" 3834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 3835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"Baz\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }" 3836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 3837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL " 3839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Bar.Baz\" }" 3840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \"Bar.Baz\" is not a type.\n"); 3842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldTypeMayBeItsName) { 3845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 3849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 3850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"Bar\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" 3853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 3854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumFieldTypeIsMessage) { 3857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Bar\" } " 3860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_ENUM" 3863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Bar\" }" 3864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \"Bar\" is not an enum type.\n"); 3867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, MessageFieldTypeIsEnum) { 3870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " 3873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE" 3876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Bar\" }" 3877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \"Bar\" is not a message type.\n"); 3880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, BadEnumDefaultValue) { 3883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " 3886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\"" 3889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value:\"NO_SUCH_VALUE\" }" 3890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: DEFAULT_VALUE: Enum type \"Bar\" has no value named " 3893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"NO_SUCH_VALUE\".\n"); 3894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3896a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, EnumDefaultValueIsInteger) { 3897a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 3898a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3899a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " 3900a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3901a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3902a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\"" 3903a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " default_value:\"0\" }" 3904a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 3905a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3906a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.foo: DEFAULT_VALUE: Default value for an enum field must " 3907a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "be an identifier.\n"); 3908a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3909a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, PrimitiveWithTypeName) { 3911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" 3916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Foo\" }" 3917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: Field with primitive type has type_name.\n"); 3920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NonPrimitiveWithoutTypeName) { 3923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE }" 3928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: Field with message or enum type missing " 3931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "type_name.\n"); 3932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3934a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, OneofWithNoFields) { 3935a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 3936a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3937a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3938a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3939a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " oneof_decl { name:\"bar\" }" 3940a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 3941a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3942a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.bar: NAME: Oneof must have at least one field.\n"); 3943a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3944a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3945a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, OneofLabelMismatch) { 3946a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 3947a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 3948a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 3949a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Foo\"" 3950a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"foo\" number:1 label:LABEL_REPEATED type:TYPE_INT32 " 3951a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " oneof_index:0 }" 3952a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " oneof_decl { name:\"bar\" }" 3953a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 3954a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3955a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Foo.foo: NAME: Fields of oneofs must themselves have label " 3956a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "LABEL_OPTIONAL.\n"); 3957a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 3958a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 3959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InputTypeNotDefined) { 3960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 3963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 3964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 3965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }" 3966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3968a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not defined.\n" 3969a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ); 3970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InputTypeNotAMessage) { 3973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 3976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " 3977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 3978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 3979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }" 3980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3982a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not a message type.\n" 3983a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ); 3984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, OutputTypeNotDefined) { 3987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 3990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 3991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 3992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }" 3993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3995a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not defined.\n" 3996a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ); 3997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, OutputTypeNotAMessage) { 4000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 4003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " 4004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 4005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 4006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }" 4007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 4008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4009a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not a message type.\n" 4010a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ); 4011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4013a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, IllegalPackedField) { 4015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {\n" 4018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 4019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"packed_string\" number:1 label:LABEL_REPEATED " 4020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type:TYPE_STRING " 4021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option {" 4022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"packed\" is_extension: false }" 4023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"true\" }}}\n" 4024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"packed_message\" number:3 label:LABEL_REPEATED " 4025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: \"Foo\"" 4026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option {" 4027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"packed\" is_extension: false }" 4028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"true\" }}}\n" 4029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"optional_int32\" number: 4 label: LABEL_OPTIONAL " 4030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type:TYPE_INT32 " 4031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option {" 4032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"packed\" is_extension: false }" 4033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"true\" }}}\n" 4034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 4035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.packed_string: TYPE: [packed = true] can only be " 4037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "specified for repeated primitive fields.\n" 4038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.packed_message: TYPE: [packed = true] can only be " 4039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "specified for repeated primitive fields.\n" 4040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.optional_int32: TYPE: [packed = true] can only be " 4041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "specified for repeated primitive fields.\n" 4042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ); 4043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, OptionWrongType) { 4046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 4049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\" " 4050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING " 4051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option { name { name_part: \"ctype\" " 4052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 4053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1 }" 4054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 4055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 4056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 4057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestMessage.foo: OPTION_VALUE: Value must be identifier for " 4059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum-valued option \"google.protobuf.FieldOptions.ctype\".\n"); 4060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, OptionExtendsAtomicType) { 4063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 4066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\" " 4067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING " 4068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option { name { name_part: \"ctype\" " 4069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 4070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"foo\" " 4071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true }" 4072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1 }" 4073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 4074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 4075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 4076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" is an " 4078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "atomic type, not a message.\n"); 4079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, DupOption) { 4082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 4085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\" " 4086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_UINT32 " 4087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option { name { name_part: \"ctype\" " 4088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 4089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"CORD\" }" 4090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { name { name_part: \"ctype\" " 4091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 4092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"CORD\" }" 4093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 4094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 4095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 4096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" was " 4098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "already set.\n"); 4099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InvalidOptionName) { 4102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 4105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\" " 4106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL " 4107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option { " 4108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"uninterpreted_option\" " 4109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 4110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1 " 4111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 4112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 4113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 4114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 4115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestMessage.foo: OPTION_NAME: Option must not use " 4117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "reserved name \"uninterpreted_option\".\n"); 4118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, RepeatedMessageOption) { 4121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type: { name: \"Bar\" field: { " 4127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32 } " 4128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "} " 4129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "extension { name: \"bar\" number: 7672757 label: LABEL_REPEATED " 4130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " type: TYPE_MESSAGE type_name: \"Bar\" " 4131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " extendee: \"google.protobuf.FileOptions\" }" 4132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "options { uninterpreted_option { name { name_part: \"bar\" " 4133a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: true } " 4134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { name_part: \"foo\" " 4135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: false } " 4136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " positive_int_value: 1 } }", 4137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: foo.proto: OPTION_NAME: Option field \"(bar)\" is a " 4139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated message. Repeated message options must be initialized " 4140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "using an aggregate value.\n"); 4141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 4142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, ResolveUndefinedOption) { 4144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The following should produce an eror that baz.bar is resolved but not 4145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // defined. 4146a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // foo.proto: 4147a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // package baz 4148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import google/protobuf/descriptor.proto 4149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Bar { optional int32 foo = 1; } 4150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // extend FileOptions { optional Bar bar = 7672757; } 4151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 4152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // qux.proto: 4153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // package qux.baz 4154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // option (baz.bar).foo = 1; 4155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 4156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Although "baz.bar" is already defined, the lookup code will try 4157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // "qux.baz.bar", since it's the match from the innermost scope, which will 4158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // cause a symbol not defined error. 4159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildDescriptorMessagesInTestPool(); 4160a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4161a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 4162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 4163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "package: \"baz\" " 4164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"google/protobuf/descriptor.proto\" " 4165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type: { name: \"Bar\" field: { " 4166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32 } " 4167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "} " 4168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "extension { name: \"bar\" number: 7672757 label: LABEL_OPTIONAL " 4169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " type: TYPE_MESSAGE type_name: \"Bar\" " 4170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " extendee: \"google.protobuf.FileOptions\" }"); 4171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 4173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"qux.proto\" " 4174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "package: \"qux.baz\" " 4175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "options { uninterpreted_option { name { name_part: \"baz.bar\" " 4176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: true } " 4177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { name_part: \"foo\" " 4178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: false } " 4179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " positive_int_value: 1 } }", 4180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "qux.proto: qux.proto: OPTION_NAME: Option \"(baz.bar)\" is resolved to " 4182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "\"(qux.baz.bar)\"," 4183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " which is not defined. The innermost scope is searched first in name " 4184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "resolution. Consider using a leading '.'(i.e., \"(.baz.bar)\") to start " 4185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "from the outermost scope.\n"); 4186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 4187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, UnknownOption) { 4189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 4190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"qux.proto\" " 4191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "package: \"qux.baz\" " 4192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "options { uninterpreted_option { name { name_part: \"baaz.bar\" " 4193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name { name_part: \"foo\" " 4195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: false } " 4196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " positive_int_value: 1 } }", 4197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "qux.proto: qux.proto: OPTION_NAME: Option \"(baaz.bar)\" unknown.\n"); 4199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, CustomOptionConflictingFieldNumber) { 4202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo1\" number: 7672757 label: LABEL_OPTIONAL " 4208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }" 4209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo2\" number: 7672757 label: LABEL_OPTIONAL " 4210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }", 4211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo2: NUMBER: Extension number 7672757 has already been used " 4213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "in \"google.protobuf.FieldOptions\" by extension \"foo1\".\n"); 4214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, Int32OptionValueOutOfPositiveRange) { 4217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" 4224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 0x80000000 } " 4227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 4228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value out of range " 4230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for int32 option \"foo\".\n"); 4231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, Int32OptionValueOutOfNegativeRange) { 4234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" 4241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " negative_int_value: -0x80000001 } " 4244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 4245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value out of range " 4247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for int32 option \"foo\".\n"); 4248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, Int32OptionValueIsNotPositiveInt) { 4251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" 4258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"5\" } }", 4261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be integer " 4263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for int32 option \"foo\".\n"); 4264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, Int64OptionValueOutOfRange) { 4267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }" 4274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 0x8000000000000000 } " 4277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 4278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value out of range " 4280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for int64 option \"foo\".\n"); 4281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, Int64OptionValueIsNotPositiveInt) { 4284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }" 4291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"5\" } }", 4294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be integer " 4296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for int64 option \"foo\".\n"); 4297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UInt32OptionValueOutOfRange) { 4300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }" 4307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 0x100000000 } }", 4310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value out of range " 4312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for uint32 option \"foo\".\n"); 4313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UInt32OptionValueIsNotPositiveInt) { 4316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }" 4323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " double_value: -5.6 } }", 4326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer " 4328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for uint32 option \"foo\".\n"); 4329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UInt64OptionValueIsNotPositiveInt) { 4332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_UINT64 extendee: \"google.protobuf.FileOptions\" }" 4339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " negative_int_value: -5 } }", 4342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer " 4344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for uint64 option \"foo\".\n"); 4345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FloatOptionValueIsNotNumber) { 4348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_FLOAT extendee: \"google.protobuf.FileOptions\" }" 4355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"bar\" } }", 4358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be number " 4360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for float option \"foo\".\n"); 4361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, DoubleOptionValueIsNotNumber) { 4364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_DOUBLE extendee: \"google.protobuf.FileOptions\" }" 4371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"bar\" } }", 4374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be number " 4376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for double option \"foo\".\n"); 4377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, BoolOptionValueIsNotTrueOrFalse) { 4380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_BOOL extendee: \"google.protobuf.FileOptions\" }" 4387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"bar\" } }", 4390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be \"true\" or \"false\" " 4392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for boolean option \"foo\".\n"); 4393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumOptionValueIsNotIdentifier) { 4396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } " 4402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name: \"BAZ\" number: 2 } }" 4403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_ENUM type_name: \"FooEnum\" " 4405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"google.protobuf.FileOptions\" }" 4406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"QUUX\" } }", 4409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be identifier for " 4411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum-valued option \"foo\".\n"); 4412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumOptionValueIsNotEnumValueName) { 4415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } " 4421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name: \"BAZ\" number: 2 } }" 4422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_ENUM type_name: \"FooEnum\" " 4424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"google.protobuf.FileOptions\" }" 4425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"QUUX\" } }", 4428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum\" has no value " 4430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "named \"QUUX\" for option \"foo\".\n"); 4431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumOptionValueIsSiblingEnumValueName) { 4434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"FooEnum1\" value { name: \"BAR\" number: 1 } " 4440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name: \"BAZ\" number: 2 } }" 4441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"FooEnum2\" value { name: \"QUX\" number: 1 } " 4442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name: \"QUUX\" number: 2 } }" 4443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_ENUM type_name: \"FooEnum1\" " 4445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"google.protobuf.FileOptions\" }" 4446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"QUUX\" } }", 4449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum1\" has no value " 4451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "named \"QUUX\" for option \"foo\". This appears to be a value from a " 4452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "sibling type.\n"); 4453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, StringOptionValueIsNotString) { 4456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 4461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_STRING extendee: \"google.protobuf.FileOptions\" }" 4463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 4464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 4465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"QUUX\" } }", 4466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be quoted string for " 4468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "string option \"foo\".\n"); 4469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, DuplicateExtensionFieldNumber) { 4472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildDescriptorMessagesInTestPool(); 4473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 4475a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 4476a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"google/protobuf/descriptor.proto\" " 4477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "extension { name: \"option1\" number: 1000 label: LABEL_OPTIONAL " 4478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }"); 4479a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithWarnings( 4481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"bar.proto\" " 4482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"google/protobuf/descriptor.proto\" " 4483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "extension { name: \"option2\" number: 1000 label: LABEL_OPTIONAL " 4484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }", 4485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "bar.proto: option2: NUMBER: Extension number 1000 has already been used " 4486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "in \"google.protobuf.FileOptions\" by extension \"option1\" defined in " 4487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto.\n"); 4488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 4489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Helper function for tests that check for aggregate value parsing 4491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// errors. The "value" argument is embedded inside the 4492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// "uninterpreted_option" portion of the result. 4493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstatic string EmbedAggregateValue(const char* value) { 4494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return strings::Substitute( 4495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 4496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"google/protobuf/descriptor.proto\" " 4497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { name: \"Foo\" } " 4498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 4499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " type: TYPE_MESSAGE type_name: \"Foo\" " 4500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " extendee: \"google.protobuf.FileOptions\" }" 4501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "options { uninterpreted_option { name { name_part: \"foo\" " 4502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " is_extension: true } " 4503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $0 } }", 4504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value); 4505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 4506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, AggregateValueNotFound) { 4508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 4509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EmbedAggregateValue("string_value: \"\""), 4512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: foo.proto: OPTION_VALUE: Option \"foo\" is a message. " 4513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "To set the entire message, use syntax like " 4514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "\"foo = { <proto text format> }\". To set fields within it, use " 4515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "syntax like \"foo.foo = value\".\n"); 4516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 4517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, AggregateValueParseError) { 4519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildDescriptorMessagesInTestPool(); 4520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4521a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 4522a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EmbedAggregateValue("aggregate_value: \"1+2\""), 4523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: foo.proto: OPTION_VALUE: Error while parsing option " 4524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "value for \"foo\": Expected identifier.\n"); 4525a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 4526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4527a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, AggregateValueUnknownFields) { 4528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildDescriptorMessagesInTestPool(); 4529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 4531a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EmbedAggregateValue("aggregate_value: \"x:100\""), 4532a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: foo.proto: OPTION_VALUE: Error while parsing option " 4533a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "value for \"foo\": Message type \"Foo\" has no field named \"x\".\n"); 4534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NotLiteImportsLite) { 4537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 4538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 4539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { optimize_for: LITE_RUNTIME } "); 4540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"bar.proto\" ", 4544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OTHER: Files that do not use optimize_for = " 4546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "LITE_RUNTIME cannot import files which do use this option. This file " 4547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "is not lite, but it imports \"bar.proto\" which is.\n"); 4548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, LiteExtendsNotLite) { 4551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 4552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 4553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type: {" 4554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 4555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 1 end: 1000 }" 4556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 4557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"bar.proto\" " 4561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { optimize_for: LITE_RUNTIME } " 4562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"ext\" number: 123 label: LABEL_OPTIONAL " 4563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"Bar\" }", 4564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: ext: EXTENDEE: Extensions to non-lite types can only be " 4566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "declared in non-lite files. Note that you cannot extend a non-lite " 4567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "type to contain a lite type, but the reverse is allowed.\n"); 4568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NoLiteServices) { 4571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "options {" 4574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " optimize_for: LITE_RUNTIME" 4575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " cc_generic_services: true" 4576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java_generic_services: true" 4577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "} " 4578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service { name: \"Foo\" }", 4579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NAME: Files with optimize_for = LITE_RUNTIME cannot " 4581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "define services unless you set both options cc_generic_services and " 4582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "java_generic_sevices to false.\n"); 4583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 4585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"bar.proto\" " 4586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "options {" 4587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " optimize_for: LITE_RUNTIME" 4588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " cc_generic_services: false" 4589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java_generic_services: false" 4590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "} " 4591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "service { name: \"Bar\" }"); 4592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, RollbackAfterError) { 4595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build a file which contains every kind of construct but references an 4596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // undefined type. All these constructs will be added to the symbol table 4597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // before the undefined type error is noticed. The DescriptorPool will then 4598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // have to roll everything back. 4599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 4600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 4602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 4603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }" 4604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "} " 4605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type {" 4606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestEnum\"" 4607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name:\"BAR\" number:1 }" 4608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "} " 4609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 4610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 4611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method {" 4612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Baz\"" 4613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " input_type: \"NoSuchType\"" // error 4614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " output_type: \"TestMessage\"" 4615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 4616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 4617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: TestService.Baz: INPUT_TYPE: \"NoSuchType\" is not defined.\n" 4619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ); 4620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Make sure that if we build the same file again with the error fixed, 4622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // it works. If the above rollback was incomplete, then some symbols will 4623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // be left defined, and this second attempt will fail since it tries to 4624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // re-define the same symbols. 4625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 4626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 4628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 4629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }" 4630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "} " 4631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type {" 4632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestEnum\"" 4633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name:\"BAR\" number:1 }" 4634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "} " 4635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 4636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 4637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name:\"Baz\"" 4638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " input_type:\"TestMessage\"" 4639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " output_type:\"TestMessage\" }" 4640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 4641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, ErrorsReportedToLogError) { 4644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that errors are reported to GOOGLE_LOG(ERROR) if no error collector is 4645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // provided. 4646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 4648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 4649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 4650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 4651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } ", 4652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &file_proto)); 4653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<string> errors; 4655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 4657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ScopedMemoryLog log; 4658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool_.BuildFile(file_proto) == NULL); 4659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville errors = log.GetMessages(ERROR); 4660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, errors.size()); 4663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Invalid proto descriptor for file \"foo.proto\":", errors[0]); 4665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(" Foo: \"Foo\" is already defined.", errors[1]); 4666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4668a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, DisallowEnumAlias) { 4669a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFileWithErrors( 4670a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 4671a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "enum_type {" 4672a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Bar\"" 4673a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " value { name:\"ENUM_A\" number:0 }" 4674a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " value { name:\"ENUM_B\" number:0 }" 4675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}", 4676a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo.proto: Bar: NUMBER: " 4677a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "\"ENUM_B\" uses the same enum value as \"ENUM_A\". " 4678a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "If this is intended, set 'option allow_alias = true;' to the enum " 4679a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "definition.\n"); 4680a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 4681a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4682a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, AllowEnumAlias) { 4683a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 4684a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"foo.proto\" " 4685a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "enum_type {" 4686a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Bar\"" 4687a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " value { name:\"ENUM_A\" number:0 }" 4688a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " value { name:\"ENUM_B\" number:0 }" 4689a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " options { allow_alias: true }" 4690a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}"); 4691a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 4692a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4693a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ValidationErrorTest, UnusedImportWarning) { 4694a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4695a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool_.AddUnusedImportTrackFile("bar.proto"); 4696a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 4697a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"bar.proto\" " 4698a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { name: \"Bar\" }"); 4699a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4700a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool_.AddUnusedImportTrackFile("base.proto"); 4701a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 4702a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"base.proto\" " 4703a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { name: \"Base\" }"); 4704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4705a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool_.AddUnusedImportTrackFile("baz.proto"); 4706a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 4707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"baz.proto\" " 4708a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { name: \"Baz\" }"); 4709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool_.AddUnusedImportTrackFile("public.proto"); 4711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 4712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"public.proto\" " 4713a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"bar.proto\"" 4714a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "public_dependency: 0"); 4715a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4716a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // // forward.proto 4717a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "base.proto" // No warning: Base message is used. 4718a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "bar.proto" // Will log a warning. 4719a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import public "baz.proto" // No warning: Do not track import public. 4720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // import "public.proto" // No warning: public.proto has import public. 4721a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message Forward { 4722a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // optional Base base = 1; 4723a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // } 4724a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 4725a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool_.AddUnusedImportTrackFile("forward.proto"); 4726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson BuildFile( 4727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: \"forward.proto\"" 4728a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"base.proto\"" 4729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"bar.proto\"" 4730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"baz.proto\"" 4731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: \"public.proto\"" 4732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "public_dependency: 2 " 4733a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type {" 4734a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name: \"Forward\"" 4735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:\"base\" number:1 label:LABEL_OPTIONAL type_name:\"Base\" }" 4736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}"); 4737a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 4738a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4739a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 4740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 4741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DescriptorDatabase 4742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic void AddToDatabase(SimpleDescriptorDatabase* database, 4744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* file_text) { 4745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 4746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); 4747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville database->Add(file_proto); 4748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DatabaseBackedPoolTest : public testing::Test { 4751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 4752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DatabaseBackedPoolTest() {} 4753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SimpleDescriptorDatabase database_; 4755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 4757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddToDatabase(&database_, 4758a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: 'foo.proto' " 4759a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { name:'Foo' extension_range { start: 1 end: 100 } } " 4760a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "enum_type { name:'TestEnum' value { name:'DUMMY' number:0 } } " 4761a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "service { name:'TestService' } "); 4762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddToDatabase(&database_, 4763a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: 'bar.proto' " 4764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "dependency: 'foo.proto' " 4765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { name:'Bar' } " 4766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "extension { name:'foo_ext' extendee: '.Foo' number:5 " 4767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " label:LABEL_OPTIONAL type:TYPE_INT32 } "); 4768a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Baz has an undeclared dependency on Foo. 4769a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson AddToDatabase(&database_, 4770a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "name: 'baz.proto' " 4771a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message_type { " 4772a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " name:'Baz' " 4773a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " field { name:'foo' number:1 label:LABEL_OPTIONAL type_name:'Foo' } " 4774a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}"); 4775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We can't inject a file containing errors into a DescriptorPool, so we 4778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // need an actual mock DescriptorDatabase to test errors. 4779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class ErrorDescriptorDatabase : public DescriptorDatabase { 4780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 4781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorDescriptorDatabase() {} 4782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~ErrorDescriptorDatabase() {} 4783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implements DescriptorDatabase --------------------------------- 4785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileByName(const string& filename, 4786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 4787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // error.proto and error2.proto cyclically import each other. 4788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (filename == "error.proto") { 4789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->Clear(); 4790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->set_name("error.proto"); 4791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->add_dependency("error2.proto"); 4792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return true; 4793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else if (filename == "error2.proto") { 4794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->Clear(); 4795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->set_name("error2.proto"); 4796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->add_dependency("error.proto"); 4797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return true; 4798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 4799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return false; 4800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingSymbol(const string& symbol_name, 4803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 4804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return false; 4805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingExtension(const string& containing_type, 4807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int field_number, 4808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 4809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return false; 4810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 4812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // A DescriptorDatabase that counts how many times each method has been 4814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // called and forwards to some other DescriptorDatabase. 4815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class CallCountingDatabase : public DescriptorDatabase { 4816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 4817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CallCountingDatabase(DescriptorDatabase* wrapped_db) 4818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville : wrapped_db_(wrapped_db) { 4819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Clear(); 4820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~CallCountingDatabase() {} 4822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorDatabase* wrapped_db_; 4824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int call_count_; 4826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void Clear() { 4828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville call_count_ = 0; 4829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implements DescriptorDatabase --------------------------------- 4832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileByName(const string& filename, 4833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 4834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++call_count_; 4835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return wrapped_db_->FindFileByName(filename, output); 4836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingSymbol(const string& symbol_name, 4838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 4839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++call_count_; 4840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return wrapped_db_->FindFileContainingSymbol(symbol_name, output); 4841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingExtension(const string& containing_type, 4843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int field_number, 4844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 4845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++call_count_; 4846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return wrapped_db_->FindFileContainingExtension( 4847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville containing_type, field_number, output); 4848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 4850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // A DescriptorDatabase which falsely always returns foo.proto when searching 4852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // for any symbol or extension number. This shouldn't cause the 4853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // DescriptorPool to reload foo.proto if it is already loaded. 4854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class FalsePositiveDatabase : public DescriptorDatabase { 4855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 4856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FalsePositiveDatabase(DescriptorDatabase* wrapped_db) 4857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville : wrapped_db_(wrapped_db) {} 4858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~FalsePositiveDatabase() {} 4859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorDatabase* wrapped_db_; 4861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implements DescriptorDatabase --------------------------------- 4863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileByName(const string& filename, 4864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 4865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return wrapped_db_->FindFileByName(filename, output); 4866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingSymbol(const string& symbol_name, 4868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 4869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return FindFileByName("foo.proto", output); 4870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingExtension(const string& containing_type, 4872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int field_number, 4873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 4874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return FindFileByName("foo.proto", output); 4875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 4877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 4878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindFileByName) { 4880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 4881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo = pool.FindFileByName("foo.proto"); 4883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 4884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo.proto", foo->name()); 4885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo->message_type_count()); 4886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", foo->message_type(0)->name()); 4887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo, pool.FindFileByName("foo.proto")); 4889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFileByName("no_such_file.proto") == NULL); 4891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindDependencyBeforeDependent) { 4894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 4895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo = pool.FindFileByName("foo.proto"); 4897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 4898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo.proto", foo->name()); 4899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo->message_type_count()); 4900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", foo->message_type(0)->name()); 4901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar = pool.FindFileByName("bar.proto"); 4903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar != NULL); 4904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar.proto", bar->name()); 4905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar->message_type_count()); 4906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Bar", bar->message_type(0)->name()); 4907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar->dependency_count()); 4909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo, bar->dependency(0)); 4910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindDependentBeforeDependency) { 4913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 4914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar = pool.FindFileByName("bar.proto"); 4916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar != NULL); 4917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar.proto", bar->name()); 4918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar->message_type_count()); 4919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ("Bar", bar->message_type(0)->name()); 4920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo = pool.FindFileByName("foo.proto"); 4922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 4923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo.proto", foo->name()); 4924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo->message_type_count()); 4925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ("Foo", foo->message_type(0)->name()); 4926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar->dependency_count()); 4928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo, bar->dependency(0)); 4929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindFileContainingSymbol) { 4932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 4933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.FindFileContainingSymbol("Foo"); 4935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 4936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo.proto", file->name()); 4937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file, pool.FindFileByName("foo.proto")); 4938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFileContainingSymbol("NoSuchSymbol") == NULL); 4940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindMessageTypeByName) { 4943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 4944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* type = pool.FindMessageTypeByName("Foo"); 4946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(type != NULL); 4947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", type->name()); 4948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(type->file(), pool.FindFileByName("foo.proto")); 4949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindMessageTypeByName("NoSuchType") == NULL); 4951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindExtensionByNumber) { 4954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 4955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo = pool.FindMessageTypeByName("Foo"); 4957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 4958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension = pool.FindExtensionByNumber(foo, 5); 4960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(extension != NULL); 4961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_ext", extension->name()); 4962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(extension->file(), pool.FindFileByName("bar.proto")); 4963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindExtensionByNumber(foo, 12) == NULL); 4965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindAllExtensions) { 4968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 4969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo = pool.FindMessageTypeByName("Foo"); 4971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 2; ++i) { 4973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Repeat the lookup twice, to check that we get consistent 4974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // results despite the fallback database lookup mutating the pool. 4975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<const FieldDescriptor*> extensions; 4976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pool.FindAllExtensions(foo, &extensions); 4977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, extensions.size()); 4978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, extensions[0]->number()); 4979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, ErrorWithoutErrorCollector) { 4983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorDescriptorDatabase error_database; 4984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&error_database); 4985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<string> errors; 4987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 4989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ScopedMemoryLog log; 4990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); 4991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville errors = log.GetMessages(ERROR); 4992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 4993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(errors.empty()); 4995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 4996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, ErrorWithErrorCollector) { 4998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorDescriptorDatabase error_database; 4999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector error_collector; 5000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&error_database, &error_collector); 5001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); 5003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 5004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "error.proto: error.proto: OTHER: File recursively imports itself: " 5005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "error.proto -> error2.proto -> error.proto\n" 5006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "error2.proto: error2.proto: OTHER: Import \"error.proto\" was not " 5007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "found or had errors.\n" 5008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "error.proto: error.proto: OTHER: Import \"error2.proto\" was not " 5009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "found or had errors.\n", 5010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville error_collector.text_); 5011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 5012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5013a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(DatabaseBackedPoolTest, UndeclaredDependencyOnUnbuiltType) { 5014a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Check that we find and report undeclared dependencies on types that exist 5015a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // in the descriptor database but that have not not been built yet. 5016a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MockErrorCollector error_collector; 5017a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool pool(&database_, &error_collector); 5018a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindMessageTypeByName("Baz") == NULL); 5019a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ( 5020a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "baz.proto: Baz.foo: TYPE: \"Foo\" seems to be defined in \"foo.proto\", " 5021a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "which is not imported by \"baz.proto\". To use it here, please add " 5022a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "the necessary import.\n", 5023a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson error_collector.text_); 5024a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 5025a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5026a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(DatabaseBackedPoolTest, RollbackAfterError) { 5027a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Make sure that all traces of bad types are removed from the pool. This used 5028a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // to be b/4529436, due to the fact that a symbol resolution failure could 5029a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // potentially cause another file to be recursively built, which would trigger 5030a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // a checkpoint _past_ possibly invalid symbols. 5031a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Baz is defined in the database, but the file is invalid because it is 5032a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // missing a necessary import. 5033a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool pool(&database_); 5034a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindMessageTypeByName("Baz") == NULL); 5035a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Make sure that searching again for the file or the type fails. 5036a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindFileByName("baz.proto") == NULL); 5037a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindMessageTypeByName("Baz") == NULL); 5038a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 5039a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, UnittestProto) { 5041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try to load all of unittest.proto from a DescriptorDatabase. This should 5042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // thoroughly test all paths through DescriptorBuilder to insure that there 5043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // are no deadlocking problems when pool_->mutex_ is non-NULL. 5044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* original_file = 5045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes::descriptor()->file(); 5046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPoolDatabase database(*DescriptorPool::generated_pool()); 5048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database); 5049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file_from_database = 5050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pool.FindFileByName(original_file->name()); 5051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file_from_database != NULL); 5053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto original_file_proto; 5055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville original_file->CopyTo(&original_file_proto); 5056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_from_database_proto; 5058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_from_database->CopyTo(&file_from_database_proto); 5059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(original_file_proto.DebugString(), 5061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_from_database_proto.DebugString()); 5062a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5063a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Also verify that CopyTo() did not omit any information. 5064a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(original_file->DebugString(), 5065a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_from_database->DebugString()); 5066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 5067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, DoesntRetryDbUnnecessarily) { 5069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Searching for a child of an existing descriptor should never fall back 5070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to the DescriptorDatabase even if it isn't found, because we know all 5071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // children are already loaded. 5072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CallCountingDatabase call_counter(&database_); 5073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&call_counter); 5074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.FindFileByName("foo.proto"); 5076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 5077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo = pool.FindMessageTypeByName("Foo"); 5078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 5079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* test_enum = pool.FindEnumTypeByName("TestEnum"); 5080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(test_enum != NULL); 5081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* test_service = pool.FindServiceByName("TestService"); 5082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(test_service != NULL); 5083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(0, call_counter.call_count_); 5085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville call_counter.Clear(); 5086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo->FindFieldByName("no_such_field") == NULL); 5088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo->FindExtensionByName("no_such_extension") == NULL); 5089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo->FindNestedTypeByName("NoSuchMessageType") == NULL); 5090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo->FindEnumTypeByName("NoSuchEnumType") == NULL); 5091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo->FindEnumValueByName("NO_SUCH_VALUE") == NULL); 5092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(test_enum->FindValueByName("NO_SUCH_VALUE") == NULL); 5093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(test_service->FindMethodByName("NoSuchMethod") == NULL); 5094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->FindMessageTypeByName("NoSuchMessageType") == NULL); 5096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->FindEnumTypeByName("NoSuchEnumType") == NULL); 5097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->FindEnumValueByName("NO_SUCH_VALUE") == NULL); 5098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->FindServiceByName("NO_SUCH_VALUE") == NULL); 5099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->FindExtensionByName("no_such_extension") == NULL); 5100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindFileContainingSymbol("Foo.no.such.field") == NULL); 5102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindFileContainingSymbol("Foo.no_such_field") == NULL); 5103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindMessageTypeByName("Foo.NoSuchMessageType") == NULL); 5104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindFieldByName("Foo.no_such_field") == NULL); 5105a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindExtensionByName("Foo.no_such_extension") == NULL); 5106a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindEnumTypeByName("Foo.NoSuchEnumType") == NULL); 5107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindEnumValueByName("Foo.NO_SUCH_VALUE") == NULL); 5108a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindMethodByName("TestService.NoSuchMethod") == NULL); 5109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, call_counter.call_count_); 5111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 5112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, DoesntReloadFilesUncesessarily) { 5114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If FindFileContainingSymbol() or FindFileContainingExtension() return a 5115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // file that is already in the DescriptorPool, it should not attempt to 5116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // reload the file. 5117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FalsePositiveDatabase false_positive_database(&database_); 5118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector error_collector; 5119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&false_positive_database, &error_collector); 5120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // First make sure foo.proto is loaded. 5122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo = pool.FindMessageTypeByName("Foo"); 5123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 5124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try inducing false positives. 5126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindMessageTypeByName("NoSuchSymbol") == NULL); 5127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindExtensionByNumber(foo, 22) == NULL); 5128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // No errors should have been reported. (If foo.proto was incorrectly 5130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // loaded multiple times, errors would have been reported.) 5131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("", error_collector.text_); 5132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 5133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// DescriptorDatabase that attempts to induce exponentially-bad performance 5135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// in DescriptorPool. For every positive N, the database contains a file 5136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// fileN.proto, which defines a message MessageN, which contains fields of 5137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// type MessageK for all K in [0,N). Message0 is not defined anywhere 5138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// (file0.proto exists, but is empty), so every other file and message type 5139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// will fail to build. 5140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 5141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// If the DescriptorPool is not careful to memoize errors, an attempt to 5142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// build a descriptor for MessageN can require O(2^N) time. 5143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass ExponentialErrorDatabase : public DescriptorDatabase { 5144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 5145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ExponentialErrorDatabase() {} 5146a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ~ExponentialErrorDatabase() {} 5147a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // implements DescriptorDatabase --------------------------------- 5149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool FindFileByName(const string& filename, 5150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto* output) { 5151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int file_num = -1; 5152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FullMatch(filename, "file", ".proto", &file_num); 5153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (file_num > -1) { 5154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return PopulateFile(file_num, output); 5155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 5156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return false; 5157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool FindFileContainingSymbol(const string& symbol_name, 5160a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto* output) { 5161a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int file_num = -1; 5162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FullMatch(symbol_name, "Message", "", &file_num); 5163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (file_num > 0) { 5164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return PopulateFile(file_num, output); 5165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 5166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return false; 5167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool FindFileContainingExtension(const string& containing_type, 5170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int field_number, 5171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto* output) { 5172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return false; 5173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private: 5176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void FullMatch(const string& name, 5177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string& begin_with, 5178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string& end_with, 5179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int* file_num) { 5180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int begin_size = begin_with.size(); 5181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int end_size = end_with.size(); 5182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (name.substr(0, begin_size) != begin_with || 5183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson name.substr(name.size()- end_size, end_size) != end_with) { 5184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return; 5185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson safe_strto32(name.substr(begin_size, name.size() - end_size - begin_size), 5187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_num); 5188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool PopulateFile(int file_num, FileDescriptorProto* output) { 5191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson using strings::Substitute; 5192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_GE(file_num, 0); 5193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson output->Clear(); 5194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson output->set_name(Substitute("file$0.proto", file_num)); 5195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // file0.proto doesn't define Message0 5196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (file_num > 0) { 5197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorProto* message = output->add_message_type(); 5198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message->set_name(Substitute("Message$0", file_num)); 5199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for (int i = 0; i < file_num; ++i) { 5200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson output->add_dependency(Substitute("file$0.proto", i)); 5201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptorProto* field = message->add_field(); 5202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->set_name(Substitute("field$0", i)); 5203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->set_number(i); 5204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->set_label(FieldDescriptorProto::LABEL_OPTIONAL); 5205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->set_type(FieldDescriptorProto::TYPE_MESSAGE); 5206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field->set_type_name(Substitute("Message$0", i)); 5207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return true; 5210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 5212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, DoesntReloadKnownBadFiles) { 5214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ExponentialErrorDatabase error_database; 5215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool pool(&error_database); 5216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_LOG(INFO) << "A timeout in this test probably indicates a real bug."; 5218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindFileByName("file40.proto") == NULL); 5220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(pool.FindMessageTypeByName("Message40") == NULL); 5221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 5222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, DoesntFallbackOnWrongType) { 5224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If a lookup finds a symbol of the wrong type (e.g. we pass a type name 5225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to FindFieldByName()), we should fail fast, without checking the fallback 5226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // database. 5227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CallCountingDatabase call_counter(&database_); 5228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&call_counter); 5229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.FindFileByName("foo.proto"); 5231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 5232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo = pool.FindMessageTypeByName("Foo"); 5233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 5234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* test_enum = pool.FindEnumTypeByName("TestEnum"); 5235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(test_enum != NULL); 5236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(0, call_counter.call_count_); 5238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville call_counter.Clear(); 5239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindMessageTypeByName("TestEnum") == NULL); 5241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFieldByName("Foo") == NULL); 5242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindExtensionByName("Foo") == NULL); 5243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindEnumTypeByName("Foo") == NULL); 5244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindEnumValueByName("Foo") == NULL); 5245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindServiceByName("Foo") == NULL); 5246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindMethodByName("Foo") == NULL); 5247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, call_counter.call_count_); 5249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 5250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5251d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// =================================================================== 5252d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 5253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass AbortingErrorCollector : public DescriptorPool::ErrorCollector { 5254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 5255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson AbortingErrorCollector() {} 5256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson virtual void AddError( 5258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string &filename, 5259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string &element_name, 5260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message *message, 5261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ErrorLocation location, 5262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string &error_message) { 5263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_LOG(FATAL) << "AddError() called unexpectedly: " << filename << ": " 5264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson << error_message; 5265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private: 5267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AbortingErrorCollector); 5268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 5269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// A source tree containing only one file. 5271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass SingletonSourceTree : public compiler::SourceTree { 5272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 5273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SingletonSourceTree(const string& filename, const string& contents) 5274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : filename_(filename), contents_(contents) {} 5275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson virtual io::ZeroCopyInputStream* Open(const string& filename) { 5277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return filename == filename_ ? 5278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson new io::ArrayInputStream(contents_.data(), contents_.size()) : NULL; 5279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private: 5282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string filename_; 5283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string contents_; 5284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SingletonSourceTree); 5286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 5287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonconst char *const kSourceLocationTestInput = 5289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "syntax = \"proto2\";\n" 5290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message A {\n" 5291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " optional int32 a = 1;\n" 5292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " message B {\n" 5293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " required double b = 1;\n" 5294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 5295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 5296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "enum Indecision {\n" 5297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " YES = 1;\n" 5298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " NO = 2;\n" 5299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " MAYBE = 3;\n" 5300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 5301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "service S {\n" 5302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " rpc Method(A) returns (A.B);\n" 5303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Put an empty line here to make the source location range match. 5304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "\n" 5305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 5306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message MessageWithExtensions {\n" 5307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " extensions 1000 to max;\n" 5308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 5309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "extend MessageWithExtensions {\n" 5310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " optional int32 int32_extension = 1001;\n" 5311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 5312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message C {\n" 5313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " extend MessageWithExtensions {\n" 5314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " optional C message_extension = 1002;\n" 5315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 5316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"; 5317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass SourceLocationTest : public testing::Test { 5319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 5320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SourceLocationTest() 5321a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : source_tree_("/test/test.proto", kSourceLocationTestInput), 5322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson db_(&source_tree_), 5323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool_(&db_, &collector_) {} 5324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5325a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson static string PrintSourceLocation(const SourceLocation &loc) { 5326a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return strings::Substitute("$0:$1-$2:$3", 5327a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1 + loc.start_line, 5328a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1 + loc.start_column, 5329a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1 + loc.end_line, 5330a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1 + loc.end_column); 5331a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 5332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private: 5334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson AbortingErrorCollector collector_; 5335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SingletonSourceTree source_tree_; 5336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson compiler::SourceTreeDescriptorDatabase db_; 5337a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5338a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protected: 5339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool pool_; 5340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 5341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// TODO(adonovan): implement support for option fields and for 5343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// subparts of declarations. 5344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(SourceLocationTest, GetSourceLocation) { 5346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SourceLocation loc; 5347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor *file_desc = 5349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); 5350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor *a_desc = file_desc->FindMessageTypeByName("A"); 5352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(a_desc->GetSourceLocation(&loc)); 5353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("2:1-7:2", PrintSourceLocation(loc)); 5354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor *a_b_desc = a_desc->FindNestedTypeByName("B"); 5356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(a_b_desc->GetSourceLocation(&loc)); 5357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("4:3-6:4", PrintSourceLocation(loc)); 5358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const EnumDescriptor *e_desc = file_desc->FindEnumTypeByName("Indecision"); 5360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(e_desc->GetSourceLocation(&loc)); 5361a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("8:1-12:2", PrintSourceLocation(loc)); 5362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5363a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const EnumValueDescriptor *yes_desc = e_desc->FindValueByName("YES"); 5364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(yes_desc->GetSourceLocation(&loc)); 5365a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("9:3-9:13", PrintSourceLocation(loc)); 5366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const ServiceDescriptor *s_desc = file_desc->FindServiceByName("S"); 5368a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(s_desc->GetSourceLocation(&loc)); 5369a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("13:1-16:2", PrintSourceLocation(loc)); 5370a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5371a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const MethodDescriptor *m_desc = s_desc->FindMethodByName("Method"); 5372a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(m_desc->GetSourceLocation(&loc)); 5373a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("14:3-14:31", PrintSourceLocation(loc)); 5374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 5376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5377a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(SourceLocationTest, ExtensionSourceLocation) { 5378a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SourceLocation loc; 5379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor *file_desc = 5381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); 5382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor *int32_extension_desc = 5384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_desc->FindExtensionByName("int32_extension"); 5385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(int32_extension_desc->GetSourceLocation(&loc)); 5386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("21:3-21:41", PrintSourceLocation(loc)); 5387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor *c_desc = file_desc->FindMessageTypeByName("C"); 5389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(c_desc->GetSourceLocation(&loc)); 5390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("23:1-27:2", PrintSourceLocation(loc)); 5391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor *message_extension_desc = 5393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson c_desc->FindExtensionByName("message_extension"); 5394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(message_extension_desc->GetSourceLocation(&loc)); 5395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("25:5-25:41", PrintSourceLocation(loc)); 5396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 5397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Missing SourceCodeInfo doesn't cause crash: 5399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(SourceLocationTest, GetSourceLocation_MissingSourceCodeInfo) { 5400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SourceLocation loc; 5401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor *file_desc = 5403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); 5404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto proto; 5406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_desc->CopyTo(&proto); // Note, this discards the SourceCodeInfo. 5407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(proto.has_source_code_info()); 5408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool bad1_pool(&pool_); 5410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* bad1_file_desc = 5411a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_NOTNULL(bad1_pool.BuildFile(proto)); 5412a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor *bad1_a_desc = bad1_file_desc->FindMessageTypeByName("A"); 5413a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(bad1_a_desc->GetSourceLocation(&loc)); 5414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 5415a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5416a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Corrupt SourceCodeInfo doesn't cause crash: 5417a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(SourceLocationTest, GetSourceLocation_BogusSourceCodeInfo) { 5418a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SourceLocation loc; 5419a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5420a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor *file_desc = 5421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); 5422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto proto; 5424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_desc->CopyTo(&proto); // Note, this discards the SourceCodeInfo. 5425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(proto.has_source_code_info()); 5426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SourceCodeInfo_Location *loc_msg = 5427a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson proto.mutable_source_code_info()->add_location(); 5428a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson loc_msg->add_path(1); 5429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson loc_msg->add_path(2); 5430a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson loc_msg->add_path(3); 5431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson loc_msg->add_span(4); 5432a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson loc_msg->add_span(5); 5433a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson loc_msg->add_span(6); 5434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5435a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool bad2_pool(&pool_); 5436a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* bad2_file_desc = 5437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_NOTNULL(bad2_pool.BuildFile(proto)); 5438a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor *bad2_a_desc = bad2_file_desc->FindMessageTypeByName("A"); 5439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(bad2_a_desc->GetSourceLocation(&loc)); 5440a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 5441a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5442a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// =================================================================== 5443a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5444a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonconst char* const kCopySourceCodeInfoToTestInput = 5445a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "syntax = \"proto2\";\n" 5446a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "message Foo {}\n"; 5447a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5448a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Required since source code information is not preserved by 5449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// FileDescriptorTest. 5450a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass CopySourceCodeInfoToTest : public testing::Test { 5451a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 5452a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson CopySourceCodeInfoToTest() 5453a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : source_tree_("/test/test.proto", kCopySourceCodeInfoToTestInput), 5454a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson db_(&source_tree_), 5455a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson pool_(&db_, &collector_) {} 5456a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5457a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private: 5458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson AbortingErrorCollector collector_; 5459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SingletonSourceTree source_tree_; 5460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson compiler::SourceTreeDescriptorDatabase db_; 5461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5462a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protected: 5463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson DescriptorPool pool_; 5464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 5465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(CopySourceCodeInfoToTest, CopyTo_DoesNotCopySourceCodeInfo) { 5467a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* file_desc = 5468a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); 5469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto file_desc_proto; 5470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_FALSE(file_desc_proto.has_source_code_info()); 5471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_desc->CopyTo(&file_desc_proto); 5473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(file_desc_proto.has_source_code_info()); 5474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 5475a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5476a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(CopySourceCodeInfoToTest, CopySourceCodeInfoTo) { 5477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* file_desc = 5478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); 5479a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FileDescriptorProto file_desc_proto; 5480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_FALSE(file_desc_proto.has_source_code_info()); 5481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_desc->CopySourceCodeInfoTo(&file_desc_proto); 5483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const SourceCodeInfo& info = file_desc_proto.source_code_info(); 5484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(3, info.location_size()); 5485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Get the Foo message location 5486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const SourceCodeInfo_Location& foo_location = info.location(1); 5487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(2, foo_location.path_size()); 5488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(FileDescriptorProto::kMessageTypeFieldNumber, foo_location.path(0)); 5489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(0, foo_location.path(1)); // Foo is the first message defined 5490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(3, foo_location.span_size()); // Foo spans one line 5491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(1, foo_location.span(0)); // Foo is declared on line 1 5492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(0, foo_location.span(1)); // Foo starts at column 0 5493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(14, foo_location.span(2)); // Foo ends on column 14 5494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 5495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// =================================================================== 5497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 5498d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 5499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace descriptor_unittest 5500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 5501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 5502