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