Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 52 additions & 40 deletions src/google/protobuf/any_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,20 @@ namespace protobuf {
namespace {

TEST(AnyTest, TestPackAndUnpack) {
proto2_unittest::TestAny submessage;
submessage.set_int32_value(12345);
proto2_unittest::TestAny message;
ASSERT_TRUE(message.mutable_any_value()->PackFrom(submessage));

std::string data = message.SerializeAsString();
std::string data;
{
proto2_unittest::TestAny submessage;
submessage.set_int32_value(12345);
proto2_unittest::TestAny message;
ASSERT_TRUE(message.mutable_any_value()->PackFrom(submessage));

data = message.SerializeAsString();
}

proto2_unittest::TestAny message;
ASSERT_TRUE(message.ParseFromString(data));
EXPECT_TRUE(message.has_any_value());
submessage.Clear();
proto2_unittest::TestAny submessage;
ASSERT_TRUE(message.any_value().UnpackTo(&submessage));
EXPECT_EQ(12345, submessage.int32_value());
}
Expand All @@ -62,41 +66,47 @@ TEST(AnyTest, TestUnpackWithTypeMismatch) {
}

TEST(AnyTest, TestPackAndUnpackAny) {
// We can pack a Any message inside another Any message.
proto2_unittest::TestAny submessage;
submessage.set_int32_value(12345);
google::protobuf::Any any;
any.PackFrom(submessage);
proto2_unittest::TestAny message;
message.mutable_any_value()->PackFrom(any);

std::string data = message.SerializeAsString();
std::string data;
{
// We can pack an Any message inside another Any message.
proto2_unittest::TestAny submessage;
submessage.set_int32_value(12345);
google::protobuf::Any any;
any.PackFrom(submessage);
proto2_unittest::TestAny message;
message.mutable_any_value()->PackFrom(any);

data = message.SerializeAsString();
}

proto2_unittest::TestAny message;
ASSERT_TRUE(message.ParseFromString(data));
EXPECT_TRUE(message.has_any_value());
any.Clear();
submessage.Clear();
google::protobuf::Any any;
ASSERT_TRUE(message.any_value().UnpackTo(&any));
proto2_unittest::TestAny submessage;
ASSERT_TRUE(any.UnpackTo(&submessage));
EXPECT_EQ(12345, submessage.int32_value());
}

TEST(AnyTest, TestPackWithCustomTypeUrl) {
proto2_unittest::TestAny submessage;
submessage.set_int32_value(12345);
google::protobuf::Any any;
// Pack with a custom type URL prefix.
any.PackFrom(submessage, "type.myservice.com");
EXPECT_EQ("type.myservice.com/proto2_unittest.TestAny", any.type_url());
// Pack with a custom type URL prefix ending with '/'.
any.PackFrom(submessage, "type.myservice.com/");
EXPECT_EQ("type.myservice.com/proto2_unittest.TestAny", any.type_url());
// Pack with an empty type URL prefix.
any.PackFrom(submessage, "");
EXPECT_EQ("/proto2_unittest.TestAny", any.type_url());
{
proto2_unittest::TestAny submessage;
submessage.set_int32_value(12345);
// Pack with a custom type URL prefix.
any.PackFrom(submessage, "type.myservice.com");
EXPECT_EQ("type.myservice.com/proto2_unittest.TestAny", any.type_url());
// Pack with a custom type URL prefix ending with '/'.
any.PackFrom(submessage, "type.myservice.com/");
EXPECT_EQ("type.myservice.com/proto2_unittest.TestAny", any.type_url());
// Pack with an empty type URL prefix.
any.PackFrom(submessage, "");
EXPECT_EQ("/proto2_unittest.TestAny", any.type_url());
}

// Test unpacking the type.
submessage.Clear();
proto2_unittest::TestAny submessage;
EXPECT_TRUE(any.UnpackTo(&submessage));
EXPECT_EQ(12345, submessage.int32_value());
}
Expand Down Expand Up @@ -127,34 +137,36 @@ TEST(AnyTest, TestIs) {
}

TEST(AnyTest, MoveConstructor) {
proto2_unittest::TestAny payload;
payload.set_int32_value(12345);

google::protobuf::Any src;
src.PackFrom(payload);
{
proto2_unittest::TestAny payload;
payload.set_int32_value(12345);
src.PackFrom(payload);
}

const char* type_url = src.type_url().data();

google::protobuf::Any dst(std::move(src));
EXPECT_EQ(type_url, dst.type_url().data());
payload.Clear();
proto2_unittest::TestAny payload;
ASSERT_TRUE(dst.UnpackTo(&payload));
EXPECT_EQ(12345, payload.int32_value());
}

TEST(AnyTest, MoveAssignment) {
proto2_unittest::TestAny payload;
payload.set_int32_value(12345);

google::protobuf::Any src;
src.PackFrom(payload);
{
proto2_unittest::TestAny payload;
payload.set_int32_value(12345);
src.PackFrom(payload);
}

const char* type_url = src.type_url().data();

google::protobuf::Any dst;
dst = std::move(src);
EXPECT_EQ(type_url, dst.type_url().data());
payload.Clear();
proto2_unittest::TestAny payload;
ASSERT_TRUE(dst.UnpackTo(&payload));
EXPECT_EQ(12345, payload.int32_value());
}
Expand Down
18 changes: 8 additions & 10 deletions src/google/protobuf/compiler/cpp/message.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1770,15 +1770,14 @@ void MessageGenerator::GenerateAnyMethodDefinition(io::Printer* p) {
R"cc(
bool PackFrom(const $pb$::Message& message) {
$DCHK$_NE(&message, this);
return $pbi$::InternalPackFrom(message, mutable_type_url(),
_internal_mutable_value());
return $pbi$::InternalPackFrom(message, mutable_type_url(), mutable_value());
}
bool PackFrom(const $pb$::Message& message,
::absl::string_view type_url_prefix) {
$DCHK$_NE(&message, this);
return $pbi$::InternalPackFrom(message, type_url_prefix,
mutable_type_url(),
_internal_mutable_value());
mutable_value());
}
bool UnpackTo($pb$::Message* $nonnull$ message) const {
return $pbi$::InternalUnpackTo(_internal_type_url(),
Expand All @@ -1796,17 +1795,17 @@ void MessageGenerator::GenerateAnyMethodDefinition(io::Printer* p) {
T, const $pb$::Message&>::value>::type>
bool PackFrom(const T& message) {
return $pbi$::InternalPackFrom<T>(
message, mutable_type_url(), _internal_mutable_value());
message, mutable_type_url(), mutable_value());
}
template <
typename T,
class = typename std::enable_if<!std::is_convertible<
T, const $pb$::Message&>::value>::type>
bool PackFrom(const T& message,
::absl::string_view type_url_prefix) {
return $pbi$::InternalPackFrom<T>(
message, type_url_prefix, mutable_type_url(),
_internal_mutable_value());
return $pbi$::InternalPackFrom<T>(message, type_url_prefix,
mutable_type_url(),
mutable_value());
}
template <
typename T,
Expand All @@ -1822,15 +1821,14 @@ void MessageGenerator::GenerateAnyMethodDefinition(io::Printer* p) {
R"cc(
template <typename T>
bool PackFrom(const T& message) {
return $pbi$::InternalPackFrom(message, mutable_type_url(),
_internal_mutable_value());
return $pbi$::InternalPackFrom(message, mutable_type_url(), mutable_value());
}
template <typename T>
bool PackFrom(const T& message,
::absl::string_view type_url_prefix) {
return $pbi$::InternalPackFrom(message, type_url_prefix,
mutable_type_url(),
_internal_mutable_value());
mutable_value());
}
template <typename T>
bool UnpackTo(T* $nonnull$ message) const {
Expand Down
Loading