1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This test is testing a lot more than just the UnknownFieldSet class.  It
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// tests handling of unknown fields throughout the system.
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unknown_field_set.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/coded_stream.h>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/zero_copy_stream_impl.h>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/wire_format.h>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest.pb.h>
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/test_util.h>
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h>
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h>
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/stl_util-inl.h>
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::WireFormat;
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass UnknownFieldSetTest : public testing::Test {
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected:
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void SetUp() {
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    descriptor_ = unittest::TestAllTypes::descriptor();
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestUtil::SetAllFields(&all_fields_);
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    all_fields_.SerializeToString(&all_fields_data_);
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_TRUE(empty_message_.ParseFromString(all_fields_data_));
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unknown_fields_ = empty_message_.mutable_unknown_fields();
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const UnknownField* GetField(const string& name) {
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field = descriptor_->FindFieldByName(name);
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (field == NULL) return NULL;
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < unknown_fields_->field_count(); i++) {
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (unknown_fields_->field(i).number() == field->number()) {
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        return &unknown_fields_->field(i);
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return NULL;
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Constructs a protocol buffer which contains fields with all the same
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // numbers as all_fields_data_ except that each field is some other wire
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // type.
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string GetBizarroData() {
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestEmptyMessage bizarro_message;
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    UnknownFieldSet* bizarro_unknown_fields =
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      bizarro_message.mutable_unknown_fields();
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < unknown_fields_->field_count(); i++) {
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const UnknownField& unknown_field = unknown_fields_->field(i);
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (unknown_field.type() == UnknownField::TYPE_VARINT) {
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        bizarro_unknown_fields->AddFixed32(unknown_field.number(), 1);
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      } else {
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        bizarro_unknown_fields->AddVarint(unknown_field.number(), 1);
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string data;
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(bizarro_message.SerializeToString(&data));
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return data;
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* descriptor_;
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestAllTypes all_fields_;
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string all_fields_data_;
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // An empty message that has been parsed from all_fields_data_.  So, it has
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // unknown fields of every type.
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessage empty_message_;
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  UnknownFieldSet* unknown_fields_;
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, AllFieldsPresent) {
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // All fields of TestAllTypes should be present, in numeric order (because
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // that's the order we parsed them in).  Fields that are not valid field
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // numbers of TestAllTypes should NOT be present.
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int pos = 0;
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < 1000; i++) {
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field = descriptor_->FindFieldByNumber(i);
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (field != NULL) {
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ASSERT_LT(pos, unknown_fields_->field_count());
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      EXPECT_EQ(i, unknown_fields_->field(pos++).number());
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (field->is_repeated()) {
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        // Should have a second instance.
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ASSERT_LT(pos, unknown_fields_->field_count());
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        EXPECT_EQ(i, unknown_fields_->field(pos++).number());
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(unknown_fields_->field_count(), pos);
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, Varint) {
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const UnknownField* field = GetField("optional_int32");
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(field != NULL);
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ(UnknownField::TYPE_VARINT, field->type());
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(all_fields_.optional_int32(), field->varint());
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, Fixed32) {
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const UnknownField* field = GetField("optional_fixed32");
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(field != NULL);
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ(UnknownField::TYPE_FIXED32, field->type());
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(all_fields_.optional_fixed32(), field->fixed32());
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, Fixed64) {
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const UnknownField* field = GetField("optional_fixed64");
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(field != NULL);
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ(UnknownField::TYPE_FIXED64, field->type());
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(all_fields_.optional_fixed64(), field->fixed64());
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, LengthDelimited) {
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const UnknownField* field = GetField("optional_string");
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(field != NULL);
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ(UnknownField::TYPE_LENGTH_DELIMITED, field->type());
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(all_fields_.optional_string(), field->length_delimited());
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, Group) {
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const UnknownField* field = GetField("optionalgroup");
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(field != NULL);
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ(UnknownField::TYPE_GROUP, field->type());
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ(1, field->group().field_count());
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const UnknownField& nested_field = field->group().field(0);
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* nested_field_descriptor =
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllTypes::OptionalGroup::descriptor()->FindFieldByName("a");
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(nested_field_descriptor != NULL);
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(nested_field_descriptor->number(), nested_field.number());
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ(UnknownField::TYPE_VARINT, nested_field.type());
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(all_fields_.optionalgroup().a(), nested_field.varint());
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, SerializeFastAndSlowAreEquivalent) {
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int size = WireFormat::ComputeUnknownFieldsSize(
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      empty_message_.unknown_fields());
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string slow_buffer;
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string fast_buffer;
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  slow_buffer.resize(size);
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  fast_buffer.resize(size);
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint8* target = reinterpret_cast<uint8*>(string_as_array(&fast_buffer));
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint8* result = WireFormat::SerializeUnknownFieldsToArray(
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          empty_message_.unknown_fields(), target);
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(size, result - target);
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::ArrayOutputStream raw_stream(string_as_array(&slow_buffer), size, 1);
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::CodedOutputStream output_stream(&raw_stream);
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    WireFormat::SerializeUnknownFields(empty_message_.unknown_fields(),
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                       &output_stream);
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_FALSE(output_stream.HadError());
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(fast_buffer == slow_buffer);
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, Serialize) {
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Check that serializing the UnknownFieldSet produces the original data
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // again.
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string data;
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  empty_message_.SerializeToString(&data);
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Don't use EXPECT_EQ because we don't want to dump raw binary data to
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // stdout.
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(data == all_fields_data_);
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, ParseViaReflection) {
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Make sure fields are properly parsed to the UnknownFieldSet when parsing
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // via reflection.
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessage message;
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  io::ArrayInputStream raw_input(all_fields_data_.data(),
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 all_fields_data_.size());
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  io::CodedInputStream input(&raw_input);
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message));
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(message.DebugString(), empty_message_.DebugString());
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, SerializeViaReflection) {
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Make sure fields are properly written from the UnknownFieldSet when
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // serializing via reflection.
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string data;
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::StringOutputStream raw_output(&data);
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::CodedOutputStream output(&raw_output);
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int size = WireFormat::ByteSize(empty_message_);
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    WireFormat::SerializeWithCachedSizes(empty_message_, size, &output);
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_FALSE(output.HadError());
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Don't use EXPECT_EQ because we don't want to dump raw binary data to
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // stdout.
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(data == all_fields_data_);
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, CopyFrom) {
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessage message;
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  message.CopyFrom(empty_message_);
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(empty_message_.DebugString(), message.DebugString());
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, Swap) {
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessage other_message;
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(other_message.ParseFromString(GetBizarroData()));
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_GT(other_message.unknown_fields().field_count(), 0);
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string debug_string = empty_message_.DebugString();
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string other_debug_string = other_message.DebugString();
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(debug_string, other_debug_string);
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  empty_message_.Swap(&other_message);
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(debug_string, other_message.DebugString());
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(other_debug_string, empty_message_.DebugString());
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, SwapWithSelf) {
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string debug_string = empty_message_.DebugString();
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  empty_message_.Swap(&empty_message_);
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(debug_string, empty_message_.DebugString());
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, MergeFrom) {
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessage source, destination;
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  destination.mutable_unknown_fields()->AddVarint(1, 1);
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  destination.mutable_unknown_fields()->AddVarint(3, 2);
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  source.mutable_unknown_fields()->AddVarint(2, 3);
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  source.mutable_unknown_fields()->AddVarint(3, 4);
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  destination.MergeFrom(source);
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Note:  The ordering of fields here depends on the ordering of adds
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    //   and merging, above.
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1: 1\n"
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "3: 2\n"
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "2: 3\n"
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "3: 4\n",
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    destination.DebugString());
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, Clear) {
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Clear the set.
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  empty_message_.Clear();
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(0, unknown_fields_->field_count());
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, ParseKnownAndUnknown) {
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Test mixing known and unknown fields when parsing.
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessage source;
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  source.mutable_unknown_fields()->AddVarint(123456, 654321);
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string data;
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(source.SerializeToString(&data));
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestAllTypes destination;
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(destination.ParseFromString(all_fields_data_ + data));
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ExpectAllFieldsSet(destination);
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ(1, destination.unknown_fields().field_count());
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ(UnknownField::TYPE_VARINT,
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            destination.unknown_fields().field(0).type());
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(654321, destination.unknown_fields().field(0).varint());
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknown) {
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Test that fields of the wrong wire type are treated like unknown fields
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // when parsing.
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestAllTypes all_types_message;
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessage empty_message;
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string bizarro_data = GetBizarroData();
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(all_types_message.ParseFromString(bizarro_data));
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // All fields should have been interpreted as unknown, so the debug strings
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // should be the same.
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString());
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknownViaReflection) {
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Same as WrongTypeTreatedAsUnknown but via the reflection interface.
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestAllTypes all_types_message;
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessage empty_message;
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string bizarro_data = GetBizarroData();
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  io::ArrayInputStream raw_input(bizarro_data.data(), bizarro_data.size());
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  io::CodedInputStream input(&raw_input);
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &all_types_message));
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString());
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, UnknownExtensions) {
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Make sure fields are properly parsed to the UnknownFieldSet even when
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // they are declared as extension numbers.
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessageWithExtensions message;
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(message.ParseFromString(all_fields_data_));
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(message.DebugString(), empty_message_.DebugString());
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, UnknownExtensionsReflection) {
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Same as UnknownExtensions except parsing via reflection.
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessageWithExtensions message;
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  io::ArrayInputStream raw_input(all_fields_data_.data(),
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 all_fields_data_.size());
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  io::CodedInputStream input(&raw_input);
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message));
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(message.DebugString(), empty_message_.DebugString());
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, WrongExtensionTypeTreatedAsUnknown) {
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Test that fields of the wrong wire type are treated like unknown fields
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // when parsing extensions.
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestAllExtensions all_extensions_message;
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessage empty_message;
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string bizarro_data = GetBizarroData();
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(all_extensions_message.ParseFromString(bizarro_data));
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // All fields should have been interpreted as unknown, so the debug strings
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // should be the same.
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(empty_message.DebugString(), all_extensions_message.DebugString());
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, UnknownEnumValue) {
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  using unittest::TestAllTypes;
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  using unittest::TestAllExtensions;
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  using unittest::TestEmptyMessage;
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* singular_field =
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestAllTypes::descriptor()->FindFieldByName("optional_nested_enum");
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* repeated_field =
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestAllTypes::descriptor()->FindFieldByName("repeated_nested_enum");
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(singular_field != NULL);
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(repeated_field != NULL);
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string data;
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestEmptyMessage empty_message;
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields();
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unknown_fields->AddVarint(singular_field->number(), TestAllTypes::BAR);
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unknown_fields->AddVarint(singular_field->number(), 5);  // not valid
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unknown_fields->AddVarint(repeated_field->number(), TestAllTypes::FOO);
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unknown_fields->AddVarint(repeated_field->number(), 4);  // not valid
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unknown_fields->AddVarint(repeated_field->number(), TestAllTypes::BAZ);
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unknown_fields->AddVarint(repeated_field->number(), 6);  // not valid
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    empty_message.SerializeToString(&data);
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestAllTypes message;
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_TRUE(message.ParseFromString(data));
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(TestAllTypes::BAR, message.optional_nested_enum());
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(2, message.repeated_nested_enum_size());
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(TestAllTypes::FOO, message.repeated_nested_enum(0));
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(TestAllTypes::BAZ, message.repeated_nested_enum(1));
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const UnknownFieldSet& unknown_fields = message.unknown_fields();
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(3, unknown_fields.field_count());
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number());
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(0).type());
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(5, unknown_fields.field(0).varint());
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(repeated_field->number(), unknown_fields.field(1).number());
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(1).type());
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(4, unknown_fields.field(1).varint());
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(repeated_field->number(), unknown_fields.field(2).number());
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(2).type());
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(6, unknown_fields.field(2).varint());
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  {
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    using unittest::optional_nested_enum_extension;
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    using unittest::repeated_nested_enum_extension;
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TestAllExtensions message;
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_TRUE(message.ParseFromString(data));
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(TestAllTypes::BAR,
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              message.GetExtension(optional_nested_enum_extension));
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(2, message.ExtensionSize(repeated_nested_enum_extension));
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(TestAllTypes::FOO,
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              message.GetExtension(repeated_nested_enum_extension, 0));
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(TestAllTypes::BAZ,
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              message.GetExtension(repeated_nested_enum_extension, 1));
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const UnknownFieldSet& unknown_fields = message.unknown_fields();
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(3, unknown_fields.field_count());
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number());
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(0).type());
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(5, unknown_fields.field(0).varint());
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(repeated_field->number(), unknown_fields.field(1).number());
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(1).type());
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(4, unknown_fields.field(1).varint());
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(repeated_field->number(), unknown_fields.field(2).number());
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(2).type());
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(6, unknown_fields.field(2).varint());
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, SpaceUsed) {
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestEmptyMessage empty_message;
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Make sure an unknown field set has zero space used until a field is
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // actually added.
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int base_size = empty_message.SpaceUsed();
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields();
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(base_size, empty_message.SpaceUsed());
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Make sure each thing we add to the set increases the SpaceUsed().
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unknown_fields->AddVarint(1, 0);
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_LT(base_size, empty_message.SpaceUsed());
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  base_size = empty_message.SpaceUsed();
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string* str = unknown_fields->AddLengthDelimited(1);
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_LT(base_size, empty_message.SpaceUsed());
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  base_size = empty_message.SpaceUsed();
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  str->assign(sizeof(string) + 1, 'x');
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_LT(base_size, empty_message.SpaceUsed());
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  base_size = empty_message.SpaceUsed();
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  UnknownFieldSet* group = unknown_fields->AddGroup(1);
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_LT(base_size, empty_message.SpaceUsed());
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  base_size = empty_message.SpaceUsed();
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  group->AddVarint(1, 0);
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_LT(base_size, empty_message.SpaceUsed());
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(UnknownFieldSetTest, Empty) {
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  UnknownFieldSet unknown_fields;
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(unknown_fields.empty());
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unknown_fields.AddVarint(6, 123);
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_FALSE(unknown_fields.empty());
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unknown_fields.Clear();
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(unknown_fields.empty());
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
513