31 #include <google/protobuf/arena.h>
38 #include <type_traits>
42 #include <google/protobuf/stubs/logging.h>
43 #include <google/protobuf/stubs/common.h>
44 #include <google/protobuf/arena_test_util.h>
45 #include <google/protobuf/test_util.h>
46 #include <google/protobuf/unittest.pb.h>
47 #include <google/protobuf/unittest_arena.pb.h>
48 #include <google/protobuf/io/coded_stream.h>
49 #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
50 #include <google/protobuf/descriptor.h>
51 #include <google/protobuf/extension_set.h>
52 #include <google/protobuf/message.h>
53 #include <google/protobuf/message_lite.h>
54 #include <google/protobuf/repeated_field.h>
55 #include <google/protobuf/unknown_field_set.h>
56 #include <google/protobuf/wire_format_lite.h>
57 #include <gtest/gtest.h>
58 #include <google/protobuf/stubs/strutil.h>
62 #include <google/protobuf/port_def.inc>
64 using proto2_arena_unittest::ArenaMessage;
65 using protobuf_unittest::TestAllExtensions;
66 using protobuf_unittest::TestAllTypes;
67 using protobuf_unittest::TestEmptyMessage;
68 using protobuf_unittest::TestOneof2;
83 class SimpleDataType {
99 class PleaseDontCopyMe {
111 class MustBeConstructedWithOneThroughFour {
119 const char*
const two_;
128 class MustBeConstructedWithOneThroughEight {
146 const char*
const two_;
150 const char*
const six_;
158 TEST(ArenaTest, ArenaConstructable) {
164 TEST(ArenaTest, DestructorSkippable) {
170 TEST(ArenaTest, BasicCreate) {
179 arena.Own(
new float);
180 arena.Own(
new double);
182 arena.Own<
int>(NULL);
184 SimpleDataType*
data = Arena::Create<SimpleDataType>(&
arena);
185 data->SetNotifier(¬ifier);
186 data =
new SimpleDataType;
187 data->SetNotifier(¬ifier);
193 TEST(ArenaTest, CreateAndConstCopy) {
202 TEST(ArenaTest, CreateAndNonConstCopy) {
211 TEST(ArenaTest, CreateAndMove) {
220 TEST(ArenaTest, CreateWithFourConstructorArguments) {
223 const PleaseDontCopyMe four(4);
224 const MustBeConstructedWithOneThroughFour* new_object =
225 Arena::Create<MustBeConstructedWithOneThroughFour>(&
arena, 1,
"2", three,
231 ASSERT_EQ(4, new_object->four_->value());
234 TEST(ArenaTest, CreateWithEightConstructorArguments) {
237 const PleaseDontCopyMe four(4);
240 const MustBeConstructedWithOneThroughEight* new_object =
241 Arena::Create<MustBeConstructedWithOneThroughEight>(
242 &
arena, 1,
"2", three, &four, 5,
"6", seven, eight);
247 ASSERT_EQ(4, new_object->four_->value());
266 TEST(ArenaTest, CreateWithMoveArguments) {
268 PleaseMoveMe one(
"1");
269 const PleaseMoveMe* new_object =
275 TEST(ArenaTest, InitialBlockTooSmall) {
278 for (
int size = 0;
size <= Arena::kBlockOverhead + 32;
size++) {
279 std::vector<char> arena_block(
size);
281 options.initial_block = arena_block.data();
282 options.initial_block_size = arena_block.size();
286 if ((
size % 2) != 0) {
292 char*
p = Arena::CreateArray<char>(&
arena, 96);
298 uintptr_t arena_end = arena_start + arena_block.size();
299 EXPECT_FALSE(allocation >= arena_start && allocation < arena_end);
308 TEST(ArenaTest, Parsing) {
309 TestAllTypes original;
314 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
315 arena_message->ParseFromString(original.SerializeAsString());
319 EXPECT_EQ(strlen(original.optional_string().c_str()),
320 strlen(arena_message->optional_string().c_str()));
324 TestAllTypes original;
330 TestEmptyMessage* arena_message =
331 Arena::CreateMessage<TestEmptyMessage>(&
arena);
332 arena_message->ParseFromString(original.SerializeAsString());
335 copied.ParseFromString(arena_message->SerializeAsString());
339 arena_message = Arena::CreateMessage<TestEmptyMessage>(&
arena);
340 arena_message->mutable_unknown_fields()->AddVarint(
341 TestAllTypes::kOptionalInt32FieldNumber, 42);
343 copied.ParseFromString(arena_message->SerializeAsString());
348 TestEmptyMessage* arena_message_2 =
349 Arena::CreateMessage<TestEmptyMessage>(&
arena);
350 arena_message_2->Swap(arena_message);
352 copied.ParseFromString(arena_message_2->SerializeAsString());
357 TestEmptyMessage* arena_message_3 =
358 Arena::CreateMessage<TestEmptyMessage>(&
arena);
359 arena_message_3->mutable_unknown_fields()->AddVarint(1000, 42);
360 arena_message_3->mutable_unknown_fields()->AddFixed32(1001, 42);
361 arena_message_3->mutable_unknown_fields()->AddFixed64(1002, 42);
362 arena_message_3->mutable_unknown_fields()->AddLengthDelimited(1003);
363 arena_message_3->mutable_unknown_fields()->DeleteSubrange(0, 2);
364 arena_message_3->mutable_unknown_fields()->DeleteByNumber(1002);
365 arena_message_3->mutable_unknown_fields()->DeleteByNumber(1003);
366 EXPECT_TRUE(arena_message_3->unknown_fields().empty());
372 TestAllTypes* arena1_message;
373 TestAllTypes* arena2_message;
377 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
378 arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
379 arena1_message->Swap(arena2_message);
380 EXPECT_EQ(&arena1, arena1_message->GetArena());
381 EXPECT_EQ(&arena2, arena2_message->GetArena());
384 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
385 arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
386 arena1_message->mutable_unknown_fields()->AddVarint(1, 42);
387 arena1_message->Swap(arena2_message);
388 EXPECT_EQ(&arena1, arena1_message->GetArena());
389 EXPECT_EQ(&arena2, arena2_message->GetArena());
390 EXPECT_EQ(0, arena1_message->unknown_fields().field_count());
391 EXPECT_EQ(1, arena2_message->unknown_fields().field_count());
392 EXPECT_EQ(42, arena2_message->unknown_fields().field(0).varint());
395 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
396 arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
397 arena1_message->mutable_unknown_fields()->AddVarint(1, 42);
398 arena2_message->mutable_unknown_fields()->AddVarint(2, 84);
399 arena1_message->Swap(arena2_message);
400 EXPECT_EQ(&arena1, arena1_message->GetArena());
401 EXPECT_EQ(&arena2, arena2_message->GetArena());
402 EXPECT_EQ(1, arena1_message->unknown_fields().field_count());
403 EXPECT_EQ(1, arena2_message->unknown_fields().field_count());
404 EXPECT_EQ(84, arena1_message->unknown_fields().field(0).varint());
405 EXPECT_EQ(42, arena2_message->unknown_fields().field(0).varint());
408 TEST(ArenaTest, ReflectionSwapFields) {
411 TestAllTypes* arena1_message;
412 TestAllTypes* arena2_message;
415 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
416 arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
418 const Reflection* reflection = arena1_message->GetReflection();
419 std::vector<const FieldDescriptor*>
fields;
420 reflection->ListFields(*arena1_message, &
fields);
421 reflection->SwapFields(arena1_message, arena2_message,
fields);
422 EXPECT_EQ(&arena1, arena1_message->GetArena());
423 EXPECT_EQ(&arena2, arena2_message->GetArena());
425 arena1_message->SerializeToString(&
output);
428 reflection->SwapFields(arena1_message, arena2_message,
fields);
429 arena2_message->SerializeToString(&
output);
434 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
435 arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
438 reflection->SwapFields(arena1_message, arena2_message,
fields);
439 EXPECT_EQ(&arena1, arena1_message->GetArena());
440 EXPECT_EQ(&arena2, arena2_message->GetArena());
445 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
448 TestAllTypes* arena3_message = Arena::CreateMessage<TestAllTypes>(&arena3);
450 reflection->SwapFields(arena1_message, arena3_message,
fields);
455 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
459 EXPECT_EQ(&arena1, arena1_message->GetArena());
461 arena1_message->SerializeToString(&
output);
466 TEST(ArenaTest, SetAllocatedMessage) {
468 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
469 TestAllTypes::NestedMessage*
nested =
new TestAllTypes::NestedMessage;
471 arena_message->set_allocated_optional_nested_message(
nested);
472 EXPECT_EQ(118, arena_message->optional_nested_message().bb());
475 TEST(ArenaTest, ReleaseMessage) {
477 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
478 arena_message->mutable_optional_nested_message()->set_bb(118);
479 std::unique_ptr<TestAllTypes::NestedMessage>
nested(
480 arena_message->release_optional_nested_message());
483 TestAllTypes::NestedMessage* released_null =
484 arena_message->release_optional_nested_message();
488 TEST(ArenaTest, SetAllocatedString) {
490 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
492 arena_message->set_allocated_optional_string(allocated_str);
493 EXPECT_EQ(
"hello", arena_message->optional_string());
496 TEST(ArenaTest, ReleaseString) {
498 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
499 arena_message->set_optional_string(
"hello");
500 std::unique_ptr<std::string> released_str(
501 arena_message->release_optional_string());
508 TEST(ArenaTest, SwapBetweenArenasWithAllFieldsSet) {
510 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
513 TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
515 arena2_message->Swap(arena1_message);
517 arena2_message->SerializeToString(&
output);
523 TEST(ArenaTest, SwapBetweenArenaAndNonArenaWithAllFieldsSet) {
524 TestAllTypes non_arena_message;
528 TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
530 arena2_message->Swap(&non_arena_message);
536 TEST(ArenaTest, UnsafeArenaSwap) {
538 TestAllTypes* message1 = Arena::CreateMessage<TestAllTypes>(&shared_arena);
539 TestAllTypes* message2 = Arena::CreateMessage<TestAllTypes>(&shared_arena);
541 message1->UnsafeArenaSwap(message2);
545 TEST(ArenaTest, SwapBetweenArenasUsingReflection) {
547 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
550 TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
552 const Reflection*
r = arena2_message->GetReflection();
553 r->Swap(arena1_message, arena2_message);
555 arena2_message->SerializeToString(&
output);
561 TEST(ArenaTest, SwapBetweenArenaAndNonArenaUsingReflection) {
562 TestAllTypes non_arena_message;
566 TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
568 const Reflection*
r = arena2_message->GetReflection();
569 r->Swap(&non_arena_message, arena2_message);
575 TEST(ArenaTest, ReleaseFromArenaMessageMakesCopy) {
576 TestAllTypes::NestedMessage* nested_msg = NULL;
580 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
581 arena_message->mutable_optional_nested_message()->set_bb(42);
582 *arena_message->mutable_optional_string() =
"Hello";
583 nested_msg = arena_message->release_optional_nested_message();
584 nested_string = arena_message->release_optional_string();
589 delete nested_string;
593 TEST(ArenaTest, ReleaseFromArenaMessageUsingReflectionMakesCopy) {
594 TestAllTypes::NestedMessage* nested_msg = NULL;
598 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
599 arena_message->mutable_optional_nested_message()->set_bb(42);
600 const Reflection*
r = arena_message->GetReflection();
602 "optional_nested_message");
603 nested_msg =
static_cast<TestAllTypes::NestedMessage*
>(
604 r->ReleaseMessage(arena_message, f));
609 #endif // PROTOBUF_RTTI
611 TEST(ArenaTest, SetAllocatedAcrossArenas) {
613 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
614 TestAllTypes::NestedMessage* heap_submessage =
615 new TestAllTypes::NestedMessage();
616 heap_submessage->set_bb(42);
617 arena1_message->set_allocated_optional_nested_message(heap_submessage);
619 EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message());
622 TestAllTypes::NestedMessage* arena2_submessage =
623 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
624 arena2_submessage->set_bb(42);
625 #ifdef PROTOBUF_HAS_DEATH_TEST
626 EXPECT_DEBUG_DEATH(arena1_message->set_allocated_optional_nested_message(
631 arena1_message->mutable_optional_nested_message());
634 TestAllTypes::NestedMessage* arena1_submessage =
635 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
636 arena1_submessage->set_bb(42);
637 TestAllTypes* heap_message =
new TestAllTypes;
638 #ifdef PROTOBUF_HAS_DEATH_TEST
640 heap_message->set_allocated_optional_nested_message(arena1_submessage),
643 EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message());
647 TEST(ArenaTest, UnsafeArenaSetAllocatedAcrossArenas) {
649 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
652 TestAllTypes::NestedMessage* arena2_submessage =
653 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
654 arena2_submessage->set_bb(42);
655 arena1_message->unsafe_arena_set_allocated_optional_nested_message(
658 arena1_message->mutable_optional_nested_message());
660 arena1_message->unsafe_arena_release_optional_nested_message());
663 TestAllTypes::NestedMessage* arena1_submessage =
664 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
665 arena1_submessage->set_bb(42);
666 TestAllTypes* heap_message =
new TestAllTypes;
667 heap_message->unsafe_arena_set_allocated_optional_nested_message(
669 EXPECT_EQ(arena1_submessage, heap_message->mutable_optional_nested_message());
671 heap_message->unsafe_arena_release_optional_nested_message());
675 TEST(ArenaTest, SetAllocatedAcrossArenasWithReflection) {
678 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
679 const Reflection*
r = arena1_message->GetReflection();
680 const Descriptor* d = arena1_message->GetDescriptor();
682 d->FindFieldByName(
"optional_nested_message");
683 TestAllTypes::NestedMessage* heap_submessage =
684 new TestAllTypes::NestedMessage();
685 heap_submessage->set_bb(42);
686 r->SetAllocatedMessage(arena1_message, heap_submessage, msg_field);
688 EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message());
691 TestAllTypes::NestedMessage* arena2_submessage =
692 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
693 arena2_submessage->set_bb(42);
694 #ifdef PROTOBUF_HAS_DEATH_TEST
696 r->SetAllocatedMessage(arena1_message, arena2_submessage, msg_field),
700 arena1_message->mutable_optional_nested_message());
703 TestAllTypes::NestedMessage* arena1_submessage =
704 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
705 arena1_submessage->set_bb(42);
706 TestAllTypes* heap_message =
new TestAllTypes;
707 #ifdef PROTOBUF_HAS_DEATH_TEST
709 r->SetAllocatedMessage(heap_message, arena1_submessage, msg_field),
712 EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message());
716 TEST(ArenaTest, UnsafeArenaSetAllocatedAcrossArenasWithReflection) {
719 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
720 const Reflection*
r = arena1_message->GetReflection();
721 const Descriptor* d = arena1_message->GetDescriptor();
723 d->FindFieldByName(
"optional_nested_message");
726 TestAllTypes::NestedMessage* arena2_submessage =
727 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
728 arena2_submessage->set_bb(42);
729 r->UnsafeArenaSetAllocatedMessage(arena1_message, arena2_submessage,
732 arena1_message->mutable_optional_nested_message());
734 arena1_message->unsafe_arena_release_optional_nested_message());
737 TestAllTypes::NestedMessage* arena1_submessage =
738 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
739 arena1_submessage->set_bb(42);
740 TestAllTypes* heap_message =
new TestAllTypes;
741 r->UnsafeArenaSetAllocatedMessage(heap_message, arena1_submessage, msg_field);
742 EXPECT_EQ(arena1_submessage, heap_message->mutable_optional_nested_message());
744 heap_message->unsafe_arena_release_optional_nested_message());
748 TEST(ArenaTest, AddAllocatedWithReflection) {
750 ArenaMessage* arena1_message = Arena::CreateMessage<ArenaMessage>(&arena1);
751 const Reflection*
r = arena1_message->GetReflection();
752 const Descriptor* d = arena1_message->GetDescriptor();
754 const FieldDescriptor* fd = d->FindFieldByName(
"repeated_nested_message");
755 r->AddMessage(arena1_message, fd);
756 r->AddMessage(arena1_message, fd);
757 r->AddMessage(arena1_message, fd);
758 EXPECT_EQ(3,
r->FieldSize(*arena1_message, fd));
761 TEST(ArenaTest, RepeatedPtrFieldAddClearedTest) {
762 #ifndef PROTOBUF_FUTURE_BREAKING_CHANGES
768 TestAllTypes* cleared =
new TestAllTypes();
773 #endif // !PROTOBUF_FUTURE_BREAKING_CHANGES
779 TestAllTypes* cleared =
new TestAllTypes();
786 TEST(ArenaTest, AddAllocatedToRepeatedField) {
789 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
790 for (
int i = 0;
i < 10;
i++) {
791 TestAllTypes::NestedMessage* heap_submessage =
792 new TestAllTypes::NestedMessage();
793 heap_submessage->set_bb(42);
794 arena1_message->mutable_repeated_nested_message()->AddAllocated(
797 EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(i));
798 EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
802 arena1_message->Clear();
803 for (
int i = 0;
i < 10;
i++) {
805 TestAllTypes::NestedMessage* arena2_submessage =
806 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
807 arena2_submessage->set_bb(42);
808 #ifdef PROTOBUF_HAS_DEATH_TEST
810 arena1_message->mutable_repeated_nested_message()->AddAllocated(
815 EXPECT_TRUE(arena1_message->repeated_nested_message().empty());
819 TestAllTypes* heap_message =
new TestAllTypes;
820 for (
int i = 0;
i < 10;
i++) {
822 TestAllTypes::NestedMessage* arena2_submessage =
823 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
824 arena2_submessage->set_bb(42);
825 #ifdef PROTOBUF_HAS_DEATH_TEST
827 heap_message->mutable_repeated_nested_message()->AddAllocated(
832 EXPECT_TRUE(heap_message->repeated_nested_message().empty());
837 arena1_message->Clear();
838 for (
int i = 0;
i < 10;
i++) {
840 arena1_message->mutable_repeated_string()->AddAllocated(s);
842 EXPECT_EQ(s, &arena1_message->repeated_string(i));
843 EXPECT_EQ(
"Test", arena1_message->repeated_string(i));
847 TEST(ArenaTest, UnsafeArenaAddAllocatedToRepeatedField) {
850 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
852 auto* heap_submessage =
new TestAllTypes::NestedMessage;
853 arena1_message->mutable_repeated_nested_message()->UnsafeArenaAddAllocated(
856 EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(0));
857 EXPECT_EQ(heap_submessage, arena1_message->mutable_repeated_nested_message()
858 ->UnsafeArenaReleaseLast());
859 delete heap_submessage;
863 arena1_message->Clear();
866 TestAllTypes::NestedMessage* arena2_submessage =
867 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
868 arena2_submessage->set_bb(42);
869 arena1_message->mutable_repeated_nested_message()->UnsafeArenaAddAllocated(
872 EXPECT_EQ(arena2_submessage, &arena1_message->repeated_nested_message(0));
874 arena1_message->mutable_repeated_nested_message()
875 ->UnsafeArenaReleaseLast());
879 TestAllTypes* heap_message =
new TestAllTypes;
882 TestAllTypes::NestedMessage* arena2_submessage =
883 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
884 arena2_submessage->set_bb(42);
885 heap_message->mutable_repeated_nested_message()->UnsafeArenaAddAllocated(
888 EXPECT_EQ(arena2_submessage, &heap_message->repeated_nested_message(0));
889 EXPECT_EQ(arena2_submessage, heap_message->mutable_repeated_nested_message()
890 ->UnsafeArenaReleaseLast());
895 arena1_message->Clear();
898 arena1_message->mutable_repeated_string()->UnsafeArenaAddAllocated(s);
900 EXPECT_EQ(s, &arena1_message->repeated_string(0));
901 EXPECT_EQ(
"Test", arena1_message->repeated_string(0));
902 delete arena1_message->mutable_repeated_string()->UnsafeArenaReleaseLast();
906 TEST(ArenaTest, AddAllocatedToRepeatedFieldViaReflection) {
909 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
910 const Reflection*
r = arena1_message->GetReflection();
911 const Descriptor* d = arena1_message->GetDescriptor();
912 const FieldDescriptor* fd = d->FindFieldByName(
"repeated_nested_message");
913 for (
int i = 0;
i < 10;
i++) {
914 TestAllTypes::NestedMessage* heap_submessage =
915 new TestAllTypes::NestedMessage;
916 heap_submessage->set_bb(42);
917 r->AddAllocatedMessage(arena1_message, fd, heap_submessage);
919 EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(i));
920 EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
924 arena1_message->Clear();
925 for (
int i = 0;
i < 10;
i++) {
927 TestAllTypes::NestedMessage* arena2_submessage =
928 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
929 arena2_submessage->set_bb(42);
930 #ifdef PROTOBUF_HAS_DEATH_TEST
932 r->AddAllocatedMessage(arena1_message, fd, arena2_submessage),
936 EXPECT_TRUE(arena1_message->repeated_nested_message().empty());
940 TestAllTypes* heap_message =
new TestAllTypes;
941 for (
int i = 0;
i < 10;
i++) {
943 TestAllTypes::NestedMessage* arena2_submessage =
944 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
945 arena2_submessage->set_bb(42);
946 #ifdef PROTOBUF_HAS_DEATH_TEST
948 r->AddAllocatedMessage(heap_message, fd, arena2_submessage),
952 EXPECT_TRUE(heap_message->repeated_nested_message().empty());
957 TEST(ArenaTest, ReleaseLastRepeatedField) {
961 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
962 for (
int i = 0;
i < 10;
i++) {
963 TestAllTypes::NestedMessage*
nested =
964 Arena::CreateMessage<TestAllTypes::NestedMessage>(&
arena);
966 arena_message->mutable_repeated_nested_message()->AddAllocated(
nested);
969 for (
int i = 0;
i < 10;
i++) {
970 const TestAllTypes::NestedMessage* orig_submessage =
971 &arena_message->repeated_nested_message(10 - 1 - i);
972 TestAllTypes::NestedMessage* released =
973 arena_message->mutable_repeated_nested_message()->ReleaseLast();
980 for (
int i = 0;
i < 10;
i++) {
981 TestAllTypes::NestedMessage*
nested =
982 Arena::CreateMessage<TestAllTypes::NestedMessage>(&
arena);
984 arena_message->mutable_repeated_nested_message()->AddAllocated(
nested);
987 for (
int i = 0;
i < 10;
i++) {
988 const TestAllTypes::NestedMessage* orig_submessage =
989 &arena_message->repeated_nested_message(10 - 1 - i);
990 TestAllTypes::NestedMessage* released =
991 arena_message->mutable_repeated_nested_message()
992 ->UnsafeArenaReleaseLast();
1003 arena_message->Clear();
1004 for (
int i = 0;
i < 10;
i++) {
1006 arena_message->mutable_repeated_string()->AddAllocated(s);
1008 for (
int i = 0;
i < 10;
i++) {
1010 &arena_message->repeated_string(10 - 1 - i);
1012 arena_message->mutable_repeated_string()->ReleaseLast();
1019 TEST(ArenaTest, UnsafeArenaAddAllocated) {
1021 TestAllTypes*
message = Arena::CreateMessage<TestAllTypes>(&
arena);
1022 for (
int i = 0;
i < 10;
i++) {
1024 message->mutable_repeated_string()->UnsafeArenaAddAllocated(arena_string);
1029 TEST(ArenaTest, OneofMerge) {
1031 TestAllTypes* message0 = Arena::CreateMessage<TestAllTypes>(&
arena);
1032 TestAllTypes* message1 = Arena::CreateMessage<TestAllTypes>(&
arena);
1034 message0->set_oneof_string(
"x");
1036 message1->set_oneof_string(
"y");
1038 EXPECT_EQ(
"x", message0->oneof_string());
1039 EXPECT_EQ(
"y", message1->oneof_string());
1040 message0->MergeFrom(*message1);
1041 EXPECT_EQ(
"y", message0->oneof_string());
1042 EXPECT_EQ(
"y", message1->oneof_string());
1045 TEST(ArenaTest, ArenaOneofReflection) {
1047 TestAllTypes*
message = Arena::CreateMessage<TestAllTypes>(&
arena);
1049 const Reflection* refl =
message->GetReflection();
1053 desc->FindFieldByName(
"oneof_nested_message");
1056 refl->SetString(
message, string_field,
"Test value");
1058 refl->ClearOneof(
message, oneof);
1063 refl->ClearOneof(
message, oneof);
1065 refl->MutableMessage(
message, msg_field);
1067 submsg = refl->ReleaseMessage(
message, msg_field);
1076 RepeatedPtrField<TestAllTypes> field1(arena1);
1077 RepeatedPtrField<TestAllTypes> field2(arena2);
1078 for (
int i = 0;
i < 10;
i++) {
1079 TestAllTypes*
t = Arena::CreateMessage<TestAllTypes>(arena1);
1080 t->set_optional_string(
"field1");
1081 t->set_optional_int32(i);
1082 if (arena1 != NULL) {
1083 field1.UnsafeArenaAddAllocated(t);
1085 field1.AddAllocated(t);
1088 for (
int i = 0;
i < 5;
i++) {
1089 TestAllTypes*
t = Arena::CreateMessage<TestAllTypes>(arena2);
1090 t->set_optional_string(
"field2");
1091 t->set_optional_int32(i);
1092 if (arena2 != NULL) {
1093 field2.UnsafeArenaAddAllocated(t);
1095 field2.AddAllocated(t);
1098 field1.Swap(&field2);
1104 for (
int i = 0;
i < field1.size();
i++) {
1105 EXPECT_EQ(i, field1.Get(i).optional_int32());
1107 for (
int i = 0;
i < field2.size();
i++) {
1108 EXPECT_EQ(i, field2.Get(i).optional_int32());
1112 TEST(ArenaTest, SwapRepeatedField) {
1117 TEST(ArenaTest, SwapRepeatedFieldWithDifferentArenas) {
1123 TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnRightHandSide) {
1128 TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnLeftHandSide) {
1133 TEST(ArenaTest, ExtensionsOnArena) {
1136 TestAllExtensions* message_ext =
1137 Arena::CreateMessage<TestAllExtensions>(&
arena);
1138 message_ext->SetExtension(protobuf_unittest::optional_int32_extension, 42);
1139 message_ext->SetExtension(protobuf_unittest::optional_string_extension,
1142 ->MutableExtension(protobuf_unittest::optional_nested_message_extension)
1146 TEST(ArenaTest, RepeatedFieldOnArena) {
1148 std::vector<char> arena_block(1024 * 1024);
1149 Arena arena(arena_block.data(), arena_block.size());
1152 internal::NoHeapChecker no_heap;
1157 RepeatedPtrField<TestAllTypes> repeated_message(&
arena);
1158 for (
int i = 0;
i < 100;
i++) {
1159 repeated_int32.Add(42);
1160 repeated_message.Add()->set_optional_int32(42);
1162 const TestAllTypes* msg_in_repeated_field = &repeated_message.Get(0);
1163 TestAllTypes*
msg = repeated_message.UnsafeArenaReleaseLast();
1169 for (
int i = 0;
i < 10;
i++) {
1170 repeated_message.Add()->set_optional_int32(42);
1172 TestAllTypes* extracted_messages[5];
1173 repeated_message.UnsafeArenaExtractSubrange(0, 5, extracted_messages);
1181 RepeatedPtrField<TestAllTypes> repeated_message(&
arena);
1182 for (
int i = 0;
i < 100;
i++) {
1183 repeated_message.Add()->set_optional_int32(42);
1186 TestAllTypes* extracted_messages[5];
1188 repeated_message.ExtractSubrange(0, 5, extracted_messages);
1191 for (
int i = 0;
i < 5;
i++) {
1192 delete extracted_messages[
i];
1193 extracted_messages[
i] = NULL;
1202 RepeatedPtrField<TestAllTypes>* repeated_ptr_on_arena =
1203 Arena::CreateMessage<RepeatedPtrField<TestAllTypes> >(&
arena);
1204 for (
int i = 0;
i < 10;
i++) {
1207 repeated_ptr_on_arena->Add();
1211 Arena::CreateMessage<RepeatedField<int> >(&
arena);
1212 for (
int i = 0;
i < 100;
i++) {
1213 repeated_int_on_arena->Add(i);
1223 TEST(ArenaTest, MutableMessageReflection) {
1225 TestAllTypes*
message = Arena::CreateMessage<TestAllTypes>(&
arena);
1226 const Reflection*
r =
message->GetReflection();
1229 TestAllTypes::NestedMessage* submessage =
1230 static_cast<TestAllTypes::NestedMessage*
>(
1232 TestAllTypes::NestedMessage* submessage_expected =
1233 message->mutable_optional_nested_message();
1235 EXPECT_EQ(submessage_expected, submessage);
1239 d->FindFieldByName(
"oneof_nested_message");
1240 submessage =
static_cast<TestAllTypes::NestedMessage*
>(
1241 r->MutableMessage(
message, oneof_field));
1242 submessage_expected =
message->mutable_oneof_nested_message();
1244 EXPECT_EQ(submessage_expected, submessage);
1247 #endif // PROTOBUF_RTTI
1252 message->set_optional_int32(42);
1253 message->set_optional_string(test_string);
1254 message->set_optional_bytes(test_string);
1255 message->mutable_optional_nested_message()->set_bb(42);
1257 message->set_oneof_uint32(42);
1258 message->mutable_oneof_nested_message()->set_bb(42);
1259 message->set_oneof_string(test_string);
1260 message->set_oneof_bytes(test_string);
1262 message->add_repeated_int32(42);
1264 message->add_repeated_nested_message()->set_bb(42);
1265 message->mutable_optional_lazy_message()->set_bb(42);
1269 TEST(ArenaTest, NoHeapAllocationsTest) {
1271 std::vector<char> arena_block(128 * 1024);
1273 options.initial_block = &arena_block[0];
1274 options.initial_block_size = arena_block.size();
1279 TestAllTypes*
message = Arena::CreateMessage<TestAllTypes>(&
arena);
1286 TEST(ArenaTest, ParseCorruptedString) {
1289 TestParseCorruptedString<TestAllTypes, true>(
message);
1290 TestParseCorruptedString<TestAllTypes, false>(
message);
1297 TEST(ArenaTest, MessageLiteOnArena) {
1298 std::vector<char> arena_block(128 * 1024);
1300 options.initial_block = &arena_block[0];
1301 options.initial_block_size = arena_block.size();
1303 const MessageLite* prototype = &TestAllTypes::default_instance();
1305 TestAllTypes initial_message;
1308 initial_message.SerializeToString(&serialized);
1315 EXPECT_TRUE(generic_message->ParseFromString(serialized));
1316 TestAllTypes* deserialized =
static_cast<TestAllTypes*
>(generic_message);
1317 EXPECT_EQ(42, deserialized->optional_int32());
1322 #endif // PROTOBUF_RTTI
1327 TEST(ArenaTest, RepeatedFieldWithNonPODType) {
1330 for (
int i = 0;
i < 100;
i++) {
1331 *field_on_heap.Add() =
"test string long enough to exceed inline buffer";
1337 for (
int i = 0;
i < 100;
i++) {
1338 *field_on_arena.Add() =
"test string long enough to exceed inline buffer";
1346 TEST(ArenaTest, SpaceAllocated_and_Used) {
1351 Arena::CreateArray<char>(&arena_1, 320);
1353 EXPECT_LE(320, arena_1.SpaceAllocated());
1358 std::vector<char> arena_block(1024);
1360 options.start_block_size = 256;
1361 options.max_block_size = 8192;
1362 options.initial_block = &arena_block[0];
1363 options.initial_block_size = arena_block.size();
1365 EXPECT_EQ(1024, arena_2.SpaceAllocated());
1368 Arena::CreateArray<char>(&arena_2, 55);
1369 EXPECT_EQ(1024, arena_2.SpaceAllocated());
1374 TEST(ArenaTest, BlockSizeDoubling) {
1380 Arena::CreateArray<char>(&
arena, 1);
1381 auto first_block_size =
arena.SpaceAllocated();
1384 while (
arena.SpaceAllocated() == first_block_size) {
1385 Arena::CreateArray<char>(&
arena, 1);
1388 auto second_block_size = (
arena.SpaceAllocated() - first_block_size);
1390 EXPECT_EQ(second_block_size, 2*first_block_size);
1393 TEST(ArenaTest, Alignment) {
1395 for (
int i = 0;
i < 200;
i++) {
1396 void* p = Arena::CreateArray<char>(&
arena, i);
1401 TEST(ArenaTest, BlockSizeSmallerThanAllocation) {
1402 for (
size_t i = 0;
i <= 8; ++
i) {
1404 opt.start_block_size = opt.max_block_size =
i;
1407 *Arena::Create<int64_t>(&
arena) = 42;
1411 *Arena::Create<int64_t>(&
arena) = 42;
1417 TEST(ArenaTest, GetArenaShouldReturnTheArenaForArenaAllocatedMessages) {
1419 ArenaMessage*
message = Arena::CreateMessage<ArenaMessage>(&
arena);
1420 const ArenaMessage* const_pointer_to_message =
message;
1431 TEST(ArenaTest, GetArenaShouldReturnNullForNonArenaAllocatedMessages) {
1433 const ArenaMessage* const_pointer_to_message = &
message;
1438 TEST(ArenaTest, GetArenaShouldReturnNullForNonArenaCompatibleTypes) {
1443 } has_get_arena_method_wrong_return_type;
1450 } has_get_arena_alias;
1457 } has_get_arena_data_member;
1461 TEST(ArenaTest, AddCleanup) {
1463 for (
int i = 0;
i < 100;
i++) {
1470 uint32_t hooks_num_allocations = 0;
1474 void ClearHookCounts() {
1476 hooks_num_allocations = 0;
1477 hooks_num_reset = 0;
1478 hooks_num_destruct = 0;
1483 class ArenaOptionsTestFriend final :
public internal::ArenaMetricsCollector {
1504 : ArenaMetricsCollector(record_allocs) {
1508 ++hooks_num_destruct;
1512 void OnAlloc(
const std::type_info* allocated_type,
1514 ++hooks_num_allocations;
1519 TEST(ArenaTest, ArenaHooksSanity) {
1528 Arena::Create<uint64_t>(&
arena);
1543 TEST(ArenaTest, ArenaHooksWhenAllocationsNotNeeded) {
1549 Arena::Create<uint64_t>(&
arena);
1557 #include <google/protobuf/port_undef.inc>