37 #include <type_traits>
45 #include <google/protobuf/unittest.pb.h>
46 #include <google/protobuf/unittest_arena.pb.h>
47 #include <google/protobuf/unittest_no_arena.pb.h>
61 using proto2_arena_unittest::ArenaMessage;
62 using protobuf_unittest::TestAllExtensions;
63 using protobuf_unittest::TestAllTypes;
64 using protobuf_unittest::TestEmptyMessage;
65 using protobuf_unittest::TestOneof2;
66 using protobuf_unittest_no_arena::TestNoArenaMessage;
156 TEST(ArenaTest, ArenaConstructable) {
163 TEST(ArenaTest, DestructorSkippable) {
177 arena.Own(
new int32);
178 arena.Own(
new int64);
179 arena.Own(
new float);
180 arena.Own(
new double);
182 arena.Own<
int>(
NULL);
185 data->SetNotifier(¬ifier);
193 TEST(ArenaTest, CreateAndConstCopy) {
196 const std::string* s_copy = Arena::Create<std::string>(&arena,
s);
202 TEST(ArenaTest, CreateAndNonConstCopy) {
205 const std::string* s_copy = Arena::Create<std::string>(&arena,
s);
211 TEST(ArenaTest, CreateAndMove) {
214 const std::string* s_move = Arena::Create<std::string>(&arena, std::move(
s));
220 TEST(ArenaTest, CreateWithFourConstructorArguments) {
225 Arena::Create<MustBeConstructedWithOneThroughFour>(&arena, 1,
"2", three,
234 TEST(ArenaTest, CreateWithEightConstructorArguments) {
241 Arena::Create<MustBeConstructedWithOneThroughEight>(
242 &arena, 1,
"2", three, &four, 5,
"6", seven, eight);
266 TEST(ArenaTest, CreateWithMoveArguments) {
270 Arena::Create<PleaseMoveMe>(&arena, std::move(one));
275 TEST(ArenaTest, InitialBlockTooSmall) {
279 std::vector<char> arena_block(96);
281 options.initial_block = &arena_block[0];
282 options.initial_block_size = arena_block.size();
285 char*
p = Arena::CreateArray<char>(&arena, 96);
286 uintptr_t allocation =
reinterpret_cast<uintptr_t
>(
p);
290 uintptr_t arena_start =
reinterpret_cast<uintptr_t
>(&arena_block[0]);
291 uintptr_t arena_end = arena_start + arena_block.size();
292 EXPECT_FALSE(allocation >= arena_start && allocation < arena_end);
301 TestAllTypes original;
306 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
307 arena_message->ParseFromString(original.SerializeAsString());
311 EXPECT_EQ(strlen(original.optional_string().c_str()),
312 strlen(arena_message->optional_string().c_str()));
316 TestAllTypes original;
322 TestEmptyMessage* arena_message =
323 Arena::CreateMessage<TestEmptyMessage>(&arena);
324 arena_message->ParseFromString(original.SerializeAsString());
327 copied.ParseFromString(arena_message->SerializeAsString());
331 arena_message = Arena::CreateMessage<TestEmptyMessage>(&arena);
332 arena_message->mutable_unknown_fields()->AddVarint(
333 TestAllTypes::kOptionalInt32FieldNumber, 42);
335 copied.ParseFromString(arena_message->SerializeAsString());
340 TestEmptyMessage* arena_message_2 =
341 Arena::CreateMessage<TestEmptyMessage>(&arena);
342 arena_message_2->Swap(arena_message);
344 copied.ParseFromString(arena_message_2->SerializeAsString());
349 TestEmptyMessage* arena_message_3 =
350 Arena::CreateMessage<TestEmptyMessage>(&arena);
351 arena_message_3->mutable_unknown_fields()->AddVarint(1000, 42);
352 arena_message_3->mutable_unknown_fields()->AddFixed32(1001, 42);
353 arena_message_3->mutable_unknown_fields()->AddFixed64(1002, 42);
354 arena_message_3->mutable_unknown_fields()->AddLengthDelimited(1003);
355 arena_message_3->mutable_unknown_fields()->DeleteSubrange(0, 2);
356 arena_message_3->mutable_unknown_fields()->DeleteByNumber(1002);
357 arena_message_3->mutable_unknown_fields()->DeleteByNumber(1003);
358 EXPECT_TRUE(arena_message_3->unknown_fields().empty());
364 TestAllTypes* arena1_message;
365 TestAllTypes* arena2_message;
369 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
370 arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
371 arena1_message->Swap(arena2_message);
372 EXPECT_EQ(&arena1, arena1_message->GetArena());
373 EXPECT_EQ(&arena2, arena2_message->GetArena());
376 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
377 arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
378 arena1_message->mutable_unknown_fields()->AddVarint(1, 42);
379 arena1_message->Swap(arena2_message);
380 EXPECT_EQ(&arena1, arena1_message->GetArena());
381 EXPECT_EQ(&arena2, arena2_message->GetArena());
382 EXPECT_EQ(0, arena1_message->unknown_fields().field_count());
383 EXPECT_EQ(1, arena2_message->unknown_fields().field_count());
384 EXPECT_EQ(42, arena2_message->unknown_fields().field(0).varint());
387 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
388 arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
389 arena1_message->mutable_unknown_fields()->AddVarint(1, 42);
390 arena2_message->mutable_unknown_fields()->AddVarint(2, 84);
391 arena1_message->Swap(arena2_message);
392 EXPECT_EQ(&arena1, arena1_message->GetArena());
393 EXPECT_EQ(&arena2, arena2_message->GetArena());
394 EXPECT_EQ(1, arena1_message->unknown_fields().field_count());
395 EXPECT_EQ(1, arena2_message->unknown_fields().field_count());
396 EXPECT_EQ(84, arena1_message->unknown_fields().field(0).varint());
397 EXPECT_EQ(42, arena2_message->unknown_fields().field(0).varint());
400 TEST(ArenaTest, ReflectionSwapFields) {
403 TestAllTypes* arena1_message;
404 TestAllTypes* arena2_message;
407 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
408 arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
410 const Reflection* reflection = arena1_message->GetReflection();
411 std::vector<const FieldDescriptor*>
fields;
414 EXPECT_EQ(&arena1, arena1_message->GetArena());
415 EXPECT_EQ(&arena2, arena2_message->GetArena());
417 arena1_message->SerializeToString(&
output);
421 arena2_message->SerializeToString(&
output);
426 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
427 arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
431 EXPECT_EQ(&arena1, arena1_message->GetArena());
432 EXPECT_EQ(&arena2, arena2_message->GetArena());
437 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
440 TestAllTypes* arena3_message = Arena::CreateMessage<TestAllTypes>(&arena3);
447 arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
451 EXPECT_EQ(&arena1, arena1_message->GetArena());
453 arena1_message->SerializeToString(&
output);
458 TEST(ArenaTest, SetAllocatedMessage) {
460 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
461 TestAllTypes::NestedMessage* nested =
new TestAllTypes::NestedMessage;
463 arena_message->set_allocated_optional_nested_message(nested);
464 EXPECT_EQ(118, arena_message->optional_nested_message().bb());
466 TestNoArenaMessage no_arena_message;
468 no_arena_message.set_allocated_arena_message(
NULL);
470 no_arena_message.set_allocated_arena_message(
new ArenaMessage);
474 TEST(ArenaTest, ReleaseMessage) {
476 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
477 arena_message->mutable_optional_nested_message()->set_bb(118);
478 std::unique_ptr<TestAllTypes::NestedMessage> nested(
479 arena_message->release_optional_nested_message());
482 TestAllTypes::NestedMessage* released_null =
483 arena_message->release_optional_nested_message();
487 TEST(ArenaTest, SetAllocatedString) {
489 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
491 arena_message->set_allocated_optional_string(allocated_str);
492 EXPECT_EQ(
"hello", arena_message->optional_string());
495 TEST(ArenaTest, ReleaseString) {
497 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
498 arena_message->set_optional_string(
"hello");
499 std::unique_ptr<std::string> released_str(
500 arena_message->release_optional_string());
507 TEST(ArenaTest, SwapBetweenArenasWithAllFieldsSet) {
509 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
512 TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
514 arena2_message->Swap(arena1_message);
516 arena2_message->SerializeToString(&
output);
522 TEST(ArenaTest, SwapBetweenArenaAndNonArenaWithAllFieldsSet) {
523 TestAllTypes non_arena_message;
527 TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
529 arena2_message->Swap(&non_arena_message);
535 TEST(ArenaTest, UnsafeArenaSwap) {
537 TestAllTypes* message1 = Arena::CreateMessage<TestAllTypes>(&shared_arena);
538 TestAllTypes* message2 = Arena::CreateMessage<TestAllTypes>(&shared_arena);
540 message1->UnsafeArenaSwap(message2);
544 TEST(ArenaTest, SwapBetweenArenasUsingReflection) {
546 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
549 TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
551 const Reflection*
r = arena2_message->GetReflection();
552 r->
Swap(arena1_message, arena2_message);
554 arena2_message->SerializeToString(&
output);
560 TEST(ArenaTest, SwapBetweenArenaAndNonArenaUsingReflection) {
561 TestAllTypes non_arena_message;
565 TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
567 const Reflection*
r = arena2_message->GetReflection();
568 r->
Swap(&non_arena_message, arena2_message);
574 TEST(ArenaTest, ReleaseFromArenaMessageMakesCopy) {
575 TestAllTypes::NestedMessage* nested_msg =
NULL;
579 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
580 arena_message->mutable_optional_nested_message()->set_bb(42);
581 *arena_message->mutable_optional_string() =
"Hello";
582 nested_msg = arena_message->release_optional_nested_message();
583 nested_string = arena_message->release_optional_string();
588 delete nested_string;
592 TEST(ArenaTest, ReleaseFromArenaMessageUsingReflectionMakesCopy) {
593 TestAllTypes::NestedMessage* nested_msg =
NULL;
597 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
598 arena_message->mutable_optional_nested_message()->set_bb(42);
599 const Reflection*
r = arena_message->GetReflection();
601 "optional_nested_message");
602 nested_msg =
static_cast<TestAllTypes::NestedMessage*
>(
603 r->ReleaseMessage(arena_message,
f));
608 #endif // PROTOBUF_RTTI
610 TEST(ArenaTest, SetAllocatedAcrossArenas) {
612 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
613 TestAllTypes::NestedMessage* heap_submessage =
614 new TestAllTypes::NestedMessage();
615 heap_submessage->set_bb(42);
616 arena1_message->set_allocated_optional_nested_message(heap_submessage);
618 EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message());
621 TestAllTypes::NestedMessage* arena2_submessage =
622 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
623 arena2_submessage->set_bb(42);
624 arena1_message->set_allocated_optional_nested_message(arena2_submessage);
626 arena1_message->mutable_optional_nested_message());
629 TestAllTypes::NestedMessage* arena1_submessage =
630 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
631 arena1_submessage->set_bb(42);
632 TestAllTypes* heap_message =
new TestAllTypes;
633 heap_message->set_allocated_optional_nested_message(arena1_submessage);
634 EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message());
638 TEST(ArenaTest, SetAllocatedAcrossArenasWithReflection) {
641 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
642 const Reflection*
r = arena1_message->GetReflection();
643 const Descriptor*
d = arena1_message->GetDescriptor();
645 d->FindFieldByName(
"optional_nested_message");
646 TestAllTypes::NestedMessage* heap_submessage =
647 new TestAllTypes::NestedMessage();
648 heap_submessage->set_bb(42);
649 r->SetAllocatedMessage(arena1_message, heap_submessage, msg_field);
651 EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message());
654 TestAllTypes::NestedMessage* arena2_submessage =
655 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
656 arena2_submessage->set_bb(42);
657 r->SetAllocatedMessage(arena1_message, arena2_submessage, msg_field);
659 arena1_message->mutable_optional_nested_message());
662 TestAllTypes::NestedMessage* arena1_submessage =
663 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
664 arena1_submessage->set_bb(42);
665 TestAllTypes* heap_message =
new TestAllTypes;
666 r->SetAllocatedMessage(heap_message, arena1_submessage, msg_field);
667 EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message());
671 TEST(ArenaTest, AddAllocatedWithReflection) {
673 ArenaMessage* arena1_message = Arena::CreateMessage<ArenaMessage>(&arena1);
674 const Reflection*
r = arena1_message->GetReflection();
675 const Descriptor*
d = arena1_message->GetDescriptor();
677 d->FindFieldByName(
"repeated_import_no_arena_message");
679 r->AddMessage(arena1_message, fd);
680 r->AddMessage(arena1_message, fd);
681 r->AddMessage(arena1_message, fd);
682 EXPECT_EQ(3,
r->FieldSize(*arena1_message, fd));
684 fd =
d->FindFieldByName(
"repeated_nested_message");
685 r->AddMessage(arena1_message, fd);
686 r->AddMessage(arena1_message, fd);
687 r->AddMessage(arena1_message, fd);
688 EXPECT_EQ(3,
r->FieldSize(*arena1_message, fd));
691 TEST(ArenaTest, RepeatedPtrFieldAddClearedTest) {
697 TestAllTypes* cleared =
new TestAllTypes();
707 TestAllTypes* cleared =
new TestAllTypes();
714 TEST(ArenaTest, AddAllocatedToRepeatedField) {
717 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
718 for (
int i = 0;
i < 10;
i++) {
719 TestAllTypes::NestedMessage* heap_submessage =
720 new TestAllTypes::NestedMessage();
721 heap_submessage->set_bb(42);
722 arena1_message->mutable_repeated_nested_message()->AddAllocated(
725 EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(
i));
726 EXPECT_EQ(42, arena1_message->repeated_nested_message(
i).bb());
730 arena1_message->Clear();
731 for (
int i = 0;
i < 10;
i++) {
733 TestAllTypes::NestedMessage* arena2_submessage =
734 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
735 arena2_submessage->set_bb(42);
736 arena1_message->mutable_repeated_nested_message()->AddAllocated(
739 EXPECT_NE(arena2_submessage, &arena1_message->repeated_nested_message(
i));
740 EXPECT_EQ(42, arena1_message->repeated_nested_message(
i).bb());
744 TestAllTypes* heap_message =
new TestAllTypes();
745 for (
int i = 0;
i < 10;
i++) {
747 TestAllTypes::NestedMessage* arena2_submessage =
748 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
749 arena2_submessage->set_bb(42);
750 heap_message->mutable_repeated_nested_message()->AddAllocated(
753 EXPECT_NE(arena2_submessage, &heap_message->repeated_nested_message(
i));
754 EXPECT_EQ(42, heap_message->repeated_nested_message(
i).bb());
759 arena1_message->Clear();
760 for (
int i = 0;
i < 10;
i++) {
762 arena1_message->mutable_repeated_string()->AddAllocated(
s);
765 EXPECT_EQ(
"Test", arena1_message->repeated_string(
i));
769 TEST(ArenaTest, AddAllocatedToRepeatedFieldViaReflection) {
772 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
773 const Reflection*
r = arena1_message->GetReflection();
774 const Descriptor*
d = arena1_message->GetDescriptor();
776 for (
int i = 0;
i < 10;
i++) {
777 TestAllTypes::NestedMessage* heap_submessage =
778 new TestAllTypes::NestedMessage;
779 heap_submessage->set_bb(42);
780 r->AddAllocatedMessage(arena1_message, fd, heap_submessage);
782 EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(
i));
783 EXPECT_EQ(42, arena1_message->repeated_nested_message(
i).bb());
787 arena1_message->Clear();
788 for (
int i = 0;
i < 10;
i++) {
790 TestAllTypes::NestedMessage* arena2_submessage =
791 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
792 arena2_submessage->set_bb(42);
793 r->AddAllocatedMessage(arena1_message, fd, arena2_submessage);
795 EXPECT_NE(arena2_submessage, &arena1_message->repeated_nested_message(
i));
796 EXPECT_EQ(42, arena1_message->repeated_nested_message(
i).bb());
800 TestAllTypes* heap_message =
new TestAllTypes;
801 for (
int i = 0;
i < 10;
i++) {
803 TestAllTypes::NestedMessage* arena2_submessage =
804 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
805 arena2_submessage->set_bb(42);
806 r->AddAllocatedMessage(heap_message, fd, arena2_submessage);
808 EXPECT_NE(arena2_submessage, &heap_message->repeated_nested_message(
i));
809 EXPECT_EQ(42, heap_message->repeated_nested_message(
i).bb());
814 TEST(ArenaTest, ReleaseLastRepeatedField) {
818 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
819 for (
int i = 0;
i < 10;
i++) {
820 TestAllTypes::NestedMessage* nested =
821 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena);
823 arena_message->mutable_repeated_nested_message()->AddAllocated(nested);
826 for (
int i = 0;
i < 10;
i++) {
827 const TestAllTypes::NestedMessage* orig_submessage =
828 &arena_message->repeated_nested_message(10 - 1 -
i);
829 TestAllTypes::NestedMessage* released =
830 arena_message->mutable_repeated_nested_message()->ReleaseLast();
837 for (
int i = 0;
i < 10;
i++) {
838 TestAllTypes::NestedMessage* nested =
839 Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena);
841 arena_message->mutable_repeated_nested_message()->AddAllocated(nested);
844 for (
int i = 0;
i < 10;
i++) {
845 const TestAllTypes::NestedMessage* orig_submessage =
846 &arena_message->repeated_nested_message(10 - 1 -
i);
847 TestAllTypes::NestedMessage* released =
848 arena_message->mutable_repeated_nested_message()
849 ->UnsafeArenaReleaseLast();
860 arena_message->Clear();
861 for (
int i = 0;
i < 10;
i++) {
863 arena_message->mutable_repeated_string()->AddAllocated(
s);
865 for (
int i = 0;
i < 10;
i++) {
867 &arena_message->repeated_string(10 - 1 -
i);
869 arena_message->mutable_repeated_string()->ReleaseLast();
876 TEST(ArenaTest, UnsafeArenaReleaseAdd) {
879 const char kContent[] =
"Test content";
882 TestAllTypes* message1 = Arena::CreateMessage<TestAllTypes>(&arena);
883 TestAllTypes* message2 = Arena::CreateMessage<TestAllTypes>(&arena);
884 std::string* arena_string = Arena::Create<std::string>(&arena);
885 *arena_string = kContent;
887 message1->unsafe_arena_set_allocated_optional_string(arena_string);
888 message2->unsafe_arena_set_allocated_optional_string(
889 message1->unsafe_arena_release_optional_string());
890 EXPECT_EQ(kContent, message2->optional_string());
893 TEST(ArenaTest, UnsafeArenaAddAllocated) {
895 TestAllTypes*
message = Arena::CreateMessage<TestAllTypes>(&arena);
896 for (
int i = 0;
i < 10;
i++) {
897 std::string* arena_string = Arena::Create<std::string>(&arena);
898 message->mutable_repeated_string()->UnsafeArenaAddAllocated(arena_string);
903 TEST(ArenaTest, UnsafeArenaRelease) {
905 TestAllTypes*
message = Arena::CreateMessage<TestAllTypes>(&arena);
908 message->unsafe_arena_set_allocated_optional_string(
s);
911 s =
message->unsafe_arena_release_optional_string();
916 message->unsafe_arena_set_allocated_oneof_string(
s);
919 s =
message->unsafe_arena_release_oneof_string();
926 TestAllTypes* message0 = Arena::CreateMessage<TestAllTypes>(&arena);
927 TestAllTypes* message1 = Arena::CreateMessage<TestAllTypes>(&arena);
929 message0->unsafe_arena_set_allocated_oneof_string(
new std::string(
"x"));
931 message1->unsafe_arena_set_allocated_oneof_string(
new std::string(
"y"));
933 EXPECT_EQ(
"x", message0->oneof_string());
934 EXPECT_EQ(
"y", message1->oneof_string());
935 message0->MergeFrom(*message1);
936 EXPECT_EQ(
"y", message0->oneof_string());
937 EXPECT_EQ(
"y", message1->oneof_string());
938 delete message0->unsafe_arena_release_oneof_string();
939 delete message1->unsafe_arena_release_oneof_string();
942 TEST(ArenaTest, ArenaOneofReflection) {
944 TestAllTypes*
message = Arena::CreateMessage<TestAllTypes>(&arena);
950 desc->FindFieldByName(
"oneof_nested_message");
975 for (
int i = 0;
i < 10;
i++) {
976 TestAllTypes* t = Arena::CreateMessage<TestAllTypes>(arena1);
977 t->set_optional_string(
"field1");
978 t->set_optional_int32(
i);
979 if (arena1 !=
NULL) {
985 for (
int i = 0;
i < 5;
i++) {
986 TestAllTypes* t = Arena::CreateMessage<TestAllTypes>(arena2);
987 t->set_optional_string(
"field2");
988 t->set_optional_int32(
i);
989 if (arena2 !=
NULL) {
995 field1.
Swap(&field2);
1001 for (
int i = 0;
i < field1.
size();
i++) {
1004 for (
int i = 0;
i < field2.
size();
i++) {
1009 TEST(ArenaTest, SwapRepeatedField) {
1014 TEST(ArenaTest, SwapRepeatedFieldWithDifferentArenas) {
1020 TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnRightHandSide) {
1025 TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnLeftHandSide) {
1030 TEST(ArenaTest, ExtensionsOnArena) {
1033 TestAllExtensions* message_ext =
1034 Arena::CreateMessage<TestAllExtensions>(&arena);
1035 message_ext->SetExtension(protobuf_unittest::optional_int32_extension, 42);
1036 message_ext->SetExtension(protobuf_unittest::optional_string_extension,
1039 ->MutableExtension(protobuf_unittest::optional_nested_message_extension)
1043 TEST(ArenaTest, RepeatedFieldOnArena) {
1045 std::vector<char> arena_block(1024 * 1024);
1047 options.initial_block = &arena_block[0];
1048 options.initial_block_size = arena_block.size();
1058 for (
int i = 0;
i < 100;
i++) {
1059 repeated_int32.
Add(42);
1060 repeated_message.
Add()->set_optional_int32(42);
1062 const TestAllTypes* msg_in_repeated_field = &repeated_message.
Get(0);
1069 for (
int i = 0;
i < 10;
i++) {
1070 repeated_message.
Add()->set_optional_int32(42);
1072 TestAllTypes* extracted_messages[5];
1082 for (
int i = 0;
i < 100;
i++) {
1083 repeated_message.
Add()->set_optional_int32(42);
1086 TestAllTypes* extracted_messages[5];
1091 for (
int i = 0;
i < 5;
i++) {
1092 delete extracted_messages[
i];
1093 extracted_messages[
i] =
NULL;
1103 Arena::CreateMessage<RepeatedPtrField<TestAllTypes> >(&arena);
1104 for (
int i = 0;
i < 10;
i++) {
1107 repeated_ptr_on_arena->
Add();
1111 Arena::CreateMessage<RepeatedField<int> >(&arena);
1112 for (
int i = 0;
i < 100;
i++) {
1113 repeated_int_on_arena->
Add(
i);
1123 TEST(ArenaTest, MutableMessageReflection) {
1125 TestAllTypes*
message = Arena::CreateMessage<TestAllTypes>(&arena);
1126 const Reflection*
r =
message->GetReflection();
1129 TestAllTypes::NestedMessage* submessage =
1130 static_cast<TestAllTypes::NestedMessage*
>(
1132 TestAllTypes::NestedMessage* submessage_expected =
1133 message->mutable_optional_nested_message();
1135 EXPECT_EQ(submessage_expected, submessage);
1136 EXPECT_EQ(&arena, submessage->GetArena());
1139 d->FindFieldByName(
"oneof_nested_message");
1140 submessage =
static_cast<TestAllTypes::NestedMessage*
>(
1141 r->MutableMessage(
message, oneof_field));
1142 submessage_expected =
message->mutable_oneof_nested_message();
1144 EXPECT_EQ(submessage_expected, submessage);
1145 EXPECT_EQ(&arena, submessage->GetArena());
1147 #endif // PROTOBUF_RTTI
1152 message->set_optional_int32(42);
1153 message->set_optional_string(test_string);
1154 message->set_optional_bytes(test_string);
1155 message->mutable_optional_nested_message()->set_bb(42);
1157 message->set_oneof_uint32(42);
1158 message->mutable_oneof_nested_message()->set_bb(42);
1159 message->set_oneof_string(test_string);
1160 message->set_oneof_bytes(test_string);
1162 message->add_repeated_int32(42);
1164 message->add_repeated_nested_message()->set_bb(42);
1165 message->mutable_optional_lazy_message()->set_bb(42);
1169 TEST(ArenaTest, NoHeapAllocationsTest) {
1171 std::vector<char> arena_block(128 * 1024);
1173 options.initial_block = &arena_block[0];
1174 options.initial_block_size = arena_block.size();
1179 TestAllTypes*
message = Arena::CreateMessage<TestAllTypes>(&arena);
1186 TEST(ArenaTest, ParseCorruptedString) {
1189 TestParseCorruptedString<TestAllTypes, true>(
message);
1190 TestParseCorruptedString<TestAllTypes, false>(
message);
1197 TEST(ArenaTest, MessageLiteOnArena) {
1198 std::vector<char> arena_block(128 * 1024);
1200 options.initial_block = &arena_block[0];
1201 options.initial_block_size = arena_block.size();
1203 const MessageLite* prototype = &TestAllTypes::default_instance();
1205 TestAllTypes initial_message;
1208 initial_message.SerializeToString(&serialized);
1212 MessageLite* generic_message = prototype->New(&arena);
1214 EXPECT_EQ(&arena, generic_message->GetArena());
1215 EXPECT_TRUE(generic_message->ParseFromString(serialized));
1216 TestAllTypes* deserialized =
static_cast<TestAllTypes*
>(generic_message);
1217 EXPECT_EQ(42, deserialized->optional_int32());
1222 #endif // PROTOBUF_RTTI
1228 TEST(ArenaTest, RepeatedFieldWithNonPODType) {
1231 for (
int i = 0;
i < 100;
i++) {
1232 *field_on_heap.
Add() =
"test string long enough to exceed inline buffer";
1238 for (
int i = 0;
i < 100;
i++) {
1239 *field_on_arena.
Add() =
"test string long enough to exceed inline buffer";
1247 TEST(ArenaTest, SpaceAllocated_and_Used) {
1249 options.start_block_size = 256;
1250 options.max_block_size = 8192;
1255 Arena::CreateArray<char>(&arena_1, 320);
1257 EXPECT_LE(320, arena_1.SpaceAllocated());
1262 std::vector<char> arena_block(1024);
1263 options.initial_block = &arena_block[0];
1264 options.initial_block_size = arena_block.size();
1266 EXPECT_EQ(1024, arena_2.SpaceAllocated());
1269 Arena::CreateArray<char>(&arena_2, 55);
1270 EXPECT_EQ(1024, arena_2.SpaceAllocated());
1276 options.initial_block_size = 0;
1279 Arena::CreateArray<char>(&arena_3, 160);
1280 EXPECT_EQ(256, arena_3.SpaceAllocated());
1282 Arena::CreateArray<char>(&arena_3, 70);
1283 EXPECT_EQ(256 + 512, arena_3.SpaceAllocated());
1290 for (
int i = 0;
i < 200;
i++) {
1291 void*
p = Arena::CreateArray<char>(&arena,
i);
1296 TEST(ArenaTest, BlockSizeSmallerThanAllocation) {
1297 for (
size_t i = 0;
i <= 8; ++
i) {
1302 *Arena::Create<int64>(&arena) = 42;
1306 *Arena::Create<int64>(&arena) = 42;
1312 TEST(ArenaTest, GetArenaShouldReturnTheArenaForArenaAllocatedMessages) {
1314 ArenaMessage*
message = Arena::CreateMessage<ArenaMessage>(&arena);
1315 const ArenaMessage* const_pointer_to_message =
message;
1326 TEST(ArenaTest, GetArenaShouldReturnNullForNonArenaAllocatedMessages) {
1328 const ArenaMessage* const_pointer_to_message = &
message;
1333 TEST(ArenaTest, GetArenaShouldReturnNullForNonArenaCompatibleTypes) {
1335 const TestNoArenaMessage* const_pointer_to_message = &
message;
1343 } has_get_arena_method_wrong_return_type;
1350 } has_get_arena_alias;
1357 } has_get_arena_data_member;
1363 for (
int i = 0;
i < 100;
i++) {
1368 TEST(ArenaTest, UnsafeSetAllocatedOnArena) {
1370 TestAllTypes*
message = Arena::CreateMessage<TestAllTypes>(&arena);
1373 std::string owned_string =
"test with long enough content to heap-allocate";
1374 message->unsafe_arena_set_allocated_optional_string(&owned_string);
1377 message->unsafe_arena_set_allocated_optional_string(
NULL);
1389 return static_cast<void*
>(cookie);
1395 int cookie_value = *
static_cast<int*
>(cookie);
1401 int cookie_value = *
static_cast<int*
>(cookie);
1407 int cookie_value = *
static_cast<int*
>(cookie);
1409 delete static_cast<int*
>(cookie);
1435 TEST(ArenaTest, ArenaHooksSanity) {
1444 Arena::Create<uint64>(&arena);