blob: cab9739239cb26255b962c3f6c78e56107be5167 [file] [log] [blame]
// Protocol Buffers - Google's data interchange format
// Copyright 2023 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
#include "google/protobuf/stubs/common.h"
#include <gtest/gtest.h>
#include "google/protobuf/arena.h"
#include "google/protobuf/test_util.h"
#include "google/protobuf/unittest.pb.h"
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
namespace {
TEST(CopyMessageTest, CopyConstructor) {
protobuf_unittest::TestAllTypes message1;
TestUtil::SetAllFields(&message1);
protobuf_unittest::TestAllTypes message2(message1);
TestUtil::ExpectAllFieldsSet(message2);
}
TEST(CopyMessageTest, ArenaEnabledCopyConstructorNull) {
protobuf_unittest::TestAllTypes message1;
TestUtil::SetAllFields(&message1);
protobuf_unittest::TestAllTypes* message2 =
Arena::Create<protobuf_unittest::TestAllTypes>(nullptr, message1);
TestUtil::ExpectAllFieldsSet(*message2);
delete message2;
}
TEST(CopyMessageTest, ArenaEnabledCopyConstructor) {
protobuf_unittest::TestAllTypes message1;
TestUtil::SetAllFields(&message1);
Arena arena;
protobuf_unittest::TestAllTypes* message2 =
Arena::Create<protobuf_unittest::TestAllTypes>(&arena, message1);
TestUtil::ExpectAllFieldsSet(*message2);
}
TEST(CopyMessageTest, ArenaEnabledCopyConstructorArenaLeakTest) {
// Set possible leaking field types for TestAllTypes with values
// guaranteed to not be inlined string or Cord values.
// TestAllTypes has unconditional ArenaDtor registration.
protobuf_unittest::TestAllTypes message1;
message1.set_optional_string(std::string(1000, 'a'));
message1.add_repeated_string(std::string(1000, 'd'));
Arena arena;
protobuf_unittest::TestAllTypes* message2 =
Arena::Create<protobuf_unittest::TestAllTypes>(&arena, message1);
EXPECT_EQ(message2->optional_string(), message1.optional_string());
EXPECT_EQ(message2->repeated_string(0), message1.repeated_string(0));
}
} // namespace
} // namespace cpp
} // namespace compiler
} // namespace protobuf
} // namespace google