40 #include <google/protobuf/unittest.pb.h>
59 using internal::WireFormat;
86 unittest::TestEmptyMessage bizarro_message;
88 bizarro_message.mutable_unknown_fields();
122 for (
int i = 0;
i < 1000;
i++) {
125 ASSERT_LT(pos, unknown_fields_->field_count());
128 EXPECT_EQ(
i, unknown_fields_->field(pos++).number());
129 }
else if (
i == unknown_fields_->field(pos).number()) {
134 ASSERT_LT(pos, unknown_fields_->field_count());
135 EXPECT_EQ(
i, unknown_fields_->field(pos++).number());
139 EXPECT_EQ(unknown_fields_->field_count(), pos);
142 TEST_F(UnknownFieldSetTest, Varint) {
143 const UnknownField*
field = GetField(
"optional_int32");
150 TEST_F(UnknownFieldSetTest, Fixed32) {
151 const UnknownField*
field = GetField(
"optional_fixed32");
158 TEST_F(UnknownFieldSetTest, Fixed64) {
159 const UnknownField*
field = GetField(
"optional_fixed64");
166 TEST_F(UnknownFieldSetTest, LengthDelimited) {
167 const UnknownField*
field = GetField(
"optional_string");
171 EXPECT_EQ(all_fields_.optional_string(),
field->length_delimited());
174 TEST_F(UnknownFieldSetTest, Group) {
175 const UnknownField*
field = GetField(
"optionalgroup");
181 const UnknownField& nested_field =
field->group().field(0);
186 EXPECT_EQ(nested_field_descriptor->number(), nested_field.number());
188 EXPECT_EQ(all_fields_.optionalgroup().a(), nested_field.varint());
191 TEST_F(UnknownFieldSetTest, SerializeFastAndSlowAreEquivalent) {
196 slow_buffer.resize(
size);
197 fast_buffer.resize(
size);
201 empty_message_.unknown_fields(),
target);
207 io::CodedOutputStream output_stream(&raw_stream);
215 TEST_F(UnknownFieldSetTest, Serialize) {
220 empty_message_.SerializeToString(&
data);
227 TEST_F(UnknownFieldSetTest, ParseViaReflection) {
231 unittest::TestEmptyMessage
message;
232 io::ArrayInputStream
raw_input(all_fields_data_.data(),
233 all_fields_data_.size());
240 TEST_F(UnknownFieldSetTest, SerializeViaReflection) {
247 io::StringOutputStream raw_output(&
data);
248 io::CodedOutputStream
output(&raw_output);
260 unittest::TestEmptyMessage
message;
262 message.CopyFrom(empty_message_);
267 TEST_F(UnknownFieldSetTest, Swap) {
268 unittest::TestEmptyMessage other_message;
269 ASSERT_TRUE(other_message.ParseFromString(GetBizarroData()));
271 EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
272 EXPECT_GT(other_message.unknown_fields().field_count(), 0);
273 const std::string debug_string = empty_message_.DebugString();
274 const std::string other_debug_string = other_message.DebugString();
275 EXPECT_NE(debug_string, other_debug_string);
277 empty_message_.Swap(&other_message);
278 EXPECT_EQ(debug_string, other_message.DebugString());
279 EXPECT_EQ(other_debug_string, empty_message_.DebugString());
282 TEST_F(UnknownFieldSetTest, SwapWithSelf) {
283 const std::string debug_string = empty_message_.DebugString();
284 EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
286 empty_message_.Swap(&empty_message_);
287 EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
288 EXPECT_EQ(debug_string, empty_message_.DebugString());
292 unittest::TestEmptyMessage
source, destination;
294 destination.mutable_unknown_fields()->AddVarint(1, 1);
295 destination.mutable_unknown_fields()->AddVarint(3, 2);
296 source.mutable_unknown_fields()->AddVarint(2, 3);
297 source.mutable_unknown_fields()->AddVarint(3, 4);
299 destination.MergeFrom(
source);
308 destination.DebugString());
314 empty_message_.Clear();
315 EXPECT_EQ(0, unknown_fields_->field_count());
318 TEST_F(UnknownFieldSetTest, ClearAndFreeMemory) {
319 EXPECT_GT(unknown_fields_->field_count(), 0);
320 unknown_fields_->ClearAndFreeMemory();
321 EXPECT_EQ(0, unknown_fields_->field_count());
322 unknown_fields_->AddVarint(123456, 654321);
323 EXPECT_EQ(1, unknown_fields_->field_count());
326 TEST_F(UnknownFieldSetTest, ParseKnownAndUnknown) {
329 unittest::TestEmptyMessage
source;
330 source.mutable_unknown_fields()->AddVarint(123456, 654321);
334 unittest::TestAllTypes destination;
338 ASSERT_EQ(1, destination.unknown_fields().field_count());
340 destination.unknown_fields().field(0).type());
341 EXPECT_EQ(654321, destination.unknown_fields().field(0).varint());
344 TEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknown) {
348 unittest::TestAllTypes all_types_message;
349 unittest::TestEmptyMessage empty_message;
351 ASSERT_TRUE(all_types_message.ParseFromString(bizarro_data));
352 ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
356 EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString());
359 TEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknownViaReflection) {
362 unittest::TestAllTypes all_types_message;
363 unittest::TestEmptyMessage empty_message;
365 io::ArrayInputStream
raw_input(bizarro_data.data(), bizarro_data.size());
368 ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
370 EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString());
373 TEST_F(UnknownFieldSetTest, UnknownExtensions) {
377 unittest::TestEmptyMessageWithExtensions
message;
383 TEST_F(UnknownFieldSetTest, UnknownExtensionsReflection) {
386 unittest::TestEmptyMessageWithExtensions
message;
387 io::ArrayInputStream
raw_input(all_fields_data_.data(),
388 all_fields_data_.size());
395 TEST_F(UnknownFieldSetTest, WrongExtensionTypeTreatedAsUnknown) {
399 unittest::TestAllExtensions all_extensions_message;
400 unittest::TestEmptyMessage empty_message;
402 ASSERT_TRUE(all_extensions_message.ParseFromString(bizarro_data));
403 ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
407 EXPECT_EQ(empty_message.DebugString(), all_extensions_message.DebugString());
410 TEST_F(UnknownFieldSetTest, UnknownEnumValue) {
411 using unittest::TestAllExtensions;
412 using unittest::TestAllTypes;
413 using unittest::TestEmptyMessage;
425 TestEmptyMessage empty_message;
426 UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields();
427 unknown_fields->AddVarint(singular_field->number(), TestAllTypes::BAR);
428 unknown_fields->AddVarint(singular_field->number(), 5);
429 unknown_fields->AddVarint(
repeated_field->number(), TestAllTypes::FOO);
431 unknown_fields->AddVarint(
repeated_field->number(), TestAllTypes::BAZ);
433 empty_message.SerializeToString(&
data);
445 ASSERT_EQ(3, unknown_fields.field_count());
447 EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number());
449 EXPECT_EQ(5, unknown_fields.field(0).varint());
453 EXPECT_EQ(4, unknown_fields.field(1).varint());
457 EXPECT_EQ(6, unknown_fields.field(2).varint());
461 using unittest::optional_nested_enum_extension;
462 using unittest::repeated_nested_enum_extension;
467 message.GetExtension(optional_nested_enum_extension));
470 message.GetExtension(repeated_nested_enum_extension, 0));
472 message.GetExtension(repeated_nested_enum_extension, 1));
475 ASSERT_EQ(3, unknown_fields.field_count());
477 EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number());
479 EXPECT_EQ(5, unknown_fields.field(0).varint());
483 EXPECT_EQ(4, unknown_fields.field(1).varint());
487 EXPECT_EQ(6, unknown_fields.field(2).varint());
491 TEST_F(UnknownFieldSetTest, SpaceUsedExcludingSelf) {
493 empty.AddVarint(1, 0);
494 EXPECT_EQ(
sizeof(std::vector<UnknownField>) +
sizeof(UnknownField),
495 empty.SpaceUsedExcludingSelf());
498 TEST_F(UnknownFieldSetTest, SpaceUsed) {
499 unittest::TestEmptyMessage empty_message;
503 int base_size = empty_message.SpaceUsed();
504 UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields();
505 EXPECT_EQ(base_size, empty_message.SpaceUsed());
508 unknown_fields->AddVarint(1, 0);
509 EXPECT_LT(base_size, empty_message.SpaceUsed());
510 base_size = empty_message.SpaceUsed();
513 EXPECT_LT(base_size, empty_message.SpaceUsed());
514 base_size = empty_message.SpaceUsed();
517 EXPECT_LT(base_size, empty_message.SpaceUsed());
518 base_size = empty_message.SpaceUsed();
521 EXPECT_LT(base_size, empty_message.SpaceUsed());
522 base_size = empty_message.SpaceUsed();
524 group->AddVarint(1, 0);
525 EXPECT_LT(base_size, empty_message.SpaceUsed());
532 unknown_fields.AddVarint(6, 123);
534 unknown_fields.Clear();
538 TEST_F(UnknownFieldSetTest, DeleteSubrange) {
542 for (
int num = 0; num <=
size; ++num) {
546 for (
int i = 0;
i <
size; ++
i) {
547 unknown.AddFixed32(
i,
i);
550 unknown.DeleteSubrange(
start, num);
553 for (
int i = 0;
i < unknown.field_count(); ++
i) {
565 void CheckDeleteByNumber(
const std::vector<int>& field_numbers,
567 const std::vector<int>& expected_field_nubmers) {
569 for (
int i = 0;
i < field_numbers.size(); ++
i) {
570 unknown_fields.AddFixed32(field_numbers[
i],
i);
572 unknown_fields.DeleteByNumber(deleted_number);
573 ASSERT_EQ(expected_field_nubmers.size(), unknown_fields.field_count());
574 for (
int i = 0;
i < expected_field_nubmers.size(); ++
i) {
575 EXPECT_EQ(expected_field_nubmers[
i], unknown_fields.field(
i).number());
579 #define MAKE_VECTOR(x) std::vector<int>(x, x + GOOGLE_ARRAYSIZE(x))
580 TEST_F(UnknownFieldSetTest, DeleteByNumber) {
581 CheckDeleteByNumber(std::vector<int>(), 1, std::vector<int>());
582 static const int kTestFieldNumbers1[] = {1, 2, 3};
583 static const int kFieldNumberToDelete1 = 1;
584 static const int kExpectedFieldNumbers1[] = {2, 3};
585 CheckDeleteByNumber(
MAKE_VECTOR(kTestFieldNumbers1), kFieldNumberToDelete1,
587 static const int kTestFieldNumbers2[] = {1, 2, 3};
588 static const int kFieldNumberToDelete2 = 2;
589 static const int kExpectedFieldNumbers2[] = {1, 3};
590 CheckDeleteByNumber(
MAKE_VECTOR(kTestFieldNumbers2), kFieldNumberToDelete2,
592 static const int kTestFieldNumbers3[] = {1, 2, 3};
593 static const int kFieldNumberToDelete3 = 3;
594 static const int kExpectedFieldNumbers3[] = {1, 2};
595 CheckDeleteByNumber(
MAKE_VECTOR(kTestFieldNumbers3), kFieldNumberToDelete3,
597 static const int kTestFieldNumbers4[] = {1, 2, 1, 4, 1};
598 static const int kFieldNumberToDelete4 = 1;
599 static const int kExpectedFieldNumbers4[] = {2, 4};
600 CheckDeleteByNumber(
MAKE_VECTOR(kTestFieldNumbers4), kFieldNumberToDelete4,
602 static const int kTestFieldNumbers5[] = {1, 2, 3, 4, 5};
603 static const int kFieldNumberToDelete5 = 6;
604 static const int kExpectedFieldNumbers5[] = {1, 2, 3, 4, 5};
605 CheckDeleteByNumber(
MAKE_VECTOR(kTestFieldNumbers5), kFieldNumberToDelete5,