Index: third_party/protobuf/src/google/protobuf/arena_unittest.cc |
diff --git a/third_party/protobuf/src/google/protobuf/arena_unittest.cc b/third_party/protobuf/src/google/protobuf/arena_unittest.cc |
index 6b67f446fdad1cee4d141bc4dedc8bceb6154a0b..ab25ffe1ad967fd50f0727986b4040526db3f015 100644 |
--- a/third_party/protobuf/src/google/protobuf/arena_unittest.cc |
+++ b/third_party/protobuf/src/google/protobuf/arena_unittest.cc |
@@ -342,6 +342,64 @@ TEST(ArenaTest, Swap) { |
EXPECT_EQ(42, arena2_message->unknown_fields().field(0).varint()); |
} |
+TEST(ArenaTest, ReflectionSwapFields) { |
+ Arena arena1; |
+ Arena arena2; |
+ TestAllTypes* arena1_message; |
+ TestAllTypes* arena2_message; |
+ |
+ // Case 1: messages on different arenas, only one message is set. |
+ arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1); |
+ arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2); |
+ TestUtil::SetAllFields(arena1_message); |
+ const Reflection* reflection = arena1_message->GetReflection(); |
+ std::vector<const FieldDescriptor*> fields; |
+ reflection->ListFields(*arena1_message, &fields); |
+ reflection->SwapFields(arena1_message, arena2_message, fields); |
+ EXPECT_EQ(&arena1, arena1_message->GetArena()); |
+ EXPECT_EQ(&arena2, arena2_message->GetArena()); |
+ string output; |
+ arena1_message->SerializeToString(&output); |
+ EXPECT_EQ(0, output.size()); |
+ TestUtil::ExpectAllFieldsSet(*arena2_message); |
+ reflection->SwapFields(arena1_message, arena2_message, fields); |
+ arena2_message->SerializeToString(&output); |
+ EXPECT_EQ(0, output.size()); |
+ TestUtil::ExpectAllFieldsSet(*arena1_message); |
+ |
+ // Case 2: messages on different arenas, both messages are set. |
+ arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1); |
+ arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2); |
+ TestUtil::SetAllFields(arena1_message); |
+ TestUtil::SetAllFields(arena2_message); |
+ reflection->SwapFields(arena1_message, arena2_message, fields); |
+ EXPECT_EQ(&arena1, arena1_message->GetArena()); |
+ EXPECT_EQ(&arena2, arena2_message->GetArena()); |
+ TestUtil::ExpectAllFieldsSet(*arena1_message); |
+ TestUtil::ExpectAllFieldsSet(*arena2_message); |
+ |
+ // Case 3: messages on different arenas with different lifetimes. |
+ arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1); |
+ { |
+ Arena arena3; |
+ TestAllTypes* arena3_message = Arena::CreateMessage<TestAllTypes>(&arena3); |
+ TestUtil::SetAllFields(arena3_message); |
+ reflection->SwapFields(arena1_message, arena3_message, fields); |
+ } |
+ TestUtil::ExpectAllFieldsSet(*arena1_message); |
+ |
+ // Case 4: one message on arena, the other on heap. |
+ arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1); |
+ TestAllTypes message; |
+ TestUtil::SetAllFields(arena1_message); |
+ reflection->SwapFields(arena1_message, &message, fields); |
+ EXPECT_EQ(&arena1, arena1_message->GetArena()); |
+ EXPECT_EQ(NULL, message.GetArena()); |
+ arena1_message->SerializeToString(&output); |
+ EXPECT_EQ(0, output.size()); |
+ TestUtil::ExpectAllFieldsSet(message); |
+} |
+ |
TEST(ArenaTest, SetAllocatedMessage) { |
Arena arena; |
TestAllTypes *arena_message = Arena::CreateMessage<TestAllTypes>(&arena); |