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