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 <google/protobuf/message.h> 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <sys/types.h> 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <sys/stat.h> 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <fcntl.h> 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef _MSC_VER 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <io.h> 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <unistd.h> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <sstream> 46d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#include <fstream> 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/zero_copy_stream_impl.h> 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/coded_stream.h> 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h> 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.pb.h> 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest.pb.h> 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/test_util.h> 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h> 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef O_BINARY 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef _O_BINARY 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define O_BINARY _O_BINARY 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define O_BINARY 0 // If this isn't defined, the platform doesn't need it. 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, SerializeHelpers) { 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TODO(kenton): Test more helpers? They're all two-liners so it seems 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // like a waste of time. 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes message; 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message); 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville stringstream stream; 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string str1("foo"); 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string str2("bar"); 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 81d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(message.SerializeToString(&str1)); 82d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(message.AppendToString(&str2)); 83d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(message.SerializeToOstream(&stream)); 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(str1.size() + 3, str2.size()); 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar", str2.substr(0, 3)); 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Don't use EXPECT_EQ because we don't want to dump raw binary data to 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // stdout. 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(str2.substr(3) == str1); 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // GCC gives some sort of error if we try to just do stream.str() == str1. 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string temp = stream.str(); 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(temp == str1); 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message.SerializeAsString() == str1); 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 99d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST(MessageTest, SerializeToBrokenOstream) { 100d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ofstream out; 101d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville protobuf_unittest::TestAllTypes message; 102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville message.set_optional_int32(123); 103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 104d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_FALSE(message.SerializeToOstream(&out)); 105d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 106d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, ParseFromFileDescriptor) { 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string filename = TestSourceDir() + 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "/google/protobuf/testdata/golden_message"; 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int file = open(filename.c_str(), O_RDONLY | O_BINARY); 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message.ParseFromFileDescriptor(file)); 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message); 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_GE(close(file), 0); 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, ParsePackedFromFileDescriptor) { 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string filename = 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestSourceDir() + 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "/google/protobuf/testdata/golden_packed_fields_message"; 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int file = open(filename.c_str(), O_RDONLY | O_BINARY); 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestPackedTypes message; 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message.ParseFromFileDescriptor(file)); 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectPackedFieldsSet(message); 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_GE(close(file), 0); 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, ParseHelpers) { 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TODO(kenton): Test more helpers? They're all two-liners so it seems 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // like a waste of time. 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string data; 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Set up. 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes message; 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message); 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.SerializeToString(&data); 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test ParseFromString. 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes message; 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message.ParseFromString(data)); 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message); 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test ParseFromIstream. 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes message; 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville stringstream stream(data); 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message.ParseFromIstream(&stream)); 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(stream.eof()); 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message); 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test ParseFromBoundedZeroCopyStream. 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string data_with_junk(data); 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville data_with_junk.append("some junk on the end"); 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayInputStream stream(data_with_junk.data(), data_with_junk.size()); 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes message; 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message.ParseFromBoundedZeroCopyStream(&stream, data.size())); 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message); 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that ParseFromBoundedZeroCopyStream fails (but doesn't crash) if 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // EOF is reached before the expected number of bytes. 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayInputStream stream(data.data(), data.size()); 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes message; 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE( 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.ParseFromBoundedZeroCopyStream(&stream, data.size() + 1)); 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, ParseFailsIfNotInitialized) { 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestRequired message; 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<string> errors; 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ScopedMemoryLog log; 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(message.ParseFromString("")); 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville errors = log.GetMessages(ERROR); 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, errors.size()); 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Can't parse message of type \"protobuf_unittest.TestRequired\" " 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "because it is missing required fields: a, b, c", 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville errors[0]); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, BypassInitializationCheckOnParse) { 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestRequired message; 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayInputStream raw_input(NULL, 0); 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::CodedInputStream input(&raw_input); 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message.MergePartialFromCodedStream(&input)); 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, InitializationErrorString) { 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestRequired message; 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("a, b, c", message.InitializationErrorString()); 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet. 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, SerializeFailsIfNotInitialized) { 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestRequired message; 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string data; 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DEBUG_DEATH(EXPECT_TRUE(message.SerializeToString(&data)), 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Can't serialize message of type \"protobuf_unittest.TestRequired\" because " 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "it is missing required fields: a, b, c"); 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, CheckInitialized) { 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestRequired message; 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DEATH(message.CheckInitialized(), 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Message of type \"protobuf_unittest.TestRequired\" is missing required " 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "fields: a, b, c"); 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GTEST_HAS_DEATH_TEST 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, BypassInitializationCheckOnSerialize) { 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestRequired message; 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayOutputStream raw_output(NULL, 0); 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::CodedOutputStream output(&raw_output); 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message.SerializePartialToCodedStream(&output)); 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, FindInitializationErrors) { 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestRequired message; 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<string> errors; 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.FindInitializationErrors(&errors); 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(3, errors.size()); 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("a", errors[0]); 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("b", errors[1]); 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("c", errors[2]); 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, ParseFailsOnInvalidMessageEnd) { 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Control case. 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message.ParseFromArray("", 0)); 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The byte is a valid varint, but not a valid tag (zero). 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(message.ParseFromArray("\0", 1)); 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The byte is a malformed varint. 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(message.ParseFromArray("\200", 1)); 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The byte is an endgroup tag, but we aren't parsing a group. 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(message.ParseFromArray("\014", 1)); 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageFactoryTest, GeneratedFactoryLookup) { 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageFactory::generated_factory()->GetPrototype( 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes::descriptor()), 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &protobuf_unittest::TestAllTypes::default_instance()); 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageFactoryTest, GeneratedFactoryUnknownType) { 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Construct a new descriptor. 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool pool; 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptorProto file; 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file.set_name("foo.proto"); 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville file.add_message_type()->set_name("Foo"); 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* descriptor = pool.BuildFile(file)->message_type(0); 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Trying to construct it should return NULL. 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE( 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageFactory::generated_factory()->GetPrototype(descriptor) == NULL); 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 282