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