From 9b3b3922023e71d53f4ac94affcc12f6db7effb5 Mon Sep 17 00:00:00 2001 From: Lukas Heppel Date: Tue, 18 Feb 2025 11:14:45 +0100 Subject: [PATCH 1/3] Picking up debruce's commits to support google.protobuf.any in the payload builder: Add constructor to Payload. Add test case to PayloadBuilderTest to exercise this constructor by creating an Any containing a uuri, passing it to the constructor, building it, and then deserializing the Any, and the contained uuri. --- include/up-cpp/datamodel/builder/Payload.h | 8 ++++++ src/datamodel/builder/Payload.cpp | 7 ++++++ .../coverage/datamodel/PayloadBuilderTest.cpp | 25 +++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/include/up-cpp/datamodel/builder/Payload.h b/include/up-cpp/datamodel/builder/Payload.h index 1caa021c1..1fdd49fed 100644 --- a/include/up-cpp/datamodel/builder/Payload.h +++ b/include/up-cpp/datamodel/builder/Payload.h @@ -12,6 +12,7 @@ #ifndef UP_CPP_DATAMODEL_BUILDER_PAYLOAD_H #define UP_CPP_DATAMODEL_BUILDER_PAYLOAD_H +#include #include #include @@ -131,6 +132,13 @@ struct Payload { /// for v1::UPayloadFormat explicit Payload(Serialized&&); + /// @brief Creates a Payload builder with a provided protobuf::Any. + /// + /// The contents of value will be moved into the Payload object. + /// + /// @param An initialized google::protobuf::Any object.. + explicit Payload(const google::protobuf::Any&); + /// @brief Move constructor. Payload(Payload&&) noexcept; diff --git a/src/datamodel/builder/Payload.cpp b/src/datamodel/builder/Payload.cpp index 42f43ad19..4d3abfdff 100644 --- a/src/datamodel/builder/Payload.cpp +++ b/src/datamodel/builder/Payload.cpp @@ -46,6 +46,13 @@ Payload::Payload(Serialized&& serialized) { payload_ = std::move(serialized); } +// google::protobuf::Any constructor +Payload::Payload(const google::protobuf::Any& any) { + payload_ = std::make_tuple( + std::move(any.SerializeAsString()), + uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF_WRAPPED_IN_ANY); +} + // Move constructor Payload::Payload(Payload&& other) noexcept : payload_(std::move(other.payload_)), moved_(std::move(other.moved_)) {} diff --git a/test/coverage/datamodel/PayloadBuilderTest.cpp b/test/coverage/datamodel/PayloadBuilderTest.cpp index f624f817b..3c4865e12 100644 --- a/test/coverage/datamodel/PayloadBuilderTest.cpp +++ b/test/coverage/datamodel/PayloadBuilderTest.cpp @@ -340,6 +340,31 @@ TEST_F(PayloadTest, StringMovePayloadTest) { EXPECT_THROW(auto _ = payload.buildCopy(), Payload::PayloadMoved); } +// Create Any and move payload object test +TEST_F(PayloadTest, AnyMovePayloadTest) { // NOLINT + // Arrange + uprotocol::v1::UUri uri_object; // NOLINT + uri_object.set_authority_name(testStringPayload_); + google::protobuf::Any any; + any.PackFrom(uri_object, "hello_world"); + + // Act + Payload payload(any); + auto [serialized_data, payload_format] = std::move(payload).buildMove(); + + // Assert + EXPECT_EQ( + payload_format, + uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF_WRAPPED_IN_ANY); + google::protobuf::Any parsed_any; + EXPECT_TRUE(parsed_any.ParseFromString(serialized_data)); + EXPECT_EQ(parsed_any.type_url(), "hello_world/uprotocol.v1.UUri"); + + uprotocol::v1::UUri parsed_uri_object; + EXPECT_TRUE(parsed_uri_object.ParseFromString(parsed_any.value())); + EXPECT_EQ(parsed_uri_object.authority_name(), testStringPayload_); +} + /////////////////////RValue String Payload Tests///////////////////// // Create RValue String Payload From 94fdc730f57f721e7a7347d6bf823e7fad36d341 Mon Sep 17 00:00:00 2001 From: Lukas Heppel Date: Mon, 3 Mar 2025 21:06:00 +0100 Subject: [PATCH 2/3] fix linting errors --- src/datamodel/builder/Payload.cpp | 4 ++-- test/coverage/datamodel/PayloadBuilderTest.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/datamodel/builder/Payload.cpp b/src/datamodel/builder/Payload.cpp index 4d3abfdff..83d0b8645 100644 --- a/src/datamodel/builder/Payload.cpp +++ b/src/datamodel/builder/Payload.cpp @@ -49,8 +49,8 @@ Payload::Payload(Serialized&& serialized) { // google::protobuf::Any constructor Payload::Payload(const google::protobuf::Any& any) { payload_ = std::make_tuple( - std::move(any.SerializeAsString()), - uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF_WRAPPED_IN_ANY); + any.SerializeAsString(), + uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF_WRAPPED_IN_ANY); } // Move constructor diff --git a/test/coverage/datamodel/PayloadBuilderTest.cpp b/test/coverage/datamodel/PayloadBuilderTest.cpp index 3c4865e12..6fb77899c 100644 --- a/test/coverage/datamodel/PayloadBuilderTest.cpp +++ b/test/coverage/datamodel/PayloadBuilderTest.cpp @@ -101,7 +101,7 @@ TEST_F(PayloadTest, CreateSerializedProtobufPayloadAndMoveTest) { // Act Payload payload(uriObject); - auto& [payload_reference, _] = payload.buildCopy(); + auto& [payload_reference, payload_format] = payload.buildCopy(); const void* original_address = payload_reference.data(); // Assert @@ -110,7 +110,7 @@ TEST_F(PayloadTest, CreateSerializedProtobufPayloadAndMoveTest) { uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF); EXPECT_EQ(payloadData, expectedPayloadData); - EXPECT_THROW(auto _ = payload.buildCopy(), Payload::PayloadMoved); + EXPECT_THROW(auto result = payload.buildCopy(), Payload::PayloadMoved); EXPECT_EQ(original_address, payloadData.data()); } From 6b87dffeb19cd1b306c0a2ca1428f856b2007965 Mon Sep 17 00:00:00 2001 From: Lukas Heppel Date: Mon, 3 Mar 2025 21:15:03 +0100 Subject: [PATCH 3/3] fix linting error --- test/coverage/datamodel/PayloadBuilderTest.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/coverage/datamodel/PayloadBuilderTest.cpp b/test/coverage/datamodel/PayloadBuilderTest.cpp index 6fb77899c..c3ffac21f 100644 --- a/test/coverage/datamodel/PayloadBuilderTest.cpp +++ b/test/coverage/datamodel/PayloadBuilderTest.cpp @@ -130,7 +130,9 @@ TEST_F(PayloadTest, CreateSerializedProtobufPayloadAndMoveTwiceExceptionTest) { uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF); EXPECT_EQ(payloadData, uriObject.SerializeAsString()); - EXPECT_THROW(std::move(payload).buildMove(), Payload::PayloadMoved); + EXPECT_THROW({ + auto _ = std::move(payload).buildMove(); + }, Payload::PayloadMoved); } // Create serialized protobuf payload. Call build after move.