38 #include <google/protobuf/unknown_field_set.h>
40 #include <unordered_set>
42 #include <google/protobuf/stubs/callback.h>
43 #include <google/protobuf/stubs/common.h>
44 #include <google/protobuf/stubs/logging.h>
45 #include <google/protobuf/test_util.h>
46 #include <google/protobuf/unittest.pb.h>
47 #include <google/protobuf/unittest_lite.pb.h>
48 #include <google/protobuf/io/coded_stream.h>
49 #include <google/protobuf/io/zero_copy_stream_impl.h>
50 #include <google/protobuf/descriptor.h>
51 #include <google/protobuf/stubs/mutex.h>
52 #include <google/protobuf/wire_format.h>
53 #include <google/protobuf/testing/googletest.h>
54 #include <gtest/gtest.h>
55 #include <google/protobuf/stubs/time.h>
56 #include <google/protobuf/stubs/stl_util.h>
61 using internal::WireFormat;
75 if (
field ==
nullptr)
return nullptr;
88 unittest::TestEmptyMessage bizarro_message;
90 bizarro_message.mutable_unknown_fields();
117 TEST_F(UnknownFieldSetTest, AllFieldsPresent) {
126 int non_oneof_count = 0;
133 std::unordered_set<uint32> unknown_tags;
134 for (
int i = 0;
i < unknown_fields_->field_count();
i++) {
135 unknown_tags.insert(unknown_fields_->field(i).number());
138 for (
uint32 t : unknown_tags) {
143 unknown_tags.
size());
170 TEST_F(UnknownFieldSetTest, LengthDelimited) {
175 EXPECT_EQ(all_fields_.optional_string(),
field->length_delimited());
190 EXPECT_EQ(nested_field_descriptor->number(), nested_field.number());
192 EXPECT_EQ(all_fields_.optionalgroup().a(), nested_field.varint());
195 TEST_F(UnknownFieldSetTest, SerializeFastAndSlowAreEquivalent) {
200 slow_buffer.resize(
size);
201 fast_buffer.resize(
size);
205 empty_message_.unknown_fields(),
target);
219 TEST_F(UnknownFieldSetTest, Serialize) {
224 empty_message_.SerializeToString(&
data);
231 TEST_F(UnknownFieldSetTest, ParseViaReflection) {
235 unittest::TestEmptyMessage
message;
236 io::ArrayInputStream
raw_input(all_fields_data_.data(),
237 all_fields_data_.size());
244 TEST_F(UnknownFieldSetTest, SerializeViaReflection) {
264 unittest::TestEmptyMessage
message;
266 message.CopyFrom(empty_message_);
272 unittest::TestEmptyMessage other_message;
273 ASSERT_TRUE(other_message.ParseFromString(GetBizarroData()));
275 EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
276 EXPECT_GT(other_message.unknown_fields().field_count(), 0);
277 const std::string debug_string = empty_message_.DebugString();
278 const std::string other_debug_string = other_message.DebugString();
279 EXPECT_NE(debug_string, other_debug_string);
281 empty_message_.Swap(&other_message);
282 EXPECT_EQ(debug_string, other_message.DebugString());
283 EXPECT_EQ(other_debug_string, empty_message_.DebugString());
286 TEST_F(UnknownFieldSetTest, SwapWithSelf) {
287 const std::string debug_string = empty_message_.DebugString();
288 EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
290 empty_message_.Swap(&empty_message_);
291 EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
292 EXPECT_EQ(debug_string, empty_message_.DebugString());
296 unittest::TestEmptyMessage source, destination;
298 destination.mutable_unknown_fields()->AddVarint(1, 1);
299 destination.mutable_unknown_fields()->AddVarint(3, 2);
300 source.mutable_unknown_fields()->AddVarint(2, 3);
301 source.mutable_unknown_fields()->AddVarint(3, 4);
303 destination.MergeFrom(source);
312 destination.DebugString());
315 TEST_F(UnknownFieldSetTest, MergeFromMessage) {
316 unittest::TestEmptyMessage source, destination;
318 destination.mutable_unknown_fields()->AddVarint(1, 1);
319 destination.mutable_unknown_fields()->AddVarint(3, 2);
320 source.mutable_unknown_fields()->AddVarint(2, 3);
321 source.mutable_unknown_fields()->AddVarint(3, 4);
323 destination.mutable_unknown_fields()->MergeFromMessage(source);
332 destination.DebugString());
335 TEST_F(UnknownFieldSetTest, MergeFromMessageLite) {
336 unittest::TestAllTypesLite source;
337 unittest::TestEmptyMessageLite destination;
339 source.set_optional_fixed32(42);
340 destination.ParseFromString(source.SerializeAsString());
343 EXPECT_TRUE(unknown_field_set.MergeFromMessage(destination));
344 EXPECT_EQ(unknown_field_set.field_count(), 1);
346 const UnknownField& unknown_field = unknown_field_set.field(0);
354 empty_message_.Clear();
355 EXPECT_EQ(0, unknown_fields_->field_count());
358 TEST_F(UnknownFieldSetTest, ClearAndFreeMemory) {
359 EXPECT_GT(unknown_fields_->field_count(), 0);
360 unknown_fields_->ClearAndFreeMemory();
361 EXPECT_EQ(0, unknown_fields_->field_count());
362 unknown_fields_->AddVarint(123456, 654321);
363 EXPECT_EQ(1, unknown_fields_->field_count());
366 TEST_F(UnknownFieldSetTest, ParseKnownAndUnknown) {
369 unittest::TestEmptyMessage source;
370 source.mutable_unknown_fields()->AddVarint(123456, 654321);
374 unittest::TestAllTypes destination;
378 ASSERT_EQ(1, destination.unknown_fields().field_count());
380 destination.unknown_fields().field(0).type());
381 EXPECT_EQ(654321, destination.unknown_fields().field(0).varint());
384 TEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknown) {
388 unittest::TestAllTypes all_types_message;
389 unittest::TestEmptyMessage empty_message;
391 ASSERT_TRUE(all_types_message.ParseFromString(bizarro_data));
392 ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
396 EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString());
399 TEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknownViaReflection) {
402 unittest::TestAllTypes all_types_message;
403 unittest::TestEmptyMessage empty_message;
405 io::ArrayInputStream
raw_input(bizarro_data.data(), bizarro_data.size());
408 ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
410 EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString());
413 TEST_F(UnknownFieldSetTest, UnknownExtensions) {
417 unittest::TestEmptyMessageWithExtensions
message;
423 TEST_F(UnknownFieldSetTest, UnknownExtensionsReflection) {
426 unittest::TestEmptyMessageWithExtensions
message;
427 io::ArrayInputStream
raw_input(all_fields_data_.data(),
428 all_fields_data_.size());
435 TEST_F(UnknownFieldSetTest, WrongExtensionTypeTreatedAsUnknown) {
439 unittest::TestAllExtensions all_extensions_message;
440 unittest::TestEmptyMessage empty_message;
442 ASSERT_TRUE(all_extensions_message.ParseFromString(bizarro_data));
443 ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
447 EXPECT_EQ(empty_message.DebugString(), all_extensions_message.DebugString());
450 TEST_F(UnknownFieldSetTest, UnknownEnumValue) {
451 using unittest::TestAllExtensions;
452 using unittest::TestAllTypes;
453 using unittest::TestEmptyMessage;
465 TestEmptyMessage empty_message;
466 UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields();
467 unknown_fields->AddVarint(singular_field->number(), TestAllTypes::BAR);
468 unknown_fields->AddVarint(singular_field->number(), 5);
469 unknown_fields->AddVarint(
repeated_field->number(), TestAllTypes::FOO);
471 unknown_fields->AddVarint(
repeated_field->number(), TestAllTypes::BAZ);
473 empty_message.SerializeToString(&
data);
485 ASSERT_EQ(3, unknown_fields.field_count());
487 EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number());
489 EXPECT_EQ(5, unknown_fields.field(0).varint());
493 EXPECT_EQ(4, unknown_fields.field(1).varint());
497 EXPECT_EQ(6, unknown_fields.field(2).varint());
501 using unittest::optional_nested_enum_extension;
502 using unittest::repeated_nested_enum_extension;
507 message.GetExtension(optional_nested_enum_extension));
510 message.GetExtension(repeated_nested_enum_extension, 0));
512 message.GetExtension(repeated_nested_enum_extension, 1));
515 ASSERT_EQ(3, unknown_fields.field_count());
517 EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number());
519 EXPECT_EQ(5, unknown_fields.field(0).varint());
523 EXPECT_EQ(4, unknown_fields.field(1).varint());
527 EXPECT_EQ(6, unknown_fields.field(2).varint());
531 TEST_F(UnknownFieldSetTest, SpaceUsedExcludingSelf) {
533 empty.AddVarint(1, 0);
535 empty.SpaceUsedExcludingSelf());
538 TEST_F(UnknownFieldSetTest, SpaceUsed) {
539 unittest::TestEmptyMessage empty_message;
543 size_t base_size = empty_message.SpaceUsedLong();
544 UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields();
545 EXPECT_EQ(base_size, empty_message.SpaceUsedLong());
548 unknown_fields->AddVarint(1, 0);
549 EXPECT_LT(base_size, empty_message.SpaceUsedLong());
550 base_size = empty_message.SpaceUsedLong();
553 EXPECT_LT(base_size, empty_message.SpaceUsedLong());
554 base_size = empty_message.SpaceUsedLong();
557 EXPECT_LT(base_size, empty_message.SpaceUsedLong());
558 base_size = empty_message.SpaceUsedLong();
561 EXPECT_LT(base_size, empty_message.SpaceUsedLong());
562 base_size = empty_message.SpaceUsedLong();
564 group->AddVarint(1, 0);
565 EXPECT_LT(base_size, empty_message.SpaceUsedLong());
572 unknown_fields.AddVarint(6, 123);
574 unknown_fields.Clear();
578 TEST_F(UnknownFieldSetTest, DeleteSubrange) {
586 for (
int i = 0;
i <
size; ++
i) {
587 unknown.AddFixed32(i, i);
593 for (
int i = 0;
i < unknown.field_count(); ++
i) {
595 EXPECT_EQ(i, unknown.field(i).fixed32());
605 void CheckDeleteByNumber(
const std::vector<int>& field_numbers,
607 const std::vector<int>& expected_field_nubmers) {
609 for (
int i = 0;
i < field_numbers.size(); ++
i) {
610 unknown_fields.AddFixed32(field_numbers[i], i);
612 unknown_fields.DeleteByNumber(deleted_number);
613 ASSERT_EQ(expected_field_nubmers.size(), unknown_fields.field_count());
614 for (
int i = 0;
i < expected_field_nubmers.size(); ++
i) {
615 EXPECT_EQ(expected_field_nubmers[i], unknown_fields.field(i).number());
619 #define MAKE_VECTOR(x) std::vector<int>(x, x + GOOGLE_ARRAYSIZE(x))
620 TEST_F(UnknownFieldSetTest, DeleteByNumber) {
621 CheckDeleteByNumber(std::vector<int>(), 1, std::vector<int>());
622 static const int kTestFieldNumbers1[] = {1, 2, 3};
623 static const int kFieldNumberToDelete1 = 1;
624 static const int kExpectedFieldNumbers1[] = {2, 3};
625 CheckDeleteByNumber(
MAKE_VECTOR(kTestFieldNumbers1), kFieldNumberToDelete1,
627 static const int kTestFieldNumbers2[] = {1, 2, 3};
628 static const int kFieldNumberToDelete2 = 2;
629 static const int kExpectedFieldNumbers2[] = {1, 3};
630 CheckDeleteByNumber(
MAKE_VECTOR(kTestFieldNumbers2), kFieldNumberToDelete2,
632 static const int kTestFieldNumbers3[] = {1, 2, 3};
633 static const int kFieldNumberToDelete3 = 3;
634 static const int kExpectedFieldNumbers3[] = {1, 2};
635 CheckDeleteByNumber(
MAKE_VECTOR(kTestFieldNumbers3), kFieldNumberToDelete3,
637 static const int kTestFieldNumbers4[] = {1, 2, 1, 4, 1};
638 static const int kFieldNumberToDelete4 = 1;
639 static const int kExpectedFieldNumbers4[] = {2, 4};
640 CheckDeleteByNumber(
MAKE_VECTOR(kTestFieldNumbers4), kFieldNumberToDelete4,
642 static const int kTestFieldNumbers5[] = {1, 2, 3, 4, 5};
643 static const int kFieldNumberToDelete5 = 6;
644 static const int kExpectedFieldNumbers5[] = {1, 2, 3, 4, 5};
645 CheckDeleteByNumber(
MAKE_VECTOR(kTestFieldNumbers5), kFieldNumberToDelete5,