1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Based on original Protocol Buffers design by 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sanjay Ghemawat, Jeff Dean, and others. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This file makes extensive use of RFC 3092. :) 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector> 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h> 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor_database.h> 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/dynamic_message.h> 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.pb.h> 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/text_format.h> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest.pb.h> 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest_custom_options.pb.h> 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h> 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/substitute.h> 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h> 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Can't use an anonymous namespace here due to brokenness of Tru64 compiler. 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace descriptor_unittest { 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Some helpers to make assembling descriptors faster. 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDescriptorProto* AddMessage(FileDescriptorProto* file, const string& name) { 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* result = file->add_message_type(); 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDescriptorProto* AddNestedMessage(DescriptorProto* parent, const string& name) { 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* result = parent->add_nested_type(); 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleEnumDescriptorProto* AddEnum(FileDescriptorProto* file, const string& name) { 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* result = file->add_enum_type(); 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleEnumDescriptorProto* AddNestedEnum(DescriptorProto* parent, 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name) { 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* result = parent->add_enum_type(); 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleServiceDescriptorProto* AddService(FileDescriptorProto* file, 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name) { 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ServiceDescriptorProto* result = file->add_service(); 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleFieldDescriptorProto* AddField(DescriptorProto* parent, 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name, int number, 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Label label, 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Type type) { 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* result = parent->add_field(); 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_number(number); 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_label(label); 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_type(type); 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleFieldDescriptorProto* AddExtension(FileDescriptorProto* file, 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& extendee, 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name, int number, 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Label label, 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Type type) { 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* result = file->add_extension(); 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_number(number); 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_label(label); 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_type(type); 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_extendee(extendee); 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleFieldDescriptorProto* AddNestedExtension(DescriptorProto* parent, 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& extendee, 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name, int number, 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Label label, 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::Type type) { 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* result = parent->add_extension(); 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_number(number); 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_label(label); 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_type(type); 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_extendee(extendee); 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDescriptorProto::ExtensionRange* AddExtensionRange(DescriptorProto* parent, 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int start, int end) { 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto::ExtensionRange* result = parent->add_extension_range(); 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_start(start); 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_end(end); 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleEnumValueDescriptorProto* AddEnumValue(EnumDescriptorProto* enum_proto, 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name, int number) { 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumValueDescriptorProto* result = enum_proto->add_value(); 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_number(number); 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMethodDescriptorProto* AddMethod(ServiceDescriptorProto* service, 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name, 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& input_type, 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& output_type) { 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MethodDescriptorProto* result = service->add_method(); 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_name(name); 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_input_type(input_type); 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result->set_output_type(output_type); 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Empty enums technically aren't allowed. We need to insert a dummy value 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// into them. 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid AddEmptyEnum(FileDescriptorProto* file, const string& name) { 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(AddEnum(file, name), name + "_DUMMY", 1); 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test simple files. 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FileDescriptorTest : public testing::Test { 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following definitions: 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "foo.proto" 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message FooMessage { extensions 1; } 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum FooEnum {FOO_ENUM_VALUE = 1;} 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // service FooService {} 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extend FooMessage { optional int32 foo_extension = 1; } 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "bar.proto" 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package bar_package; 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message BarMessage { extensions 1; } 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum BarEnum {BAR_ENUM_VALUE = 1;} 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // service BarService {} 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extend BarMessage { optional int32 bar_extension = 1; } 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Also, we have an empty file "baz.proto". This file's purpose is to 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // make sure that even though it has the same package as foo.proto, 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // searching it for members of foo.proto won't work. 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtensionRange(AddMessage(&foo_file, "FooMessage"), 1, 2); 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(AddEnum(&foo_file, "FooEnum"), "FOO_ENUM_VALUE", 1); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddService(&foo_file, "FooService"); 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&foo_file, "FooMessage", "foo_extension", 1, 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto bar_file; 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_name("bar.proto"); 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_package("bar_package"); 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.add_dependency("foo.proto"); 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtensionRange(AddMessage(&bar_file, "BarMessage"), 1, 2); 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(AddEnum(&bar_file, "BarEnum"), "BAR_ENUM_VALUE", 1); 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddService(&bar_file, "BarService"); 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&bar_file, "bar_package.BarMessage", "bar_extension", 1, 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto baz_file; 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_file.set_name("baz.proto"); 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file_ = pool_.BuildFile(bar_file); 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_file_ = pool_.BuildFile(baz_file); 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(baz_file_ != NULL); 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->message_type_count()); 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_message_ = foo_file_->message_type(0); 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->enum_type_count()); 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_enum_ = foo_file_->enum_type(0); 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_enum_->value_count()); 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_enum_value_ = foo_enum_->value(0); 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->service_count()); 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_service_ = foo_file_->service(0); 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->extension_count()); 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_extension_ = foo_file_->extension(0); 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->message_type_count()); 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_message_ = bar_file_->message_type(0); 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->enum_type_count()); 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_enum_ = bar_file_->enum_type(0); 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_enum_->value_count()); 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_enum_value_ = bar_enum_->value(0); 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->service_count()); 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_service_ = bar_file_->service(0); 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->extension_count()); 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_extension_ = bar_file_->extension(0); 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* baz_file_; 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_message_; 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* foo_enum_; 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* foo_enum_value_; 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* foo_service_; 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* foo_extension_; 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_message_; 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* bar_enum_; 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* bar_enum_value_; 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* bar_service_; 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* bar_extension_; 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, Name) { 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo.proto", foo_file_->name()); 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar.proto", bar_file_->name()); 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz.proto", baz_file_->name()); 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, Package) { 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("", foo_file_->package()); 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar_package", bar_file_->package()); 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, Dependencies) { 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, foo_file_->dependency_count()); 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, bar_file_->dependency_count()); 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, bar_file_->dependency(0)); 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindMessageTypeByName) { 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_message_, foo_file_->FindMessageTypeByName("FooMessage")); 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_message_, bar_file_->FindMessageTypeByName("BarMessage")); 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindMessageTypeByName("BarMessage") == NULL); 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_file_->FindMessageTypeByName("FooMessage") == NULL); 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_file_->FindMessageTypeByName("FooMessage") == NULL); 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindMessageTypeByName("NoSuchMessage") == NULL); 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindMessageTypeByName("FooEnum") == NULL); 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindEnumTypeByName) { 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_enum_, foo_file_->FindEnumTypeByName("FooEnum")); 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_enum_, bar_file_->FindEnumTypeByName("BarEnum")); 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumTypeByName("BarEnum") == NULL); 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_file_->FindEnumTypeByName("FooEnum") == NULL); 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_file_->FindEnumTypeByName("FooEnum") == NULL); 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumTypeByName("NoSuchEnum") == NULL); 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumTypeByName("FooMessage") == NULL); 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindEnumValueByName) { 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_enum_value_, foo_file_->FindEnumValueByName("FOO_ENUM_VALUE")); 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_enum_value_, bar_file_->FindEnumValueByName("BAR_ENUM_VALUE")); 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumValueByName("BAR_ENUM_VALUE") == NULL); 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL); 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL); 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumValueByName("NO_SUCH_VALUE") == NULL); 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindEnumValueByName("FooMessage") == NULL); 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindServiceByName) { 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_service_, foo_file_->FindServiceByName("FooService")); 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_service_, bar_file_->FindServiceByName("BarService")); 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindServiceByName("BarService") == NULL); 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_file_->FindServiceByName("FooService") == NULL); 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_file_->FindServiceByName("FooService") == NULL); 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindServiceByName("NoSuchService") == NULL); 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindServiceByName("FooMessage") == NULL); 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindExtensionByName) { 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_extension_, foo_file_->FindExtensionByName("foo_extension")); 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_extension_, bar_file_->FindExtensionByName("bar_extension")); 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindExtensionByName("bar_extension") == NULL); 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_file_->FindExtensionByName("foo_extension") == NULL); 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_file_->FindExtensionByName("foo_extension") == NULL); 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindExtensionByName("no_such_extension") == NULL); 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->FindExtensionByName("FooMessage") == NULL); 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, FindExtensionByNumber) { 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_extension_, pool_.FindExtensionByNumber(foo_message_, 1)); 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_extension_, pool_.FindExtensionByNumber(bar_message_, 1)); 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool_.FindExtensionByNumber(foo_message_, 2) == NULL); 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(FileDescriptorTest, BuildAgain) { 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that if te call BuildFile again on the same input we get the same 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FileDescriptor back. 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file; 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_->CopyTo(&file); 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, pool_.BuildFile(file)); 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // But if we change the file then it won't work. 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file.set_package("some.other.package"); 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool_.BuildFile(file) == NULL); 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test simple flat messages and fields. 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorTest : public testing::Test { 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following definitions: 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "foo.proto" 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message TestForeign {} 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum TestEnum {} 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message TestMessage { 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required string foo = 1; 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // optional TestEnum bar = 6; 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // repeated TestForeign baz = 500000000; 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // optional group qux = 15 {} 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "bar.proto" 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package corge.grault; 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message TestMessage2 { 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required string foo = 1; 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required string bar = 2; 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required string quux = 6; 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We cheat and use TestForeign as the type for qux rather than create 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // an actual nested type. 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Since all primitive types (including string) use the same building 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // code, there's no need to test each one individually. 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TestMessage2 is primarily here to test FindFieldByName and friends. 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // All messages created from the same DescriptorPool share the same lookup 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // table, so we need to insure that they don't interfere. 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "TestForeign"); 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEmptyEnum(&foo_file, "TestEnum"); 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message = AddMessage(&foo_file, "TestMessage"); 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "foo", 1, 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REQUIRED, 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_STRING); 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "bar", 6, 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_ENUM) 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("TestEnum"); 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "baz", 500000000, 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REPEATED, 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_MESSAGE) 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("TestForeign"); 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "qux", 15, 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_GROUP) 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("TestForeign"); 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto bar_file; 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_name("bar.proto"); 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_package("corge.grault"); 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2"); 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message2, "foo", 1, 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REQUIRED, 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_STRING); 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message2, "bar", 2, 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REQUIRED, 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_STRING); 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message2, "quux", 6, 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REQUIRED, 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_STRING); 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file_ = pool_.BuildFile(bar_file); 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->enum_type_count()); 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_ = foo_file_->enum_type(0); 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, foo_file_->message_type_count()); 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_ = foo_file_->message_type(0); 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_ = foo_file_->message_type(1); 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(4, message_->field_count()); 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_ = message_->field(0); 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_ = message_->field(1); 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_ = message_->field(2); 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_ = message_->field(3); 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->message_type_count()); 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2_ = bar_file_->message_type(0); 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(3, message2_->field_count()); 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo2_ = message2_->field(0); 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar2_ = message2_->field(1); 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville quux2_ = message2_->field(2); 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message_; 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message2_; 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foreign_; 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum_; 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* foo_; 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* bar_; 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* baz_; 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* qux_; 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* foo2_; 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* bar2_; 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* quux2_; 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, Name) { 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage", message_->name()); 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage", message_->full_name()); 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, message_->file()); 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage2", message2_->name()); 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2", message2_->full_name()); 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, message2_->file()); 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, ContainingType) { 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->containing_type() == NULL); 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->containing_type() == NULL); 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldsByIndex) { 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(4, message_->field_count()); 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, message_->field(0)); 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, message_->field(1)); 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz_, message_->field(2)); 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_, message_->field(3)); 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FindFieldByName) { 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // All messages in the same DescriptorPool share a single lookup table for 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fields. So, in addition to testing that FindFieldByName finds the fields 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of the message, we need to test that it does *not* find the fields of 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // *other* messages. 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, message_->FindFieldByName("foo")); 514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, message_->FindFieldByName("bar")); 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz_, message_->FindFieldByName("baz")); 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_, message_->FindFieldByName("qux")); 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByName("no_such_field") == NULL); 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByName("quux") == NULL); 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_ , message2_->FindFieldByName("foo" )); 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar2_ , message2_->FindFieldByName("bar" )); 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(quux2_, message2_->FindFieldByName("quux")); 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindFieldByName("baz") == NULL); 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindFieldByName("qux") == NULL); 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FindFieldByNumber) { 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, message_->FindFieldByNumber(1)); 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, message_->FindFieldByNumber(6)); 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz_, message_->FindFieldByNumber(500000000)); 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_, message_->FindFieldByNumber(15)); 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByNumber(837592) == NULL); 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByNumber(2) == NULL); 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_ , message2_->FindFieldByNumber(1)); 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar2_ , message2_->FindFieldByNumber(2)); 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(quux2_, message2_->FindFieldByNumber(6)); 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindFieldByNumber(15) == NULL); 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindFieldByNumber(500000000) == NULL); 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldName) { 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo", foo_->name()); 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar", bar_->name()); 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz", baz_->name()); 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("qux", qux_->name()); 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldFullName) { 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.foo", foo_->full_name()); 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.bar", bar_->full_name()); 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.baz", baz_->full_name()); 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.qux", qux_->full_name()); 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.foo", foo2_->full_name()); 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.bar", bar2_->full_name()); 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.quux", quux2_->full_name()); 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldFile) { 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, foo_->file()); 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, bar_->file()); 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, baz_->file()); 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, qux_->file()); 565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, foo2_->file()); 567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, bar2_->file()); 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, quux2_->file()); 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldIndex) { 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, foo_->index()); 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, bar_->index()); 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, baz_->index()); 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(3, qux_->index()); 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldNumber) { 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 1, foo_->number()); 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 6, bar_->number()); 581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(500000000, baz_->number()); 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 15, qux_->number()); 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldType) { 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_STRING , foo_->type()); 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_ENUM , bar_->type()); 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_->type()); 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_GROUP , qux_->type()); 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldLabel) { 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_REQUIRED, foo_->label()); 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->label()); 595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, baz_->label()); 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, qux_->label()); 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (foo_->is_required()); 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->is_optional()); 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->is_repeated()); 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(bar_->is_required()); 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (bar_->is_optional()); 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(bar_->is_repeated()); 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(baz_->is_required()); 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(baz_->is_optional()); 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (baz_->is_repeated()); 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldHasDefault) { 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->has_default_value()); 613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(bar_->has_default_value()); 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(baz_->has_default_value()); 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(qux_->has_default_value()); 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldContainingType) { 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_, foo_->containing_type()); 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_, bar_->containing_type()); 621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_, baz_->containing_type()); 622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_, qux_->containing_type()); 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, foo2_ ->containing_type()); 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, bar2_ ->containing_type()); 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, quux2_->containing_type()); 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldMessageType) { 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_->message_type() == NULL); 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_->message_type() == NULL); 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foreign_, baz_->message_type()); 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foreign_, qux_->message_type()); 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DescriptorTest, FieldEnumType) { 638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_->enum_type() == NULL); 639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(baz_->enum_type() == NULL); 640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(qux_->enum_type() == NULL); 641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum_, bar_->enum_type()); 643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass StylizedFieldNamesTest : public testing::Test { 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetUp() { 650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file; 651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file.set_name("foo.proto"); 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtensionRange(AddMessage(&file, "ExtendableMessage"), 1, 1000); 654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message = AddMessage(&file, "TestMessage"); 656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "foo_foo", 1, 657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "FooBar", 2, 660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "fooBaz", 3, 663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "fooFoo", 4, // Camel-case conflict with foo_foo. 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "foobar", 5, // Lower-case conflict with FooBar. 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(message, "ExtendableMessage", "bar_foo", 1, 673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(message, "ExtendableMessage", "BarBar", 2, 676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(message, "ExtendableMessage", "BarBaz", 3, 679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(message, "ExtendableMessage", "barFoo", 4, // Conflict 682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(message, "ExtendableMessage", "barbar", 5, // Conflict 685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&file, "ExtendableMessage", "baz_foo", 11, 689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&file, "ExtendableMessage", "BazBar", 12, 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&file, "ExtendableMessage", "BazBaz", 13, 695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&file, "ExtendableMessage", "bazFoo", 14, // Conflict 698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&file, "ExtendableMessage", "bazbar", 15, // Conflict 701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_ = pool_.BuildFile(file); 705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file_ != NULL); 706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, file_->message_type_count()); 707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_ = file_->message_type(1); 708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ("TestMessage", message_->name()); 709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(5, message_->field_count()); 710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(5, message_->extension_count()); 711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(5, file_->extension_count()); 712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file_; 716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message_; 717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(StylizedFieldNamesTest, LowercaseName) { 720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_foo", message_->field(0)->lowercase_name()); 721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foobar" , message_->field(1)->lowercase_name()); 722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foobaz" , message_->field(2)->lowercase_name()); 723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foofoo" , message_->field(3)->lowercase_name()); 724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foobar" , message_->field(4)->lowercase_name()); 725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar_foo", message_->extension(0)->lowercase_name()); 727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barbar" , message_->extension(1)->lowercase_name()); 728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barbaz" , message_->extension(2)->lowercase_name()); 729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barfoo" , message_->extension(3)->lowercase_name()); 730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barbar" , message_->extension(4)->lowercase_name()); 731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz_foo", file_->extension(0)->lowercase_name()); 733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazbar" , file_->extension(1)->lowercase_name()); 734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazbaz" , file_->extension(2)->lowercase_name()); 735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazfoo" , file_->extension(3)->lowercase_name()); 736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazbar" , file_->extension(4)->lowercase_name()); 737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(StylizedFieldNamesTest, CamelcaseName) { 740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("fooFoo", message_->field(0)->camelcase_name()); 741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("fooBar", message_->field(1)->camelcase_name()); 742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("fooBaz", message_->field(2)->camelcase_name()); 743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("fooFoo", message_->field(3)->camelcase_name()); 744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foobar", message_->field(4)->camelcase_name()); 745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barFoo", message_->extension(0)->camelcase_name()); 747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barBar", message_->extension(1)->camelcase_name()); 748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barBaz", message_->extension(2)->camelcase_name()); 749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barFoo", message_->extension(3)->camelcase_name()); 750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("barbar", message_->extension(4)->camelcase_name()); 751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazFoo", file_->extension(0)->camelcase_name()); 753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazBar", file_->extension(1)->camelcase_name()); 754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazBaz", file_->extension(2)->camelcase_name()); 755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazFoo", file_->extension(3)->camelcase_name()); 756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bazbar", file_->extension(4)->camelcase_name()); 757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(StylizedFieldNamesTest, FindByLowercaseName) { 760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(0), 761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByLowercaseName("foo_foo")); 762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(1), 763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByLowercaseName("foobar")); 764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(2), 765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByLowercaseName("foobaz")); 766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByLowercaseName("FooBar") == NULL); 767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByLowercaseName("fooBaz") == NULL); 768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByLowercaseName("bar_foo") == NULL); 769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByLowercaseName("nosuchfield") == NULL); 770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(0), 772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByLowercaseName("bar_foo")); 773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(1), 774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByLowercaseName("barbar")); 775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(2), 776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByLowercaseName("barbaz")); 777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByLowercaseName("BarBar") == NULL); 778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByLowercaseName("barBaz") == NULL); 779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByLowercaseName("foo_foo") == NULL); 780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByLowercaseName("nosuchfield") == NULL); 781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(0), 783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByLowercaseName("baz_foo")); 784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(1), 785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByLowercaseName("bazbar")); 786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(2), 787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByLowercaseName("bazbaz")); 788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByLowercaseName("BazBar") == NULL); 789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByLowercaseName("bazBaz") == NULL); 790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByLowercaseName("nosuchfield") == NULL); 791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(StylizedFieldNamesTest, FindByCamelcaseName) { 794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(0), 795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByCamelcaseName("fooFoo")); 796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(1), 797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByCamelcaseName("fooBar")); 798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->field(2), 799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindFieldByCamelcaseName("fooBaz")); 800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByCamelcaseName("foo_foo") == NULL); 801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByCamelcaseName("FooBar") == NULL); 802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByCamelcaseName("barFoo") == NULL); 803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByCamelcaseName("nosuchfield") == NULL); 804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(0), 806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByCamelcaseName("barFoo")); 807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(1), 808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByCamelcaseName("barBar")); 809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_->extension(2), 810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_->FindExtensionByCamelcaseName("barBaz")); 811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByCamelcaseName("bar_foo") == NULL); 812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByCamelcaseName("BarBar") == NULL); 813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByCamelcaseName("fooFoo") == NULL); 814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByCamelcaseName("nosuchfield") == NULL); 815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(0), 817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByCamelcaseName("bazFoo")); 818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(1), 819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByCamelcaseName("bazBar")); 820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file_->extension(2), 821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_->FindExtensionByCamelcaseName("bazBaz")); 822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByCamelcaseName("baz_foo") == NULL); 823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByCamelcaseName("BazBar") == NULL); 824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file_->FindExtensionByCamelcaseName("nosuchfield") == NULL); 825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test enum descriptors. 830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumDescriptorTest : public testing::Test { 831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following definitions: 834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "foo.proto" 836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum TestEnum { 837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FOO = 1; 838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // BAR = 2; 839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "bar.proto" 842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package corge.grault; 843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum TestEnum2 { 844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FOO = 1; 845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // BAZ = 3; 846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TestEnum2 is primarily here to test FindValueByName and friends. 849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // All enums created from the same DescriptorPool share the same lookup 850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // table, so we need to insure that they don't interfere. 851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TestEnum 853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* enum_proto = AddEnum(&foo_file, "TestEnum"); 857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum_proto, "FOO", 1); 858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum_proto, "BAR", 2); 859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TestEnum2 861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto bar_file; 862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_name("bar.proto"); 863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_package("corge.grault"); 864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* enum2_proto = AddEnum(&bar_file, "TestEnum2"); 866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum2_proto, "FOO", 1); 867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum2_proto, "BAZ", 3); 868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file_ = pool_.BuildFile(bar_file); 874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->enum_type_count()); 877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_ = foo_file_->enum_type(0); 878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, enum_->value_count()); 880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_ = enum_->value(0); 881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_ = enum_->value(1); 882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->enum_type_count()); 884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum2_ = bar_file_->enum_type(0); 885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, enum2_->value_count()); 887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo2_ = enum2_->value(0); 888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz2_ = enum2_->value(1); 889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum_; 897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum2_; 898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* foo_; 900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* bar_; 901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* foo2_; 903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* baz2_; 904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, Name) { 907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestEnum", enum_->name()); 908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestEnum", enum_->full_name()); 909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, enum_->file()); 910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestEnum2", enum2_->name()); 912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestEnum2", enum2_->full_name()); 913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, enum2_->file()); 914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ContainingType) { 917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum_->containing_type() == NULL); 918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum2_->containing_type() == NULL); 919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValuesByIndex) { 922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, enum_->value_count()); 923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, enum_->value(0)); 924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, enum_->value(1)); 925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, FindValueByName) { 928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_ , enum_ ->FindValueByName("FOO")); 929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_ , enum_ ->FindValueByName("BAR")); 930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_, enum2_->FindValueByName("FOO")); 931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz2_, enum2_->FindValueByName("BAZ")); 932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum_ ->FindValueByName("NO_SUCH_VALUE") == NULL); 934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum_ ->FindValueByName("BAZ" ) == NULL); 935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum2_->FindValueByName("BAR" ) == NULL); 936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, FindValueByNumber) { 939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_ , enum_ ->FindValueByNumber(1)); 940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_ , enum_ ->FindValueByNumber(2)); 941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_, enum2_->FindValueByNumber(1)); 942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz2_, enum2_->FindValueByNumber(3)); 943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum_ ->FindValueByNumber(416) == NULL); 945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum_ ->FindValueByNumber(3) == NULL); 946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(enum2_->FindValueByNumber(2) == NULL); 947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValueName) { 950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("FOO", foo_->name()); 951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("BAR", bar_->name()); 952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValueFullName) { 955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("FOO", foo_->full_name()); 956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("BAR", bar_->full_name()); 957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.FOO", foo2_->full_name()); 958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.BAZ", baz2_->full_name()); 959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValueIndex) { 962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, foo_->index()); 963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, bar_->index()); 964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValueNumber) { 967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, foo_->number()); 968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, bar_->number()); 969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(EnumDescriptorTest, ValueType) { 972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum_ , foo_ ->type()); 973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum_ , bar_ ->type()); 974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum2_, foo2_->type()); 975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum2_, baz2_->type()); 976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test service descriptors. 981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ServiceDescriptorTest : public testing::Test { 982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following messages and service: 985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "foo.proto" 986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message FooRequest {} 987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message FooResponse {} 988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message BarRequest {} 989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message BarResponse {} 990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message BazRequest {} 991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message BazResponse {} 992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // service TestService { 994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // rpc Foo(FooRequest) returns (FooResponse); 995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // rpc Bar(BarRequest) returns (BarResponse); 996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "bar.proto" 999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package corge.grault 1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // service TestService2 { 1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // rpc Foo(FooRequest) returns (FooResponse); 1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // rpc Baz(BazRequest) returns (BazResponse); 1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "FooRequest"); 1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "FooResponse"); 1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "BarRequest"); 1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "BarResponse"); 1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "BazRequest"); 1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "BazResponse"); 1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ServiceDescriptorProto* service = AddService(&foo_file, "TestService"); 1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMethod(service, "Foo", "FooRequest", "FooResponse"); 1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMethod(service, "Bar", "BarRequest", "BarResponse"); 1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto bar_file; 1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_name("bar.proto"); 1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_package("corge.grault"); 1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.add_dependency("foo.proto"); 1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ServiceDescriptorProto* service2 = AddService(&bar_file, "TestService2"); 1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMethod(service2, "Foo", "FooRequest", "FooResponse"); 1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMethod(service2, "Baz", "BazRequest", "BazResponse"); 1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file_ = pool_.BuildFile(bar_file); 1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 1034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(6, foo_file_->message_type_count()); 1036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_request_ = foo_file_->message_type(0); 1037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_response_ = foo_file_->message_type(1); 1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_request_ = foo_file_->message_type(2); 1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_response_ = foo_file_->message_type(3); 1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_request_ = foo_file_->message_type(4); 1041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_response_ = foo_file_->message_type(5); 1042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->service_count()); 1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville service_ = foo_file_->service(0); 1045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, service_->method_count()); 1047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_ = service_->method(0); 1048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_ = service_->method(1); 1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->service_count()); 1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville service2_ = bar_file_->service(0); 1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, service2_->method_count()); 1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo2_ = service2_->method(0); 1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz2_ = service2_->method(1); 1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_request_; 1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_response_; 1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_request_; 1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_response_; 1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* baz_request_; 1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* baz_response_; 1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* service_; 1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* service2_; 1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* foo_; 1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* bar_; 1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* foo2_; 1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* baz2_; 1078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, Name) { 1081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestService", service_->name()); 1082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestService", service_->full_name()); 1083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_file_, service_->file()); 1084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestService2", service2_->name()); 1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestService2", service2_->full_name()); 1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, service2_->file()); 1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodsByIndex) { 1091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, service_->method_count()); 1092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, service_->method(0)); 1093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, service_->method(1)); 1094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, FindMethodByName) { 1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_ , service_ ->FindMethodByName("Foo")); 1098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_ , service_ ->FindMethodByName("Bar")); 1099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_, service2_->FindMethodByName("Foo")); 1100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz2_, service2_->FindMethodByName("Baz")); 1101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(service_ ->FindMethodByName("NoSuchMethod") == NULL); 1103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(service_ ->FindMethodByName("Baz" ) == NULL); 1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(service2_->FindMethodByName("Bar" ) == NULL); 1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodName) { 1108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", foo_->name()); 1109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Bar", bar_->name()); 1110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodFullName) { 1113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestService.Foo", foo_->full_name()); 1114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestService.Bar", bar_->full_name()); 1115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestService2.Foo", foo2_->full_name()); 1116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestService2.Baz", baz2_->full_name()); 1117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodIndex) { 1120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, foo_->index()); 1121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, bar_->index()); 1122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodParent) { 1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(service_, foo_->service()); 1126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(service_, bar_->service()); 1127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodInputType) { 1130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_request_, foo_->input_type()); 1131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_request_, bar_->input_type()); 1132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ServiceDescriptorTest, MethodOutputType) { 1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_response_, foo_->output_type()); 1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_response_, bar_->output_type()); 1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test nested types. 1142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass NestedDescriptorTest : public testing::Test { 1143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 1144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following definitions: 1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "foo.proto" 1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message TestMessage { 1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Foo {} 1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Bar {} 1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum Baz { A = 1; } 1152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum Qux { B = 1; } 1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // in "bar.proto" 1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package corge.grault; 1157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message TestMessage2 { 1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Foo {} 1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Baz {} 1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum Qux { A = 1; } 1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum Quux { C = 1; } 1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TestMessage2 is primarily here to test FindNestedTypeByName and friends. 1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // All messages created from the same DescriptorPool share the same lookup 1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // table, so we need to insure that they don't interfere. 1167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We add enum values to the enums in order to test searching for enum 1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // values across a message's scope. 1170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 1172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 1173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message = AddMessage(&foo_file, "TestMessage"); 1175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedMessage(message, "Foo"); 1176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedMessage(message, "Bar"); 1177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* baz = AddNestedEnum(message, "Baz"); 1178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(baz, "A", 1); 1179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* qux = AddNestedEnum(message, "Qux"); 1180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(qux, "B", 1); 1181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto bar_file; 1183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_name("bar.proto"); 1184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file.set_package("corge.grault"); 1185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2"); 1187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedMessage(message2, "Foo"); 1188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedMessage(message2, "Baz"); 1189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* qux2 = AddNestedEnum(message2, "Qux"); 1190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(qux2, "A", 1); 1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* quux2 = AddNestedEnum(message2, "Quux"); 1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(quux2, "C", 1); 1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file_ = pool_.BuildFile(bar_file); 1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->message_type_count()); 1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_ = foo_file_->message_type(0); 1203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message_->nested_type_count()); 1205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_ = message_->nested_type(0); 1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_ = message_->nested_type(1); 1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message_->enum_type_count()); 1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_ = message_->enum_type(0); 1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_ = message_->enum_type(1); 1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, baz_->value_count()); 1213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville a_ = baz_->value(0); 1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, qux_->value_count()); 1215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b_ = qux_->value(0); 1216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->message_type_count()); 1218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2_ = bar_file_->message_type(0); 1219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message2_->nested_type_count()); 1221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo2_ = message2_->nested_type(0); 1222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz2_ = message2_->nested_type(1); 1223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message2_->enum_type_count()); 1225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux2_ = message2_->enum_type(0); 1226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville quux2_ = message2_->enum_type(1); 1227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, qux2_->value_count()); 1229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville a2_ = qux2_->value(0); 1230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, quux2_->value_count()); 1231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville c2_ = quux2_->value(0); 1232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 1235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message_; 1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message2_; 1241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_; 1243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_; 1244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* baz_; 1245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* qux_; 1246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* a_; 1247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* b_; 1248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo2_; 1250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* baz2_; 1251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* qux2_; 1252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* quux2_; 1253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* a2_; 1254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* c2_; 1255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, MessageName) { 1258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", foo_ ->name()); 1259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Bar", bar_ ->name()); 1260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", foo2_->name()); 1261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Baz", baz2_->name()); 1262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.Foo", foo_->full_name()); 1264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.Bar", bar_->full_name()); 1265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.Foo", foo2_->full_name()); 1266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.Baz", baz2_->full_name()); 1267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, MessageContainingType) { 1270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_ , foo_ ->containing_type()); 1271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_ , bar_ ->containing_type()); 1272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, foo2_->containing_type()); 1273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, baz2_->containing_type()); 1274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, NestedMessagesByIndex) { 1277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message_->nested_type_count()); 1278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, message_->nested_type(0)); 1279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, message_->nested_type(1)); 1280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, FindFieldByNameDoesntFindNestedTypes) { 1283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByName("Foo") == NULL); 1284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindFieldByName("Qux") == NULL); 1285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByName("Foo") == NULL); 1286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindExtensionByName("Qux") == NULL); 1287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, FindNestedTypeByName) { 1290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_ , message_ ->FindNestedTypeByName("Foo")); 1291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_ , message_ ->FindNestedTypeByName("Bar")); 1292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo2_, message2_->FindNestedTypeByName("Foo")); 1293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz2_, message2_->FindNestedTypeByName("Baz")); 1294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindNestedTypeByName("NoSuchType") == NULL); 1296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindNestedTypeByName("Baz" ) == NULL); 1297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindNestedTypeByName("Bar" ) == NULL); 1298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindNestedTypeByName("Qux") == NULL); 1300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, EnumName) { 1303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Baz" , baz_ ->name()); 1304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Qux" , qux_ ->name()); 1305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Qux" , qux2_->name()); 1306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Quux", quux2_->name()); 1307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.Baz", baz_->full_name()); 1309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("TestMessage.Qux", qux_->full_name()); 1310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.Qux" , qux2_ ->full_name()); 1311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.grault.TestMessage2.Quux", quux2_->full_name()); 1312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, EnumContainingType) { 1315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_ , baz_ ->containing_type()); 1316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message_ , qux_ ->containing_type()); 1317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, qux2_ ->containing_type()); 1318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message2_, quux2_->containing_type()); 1319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, NestedEnumsByIndex) { 1322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message_->nested_type_count()); 1323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, message_->nested_type(0)); 1324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, message_->nested_type(1)); 1325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, FindEnumTypeByName) { 1328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz_ , message_ ->FindEnumTypeByName("Baz" )); 1329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_ , message_ ->FindEnumTypeByName("Qux" )); 1330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux2_ , message2_->FindEnumTypeByName("Qux" )); 1331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(quux2_, message2_->FindEnumTypeByName("Quux")); 1332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindEnumTypeByName("NoSuchType") == NULL); 1334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindEnumTypeByName("Quux" ) == NULL); 1335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindEnumTypeByName("Baz" ) == NULL); 1336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindEnumTypeByName("Foo") == NULL); 1338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(NestedDescriptorTest, FindEnumValueByName) { 1341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(a_ , message_ ->FindEnumValueByName("A")); 1342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(b_ , message_ ->FindEnumValueByName("B")); 1343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(a2_, message2_->FindEnumValueByName("A")); 1344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(c2_, message2_->FindEnumValueByName("C")); 1345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindEnumValueByName("NO_SUCH_VALUE") == NULL); 1347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_ ->FindEnumValueByName("C" ) == NULL); 1348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message2_->FindEnumValueByName("B" ) == NULL); 1349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message_->FindEnumValueByName("Foo") == NULL); 1351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test extensions. 1356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ExtensionDescriptorTest : public testing::Test { 1357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 1358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 1359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptors for the following definitions: 1360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum Baz {} 1362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Qux {} 1363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Foo { 1365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extensions 10 to 19; 1366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extensions 30 to 39; 1367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 1368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extends Foo with optional int32 foo_int32 = 10; 1369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extends Foo with repeated TestEnum foo_enum = 19; 1370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Bar { 1371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extends Foo with optional Qux foo_message = 30; 1372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // (using Qux as the group type) 1373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extends Foo with repeated group foo_group = 39; 1374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 1375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_file; 1377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file.set_name("foo.proto"); 1378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEmptyEnum(&foo_file, "Baz"); 1380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddMessage(&foo_file, "Qux"); 1381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* foo = AddMessage(&foo_file, "Foo"); 1383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtensionRange(foo, 10, 20); 1384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtensionRange(foo, 30, 40); 1385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&foo_file, "Foo", "foo_int32", 10, 1387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 1388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 1389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddExtension(&foo_file, "Foo", "foo_enum", 19, 1390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REPEATED, 1391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_ENUM) 1392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("Baz"); 1393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* bar = AddMessage(&foo_file, "Bar"); 1395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(bar, "Foo", "foo_message", 30, 1396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 1397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_MESSAGE) 1398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("Qux"); 1399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddNestedExtension(bar, "Foo", "foo_group", 39, 1400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_REPEATED, 1401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_GROUP) 1402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("Qux"); 1403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 1405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_file); 1406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 1407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->enum_type_count()); 1409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_ = foo_file_->enum_type(0); 1410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(3, foo_file_->message_type_count()); 1412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_ = foo_file_->message_type(0); 1413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_ = foo_file_->message_type(1); 1414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_ = foo_file_->message_type(2); 1415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 1418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 1420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_; 1422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_; 1423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* baz_; 1424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* qux_; 1425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ExtensionDescriptorTest, ExtensionRanges) { 1428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, bar_->extension_range_count()); 1429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, foo_->extension_range_count()); 1430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(10, foo_->extension_range(0)->start); 1432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(30, foo_->extension_range(1)->start); 1433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(20, foo_->extension_range(0)->end); 1435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(40, foo_->extension_range(1)->end); 1436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ExtensionDescriptorTest, Extensions) { 1439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, foo_->extension_count()); 1440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, foo_file_->extension_count()); 1441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, bar_->extension_count()); 1442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->extension(0)->is_extension()); 1444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->extension(1)->is_extension()); 1445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_->extension(0)->is_extension()); 1446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_->extension(1)->is_extension()); 1447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_int32" , foo_file_->extension(0)->name()); 1449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_enum" , foo_file_->extension(1)->name()); 1450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_message", bar_->extension(0)->name()); 1451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_group" , bar_->extension(1)->name()); 1452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(10, foo_file_->extension(0)->number()); 1454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(19, foo_file_->extension(1)->number()); 1455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(30, bar_->extension(0)->number()); 1456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(39, bar_->extension(1)->number()); 1457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_INT32 , foo_file_->extension(0)->type()); 1459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_ENUM , foo_file_->extension(1)->type()); 1460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_->extension(0)->type()); 1461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::TYPE_GROUP , bar_->extension(1)->type()); 1462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(baz_, foo_file_->extension(1)->enum_type()); 1464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_, bar_->extension(0)->message_type()); 1465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(qux_, bar_->extension(1)->message_type()); 1466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, foo_file_->extension(0)->label()); 1468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, foo_file_->extension(1)->label()); 1469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->extension(0)->label()); 1470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, bar_->extension(1)->label()); 1471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, foo_file_->extension(0)->containing_type()); 1473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, foo_file_->extension(1)->containing_type()); 1474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, bar_->extension(0)->containing_type()); 1475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo_, bar_->extension(1)->containing_type()); 1476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->extension(0)->extension_scope() == NULL); 1478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_file_->extension(1)->extension_scope() == NULL); 1479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, bar_->extension(0)->extension_scope()); 1480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_, bar_->extension(1)->extension_scope()); 1481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ExtensionDescriptorTest, IsExtensionNumber) { 1484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->IsExtensionNumber( 9)); 1485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (foo_->IsExtensionNumber(10)); 1486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (foo_->IsExtensionNumber(19)); 1487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->IsExtensionNumber(20)); 1488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->IsExtensionNumber(29)); 1489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (foo_->IsExtensionNumber(30)); 1490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE (foo_->IsExtensionNumber(39)); 1491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(foo_->IsExtensionNumber(40)); 1492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ExtensionDescriptorTest, FindExtensionByName) { 1495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note that FileDescriptor::FindExtensionByName() is tested by 1496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FileDescriptorTest. 1497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, bar_->extension_count()); 1498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_->extension(0), bar_->FindExtensionByName("foo_message")); 1500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_->extension(1), bar_->FindExtensionByName("foo_group" )); 1501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar_->FindExtensionByName("no_such_extension") == NULL); 1503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_->FindExtensionByName("foo_int32") == NULL); 1504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo_->FindExtensionByName("foo_message") == NULL); 1505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ExtensionDescriptorTest, FindAllExtensions) { 1508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<const FieldDescriptor*> extensions; 1509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pool_.FindAllExtensions(foo_, &extensions); 1510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(4, extensions.size()); 1511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(10, extensions[0]->number()); 1512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(19, extensions[1]->number()); 1513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(30, extensions[2]->number()); 1514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(39, extensions[3]->number()); 1515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MiscTest : public testing::Test { 1520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 1521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Function which makes a field of the given type just to find out what its 1522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // cpp_type is. 1523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptor::CppType GetCppTypeForFieldType(FieldDescriptor::Type type) { 1524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 1525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_proto.set_name("foo.proto"); 1526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEmptyEnum(&file_proto, "DummyEnum"); 1527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message = AddMessage(&file_proto, "TestMessage"); 1529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* field = 1530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message, "foo", 1, FieldDescriptorProto::LABEL_OPTIONAL, 1531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static_cast<FieldDescriptorProto::Type>(static_cast<int>(type))); 1532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (type == FieldDescriptor::TYPE_MESSAGE || 1534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville type == FieldDescriptor::TYPE_GROUP) { 1535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->set_type_name("TestMessage"); 1536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else if (type == FieldDescriptor::TYPE_ENUM) { 1537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->set_type_name("DummyEnum"); 1538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 1541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool; 1542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.BuildFile(file_proto); 1543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (file != NULL && 1545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->message_type_count() == 1 && 1546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->message_type(0)->field_count() == 1) { 1547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return file->message_type(0)->field(0)->cpp_type(); 1548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<FieldDescriptor::CppType>(0); 1550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(MiscTest, CppTypes) { 1555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that CPP types are assigned correctly. 1556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef FieldDescriptor FD; // avoid ugly line wrapping 1558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_DOUBLE , GetCppTypeForFieldType(FD::TYPE_DOUBLE )); 1560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_FLOAT , GetCppTypeForFieldType(FD::TYPE_FLOAT )); 1561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_INT64 )); 1562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_UINT64 )); 1563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_INT32 )); 1564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_FIXED64 )); 1565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_FIXED32 )); 1566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_BOOL , GetCppTypeForFieldType(FD::TYPE_BOOL )); 1567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_STRING )); 1568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_GROUP )); 1569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_MESSAGE )); 1570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_BYTES )); 1571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_UINT32 )); 1572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_ENUM , GetCppTypeForFieldType(FD::TYPE_ENUM )); 1573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_SFIXED32)); 1574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_SFIXED64)); 1575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_SINT32 )); 1576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_SINT64 )); 1577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(MiscTest, DefaultValues) { 1580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that setting default values works. 1581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 1582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_proto.set_name("foo.proto"); 1583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptorProto* enum_type_proto = AddEnum(&file_proto, "DummyEnum"); 1585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum_type_proto, "A", 1); 1586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddEnumValue(enum_type_proto, "B", 2); 1587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message_proto = AddMessage(&file_proto, "TestMessage"); 1589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef FieldDescriptorProto FD; // avoid ugly line wrapping 1591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FD::Label label = FD::LABEL_OPTIONAL; 1592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Create fields of every CPP type with default values. 1594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "int32" , 1, label, FD::TYPE_INT32 ) 1595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("-1"); 1596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "int64" , 2, label, FD::TYPE_INT64 ) 1597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("-1000000000000"); 1598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "uint32", 3, label, FD::TYPE_UINT32) 1599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("42"); 1600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "uint64", 4, label, FD::TYPE_UINT64) 1601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("2000000000000"); 1602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "float" , 5, label, FD::TYPE_FLOAT ) 1603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("4.5"); 1604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "double", 6, label, FD::TYPE_DOUBLE) 1605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("10e100"); 1606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "bool" , 7, label, FD::TYPE_BOOL ) 1607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("true"); 1608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "string", 8, label, FD::TYPE_STRING) 1609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("hello"); 1610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "data" , 9, label, FD::TYPE_BYTES ) 1611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value("\\001\\002\\003"); 1612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* enum_field = 1614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "enum", 10, label, FD::TYPE_ENUM); 1615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_field->set_type_name("DummyEnum"); 1616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_field->set_default_value("B"); 1617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Strings are allowed to have empty defaults. (At one point, due to 1619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // a bug, empty defaults for strings were rejected. Oops.) 1620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "empty_string", 11, label, FD::TYPE_STRING) 1621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_default_value(""); 1622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Add a second set of fields with implicit defalut values. 1624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_int32" , 21, label, FD::TYPE_INT32 ); 1625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_int64" , 22, label, FD::TYPE_INT64 ); 1626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_uint32", 23, label, FD::TYPE_UINT32); 1627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_uint64", 24, label, FD::TYPE_UINT64); 1628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_float" , 25, label, FD::TYPE_FLOAT ); 1629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_double", 26, label, FD::TYPE_DOUBLE); 1630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_bool" , 27, label, FD::TYPE_BOOL ); 1631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_string", 28, label, FD::TYPE_STRING); 1632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_data" , 29, label, FD::TYPE_BYTES ); 1633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "implicit_enum" , 30, label, FD::TYPE_ENUM) 1634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->set_type_name("DummyEnum"); 1635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build it. 1637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool; 1638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.BuildFile(file_proto); 1639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 1640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, file->enum_type_count()); 1642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum_type = file->enum_type(0); 1643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, enum_type->value_count()); 1644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* enum_value_a = enum_type->value(0); 1645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* enum_value_b = enum_type->value(1); 1646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, file->message_type_count()); 1648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message = file->message_type(0); 1649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(21, message->field_count()); 1651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check the default values. 1653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(0)->has_default_value()); 1654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(1)->has_default_value()); 1655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(2)->has_default_value()); 1656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(3)->has_default_value()); 1657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(4)->has_default_value()); 1658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(5)->has_default_value()); 1659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(6)->has_default_value()); 1660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(7)->has_default_value()); 1661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(8)->has_default_value()); 1662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(9)->has_default_value()); 1663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(message->field(10)->has_default_value()); 1664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-1 , message->field(0)->default_value_int32 ()); 1666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-GOOGLE_ULONGLONG(1000000000000), 1667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message->field(1)->default_value_int64 ()); 1668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(42 , message->field(2)->default_value_uint32()); 1669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(GOOGLE_ULONGLONG(2000000000000), 1670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message->field(3)->default_value_uint64()); 1671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(4.5 , message->field(4)->default_value_float ()); 1672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(10e100 , message->field(5)->default_value_double()); 1673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(true , message->field(6)->default_value_bool ()); 1674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("hello" , message->field(7)->default_value_string()); 1675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("\001\002\003" , message->field(8)->default_value_string()); 1676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum_value_b , message->field(9)->default_value_enum ()); 1677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("" , message->field(10)->default_value_string()); 1678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(11)->has_default_value()); 1680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(12)->has_default_value()); 1681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(13)->has_default_value()); 1682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(14)->has_default_value()); 1683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(15)->has_default_value()); 1684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(16)->has_default_value()); 1685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(17)->has_default_value()); 1686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(18)->has_default_value()); 1687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(19)->has_default_value()); 1688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_FALSE(message->field(20)->has_default_value()); 1689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , message->field(11)->default_value_int32 ()); 1691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , message->field(12)->default_value_int64 ()); 1692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , message->field(13)->default_value_uint32()); 1693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , message->field(14)->default_value_uint64()); 1694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0.0f , message->field(15)->default_value_float ()); 1695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0.0 , message->field(16)->default_value_double()); 1696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(false, message->field(17)->default_value_bool ()); 1697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("" , message->field(18)->default_value_string()); 1698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("" , message->field(19)->default_value_string()); 1699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(enum_value_a, message->field(20)->default_value_enum()); 1700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(MiscTest, FieldOptions) { 1703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try setting field options. 1704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 1706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_proto.set_name("foo.proto"); 1707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto* message_proto = AddMessage(&file_proto, "TestMessage"); 1709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "foo", 1, 1710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 1711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 1712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto* bar_proto = 1713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddField(message_proto, "bar", 2, 1714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::LABEL_OPTIONAL, 1715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto::TYPE_INT32); 1716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldOptions* options = bar_proto->mutable_options(); 1718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->set_ctype(FieldOptions::CORD); 1719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build the descriptors and get the pointers. 1721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool; 1722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.BuildFile(file_proto); 1723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 1724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, file->message_type_count()); 1726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message = file->message_type(0); 1727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message->field_count()); 1729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* foo = message->field(0); 1730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* bar = message->field(1); 1731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // "foo" had no options set, so it should return the default options. 1733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&FieldOptions::default_instance(), &foo->options()); 1734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // "bar" had options set. 1736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(&FieldOptions::default_instance(), options); 1737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(bar->options().has_ctype()); 1738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldOptions::CORD, bar->options().ctype()); 1739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass AllowUnknownDependenciesTest : public testing::Test { 1744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 1745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 1746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto foo_proto, bar_proto; 1747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pool_.AllowUnknownDependencies(); 1749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 1751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: 'foo.proto'" 1752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: 'bar.proto'" 1753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: 'baz.proto'" 1754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 1755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: 'Foo'" 1756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'Bar' }" 1757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:'baz' number:2 label:LABEL_OPTIONAL type_name:'Baz' }" 1758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:'qux' number:3 label:LABEL_OPTIONAL" 1759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: '.corge.Qux'" 1760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_ENUM" 1761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options {" 1762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option {" 1763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name {" 1764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: 'grault'" 1765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true" 1766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 1767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234" 1768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 1769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 1770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 1771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 1772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &foo_proto)); 1773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 1774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: 'bar.proto'" 1775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: 'Bar' }", 1776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &bar_proto)); 1777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Collect pointers to stuff. 1779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_file_ = pool_.BuildFile(bar_proto); 1780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar_file_ != NULL); 1781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar_file_->message_type_count()); 1783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_type_ = bar_file_->message_type(0); 1784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_file_ = pool_.BuildFile(foo_proto); 1786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo_file_ != NULL); 1787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo_file_->message_type_count()); 1789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_type_ = foo_file_->message_type(0); 1790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(3, foo_type_->field_count()); 1792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_field_ = foo_type_->field(0); 1793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_field_ = foo_type_->field(1); 1794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_field_ = foo_type_->field(2); 1795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar_file_; 1798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* bar_type_; 1799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo_file_; 1800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo_type_; 1801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* bar_field_; 1802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* baz_field_; 1803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* qux_field_; 1804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 1806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(AllowUnknownDependenciesTest, PlaceholderFile) { 1809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, foo_file_->dependency_count()); 1810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, foo_file_->dependency(0)); 1811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* baz_file = foo_file_->dependency(1); 1813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz.proto", baz_file->name()); 1814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, baz_file->message_type_count()); 1815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Placeholder files should not be findable. 1817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_file_, pool_.FindFileByName(bar_file_->name())); 1818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool_.FindFileByName(baz_file->name()) == NULL); 1819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(AllowUnknownDependenciesTest, PlaceholderTypes) { 1822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_field_->type()); 1823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_type_, bar_field_->message_type()); 1824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_field_->type()); 1826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* baz_type = baz_field_->message_type(); 1827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Baz", baz_type->name()); 1828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Baz", baz_type->full_name()); 1829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Baz.placeholder.proto", baz_type->file()->name()); 1830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, baz_type->extension_range_count()); 1831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(FieldDescriptor::TYPE_ENUM, qux_field_->type()); 1833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* qux_type = qux_field_->enum_type(); 1834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Qux", qux_type->name()); 1835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.Qux", qux_type->full_name()); 1836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("corge.Qux.placeholder.proto", qux_type->file()->name()); 1837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Placeholder types should not be findable. 1839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(bar_type_, pool_.FindMessageTypeByName(bar_type_->full_name())); 1840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool_.FindMessageTypeByName(baz_type->full_name()) == NULL); 1841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool_.FindEnumTypeByName(qux_type->full_name()) == NULL); 1842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(AllowUnknownDependenciesTest, CopyTo) { 1845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FieldDescriptor::CopyTo() should write non-fully-qualified type names 1846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // for placeholder types which were not originally fully-qualified. 1847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptorProto proto; 1848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Bar is not a placeholder, so it is fully-qualified. 1850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bar_field_->CopyTo(&proto); 1851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(".Bar", proto.type_name()); 1852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptorProto::TYPE_MESSAGE, proto.type()); 1853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Baz is an unqualified placeholder. 1855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Clear(); 1856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville baz_field_->CopyTo(&proto); 1857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Baz", proto.type_name()); 1858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(proto.has_type()); 1859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Qux is a fully-qualified placeholder. 1861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Clear(); 1862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_field_->CopyTo(&proto); 1863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(".corge.Qux", proto.type_name()); 1864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptorProto::TYPE_ENUM, proto.type()); 1865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(AllowUnknownDependenciesTest, CustomOptions) { 1868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Qux should still have the uninterpreted option attached. 1869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, qux_field_->options().uninterpreted_option_size()); 1870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const UninterpretedOption& option = 1871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville qux_field_->options().uninterpreted_option(0); 1872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, option.name_size()); 1873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("grault", option.name(0).name_part()); 1874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(AllowUnknownDependenciesTest, UnknownExtendee) { 1877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that we can extend an unknown type. This is slightly tricky because 1878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // it means that the placeholder type must have an extension range. 1879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto extension_proto; 1881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 1883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: 'extension.proto'" 1884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { extendee: 'UnknownType' name:'some_extension' number:123" 1885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " label:LABEL_OPTIONAL type:TYPE_INT32 }", 1886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &extension_proto)); 1887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool_.BuildFile(extension_proto); 1888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 1890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, file->extension_count()); 1892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* extendee = file->extension(0)->containing_type(); 1893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("UnknownType", extendee->name()); 1894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, extendee->extension_range_count()); 1895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, extendee->extension_range(0)->start); 1896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldDescriptor::kMaxNumber + 1, extendee->extension_range(0)->end); 1897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(AllowUnknownDependenciesTest, CustomOption) { 1900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that we can use a custom option without having parsed 1901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // descriptor.proto. 1902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto option_proto; 1904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 1906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"unknown_custom_options.proto\" " 1907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 1908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { " 1909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"google.protobuf.FileOptions\" " 1910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"some_option\" " 1911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " number: 123456 " 1912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " label: LABEL_OPTIONAL " 1913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 " 1914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "} " 1915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { " 1916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 1917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 1918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"some_option\" " 1919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 1920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 1921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 1922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 1923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 1924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 1925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"unknown_option\" " 1926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 1927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 1928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 1929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 1930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 1931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 1932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"optimize_for\" " 1933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 1934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 1935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"SPEED\" " 1936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 1937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 1938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &option_proto)); 1939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool_.BuildFile(option_proto); 1941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 1942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Verify that no extension options were set, but they were left as 1944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // uninterpreted_options. 1945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<const FieldDescriptor*> fields; 1946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->options().GetReflection()->ListFields(file->options(), &fields); 1947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, fields.size()); 1948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->options().has_optimize_for()); 1949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, file->options().uninterpreted_option_size()); 1950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(CustomOptions, OptionLocations) { 1955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message = 1956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageWithCustomOptions::descriptor(); 1957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = message->file(); 1958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field = message->FindFieldByName("field1"); 1959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enm = message->FindEnumTypeByName("AnEnum"); 1960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TODO(benjy): Support EnumValue options, once the compiler does. 1961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* service = 1962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->FindServiceByName("TestServiceWithCustomOptions"); 1963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* method = service->FindMethodByName("Foo"); 1964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(GOOGLE_LONGLONG(9876543210), 1966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->options().GetExtension(protobuf_unittest::file_opt1)); 1967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-56, 1968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message->options().GetExtension(protobuf_unittest::message_opt1)); 1969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(GOOGLE_LONGLONG(8765432109), 1970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->options().GetExtension(protobuf_unittest::field_opt1)); 1971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(42, // Check that we get the default for an option we don't set. 1972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->options().GetExtension(protobuf_unittest::field_opt2)); 1973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-789, 1974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enm->options().GetExtension(protobuf_unittest::enum_opt1)); 1975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(123, 1976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enm->value(1)->options().GetExtension( 1977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::enum_value_opt1)); 1978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(GOOGLE_LONGLONG(-9876543210), 1979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville service->options().GetExtension(protobuf_unittest::service_opt1)); 1980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(protobuf_unittest::METHODOPT1_VAL2, 1981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville method->options().GetExtension(protobuf_unittest::method_opt1)); 1982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See that the regular options went through unscathed. 1984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message->options().has_message_set_wire_format()); 1985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FieldOptions::CORD, field->options().ctype()); 1986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(CustomOptions, OptionTypes) { 1989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageOptions* options = NULL; 1990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options = 1992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::CustomOptionMinIntegerValues::descriptor()->options(); 1993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(false , options->GetExtension(protobuf_unittest::bool_opt)); 1994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::int32_opt)); 1995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::int64_opt)); 1996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::uint32_opt)); 1997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::uint64_opt)); 1998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sint32_opt)); 1999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sint64_opt)); 2000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::fixed32_opt)); 2001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::fixed64_opt)); 2002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sfixed32_opt)); 2003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sfixed64_opt)); 2004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options = 2006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::CustomOptionMaxIntegerValues::descriptor()->options(); 2007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(true , options->GetExtension(protobuf_unittest::bool_opt)); 2008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::int32_opt)); 2009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::int64_opt)); 2010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::uint32_opt)); 2011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::uint64_opt)); 2012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sint32_opt)); 2013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sint64_opt)); 2014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::fixed32_opt)); 2015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::fixed64_opt)); 2016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sfixed32_opt)); 2017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sfixed64_opt)); 2018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options = 2020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::CustomOptionOtherValues::descriptor()->options(); 2021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-100, options->GetExtension(protobuf_unittest::int32_opt)); 2022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FLOAT_EQ(12.3456789, 2023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->GetExtension(protobuf_unittest::float_opt)); 2024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_EQ(1.234567890123456789, 2025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->GetExtension(protobuf_unittest::double_opt)); 2026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Hello, \"World\"", 2027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->GetExtension(protobuf_unittest::string_opt)); 2028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(string("Hello\0World", 11), 2030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->GetExtension(protobuf_unittest::bytes_opt)); 2031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(protobuf_unittest::DummyMessageContainingEnum::TEST_OPTION_ENUM_TYPE2, 2033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options->GetExtension(protobuf_unittest::enum_opt)); 2034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options = 2036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::SettingRealsFromPositiveInts::descriptor()->options(); 2037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FLOAT_EQ(12, options->GetExtension(protobuf_unittest::float_opt)); 2038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_EQ(154, options->GetExtension(protobuf_unittest::double_opt)); 2039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options = 2041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::SettingRealsFromNegativeInts::descriptor()->options(); 2042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FLOAT_EQ(-12, options->GetExtension(protobuf_unittest::float_opt)); 2043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_EQ(-154, options->GetExtension(protobuf_unittest::double_opt)); 2044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(CustomOptions, ComplexExtensionOptions) { 2047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageOptions* options = 2048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::VariousComplexOptions::descriptor()->options(); 2049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1).foo(), 42); 2050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1). 2051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::quux), 324); 2052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1). 2053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::corge).qux(), 876); 2054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).baz(), 987); 2055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). 2056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::grault), 654); 2057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar().foo(), 2058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 743); 2059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar(). 2060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::quux), 1999); 2061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar(). 2062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::corge).qux(), 2008); 2063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). 2064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::garply).foo(), 741); 2065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). 2066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::garply). 2067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::quux), 1998); 2068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). 2069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::garply). 2070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetExtension(protobuf_unittest::corge).qux(), 2121); 2071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension( 2072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::ComplexOptionType2::ComplexOptionType4::complex_opt4). 2073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville waldo(), 1971); 2074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). 2075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fred().waldo(), 321); 2076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(9, options->GetExtension(protobuf_unittest::complex_opt3).qux()); 2077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(22, options->GetExtension(protobuf_unittest::complex_opt3). 2078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville complexoptiontype5().plugh()); 2079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(24, options->GetExtension(protobuf_unittest::complexopt6).xyzzy()); 2080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(CustomOptions, OptionsFromOtherFile) { 2083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that to use a custom option, we only need to import the file 2084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // defining the option; we do not also have to import descriptor.proto. 2085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool; 2086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 2088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); 2089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageWithCustomOptions::descriptor() 2092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->file()->CopyTo(&file_proto); 2093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 2096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"custom_options_import.proto\" " 2097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"protobuf_unittest\" " 2098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/unittest_custom_options.proto\" " 2099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { " 2100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"file_opt1\" " 2103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 2104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 2106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test a non-extension option too. (At one point this failed due to a 2108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // bug.) 2109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"java_package\" " 2112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 2113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"foo\" " 2115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that enum-typed options still work too. (At one point this also 2117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // failed due to a bug.) 2118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"optimize_for\" " 2121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 2122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"SPEED\" " 2124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 2126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville , 2127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &file_proto)); 2128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.BuildFile(file_proto); 2130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 2131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1234, file->options().GetExtension(protobuf_unittest::file_opt1)); 2132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->options().has_java_package()); 2133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo", file->options().java_package()); 2134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->options().has_optimize_for()); 2135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(FileOptions::SPEED, file->options().optimize_for()); 2136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(CustomOptions, MessageOptionThreeFieldsSet) { 2139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This tests a bug which previously existed in custom options parsing. The 2140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // bug occurred when you defined a custom option with message type and then 2141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // set three fields of that option on a single definition (see the example 2142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // below). The bug is a bit hard to explain, so check the change history if 2143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // you want to know more. 2144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool; 2145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 2147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); 2148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageWithCustomOptions::descriptor() 2151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ->file()->CopyTo(&file_proto); 2152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); 2153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The following represents the definition: 2155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 2156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // import "google/protobuf/unittest_custom_options.proto" 2157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package protobuf_unittest; 2158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Foo { 2159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // option (complex_opt1).foo = 1234; 2160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // option (complex_opt1).foo2 = 1234; 2161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // option (complex_opt1).foo3 = 1234; 2162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 2163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 2164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"custom_options_import.proto\" " 2165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"protobuf_unittest\" " 2166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/unittest_custom_options.proto\" " 2167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 2168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\" " 2169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { " 2170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"complex_opt1\" " 2173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 2174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"foo\" " 2177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 2178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 2180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"complex_opt1\" " 2184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 2185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"foo2\" " 2188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 2189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 2191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 2193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"complex_opt1\" " 2195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true " 2196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { " 2198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name_part: \"foo3\" " 2199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false " 2200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1234 " 2202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 2204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &file_proto)); 2206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.BuildFile(file_proto); 2208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 2209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, file->message_type_count()); 2210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageOptions& options = file->message_type(0)->options(); 2212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1234, options.GetExtension(protobuf_unittest::complex_opt1).foo()); 2213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 2217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The tests below trigger every unique call to AddError() in descriptor.cc, 2219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the order in which they appear in that file. I'm using TextFormat here 2220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to specify the input descriptors because building them using code would 2221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// be too bulky. 2222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MockErrorCollector : public DescriptorPool::ErrorCollector { 2224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 2225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector() {} 2226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~MockErrorCollector() {} 2227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string text_; 2229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implements ErrorCollector --------------------------------------- 2231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void AddError(const string& filename, 2232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& element_name, const Message* descriptor, 2233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorLocation location, const string& message) { 2234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* location_name = NULL; 2235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville switch (location) { 2236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case NAME : location_name = "NAME" ; break; 2237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case NUMBER : location_name = "NUMBER" ; break; 2238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case TYPE : location_name = "TYPE" ; break; 2239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case EXTENDEE : location_name = "EXTENDEE" ; break; 2240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case DEFAULT_VALUE: location_name = "DEFAULT_VALUE"; break; 2241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case OPTION_NAME : location_name = "OPTION_NAME" ; break; 2242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case OPTION_VALUE : location_name = "OPTION_VALUE" ; break; 2243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case INPUT_TYPE : location_name = "INPUT_TYPE" ; break; 2244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case OUTPUT_TYPE : location_name = "OUTPUT_TYPE" ; break; 2245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case OTHER : location_name = "OTHER" ; break; 2246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville strings::SubstituteAndAppend( 2249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &text_, "$0: $1: $2: $3\n", 2250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville filename, element_name, location_name, message); 2251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 2253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ValidationErrorTest : public testing::Test { 2255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 2256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse file_text as a FileDescriptorProto in text format and add it 2257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to the DescriptorPool. Expect no errors. 2258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void BuildFile(const string& file_text) { 2259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 2260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); 2261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool_.BuildFile(file_proto) != NULL); 2262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse file_text as a FileDescriptorProto in text format and add it 2265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to the DescriptorPool. Expect errors to be produced which match the 2266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // given error text. 2267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void BuildFileWithErrors(const string& file_text, 2268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& expected_errors) { 2269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 2270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); 2271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector error_collector; 2273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE( 2274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pool_.BuildFileCollectingErrors(file_proto, &error_collector) == NULL); 2275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(expected_errors, error_collector.text_); 2276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Builds some already-parsed file in our test pool. 2279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void BuildFileInTestPool(const FileDescriptor* file) { 2280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 2281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file->CopyTo(&file_proto); 2282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool_.BuildFile(file_proto) != NULL); 2283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build descriptor.proto in our test pool. This allows us to extend it in 2286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the test pool, so we can test custom options. 2287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void BuildDescriptorMessagesInTestPool() { 2288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileInTestPool(DescriptorProto::descriptor()->file()); 2289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 2290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 2292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 2293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, AlreadyDefined) { 2295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }" 2298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }", 2299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NAME: \"Foo\" is already defined.\n"); 2301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, AlreadyDefinedInPackage) { 2304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.bar\" " 2307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }" 2308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }", 2309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.bar.Foo: NAME: \"Foo\" is already defined in " 2311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"foo.bar\".\n"); 2312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, AlreadyDefinedInOtherFile) { 2315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 2316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }"); 2318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 2321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }", 2322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: Foo: NAME: \"Foo\" is already defined in file " 2324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"foo.proto\".\n"); 2325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, PackageAlreadyDefined) { 2328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 2329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"foo\" }"); 2331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 2333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.bar\"", 2334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: foo: NAME: \"foo\" is already defined (as something other " 2336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "than a package) in file \"foo.proto\".\n"); 2337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParent) { 2340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } " 2343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ", 2344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: FOO: NAME: \"FOO\" is already defined.\n" 2346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: FOO: NAME: Note that enum values use C++ scoping rules, " 2347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "meaning that enum values are siblings of their type, not children of " 2348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "it. Therefore, \"FOO\" must be unique within the global scope, not " 2349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "just within \"Bar\".\n"); 2350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParentNonGlobal) { 2353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"pkg\" " 2356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } " 2357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ", 2358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: pkg.FOO: NAME: \"FOO\" is already defined in \"pkg\".\n" 2360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: pkg.FOO: NAME: Note that enum values use C++ scoping rules, " 2361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "meaning that enum values are siblings of their type, not children of " 2362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "it. Therefore, \"FOO\" must be unique within \"pkg\", not just within " 2363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"Bar\".\n"); 2364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, MissingName) { 2367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { }", 2370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: : NAME: Missing name.\n"); 2372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InvalidName) { 2375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"$\" }", 2378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: $: NAME: \"$\" is not a valid identifier.\n"); 2380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InvalidPackageName) { 2383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.$\"", 2386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.$: NAME: \"$\" is not a valid identifier.\n"); 2388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, MissingFileName) { 2391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "", 2393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ": : OTHER: Missing field: FileDescriptorProto.name.\n"); 2395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, DupeDependency) { 2398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile("name: \"foo.proto\""); 2399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 2401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"foo.proto\" " 2402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"foo.proto\" ", 2403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: bar.proto: OTHER: Import \"foo.proto\" was listed twice.\n"); 2405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UnknownDependency) { 2408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 2410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"foo.proto\" ", 2411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: bar.proto: OTHER: Import \"foo.proto\" has not been loaded.\n"); 2413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, ForeignUnimportedPackageNoCrash) { 2416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Used to crash: If we depend on a non-existent file and then refer to a 2417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package defined in a file that we didn't import, and that package is 2418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // nested within a parent package which this file is also in, and we don't 2419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // include that parent package in the name (i.e. we do a relative lookup)... 2420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Yes, really. 2421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 2422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: 'foo.proto' " 2423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: 'outer.foo' "); 2424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: 'bar.proto' " 2426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: 'baz.proto' " 2427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: 'outer.bar' " 2428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 2429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: 'Bar' " 2430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'foo.Foo' }" 2431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: bar.proto: OTHER: Import \"baz.proto\" has not been loaded.\n" 2434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "bar.proto: outer.bar.Bar.bar: TYPE: \"outer.foo\" seems to be defined in " 2435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"foo.proto\", which is not imported by \"bar.proto\". To use it here, " 2436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "please add the necessary import.\n"); 2437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, DupeFile) { 2440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 2441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" }"); 2443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: We should *not* get redundant errors about "Foo" already being 2444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // defined. 2445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 2448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Add another type so that the files aren't identical (in which case there 2449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // would be no error). 2450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" }", 2451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OTHER: A file with this name is already in the " 2453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "pool.\n"); 2454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldInExtensionRange) { 2457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 9 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"bar\" number: 10 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"baz\" number: 19 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"qux\" number: 20 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 10 end: 20 }" 2466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.bar: NUMBER: Extension range 10 to 19 includes field " 2469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"bar\" (10).\n" 2470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.baz: NUMBER: Extension range 10 to 19 includes field " 2471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"baz\" (19).\n"); 2472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, OverlappingExtensionRanges) { 2475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 10 end: 20 }" 2480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 20 end: 30 }" 2481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 19 end: 21 }" 2482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with " 2485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "already-defined range 10 to 19.\n" 2486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with " 2487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "already-defined range 20 to 29.\n"); 2488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InvalidDefaults) { 2491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Invalid number. 2497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32" 2498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"abc\" }" 2499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Empty default value. 2501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"bar\" number: 2 label: LABEL_OPTIONAL type: TYPE_INT32" 2502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"\" }" 2503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Invalid boolean. 2505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"baz\" number: 3 label: LABEL_OPTIONAL type: TYPE_BOOL" 2506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"abc\" }" 2507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Messages can't have defaults. 2509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"qux\" number: 4 label: LABEL_OPTIONAL type: TYPE_MESSAGE" 2510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"abc\" type_name: \"Foo\" }" 2511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Same thing, but we don't know that this field has message type until 2513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // we look up the type name. 2514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"quux\" number: 5 label: LABEL_OPTIONAL" 2515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"abc\" type_name: \"Foo\" }" 2516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Repeateds can't have defaults. 2518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"corge\" number: 6 label: LABEL_REPEATED type: TYPE_INT32" 2519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"1\" }" 2520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: DEFAULT_VALUE: Couldn't parse default value.\n" 2523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.bar: DEFAULT_VALUE: Couldn't parse default value.\n" 2524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.baz: DEFAULT_VALUE: Boolean default must be true or " 2525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "false.\n" 2526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.qux: DEFAULT_VALUE: Messages can't have default values.\n" 2527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.corge: DEFAULT_VALUE: Repeated fields can't have default " 2528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "values.\n" 2529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This ends up being reported later because the error is detected at 2530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // cross-linking time. 2531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.quux: DEFAULT_VALUE: Messages can't have default " 2532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "values.\n"); 2533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NegativeFieldNumber) { 2536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: -1 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: NUMBER: Field numbers must be positive integers.\n"); 2544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, HugeFieldNumber) { 2547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 0x70000000 " 2552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " label:LABEL_OPTIONAL type:TYPE_INT32 }" 2553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: NUMBER: Field numbers cannot be greater than " 2556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "536870911.\n"); 2557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, ReservedFieldNumber) { 2560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field {name:\"foo\" number: 18999 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field {name:\"bar\" number: 19000 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field {name:\"baz\" number: 19999 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field {name:\"qux\" number: 20000 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.bar: NUMBER: Field numbers 19000 through 19999 are " 2571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "reserved for the protocol buffer library implementation.\n" 2572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.baz: NUMBER: Field numbers 19000 through 19999 are " 2573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "reserved for the protocol buffer library implementation.\n"); 2574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, ExtensionMissingExtendee) { 2577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name: \"foo\" number: 1 label: LABEL_OPTIONAL" 2582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: \"Foo\" }" 2583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee not set for " 2586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension field.\n"); 2587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NonExtensionWithExtendee) { 2590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 2594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 1 end: 2 }" 2595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 2596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 1 label: LABEL_OPTIONAL" 2599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: \"Foo\" extendee: \"Bar\" }" 2600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee set for " 2603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "non-extension field.\n"); 2604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldNumberConflict) { 2607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"bar\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.bar: NUMBER: Field number 1 has already been used in " 2616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"Foo\" by field \"foo\".\n"); 2617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, BadMessageSetExtensionType) { 2620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"MessageSet\"" 2624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { message_set_wire_format: true }" 2625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 4 end: 5 }" 2626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 2627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"foo\" number:4 label:LABEL_OPTIONAL type:TYPE_INT32" 2630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"MessageSet\" }" 2631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional " 2634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "messages.\n"); 2635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, BadMessageSetExtensionLabel) { 2638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"MessageSet\"" 2642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { message_set_wire_format: true }" 2643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 4 end: 5 }" 2644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 2645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"foo\" number:4 label:LABEL_REPEATED type:TYPE_MESSAGE" 2648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: \"Foo\" extendee: \"MessageSet\" }" 2649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional " 2652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "messages.\n"); 2653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldInMessageSet) { 2656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { message_set_wire_format: true }" 2661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: NAME: MessageSets cannot have fields, only " 2665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extensions.\n"); 2666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NegativeExtensionRangeNumber) { 2669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: -10 end: -1 }" 2674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension numbers must be positive integers.\n"); 2677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, HugeExtensionRangeNumber) { 2680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 1 end: 0x70000000 }" 2685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension numbers cannot be greater than " 2688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "536870911.\n"); 2689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, ExtensionRangeEndBeforeStart) { 2692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 10 end: 10 }" 2697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 10 end: 5 }" 2698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension range end number must be greater than " 2701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "start number.\n" 2702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NUMBER: Extension range end number must be greater than " 2703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "start number.\n"); 2704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EmptyEnum) { 2707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Foo\" }" 2710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Also use the empty enum in a message to make sure there are no crashes 2711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // during validation (possible if the code attempts to derive a default 2712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // value for the field). 2713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 2715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type_name:\"Foo\" }" 2716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"bar\" number: 2 label:LABEL_OPTIONAL type_name:\"Foo\" " 2717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value: \"NO_SUCH_VALUE\" }" 2718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NAME: Enums must contain at least one value.\n" 2721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Bar.bar: DEFAULT_VALUE: Enum type \"Foo\" has no value named " 2722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"NO_SUCH_VALUE\".\n"); 2723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UndefinedExtendee) { 2726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" 2731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"Bar\" }" 2732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not defined.\n"); 2735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NonMessageExtendee) { 2738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } }" 2741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" 2744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"Bar\" }" 2745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not a message type.\n"); 2748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NotAnExtensionNumber) { 2751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 2755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 2756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" 2759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"Bar\" }" 2760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: NUMBER: \"Bar\" does not declare 1 as an extension " 2763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "number.\n"); 2764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UndefinedFieldType) { 2767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" 2772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \"Bar\" is not defined.\n"); 2775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldTypeDefinedInUndeclaredDependency) { 2778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 2779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 2780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Bar\" } "); 2781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" 2787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", " 2789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "which is not imported by \"foo.proto\". To use it here, please add the " 2790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "necessary import.\n"); 2791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, SearchMostLocalFirst) { 2794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The following should produce an error that Bar.Baz is not defined: 2795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Bar { message Baz {} } 2796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Foo { 2797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Bar { 2798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // Placing "message Baz{}" here, or removing Foo.Bar altogether, 2799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // // would fix the error. 2800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 2801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // optional Bar.Baz baz = 1; 2802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 2803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // An one point the lookup code incorrectly did not produce an error in this 2804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // case, because when looking for Bar.Baz, it would try "Foo.Bar.Baz" first, 2805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fail, and ten try "Bar.Baz" and succeed, even though "Bar" should actually 2806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // refer to the inner Bar, not the outer one. 2807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 2811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " nested_type { name: \"Baz\" }" 2812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 2813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " nested_type { name: \"Bar\" }" 2816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"baz\" number:1 label:LABEL_OPTIONAL" 2817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Bar.Baz\" }" 2818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.baz: TYPE: \"Bar.Baz\" is not defined.\n"); 2821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, SearchMostLocalFirst2) { 2824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This test would find the most local "Bar" first, and does, but 2825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // proceeds to find the outer one because the inner one's not an 2826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // aggregate. 2827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 2828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 2831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " nested_type { name: \"Baz\" }" 2832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 2833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"Bar\" number:1 type:TYPE_BYTES } " 2836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"baz\" number:2 label:LABEL_OPTIONAL" 2837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Bar.Baz\" }" 2838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 2839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, PackageOriginallyDeclaredInTransitiveDependent) { 2842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Imagine we have the following: 2843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 2844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // foo.proto: 2845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package foo.bar; 2846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // bar.proto: 2847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package foo.bar; 2848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // import "foo.proto"; 2849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Bar {} 2850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // baz.proto: 2851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // package foo; 2852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // import "bar.proto" 2853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message Baz { optional bar.Bar qux = 1; } 2854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 2855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // When validating baz.proto, we will look up "bar.Bar". As part of this 2856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // lookup, we first lookup "bar" then try to find "Bar" within it. "bar" 2857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // should resolve to "foo.bar". Note, though, that "foo.bar" was originally 2858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // defined in foo.proto, which is not a direct dependency of baz.proto. The 2859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implementation of FindSymbol() normally only returns symbols in direct 2860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // dependencies, not indirect ones. This test insures that this does not 2861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // prevent it from finding "foo.bar". 2862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 2864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.bar\" "); 2866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 2867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 2868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.bar\" " 2869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"foo.proto\" " 2870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Bar\" }"); 2871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 2872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"baz.proto\" " 2873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo\" " 2874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"bar.proto\" " 2875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 2876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Baz\" " 2877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"qux\" number:1 label:LABEL_OPTIONAL " 2878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"bar.Bar\" }" 2879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 2880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldTypeNotAType) { 2883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL " 2888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\".Foo.bar\" }" 2889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"bar\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \".Foo.bar\" is not a type.\n"); 2893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, RelativeFieldTypeNotAType) { 2896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " nested_type {" 2900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 2901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"Baz\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }" 2902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 2903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL " 2905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Bar.Baz\" }" 2906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \"Bar.Baz\" is not a type.\n"); 2908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FieldTypeMayBeItsName) { 2911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 2912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 2915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 2916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"Bar\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" 2919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 2920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumFieldTypeIsMessage) { 2923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Bar\" } " 2926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_ENUM" 2929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Bar\" }" 2930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \"Bar\" is not an enum type.\n"); 2933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, MessageFieldTypeIsEnum) { 2936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " 2939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE" 2942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Bar\" }" 2943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: \"Bar\" is not a message type.\n"); 2946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, BadEnumDefaultValue) { 2949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " 2952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\"" 2955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " default_value:\"NO_SUCH_VALUE\" }" 2956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: DEFAULT_VALUE: Enum type \"Bar\" has no value named " 2959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"NO_SUCH_VALUE\".\n"); 2960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, PrimitiveWithTypeName) { 2963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" 2968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"Foo\" }" 2969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: Field with primitive type has type_name.\n"); 2972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NonPrimitiveWithoutTypeName) { 2975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 2978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 2979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE }" 2980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.foo: TYPE: Field with message or enum type missing " 2983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "type_name.\n"); 2984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InputTypeNotDefined) { 2987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 2988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 2989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 2990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 2991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 2992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }" 2993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 2994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not defined.\n"); 2996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 2997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InputTypeNotAMessage) { 2999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 3002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " 3003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 3004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 3005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }" 3006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not a message type.\n"); 3009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, OutputTypeNotDefined) { 3012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 3015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 3016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 3017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }" 3018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not defined.\n"); 3021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, OutputTypeNotAMessage) { 3024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 3027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " 3028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 3029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 3030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }" 3031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not a message type.\n"); 3034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, IllegalPackedField) { 3037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {\n" 3040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Foo\"" 3041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"packed_string\" number:1 label:LABEL_REPEATED " 3042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type:TYPE_STRING " 3043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option {" 3044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"packed\" is_extension: false }" 3045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"true\" }}}\n" 3046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"packed_message\" number:3 label:LABEL_REPEATED " 3047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: \"Foo\"" 3048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option {" 3049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"packed\" is_extension: false }" 3050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"true\" }}}\n" 3051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"optional_int32\" number: 4 label: LABEL_OPTIONAL " 3052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type:TYPE_INT32 " 3053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option {" 3054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"packed\" is_extension: false }" 3055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"true\" }}}\n" 3056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.packed_string: TYPE: [packed = true] can only be " 3059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "specified for repeated primitive fields.\n" 3060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.packed_message: TYPE: [packed = true] can only be " 3061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "specified for repeated primitive fields.\n" 3062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo.optional_int32: TYPE: [packed = true] can only be " 3063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "specified for repeated primitive fields.\n" 3064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ); 3065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, OptionWrongType) { 3068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 3071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\" " 3072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING " 3073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option { name { name_part: \"ctype\" " 3074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 3075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1 }" 3076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 3077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 3078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 3079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestMessage.foo: OPTION_VALUE: Value must be identifier for " 3081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum-valued option \"google.protobuf.FieldOptions.ctype\".\n"); 3082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, OptionExtendsAtomicType) { 3085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 3088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\" " 3089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING " 3090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option { name { name_part: \"ctype\" " 3091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 3092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"foo\" " 3093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true }" 3094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1 }" 3095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 3096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 3097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 3098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" is an " 3100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "atomic type, not a message.\n"); 3101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, DupOption) { 3104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 3107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\" " 3108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_UINT32 " 3109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option { name { name_part: \"ctype\" " 3110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 3111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"CORD\" }" 3112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { name { name_part: \"ctype\" " 3113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 3114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"CORD\" }" 3115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 3116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 3117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 3118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" was " 3120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "already set.\n"); 3121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, InvalidOptionName) { 3124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 3127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\" " 3128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL " 3129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option { " 3130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"uninterpreted_option\" " 3131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 3132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1 " 3133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 3134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 3135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 3136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 3137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestMessage.foo: OPTION_NAME: Option must not use " 3139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "reserved name \"uninterpreted_option\".\n"); 3140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, RepeatedOption) { 3143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_REPEATED " 3149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_FLOAT extendee: \"google.protobuf.FileOptions\" }" 3150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " double_value: 1.2 } }", 3153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_NAME: Option field \"(foo)\" is repeated. " 3155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Repeated options are not supported.\n"); 3156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, CustomOptionConflictingFieldNumber) { 3159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo1\" number: 7672757 label: LABEL_OPTIONAL " 3165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }" 3166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo2\" number: 7672757 label: LABEL_OPTIONAL " 3167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }", 3168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo2: NUMBER: Extension number 7672757 has already been used " 3170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "in \"google.protobuf.FieldOptions\" by extension \"foo1\".\n"); 3171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, Int32OptionValueOutOfPositiveRange) { 3174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" 3181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 0x80000000 } " 3184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value out of range " 3187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for int32 option \"foo\".\n"); 3188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, Int32OptionValueOutOfNegativeRange) { 3191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" 3198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " negative_int_value: -0x80000001 } " 3201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value out of range " 3204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for int32 option \"foo\".\n"); 3205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, Int32OptionValueIsNotPositiveInt) { 3208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" 3215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"5\" } }", 3218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be integer " 3220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for int32 option \"foo\".\n"); 3221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, Int64OptionValueOutOfRange) { 3224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }" 3231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 0x8000000000000000 } " 3234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value out of range " 3237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for int64 option \"foo\".\n"); 3238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, Int64OptionValueIsNotPositiveInt) { 3241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }" 3248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"5\" } }", 3251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be integer " 3253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for int64 option \"foo\".\n"); 3254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UInt32OptionValueOutOfRange) { 3257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }" 3264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 0x100000000 } }", 3267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value out of range " 3269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for uint32 option \"foo\".\n"); 3270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UInt32OptionValueIsNotPositiveInt) { 3273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }" 3280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " double_value: -5.6 } }", 3283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer " 3285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for uint32 option \"foo\".\n"); 3286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, UInt64OptionValueIsNotPositiveInt) { 3289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_UINT64 extendee: \"google.protobuf.FileOptions\" }" 3296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " negative_int_value: -5 } }", 3299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer " 3301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for uint64 option \"foo\".\n"); 3302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, FloatOptionValueIsNotNumber) { 3305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_FLOAT extendee: \"google.protobuf.FileOptions\" }" 3312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"bar\" } }", 3315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be number " 3317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for float option \"foo\".\n"); 3318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, DoubleOptionValueIsNotNumber) { 3321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_DOUBLE extendee: \"google.protobuf.FileOptions\" }" 3328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"bar\" } }", 3331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be number " 3333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for double option \"foo\".\n"); 3334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, BoolOptionValueIsNotTrueOrFalse) { 3337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_BOOL extendee: \"google.protobuf.FileOptions\" }" 3344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"bar\" } }", 3347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be \"true\" or \"false\" " 3349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for boolean option \"foo\".\n"); 3350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumOptionValueIsNotIdentifier) { 3353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } " 3359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name: \"BAZ\" number: 2 } }" 3360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_ENUM type_name: \"FooEnum\" " 3362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"google.protobuf.FileOptions\" }" 3363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"QUUX\" } }", 3366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be identifier for " 3368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum-valued option \"foo\".\n"); 3369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumOptionValueIsNotEnumValueName) { 3372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } " 3378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name: \"BAZ\" number: 2 } }" 3379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_ENUM type_name: \"FooEnum\" " 3381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"google.protobuf.FileOptions\" }" 3382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"QUUX\" } }", 3385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum\" has no value " 3387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "named \"QUUX\" for option \"foo\".\n"); 3388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, EnumOptionValueIsSiblingEnumValueName) { 3391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"FooEnum1\" value { name: \"BAR\" number: 1 } " 3397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name: \"BAZ\" number: 2 } }" 3398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name: \"FooEnum2\" value { name: \"QUX\" number: 1 } " 3399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name: \"QUUX\" number: 2 } }" 3400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_ENUM type_name: \"FooEnum1\" " 3402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"google.protobuf.FileOptions\" }" 3403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"QUUX\" } }", 3406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum1\" has no value " 3408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "named \"QUUX\" for option \"foo\". This appears to be a value from a " 3409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "sibling type.\n"); 3410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, StringOptionValueIsNotString) { 3413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " 3419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_STRING extendee: \"google.protobuf.FileOptions\" }" 3420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"foo\" " 3421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"QUUX\" } }", 3423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_VALUE: Value must be quoted string for " 3425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "string option \"foo\".\n"); 3426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, TryingToSetMessageValuedOption) { 3429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildDescriptorMessagesInTestPool(); 3430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"google/protobuf/descriptor.proto\" " 3434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { " 3435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\" " 3436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"baz\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING }" 3437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}" 3438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"bar\" number: 7672757 label: LABEL_OPTIONAL " 3439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_MESSAGE type_name: \"TestMessage\" " 3440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"google.protobuf.FileOptions\" }" 3441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { uninterpreted_option { name { name_part: \"bar\" " 3442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 3443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"QUUX\" } }", 3444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OPTION_NAME: Option field \"(bar)\" cannot be of " 3446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message type.\n"); 3447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NotLiteImportsLite) { 3450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 3452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { optimize_for: LITE_RUNTIME } "); 3453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"bar.proto\" ", 3457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: foo.proto: OTHER: Files that do not use optimize_for = " 3459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "LITE_RUNTIME cannot import files which do use this option. This file " 3460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "is not lite, but it imports \"bar.proto\" which is.\n"); 3461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, LiteExtendsNotLite) { 3464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 3466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type: {" 3467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Bar\"" 3468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start: 1 end: 1000 }" 3469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 3470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"bar.proto\" " 3474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { optimize_for: LITE_RUNTIME } " 3475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name: \"ext\" number: 123 label: LABEL_OPTIONAL " 3476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type: TYPE_INT32 extendee: \"Bar\" }", 3477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: ext: EXTENDEE: Extensions to non-lite types can only be " 3479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "declared in non-lite files. Note that you cannot extend a non-lite " 3480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "type to contain a lite type, but the reverse is allowed.\n"); 3481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, NoLiteServices) { 3484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options { optimize_for: LITE_RUNTIME } " 3487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service { name: \"Foo\" }", 3488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: Foo: NAME: Files with optimize_for = LITE_RUNTIME cannot " 3490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "define services.\n"); 3491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, RollbackAfterError) { 3494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Build a file which contains every kind of construct but references an 3495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // undefined type. All these constructs will be added to the symbol table 3496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // before the undefined type error is noticed. The DescriptorPool will then 3497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // have to roll everything back. 3498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFileWithErrors( 3499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 3502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }" 3503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "} " 3504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type {" 3505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestEnum\"" 3506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name:\"BAR\" number:1 }" 3507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "} " 3508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 3509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 3510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method {" 3511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"Baz\"" 3512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " input_type: \"NoSuchType\"" // error 3513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " output_type: \"TestMessage\"" 3514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 3515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 3516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo.proto: TestService.Baz: INPUT_TYPE: \"NoSuchType\" is not defined.\n"); 3518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Make sure that if we build the same file again with the error fixed, 3520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // it works. If the above rollback was incomplete, then some symbols will 3521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // be left defined, and this second attempt will fail since it tries to 3522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // re-define the same symbols. 3523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BuildFile( 3524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 3526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 3527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }" 3528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "} " 3529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type {" 3530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestEnum\"" 3531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name:\"BAR\" number:1 }" 3532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "} " 3533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 3534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 3535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name:\"Baz\"" 3536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " input_type:\"TestMessage\"" 3537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " output_type:\"TestMessage\" }" 3538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 3539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ValidationErrorTest, ErrorsReportedToLogError) { 3542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that errors are reported to GOOGLE_LOG(ERROR) if no error collector is 3543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // provided. 3544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 3546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 3547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } " 3549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name: \"Foo\" } ", 3550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &file_proto)); 3551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<string> errors; 3553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 3555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ScopedMemoryLog log; 3556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool_.BuildFile(file_proto) == NULL); 3557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville errors = log.GetMessages(ERROR); 3558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, errors.size()); 3561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Invalid proto descriptor for file \"foo.proto\":", errors[0]); 3563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(" Foo: \"Foo\" is already defined.", errors[1]); 3564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 3567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DescriptorDatabase 3568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic void AddToDatabase(SimpleDescriptorDatabase* database, 3570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* file_text) { 3571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_proto; 3572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); 3573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville database->Add(file_proto); 3574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DatabaseBackedPoolTest : public testing::Test { 3577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 3578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DatabaseBackedPoolTest() {} 3579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SimpleDescriptorDatabase database_; 3581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 3583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddToDatabase(&database_, 3584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"foo.proto\" " 3585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name:\"Foo\" extension_range { start: 1 end: 100 } } " 3586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type { name:\"TestEnum\" value { name:\"DUMMY\" number:0 } } " 3587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service { name:\"TestService\" } "); 3588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AddToDatabase(&database_, 3589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "name: \"bar.proto\" " 3590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"foo.proto\" " 3591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type { name:\"Bar\" } " 3592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name:\"foo_ext\" extendee: \".Foo\" number:5 " 3593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " label:LABEL_OPTIONAL type:TYPE_INT32 } "); 3594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We can't inject a file containing errors into a DescriptorPool, so we 3597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // need an actual mock DescriptorDatabase to test errors. 3598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class ErrorDescriptorDatabase : public DescriptorDatabase { 3599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 3600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorDescriptorDatabase() {} 3601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~ErrorDescriptorDatabase() {} 3602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implements DescriptorDatabase --------------------------------- 3604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileByName(const string& filename, 3605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 3606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // error.proto and error2.proto cyclically import each other. 3607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (filename == "error.proto") { 3608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->Clear(); 3609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->set_name("error.proto"); 3610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->add_dependency("error2.proto"); 3611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return true; 3612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else if (filename == "error2.proto") { 3613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->Clear(); 3614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->set_name("error2.proto"); 3615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output->add_dependency("error.proto"); 3616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return true; 3617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 3618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return false; 3619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingSymbol(const string& symbol_name, 3622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 3623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return false; 3624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingExtension(const string& containing_type, 3626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int field_number, 3627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 3628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return false; 3629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 3631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // A DescriptorDatabase that counts how many times each method has been 3633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // called and forwards to some other DescriptorDatabase. 3634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class CallCountingDatabase : public DescriptorDatabase { 3635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 3636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CallCountingDatabase(DescriptorDatabase* wrapped_db) 3637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville : wrapped_db_(wrapped_db) { 3638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Clear(); 3639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~CallCountingDatabase() {} 3641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorDatabase* wrapped_db_; 3643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int call_count_; 3645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void Clear() { 3647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville call_count_ = 0; 3648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implements DescriptorDatabase --------------------------------- 3651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileByName(const string& filename, 3652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 3653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++call_count_; 3654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return wrapped_db_->FindFileByName(filename, output); 3655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingSymbol(const string& symbol_name, 3657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 3658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++call_count_; 3659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return wrapped_db_->FindFileContainingSymbol(symbol_name, output); 3660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingExtension(const string& containing_type, 3662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int field_number, 3663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 3664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++call_count_; 3665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return wrapped_db_->FindFileContainingExtension( 3666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville containing_type, field_number, output); 3667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 3669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // A DescriptorDatabase which falsely always returns foo.proto when searching 3671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // for any symbol or extension number. This shouldn't cause the 3672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // DescriptorPool to reload foo.proto if it is already loaded. 3673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class FalsePositiveDatabase : public DescriptorDatabase { 3674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 3675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FalsePositiveDatabase(DescriptorDatabase* wrapped_db) 3676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville : wrapped_db_(wrapped_db) {} 3677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~FalsePositiveDatabase() {} 3678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorDatabase* wrapped_db_; 3680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implements DescriptorDatabase --------------------------------- 3682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileByName(const string& filename, 3683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 3684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return wrapped_db_->FindFileByName(filename, output); 3685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingSymbol(const string& symbol_name, 3687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 3688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return FindFileByName("foo.proto", output); 3689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool FindFileContainingExtension(const string& containing_type, 3691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int field_number, 3692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto* output) { 3693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return FindFileByName("foo.proto", output); 3694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 3696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 3697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindFileByName) { 3699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 3700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo = pool.FindFileByName("foo.proto"); 3702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 3703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo.proto", foo->name()); 3704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo->message_type_count()); 3705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", foo->message_type(0)->name()); 3706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo, pool.FindFileByName("foo.proto")); 3708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFileByName("no_such_file.proto") == NULL); 3710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindDependencyBeforeDependent) { 3713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 3714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo = pool.FindFileByName("foo.proto"); 3716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 3717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo.proto", foo->name()); 3718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo->message_type_count()); 3719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", foo->message_type(0)->name()); 3720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar = pool.FindFileByName("bar.proto"); 3722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar != NULL); 3723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar.proto", bar->name()); 3724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar->message_type_count()); 3725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Bar", bar->message_type(0)->name()); 3726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar->dependency_count()); 3728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo, bar->dependency(0)); 3729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindDependentBeforeDependency) { 3732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 3733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* bar = pool.FindFileByName("bar.proto"); 3735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(bar != NULL); 3736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar.proto", bar->name()); 3737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar->message_type_count()); 3738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ("Bar", bar->message_type(0)->name()); 3739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* foo = pool.FindFileByName("foo.proto"); 3741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 3742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo.proto", foo->name()); 3743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, foo->message_type_count()); 3744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ("Foo", foo->message_type(0)->name()); 3745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, bar->dependency_count()); 3747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(foo, bar->dependency(0)); 3748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindFileContainingSymbol) { 3751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 3752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.FindFileContainingSymbol("Foo"); 3754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 3755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo.proto", file->name()); 3756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(file, pool.FindFileByName("foo.proto")); 3757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFileContainingSymbol("NoSuchSymbol") == NULL); 3759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindMessageTypeByName) { 3762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 3763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* type = pool.FindMessageTypeByName("Foo"); 3765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(type != NULL); 3766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Foo", type->name()); 3767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(type->file(), pool.FindFileByName("foo.proto")); 3768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindMessageTypeByName("NoSuchType") == NULL); 3770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindExtensionByNumber) { 3773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 3774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo = pool.FindMessageTypeByName("Foo"); 3776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 3777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension = pool.FindExtensionByNumber(foo, 5); 3779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(extension != NULL); 3780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo_ext", extension->name()); 3781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(extension->file(), pool.FindFileByName("bar.proto")); 3782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindExtensionByNumber(foo, 12) == NULL); 3784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, FindAllExtensions) { 3787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database_); 3788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo = pool.FindMessageTypeByName("Foo"); 3790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 2; ++i) { 3792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Repeat the lookup twice, to check that we get consistent 3793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // results despite the fallback database lookup mutating the pool. 3794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<const FieldDescriptor*> extensions; 3795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pool.FindAllExtensions(foo, &extensions); 3796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, extensions.size()); 3797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, extensions[0]->number()); 3798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, ErrorWithoutErrorCollector) { 3802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorDescriptorDatabase error_database; 3803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&error_database); 3804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<string> errors; 3806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 3808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ScopedMemoryLog log; 3809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); 3810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville errors = log.GetMessages(ERROR); 3811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 3812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(errors.empty()); 3814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, ErrorWithErrorCollector) { 3817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorDescriptorDatabase error_database; 3818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector error_collector; 3819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&error_database, &error_collector); 3820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); 3822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 3823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "error.proto: error.proto: OTHER: File recursively imports itself: " 3824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "error.proto -> error2.proto -> error.proto\n" 3825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "error2.proto: error2.proto: OTHER: Import \"error.proto\" was not " 3826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "found or had errors.\n" 3827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "error.proto: error.proto: OTHER: Import \"error2.proto\" was not " 3828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "found or had errors.\n", 3829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville error_collector.text_); 3830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, UnittestProto) { 3833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try to load all of unittest.proto from a DescriptorDatabase. This should 3834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // thoroughly test all paths through DescriptorBuilder to insure that there 3835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // are no deadlocking problems when pool_->mutex_ is non-NULL. 3836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* original_file = 3837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes::descriptor()->file(); 3838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPoolDatabase database(*DescriptorPool::generated_pool()); 3840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&database); 3841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file_from_database = 3842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pool.FindFileByName(original_file->name()); 3843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file_from_database != NULL); 3845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto original_file_proto; 3847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville original_file->CopyTo(&original_file_proto); 3848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file_from_database_proto; 3850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_from_database->CopyTo(&file_from_database_proto); 3851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(original_file_proto.DebugString(), 3853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_from_database_proto.DebugString()); 3854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, DoesntRetryDbUnnecessarily) { 3857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Searching for a child of an existing descriptor should never fall back 3858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to the DescriptorDatabase even if it isn't found, because we know all 3859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // children are already loaded. 3860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CallCountingDatabase call_counter(&database_); 3861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&call_counter); 3862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.FindFileByName("foo.proto"); 3864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 3865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo = pool.FindMessageTypeByName("Foo"); 3866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 3867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* test_enum = pool.FindEnumTypeByName("TestEnum"); 3868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(test_enum != NULL); 3869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* test_service = pool.FindServiceByName("TestService"); 3870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(test_service != NULL); 3871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(0, call_counter.call_count_); 3873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville call_counter.Clear(); 3874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo->FindFieldByName("no_such_field") == NULL); 3876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo->FindExtensionByName("no_such_extension") == NULL); 3877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo->FindNestedTypeByName("NoSuchMessageType") == NULL); 3878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo->FindEnumTypeByName("NoSuchEnumType") == NULL); 3879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(foo->FindEnumValueByName("NO_SUCH_VALUE") == NULL); 3880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(test_enum->FindValueByName("NO_SUCH_VALUE") == NULL); 3881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(test_service->FindMethodByName("NoSuchMethod") == NULL); 3882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->FindMessageTypeByName("NoSuchMessageType") == NULL); 3884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->FindEnumTypeByName("NoSuchEnumType") == NULL); 3885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->FindEnumValueByName("NO_SUCH_VALUE") == NULL); 3886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->FindServiceByName("NO_SUCH_VALUE") == NULL); 3887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(file->FindExtensionByName("no_such_extension") == NULL); 3888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, call_counter.call_count_); 3889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, DoesntReloadFilesUncesessarily) { 3892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If FindFileContainingSymbol() or FindFileContainingExtension() return a 3893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // file that is already in the DescriptorPool, it should not attempt to 3894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // reload the file. 3895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FalsePositiveDatabase false_positive_database(&database_); 3896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector error_collector; 3897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&false_positive_database, &error_collector); 3898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // First make sure foo.proto is loaded. 3900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo = pool.FindMessageTypeByName("Foo"); 3901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 3902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try inducing false positives. 3904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindMessageTypeByName("NoSuchSymbol") == NULL); 3905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindExtensionByNumber(foo, 22) == NULL); 3906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // No errors should have been reported. (If foo.proto was incorrectly 3908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // loaded multiple times, errors would have been reported.) 3909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("", error_collector.text_); 3910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, DoesntReloadKnownBadFiles) { 3913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorDescriptorDatabase error_database; 3914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector error_collector; 3915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&error_database, &error_collector); 3916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); 3918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville error_collector.text_.clear(); 3919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); 3920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("", error_collector.text_); 3921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(DatabaseBackedPoolTest, DoesntFallbackOnWrongType) { 3924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If a lookup finds a symbol of the wrong type (e.g. we pass a type name 3925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to FindFieldByName()), we should fail fast, without checking the fallback 3926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // database. 3927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CallCountingDatabase call_counter(&database_); 3928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool(&call_counter); 3929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file = pool.FindFileByName("foo.proto"); 3931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(file != NULL); 3932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* foo = pool.FindMessageTypeByName("Foo"); 3933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(foo != NULL); 3934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* test_enum = pool.FindEnumTypeByName("TestEnum"); 3935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(test_enum != NULL); 3936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(0, call_counter.call_count_); 3938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville call_counter.Clear(); 3939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindMessageTypeByName("TestEnum") == NULL); 3941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindFieldByName("Foo") == NULL); 3942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindExtensionByName("Foo") == NULL); 3943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindEnumTypeByName("Foo") == NULL); 3944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindEnumValueByName("Foo") == NULL); 3945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindServiceByName("Foo") == NULL); 3946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool.FindMethodByName("Foo") == NULL); 3947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, call_counter.call_count_); 3949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 3950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3951d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// =================================================================== 3952d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 3953d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 3954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace descriptor_unittest 3955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 3956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 3957