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#include <vector> 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <algorithm> 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/parser.h> 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/tokenizer.h> 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/zero_copy_stream_impl.h> 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.pb.h> 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/wire_format.h> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/text_format.h> 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest.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/testing/googletest.h> 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler { 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MockErrorCollector : public io::ErrorCollector { 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector() {} 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~MockErrorCollector() {} 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string text_; 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implements ErrorCollector --------------------------------------- 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void AddError(int line, int column, const string& message) { 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville line, column, message); 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MockValidationErrorCollector : public DescriptorPool::ErrorCollector { 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockValidationErrorCollector(const SourceLocationTable& source_locations, 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ErrorCollector* wrapped_collector) 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville : source_locations_(source_locations), 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville wrapped_collector_(wrapped_collector) {} 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~MockValidationErrorCollector() {} 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implements ErrorCollector --------------------------------------- 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void AddError(const string& filename, 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& element_name, 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message* descriptor, 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorLocation location, 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& message) { 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int line, column; 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville source_locations_.Find(descriptor, location, &line, &column); 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville wrapped_collector_->AddError(line, column, message); 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const SourceLocationTable& source_locations_; 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ErrorCollector* wrapped_collector_; 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ParserTest : public testing::Test { 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ParserTest() 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville : require_syntax_identifier_(false) {} 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Set up the parser to parse the given text. 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetupParser(const char* text) { 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raw_input_.reset(new io::ArrayInputStream(text, strlen(text))); 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville input_.reset(new io::Tokenizer(raw_input_.get(), &error_collector_)); 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser_.reset(new Parser()); 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser_->RecordErrorsTo(&error_collector_); 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser_->SetRequireSyntaxIdentifier(require_syntax_identifier_); 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse the input and expect that the resulting FileDescriptorProto matches 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the given output. The output is a FileDescriptorProto in protocol buffer 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // text format. 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectParsesTo(const char* input, const char* output) { 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetupParser(input); 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto actual, expected; 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser_->Parse(input_.get(), &actual); 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ("", error_collector_.text_); 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse the ASCII representation in order to canonicalize it. We could 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // just compare directly to actual.DebugString(), but that would require 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // that the caller precisely match the formatting that DebugString() 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // produces. 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString(output, &expected)); 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compare by comparing debug strings. 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TODO(kenton): Use differencer, once it is available. 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(expected.DebugString(), actual.DebugString()); 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse the text and expect that the given errors are reported. 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectHasErrors(const char* text, const char* expected_errors) { 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasEarlyExitErrors(text, expected_errors); 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Same as above but does not expect that the parser parses the complete 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // input. 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectHasEarlyExitErrors(const char* text, const char* expected_errors) { 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetupParser(text); 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file; 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser_->Parse(input_.get(), &file); 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(expected_errors, error_collector_.text_); 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse the text as a file and validate it (with a DescriptorPool), and 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // expect that the validation step reports the given errors. 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectHasValidationErrors(const char* text, 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* expected_errors) { 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetupParser(text); 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SourceLocationTable source_locations; 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser_->RecordSourceLocationsTo(&source_locations); 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file; 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file.set_name("foo.proto"); 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser_->Parse(input_.get(), &file); 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ("", error_collector_.text_); 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockValidationErrorCollector validation_error_collector( 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville source_locations, &error_collector_); 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool_.BuildFileCollectingErrors( 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file, &validation_error_collector) == NULL); 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(expected_errors, error_collector_.text_); 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector error_collector_; 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool_; 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville scoped_ptr<io::ZeroCopyInputStream> raw_input_; 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville scoped_ptr<io::Tokenizer> input_; 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville scoped_ptr<Parser> parser_; 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool require_syntax_identifier_; 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserTest, StopAfterSyntaxIdentifier) { 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetupParser( 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "// blah\n" 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "syntax = \"foobar\";\n" 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "this line will not be parsed\n"); 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser_->SetStopAfterSyntaxIdentifier(true); 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(parser_->Parse(input_.get(), NULL)); 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("", error_collector_.text_); 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foobar", parser_->GetSyntaxIdentifier()); 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserTest, StopAfterOmittedSyntaxIdentifier) { 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetupParser( 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "// blah\n" 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "this line will not be parsed\n"); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser_->SetStopAfterSyntaxIdentifier(true); 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(parser_->Parse(input_.get(), NULL)); 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("", error_collector_.text_); 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("", parser_->GetSyntaxIdentifier()); 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserTest, StopAfterSyntaxIdentifierWithErrors) { 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetupParser( 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "// blah\n" 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "syntax = error;\n"); 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser_->SetStopAfterSyntaxIdentifier(true); 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(parser_->Parse(input_.get(), NULL)); 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("1:9: Expected syntax identifier.\n", error_collector_.text_); 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseMessageTest; 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, SimpleMessage) { 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int32 foo = 1;\n" 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, ImplicitSyntaxIdentifier) { 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville require_syntax_identifier_ = false; 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int32 foo = 1;\n" 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, ExplicitSyntaxIdentifier) { 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "syntax = \"proto2\";\n" 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int32 foo = 1;\n" 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, ExplicitRequiredSyntaxIdentifier) { 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville require_syntax_identifier_ = true; 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "syntax = \"proto2\";\n" 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int32 foo = 1;\n" 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, SimpleFields) { 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int32 foo = 15;\n" 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 bar = 34;\n" 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " repeated int32 baz = 3;\n" 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:15 }" 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:34 }" 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"baz\" label:LABEL_REPEATED type:TYPE_INT32 number:3 }" 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, PrimitiveFieldTypes) { 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int32 foo = 1;\n" 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int64 foo = 1;\n" 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required uint32 foo = 1;\n" 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required uint64 foo = 1;\n" 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required sint32 foo = 1;\n" 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required sint64 foo = 1;\n" 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required fixed32 foo = 1;\n" 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required fixed64 foo = 1;\n" 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required sfixed32 foo = 1;\n" 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required sfixed64 foo = 1;\n" 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required float foo = 1;\n" 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required double foo = 1;\n" 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required string foo = 1;\n" 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required bytes foo = 1;\n" 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required bool foo = 1;\n" 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT64 number:1 }" 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT32 number:1 }" 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT64 number:1 }" 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT32 number:1 }" 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT64 number:1 }" 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED32 number:1 }" 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED64 number:1 }" 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED32 number:1 }" 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED64 number:1 }" 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FLOAT number:1 }" 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_DOUBLE number:1 }" 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_STRING number:1 }" 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BYTES number:1 }" 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BOOL number:1 }" 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, FieldDefaults) { 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int32 foo = 1 [default= 1 ];\n" 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int32 foo = 1 [default= -2 ];\n" 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int64 foo = 1 [default= 3 ];\n" 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int64 foo = 1 [default= -4 ];\n" 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required uint32 foo = 1 [default= 5 ];\n" 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required uint64 foo = 1 [default= 6 ];\n" 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required float foo = 1 [default= 7.5];\n" 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required float foo = 1 [default= -8.5];\n" 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required float foo = 1 [default= 9 ];\n" 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required double foo = 1 [default= 10.5];\n" 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required double foo = 1 [default=-11.5];\n" 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required double foo = 1 [default= 12 ];\n" 339d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " required double foo = 1 [default= inf ];\n" 340d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " required double foo = 1 [default=-inf ];\n" 341d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " required double foo = 1 [default= nan ];\n" 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required string foo = 1 [default='13\\001'];\n" 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required string foo = 1 [default='a' \"b\" \n \"c\"];\n" 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required bytes foo = 1 [default='14\\002'];\n" 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required bytes foo = 1 [default='a' \"b\" \n 'c'];\n" 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required bool foo = 1 [default=true ];\n" 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required Foo foo = 1 [default=FOO ];\n" 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int32 foo = 1 [default= 0x7FFFFFFF];\n" 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int32 foo = 1 [default=-0x80000000];\n" 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required uint32 foo = 1 [default= 0xFFFFFFFF];\n" 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int64 foo = 1 [default= 0x7FFFFFFFFFFFFFFF];\n" 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required int64 foo = 1 [default=-0x8000000000000000];\n" 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required uint64 foo = 1 [default= 0xFFFFFFFFFFFFFFFF];\n" 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " required double foo = 1 [default= 0xabcd];\n" 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define ETC "name:\"foo\" label:LABEL_REQUIRED number:1" 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_INT32 default_value:\"1\" "ETC" }" 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_INT32 default_value:\"-2\" "ETC" }" 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_INT64 default_value:\"3\" "ETC" }" 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_INT64 default_value:\"-4\" "ETC" }" 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_UINT32 default_value:\"5\" "ETC" }" 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_UINT64 default_value:\"6\" "ETC" }" 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_FLOAT default_value:\"7.5\" "ETC" }" 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_FLOAT default_value:\"-8.5\" "ETC" }" 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_FLOAT default_value:\"9\" "ETC" }" 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_DOUBLE default_value:\"10.5\" "ETC" }" 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_DOUBLE default_value:\"-11.5\" "ETC" }" 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_DOUBLE default_value:\"12\" "ETC" }" 373d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " field { type:TYPE_DOUBLE default_value:\"inf\" "ETC" }" 374d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " field { type:TYPE_DOUBLE default_value:\"-inf\" "ETC" }" 375d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " field { type:TYPE_DOUBLE default_value:\"nan\" "ETC" }" 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_STRING default_value:\"13\\001\" "ETC" }" 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_STRING default_value:\"abc\" "ETC" }" 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_BYTES default_value:\"14\\\\002\" "ETC" }" 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_BYTES default_value:\"abc\" "ETC" }" 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_BOOL default_value:\"true\" "ETC" }" 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type_name:\"Foo\" default_value:\"FOO\" "ETC" }" 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_INT32 default_value:\"2147483647\" "ETC" }" 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_INT32 default_value:\"-2147483648\" "ETC" }" 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_UINT32 default_value:\"4294967295\" "ETC" }" 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_INT64 default_value:\"9223372036854775807\" "ETC" }" 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_INT64 default_value:\"-9223372036854775808\" "ETC" }" 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_UINT64 default_value:\"18446744073709551615\" "ETC" }" 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { type:TYPE_DOUBLE default_value:\"43981\" "ETC" }" 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef ETC 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, FieldOptions) { 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional string foo = 1\n" 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " [ctype=CORD, (foo)=7, foo.(.bar.baz).qux.quux.(corge)=-33, \n" 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " (quux)=\"x\040y\", (baz.qux)=hey];\n" 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name: \"foo\" label: LABEL_OPTIONAL type: TYPE_STRING number: 1" 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { uninterpreted_option: { name { name_part: \"ctype\" " 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false } " 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"CORD\" }" 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option: { name { name_part: \"foo\" " 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 7 }" 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option: { name { name_part: \"foo\" " 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false } " 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \".bar.baz\"" 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"qux\" " 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false } " 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"quux\" " 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false } " 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"corge\" " 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " negative_int_value: -33 }" 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option: { name { name_part: \"quux\" " 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"x y\" }" 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option: { name { name_part: \"baz.qux\" " 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: true } " 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"hey\" }" 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }" 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, Group) { 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional group TestGroup = 1 {};\n" 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " nested_type { name: \"TestGroup\" }" 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"testgroup\" label:LABEL_OPTIONAL number:1" 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type:TYPE_GROUP type_name: \"TestGroup\" }" 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, NestedMessage) { 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " message Nested {}\n" 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional Nested test_nested = 1;\n" 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " nested_type { name: \"Nested\" }" 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"test_nested\" label:LABEL_OPTIONAL number:1" 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: \"Nested\" }" 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, NestedEnum) { 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " enum NestedEnum {}\n" 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional NestedEnum test_enum = 1;\n" 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " enum_type { name: \"NestedEnum\" }" 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " field { name:\"test_enum\" label:LABEL_OPTIONAL number:1" 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name: \"NestedEnum\" }" 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, ExtensionRange) { 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extensions 10 to 19;\n" 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extensions 30 to max;\n" 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start:10 end:20 }" 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start:30 end:536870912 }" 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, CompoundExtensionRange) { 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extensions 2, 15, 9 to 11, 100 to max, 3;\n" 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start:2 end:3 }" 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start:15 end:16 }" 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start:9 end:12 }" 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start:100 end:536870912 }" 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension_range { start:3 end:4 }" 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, Extensions) { 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extend Extendee1 { optional int32 foo = 12; }\n" 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extend Extendee2 { repeated TestMessage bar = 22; }\n", 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12" 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"Extendee1\" } " 514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name:\"bar\" label:LABEL_REPEATED number:22" 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"TestMessage\" extendee: \"Extendee2\" }"); 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, ExtensionsInMessageScope) { 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extend Extendee1 { optional int32 foo = 12; }\n" 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extend Extendee2 { repeated TestMessage bar = 22; }\n" 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message_type {" 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestMessage\"" 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12" 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"Extendee1\" }" 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extension { name:\"bar\" label:LABEL_REPEATED number:22" 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"TestMessage\" extendee: \"Extendee2\" }" 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, MultipleExtensionsOneExtendee) { 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extend Extendee1 {\n" 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 foo = 12;\n" 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " repeated TestMessage bar = 22;\n" 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12" 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extendee: \"Extendee1\" } " 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension { name:\"bar\" label:LABEL_REPEATED number:22" 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " type_name:\"TestMessage\" extendee: \"Extendee1\" }"); 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseEnumTest; 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseEnumTest, SimpleEnum) { 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum TestEnum {\n" 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " FOO = 0;\n" 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type {" 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestEnum\"" 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name:\"FOO\" number:0 }" 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseEnumTest, Values) { 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum TestEnum {\n" 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " FOO = 13;\n" 567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " BAR = -10;\n" 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " BAZ = 500;\n" 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type {" 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestEnum\"" 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name:\"FOO\" number:13 }" 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name:\"BAR\" number:-10 }" 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name:\"BAZ\" number:500 }" 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseEnumTest, ValueOptions) { 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum TestEnum {\n" 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " FOO = 13;\n" 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " BAR = -10 [ (something.text) = 'abc' ];\n" 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " BAZ = 500 [ (something.text) = 'def', other = 1 ];\n" 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum_type {" 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestEnum\"" 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name: \"FOO\" number: 13 }" 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name: \"BAR\" number: -10 " 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { " 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"something.text\" is_extension: true } " 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"abc\" " 595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " value { name: \"BAZ\" number: 500 " 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " options { " 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"something.text\" is_extension: true } " 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"def\" " 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " uninterpreted_option { " 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name { name_part: \"other\" is_extension: false } " 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " positive_int_value: 1 " 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " } " 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseServiceTest; 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseServiceTest, SimpleService) { 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service TestService {\n" 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Foo(In) returns (Out);\n" 621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name:\"Foo\" input_type:\"In\" output_type:\"Out\" }" 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseServiceTest, Methods) { 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service TestService {\n" 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Foo(In1) returns (Out1);\n" 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Bar(In2) returns (Out2);\n" 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Baz(In3) returns (Out3);\n" 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service {" 638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " name: \"TestService\"" 639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name:\"Foo\" input_type:\"In1\" output_type:\"Out1\" }" 640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name:\"Bar\" input_type:\"In2\" output_type:\"Out2\" }" 641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " method { name:\"Baz\" input_type:\"In3\" output_type:\"Out3\" }" 642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// imports and packages 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseMiscTest; 649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMiscTest, ParseImport) { 651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "import \"foo/bar/baz.proto\";\n", 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"foo/bar/baz.proto\""); 654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMiscTest, ParseMultipleImports) { 657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "import \"foo.proto\";\n" 659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "import \"bar.proto\";\n" 660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "import \"baz.proto\";\n", 661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"foo.proto\"" 662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"bar.proto\"" 663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "dependency: \"baz.proto\""); 664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMiscTest, ParsePackage) { 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package foo.bar.baz;\n", 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.bar.baz\""); 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMiscTest, ParsePackageWithSpaces) { 673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package foo . bar. \n" 675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " baz;\n", 676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package: \"foo.bar.baz\""); 677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// options 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMiscTest, ParseFileOptions) { 683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectParsesTo( 684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "option java_package = \"com.google.foo\";\n" 685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "option optimize_for = CODE_SIZE;", 686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "options {" 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "uninterpreted_option { name { name_part: \"java_package\" " 689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " string_value: \"com.google.foo\"} " 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "uninterpreted_option { name { name_part: \"optimize_for\" " 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " is_extension: false }" 693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " identifier_value: \"CODE_SIZE\" } " 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}"); 695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Error tests 699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// There are a very large number of possible errors that the parser could 701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// report, so it's infeasible to test every single one of them. Instead, 702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// we test each unique call to AddError() in parser.h. This does not mean 703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// we are testing every possible error that Parser can generate because 704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// each variant of the Consume() helper only counts as one unique call to 705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// AddError(). 706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseErrorTest; 708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MissingSyntaxIdentifier) { 710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville require_syntax_identifier_ = true; 711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasEarlyExitErrors( 712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {}", 713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:0: File must begin with 'syntax = \"proto2\";'.\n"); 714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("", parser_->GetSyntaxIdentifier()); 715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, UnknownSyntaxIdentifier) { 718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasEarlyExitErrors( 719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "syntax = \"no_such_syntax\";", 720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:9: Unrecognized syntax identifier \"no_such_syntax\". This parser " 721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "only recognizes \"proto2\".\n"); 722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("no_such_syntax", parser_->GetSyntaxIdentifier()); 723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, SimpleSyntaxError) { 726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage @#$ { blah }", 728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:20: Expected \"{\".\n"); 729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); 730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ExpectedTopLevel) { 733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "blah;", 735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:0: Expected top-level statement (e.g. \"message\").\n"); 736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, UnmatchedCloseBrace) { 739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This used to cause an infinite loop. Doh. 740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}", 742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:0: Expected top-level statement (e.g. \"message\").\n" 743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:0: Unmatched \"}\".\n"); 744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Message errors 748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MessageMissingName) { 750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message {}", 752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:8: Expected message name.\n"); 753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MessageMissingBody) { 756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage;", 758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:19: Expected \"{\".\n"); 759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, EofInMessage) { 762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {", 764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:21: Reached end of input in message definition (missing '}').\n"); 765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MissingFieldNumber) { 768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 foo;\n" 771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:20: Missing field number.\n"); 773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ExpectedFieldNumber) { 776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 foo = ;\n" 779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:23: Expected field number.\n"); 781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, FieldNumberOutOfRange) { 784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 foo = 0x100000000;\n" 787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:23: Integer out of range.\n"); 789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MissingLabel) { 792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " int32 foo = 1;\n" 795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:2: Expected \"required\", \"optional\", or \"repeated\".\n"); 797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ExpectedOptionName) { 800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional uint32 foo = 1 [];\n" 803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:27: Expected identifier.\n"); 805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, NonExtensionOptionNameBeginningWithDot) { 808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional uint32 foo = 1 [.foo=1];\n" 811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:27: Expected identifier.\n"); 813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueTypeMismatch) { 816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional uint32 foo = 1 [default=true];\n" 819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:35: Expected integer.\n"); 821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueNotBoolean) { 824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional bool foo = 1 [default=blah];\n" 827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:33: Expected \"true\" or \"false\".\n"); 829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueNotString) { 832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional string foo = 1 [default=1];\n" 835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:35: Expected string.\n"); 837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueUnsignedNegative) { 840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional uint32 foo = 1 [default=-1];\n" 843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:36: Unsigned field can't have negative default value.\n"); 845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueTooLarge) { 848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 foo = 1 [default= 0x80000000];\n" 851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 foo = 1 [default=-0x80000001];\n" 852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional uint32 foo = 1 [default= 0x100000000];\n" 853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int64 foo = 1 [default= 0x80000000000000000];\n" 854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int64 foo = 1 [default=-0x80000000000000001];\n" 855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional uint64 foo = 1 [default= 0x100000000000000000];\n" 856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:36: Integer out of range.\n" 858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "2:36: Integer out of range.\n" 859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "3:36: Integer out of range.\n" 860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "4:36: Integer out of range.\n" 861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "5:36: Integer out of range.\n" 862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "6:36: Integer out of range.\n"); 863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueMissing) { 866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional uint32 foo = 1 [default=];\n" 869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:35: Expected integer.\n"); 871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueForGroup) { 874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional group Foo = 1 [default=blah] {}\n" 877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:34: Messages can't have default values.\n"); 879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DuplicateDefaultValue) { 882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional uint32 foo = 1 [default=1,default=2];\n" 885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:37: Already set option \"default\".\n"); 887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, GroupNotCapitalized) { 890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional group foo = 1 {}\n" 893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:17: Group names must start with a capital letter.\n"); 895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, GroupMissingBody) { 898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional group Foo = 1;\n" 901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:24: Missing group body.\n"); 903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ExtendingPrimitive) { 906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extend int32 { optional string foo = 4; }\n", 908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:7: Expected message type.\n"); 909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ErrorInExtension) { 912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Foo { extensions 100 to 199; }\n" 914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extend Foo { optional string foo; }\n", 915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:32: Missing field number.\n"); 916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MultipleParseErrors) { 919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // When a statement has a parse error, the parser should be able to continue 920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // parsing at the next statement. 921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message TestMessage {\n" 923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 foo;\n" 924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " !invalid statement ending in a block { blah blah { blah } blah }\n" 925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 bar = 3 {}\n" 926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:20: Missing field number.\n" 928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "2:2: Expected \"required\", \"optional\", or \"repeated\".\n" 929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "2:2: Expected type name.\n" 930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "3:25: Expected \";\".\n"); 931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Enum errors 935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, EofInEnum) { 937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum TestEnum {", 939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:15: Reached end of input in enum definition (missing '}').\n"); 940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, EnumValueMissingNumber) { 943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum TestEnum {\n" 945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " FOO;\n" 946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:5: Missing numeric value for enum constant.\n"); 948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Service errors 952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, EofInService) { 954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service TestService {", 956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:21: Reached end of input in service definition (missing '}').\n"); 957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ServiceMethodPrimitiveParams) { 960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service TestService {\n" 962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Foo(int32) returns (string);\n" 963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:10: Expected message type.\n" 965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:26: Expected message type.\n"); 966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, EofInMethodOptions) { 969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service TestService {\n" 971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Foo(Bar) returns(Bar) {", 972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:29: Reached end of input in method options (missing '}').\n" 973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:29: Reached end of input in service definition (missing '}').\n"); 974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, PrimitiveMethodInput) { 977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service TestService {\n" 979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Foo(int32) returns(Bar);\n" 980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:10: Expected message type.\n"); 982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MethodOptionTypeError) { 985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This used to cause an infinite loop. 986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Baz {}\n" 988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service Foo {\n" 989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Bar(Baz) returns(Baz) { option invalid syntax; }\n" 990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "2:45: Expected \"=\".\n"); 992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Import and package errors 996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ImportNotQuoted) { 998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "import foo;\n", 1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:7: Expected a string naming the file to import.\n"); 1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MultiplePackagesInFile) { 1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasErrors( 1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package foo;\n" 1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package bar;\n", 1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:0: Multiple package definitions.\n"); 1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test that errors detected by DescriptorPool correctly report line and 1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// column numbers. We have one test for every call to RecordLocation() in 1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// parser.cc. 1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParserValidationErrorTest; 1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, PackageNameError) { 1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Create another file which defines symbol "foo". 1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto other_file; 1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville other_file.set_name("bar.proto"); 1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville other_file.add_message_type()->set_name("foo"); 1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(pool_.BuildFile(other_file) != NULL); 1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Now try to define it as a package. 1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "package foo.bar;", 1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:8: \"foo\" is already defined (as something other than a package) " 1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "in file \"bar.proto\".\n"); 1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, MessageNameError) { 1032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Foo {}\n" 1034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Foo {}\n", 1035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:8: \"Foo\" is already defined.\n"); 1036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldNameError) { 1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Foo {\n" 1041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 bar = 1;\n" 1042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 bar = 2;\n" 1043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "2:17: \"bar\" is already defined in \"Foo\".\n"); 1045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldTypeError) { 1048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Foo {\n" 1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional Baz bar = 1;\n" 1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:11: \"Baz\" is not defined.\n"); 1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldNumberError) { 1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Foo {\n" 1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 bar = 0;\n" 1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:23: Field numbers must be positive integers.\n"); 1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldExtendeeError) { 1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extend Baz { optional int32 bar = 1; }\n", 1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:7: \"Baz\" is not defined.\n"); 1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldDefaultValueError) { 1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum Baz { QUX = 1; }\n" 1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Foo {\n" 1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional Baz bar = 1 [default=NO_SUCH_VALUE];\n" 1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "2:32: Enum type \"Baz\" has no value named \"NO_SUCH_VALUE\".\n"); 1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FileOptionNameError) { 1079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "option foo = 5;", 1081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:7: Option \"foo\" unknown.\n"); 1082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FileOptionValueError) { 1085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "option java_outer_classname = 5;", 1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "0:30: Value must be quoted string for string option " 1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"google.protobuf.FileOptions.java_outer_classname\".\n"); 1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldOptionNameError) { 1092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Foo {\n" 1094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional bool bar = 1 [foo=1];\n" 1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:25: Option \"foo\" unknown.\n"); 1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldOptionValueError) { 1100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Foo {\n" 1102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " optional int32 bar = 1 [ctype=1];\n" 1103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:32: Value must be identifier for enum-valued option " 1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"google.protobuf.FieldOptions.ctype\".\n"); 1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, ExtensionRangeNumberError) { 1109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Foo {\n" 1111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " extensions 0;\n" 1112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 1113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:13: Extension numbers must be positive integers.\n"); 1114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, EnumNameError) { 1117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum Foo {A = 1;}\n" 1119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum Foo {B = 1;}\n", 1120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:5: \"Foo\" is already defined.\n"); 1121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, EnumValueNameError) { 1124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "enum Foo {\n" 1126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " BAR = 1;\n" 1127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " BAR = 1;\n" 1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 1129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "2:2: \"BAR\" is already defined.\n"); 1130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, ServiceNameError) { 1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service Foo {}\n" 1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service Foo {}\n", 1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:8: \"Foo\" is already defined.\n"); 1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, MethodNameError) { 1140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Baz {}\n" 1142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service Foo {\n" 1143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Bar(Baz) returns(Baz);\n" 1144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Bar(Baz) returns(Baz);\n" 1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "3:6: \"Bar\" is already defined in \"Foo\".\n"); 1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, MethodInputTypeError) { 1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Baz {}\n" 1152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service Foo {\n" 1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Bar(Qux) returns(Baz);\n" 1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 1155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "2:10: \"Qux\" is not defined.\n"); 1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, MethodOutputTypeError) { 1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectHasValidationErrors( 1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "message Baz {}\n" 1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "service Foo {\n" 1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " rpc Bar(Baz) returns(Qux);\n" 1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "2:23: \"Qux\" is not defined.\n"); 1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test that the output from FileDescriptor::DebugString() (and all other 1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// descriptor types) is parseable, and results in the same Descriptor 1170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// definitions again afoter parsing (not, however, that the order of messages 1171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// cannot be guaranteed to be the same) 1172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseDecriptorDebugTest; 1174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CompareDescriptorNames { 1176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 1177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool operator()(const DescriptorProto* left, const DescriptorProto* right) { 1178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return left->name() < right->name(); 1179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sorts nested DescriptorProtos of a DescriptoProto, by name. 1183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SortMessages(DescriptorProto *descriptor_proto) { 1184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int size = descriptor_proto->nested_type_size(); 1185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // recursively sort; we can't guarantee the order of nested messages either 1186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < size; ++i) { 1187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SortMessages(descriptor_proto->mutable_nested_type(i)); 1188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto **data = 1190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville descriptor_proto->mutable_nested_type()->mutable_data(); 1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville sort(data, data + size, CompareDescriptorNames()); 1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sorts DescriptorProtos belonging to a FileDescriptorProto, by name. 1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SortMessages(FileDescriptorProto *file_descriptor_proto) { 1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int size = file_descriptor_proto->message_type_size(); 1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // recursively sort; we can't guarantee the order of nested messages either 1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < size; ++i) { 1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SortMessages(file_descriptor_proto->mutable_message_type(i)); 1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorProto **data = 1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file_descriptor_proto->mutable_message_type()->mutable_data(); 1203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville sort(data, data + size, CompareDescriptorNames()); 1204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseDecriptorDebugTest, TestAllDescriptorTypes) { 1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* original_file = 1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes::descriptor()->file(); 1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto expected; 1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville original_file->CopyTo(&expected); 1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the DebugString of the unittest.proto FileDecriptor, which includes 1213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // all other descriptor types 1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string debug_string = original_file->DebugString(); 1215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse the debug string 1217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetupParser(debug_string.c_str()); 1218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto parsed; 1219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser_->Parse(input_.get(), &parsed); 1220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); 1221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ("", error_collector_.text_); 1222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We now have a FileDescriptorProto, but to compare with the expected we 1224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // need to link to a FileDecriptor, then output back to a proto. We'll 1225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // also need to give it the same name as the original. 1226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parsed.set_name("google/protobuf/unittest.proto"); 1227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We need the imported dependency before we can build our parsed proto 1228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* import = 1229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest_import::ImportMessage::descriptor()->file(); 1230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto import_proto; 1231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville import->CopyTo(&import_proto); 1232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(pool_.BuildFile(import_proto) != NULL); 1233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* actual = pool_.BuildFile(parsed); 1234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parsed.Clear(); 1235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville actual->CopyTo(&parsed); 1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(actual != NULL); 1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The messages might be in different orders, making them hard to compare. 1239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // So, sort the messages in the descriptor protos (including nested messages, 1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // recursively). 1241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SortMessages(&expected); 1242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SortMessages(&parsed); 1243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // I really wanted to use StringDiff here for the debug output on fail, 1245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // but the strings are too long for it, and if I increase its max size, 1246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // we get a memory allocation failure :( 1247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(expected.DebugString(), parsed.DebugString()); 1248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // anonymous namespace 1253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace compiler 1255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 1257