Skip to content

Commit

Permalink
Payload builder changes to passthrough a gpb::Any.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
David Bruce committed Aug 13, 2024
1 parent 910bc9d commit 5467c0e
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 60 deletions.
8 changes: 8 additions & 0 deletions include/up-cpp/datamodel/builder/Payload.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#ifndef UP_CPP_DATAMODEL_BUILDER_PAYLOAD_H
#define UP_CPP_DATAMODEL_BUILDER_PAYLOAD_H

#include <google/protobuf/any.pb.h>

Check failure on line 15 in include/up-cpp/datamodel/builder/Payload.h

View workflow job for this annotation

GitHub Actions / Lint C++ sources

include/up-cpp/datamodel/builder/Payload.h:15:10 [clang-diagnostic-error]

'google/protobuf/any.pb.h' file not found
#include <uprotocol/v1/uattributes.pb.h>

#include <cstdint>
Expand Down Expand Up @@ -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;

Expand Down
7 changes: 7 additions & 0 deletions src/datamodel/builder/Payload.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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_)) {}
Expand Down
149 changes: 89 additions & 60 deletions test/coverage/datamodel/PayloadBuilderTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,96 +60,98 @@ class PayloadTest : public testing::Test {
/////////////////Serialized Protobuf Tests/////////////////////////

// Create serialized protobuf payload and verify build payload
TEST_F(PayloadTest, CreateSerializedProtobufPayloadAndBuildTest) {
TEST_F(PayloadTest, CreateSerializedProtobufPayloadAndBuildTest) { // NOLINT
// Arrange
uprotocol::v1::UUri uriObject;
uriObject.set_authority_name(testStringPayload_);
auto expectedPayloadData = uriObject.SerializeAsString();
uprotocol::v1::UUri uri_object; // NOLINT
uri_object.set_authority_name(testStringPayload_);
auto expected_payload_data = uri_object.SerializeAsString();

// Act
Payload payload(uriObject);
Payload payload(uri_object);

// Assert
auto [payloadData, payloadFormat] = payload.buildCopy();
EXPECT_EQ(payloadFormat,
auto [payload_data, payload_format] = payload.buildCopy();
EXPECT_EQ(payload_format,
uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF);
EXPECT_EQ(payloadData, expectedPayloadData);
EXPECT_EQ(payload_data, expected_payload_data);
}

// Create serialized protobuf payload with empty message
TEST_F(PayloadTest, CreateEmptySerializedProtobufPayloadTest) {
TEST_F(PayloadTest, CreateEmptySerializedProtobufPayloadTest) { // NOLINT
// Arrange
uprotocol::v1::UUri uriObject;
uriObject.set_authority_name("");
uprotocol::v1::UUri uri_object; // NOLINT
uri_object.set_authority_name("");

// Act
Payload payload(uriObject);
Payload payload(uri_object);

// Assert
auto [payloadData, payloadFormat] = payload.buildCopy();
EXPECT_EQ(payloadFormat,
auto [payload_data, payload_format] = payload.buildCopy();
EXPECT_EQ(payload_format,
uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF);
EXPECT_EQ(payloadData, uriObject.SerializeAsString());
EXPECT_EQ(payload_data, uri_object.SerializeAsString());
}

// Create serialized protobuf payload and verify moved payload
TEST_F(PayloadTest, CreateSerializedProtobufPayloadAndMoveTest) {
TEST_F(PayloadTest, CreateSerializedProtobufPayloadAndMoveTest) { // NOLINT
// Arrange
uprotocol::v1::UUri uriObject;
uriObject.set_authority_name(testStringPayload_);
auto expectedPayloadData = uriObject.SerializeAsString();
uprotocol::v1::UUri uri_object; // NOLINT
uri_object.set_authority_name(testStringPayload_);
auto expected_payload_data = uri_object.SerializeAsString();

// Act
Payload payload(uriObject);
Payload payload(uri_object);
auto& [payload_reference, _] = payload.buildCopy();
const void* original_address = payload_reference.data();

// Assert
auto [payloadData, payloadFormat] = std::move(payload).buildMove();
EXPECT_EQ(payloadFormat,
auto [payload_data, payload_format] = std::move(payload).buildMove();
EXPECT_EQ(payload_format,
uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF);
EXPECT_EQ(payloadData, expectedPayloadData);
EXPECT_EQ(payload_data, expected_payload_data);

EXPECT_THROW(auto _ = payload.buildCopy(), Payload::PayloadMoved);
EXPECT_EQ(original_address, payloadData.data());
EXPECT_EQ(original_address, payload_data.data());
}

// Create serialized protobuf payload. Verify exception for move paylod twice
TEST_F(PayloadTest, CreateSerializedProtobufPayloadAndMoveTwiceExceptionTest) {
TEST_F(PayloadTest,
CreateSerializedProtobufPayloadAndMoveTwiceExceptionTest) { // NOLINT
// Arrange
uprotocol::v1::UUri uriObject;
uriObject.set_authority_name(testStringPayload_);
uprotocol::v1::UUri uri_object; // NOLINT
uri_object.set_authority_name(testStringPayload_);

// Act
Payload payload(uriObject);
Payload payload(uri_object);

// Assert
auto [payloadData, payloadFormat] = std::move(payload).buildMove();
auto [payload_data, payload_format] = std::move(payload).buildMove();

EXPECT_EQ(payloadFormat,
EXPECT_EQ(payload_format,
uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF);
EXPECT_EQ(payloadData, uriObject.SerializeAsString());
EXPECT_EQ(payload_data, uri_object.SerializeAsString());

EXPECT_THROW(std::move(payload).buildMove(), Payload::PayloadMoved);
}

// Create serialized protobuf payload. Call build after move.
TEST_F(PayloadTest,
CreateSerializedProtobufPayloadAndCallBuildAfterMoveExceptionTest) {
TEST_F(
PayloadTest,
CreateSerializedProtobufPayloadAndCallBuildAfterMoveExceptionTest) { // NOLINT
// Arrange
uprotocol::v1::UUri uriObject;
uriObject.set_authority_name(testStringPayload_);
uprotocol::v1::UUri uri_object; // NOLINT
uri_object.set_authority_name(testStringPayload_);

// Act
Payload payload(uriObject);
Payload payload(uri_object);
// Call move on payload first
auto [payloadData, payloadFormat] = std::move(payload).buildMove();
auto [payload_data, payload_format] = std::move(payload).buildMove();

// Assert

EXPECT_EQ(payloadFormat,
EXPECT_EQ(payload_format,
uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF);
EXPECT_EQ(payloadData, uriObject.SerializeAsString());
EXPECT_EQ(payload_data, uri_object.SerializeAsString());

// Call build on payload after move
EXPECT_THROW(auto _ = payload.buildCopy(), Payload::PayloadMoved);
Expand All @@ -158,54 +160,54 @@ TEST_F(PayloadTest,
/////////////Serializer Payload Protobuf Tests/////////////////

// Create a serializer payload and verify build payload
TEST_F(PayloadTest, CreateSerializerPayloadAndBuildTest) {
TEST_F(PayloadTest, CreateSerializerPayloadAndBuildTest) { // NOLINT
// Arrange
std::chrono::milliseconds t(1234);
TimeAsPayloadSerializer timeSerializer;
timeSerializer.setFormat(
TimeAsPayloadSerializer time_serializer;
time_serializer.setFormat(
uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_RAW);
auto expectedSerializedObject = timeSerializer.serialize(
auto expected_serialized_object = time_serializer.serialize(
std::chrono::duration_cast<std::chrono::milliseconds>(t));

// Act
Payload payload(timeSerializer, t);
Payload payload(time_serializer, t);

// Assert
auto [payloadData, payloadFormat] = payload.buildCopy();
EXPECT_EQ(payloadData,
std::get<Payload::PayloadType::Data>(expectedSerializedObject));
EXPECT_EQ(payloadFormat,
std::get<Payload::PayloadType::Format>(expectedSerializedObject));
auto [payload_data, payload_format] = payload.buildCopy();
EXPECT_EQ(payload_data,
std::get<Payload::PayloadType::Data>(expected_serialized_object));
EXPECT_EQ(payload_format, std::get<Payload::PayloadType::Format>(
expected_serialized_object));
}

// Create a serializer payload with invalid format
TEST_F(PayloadTest, CreateSerializerPayloadWithInvalidFormat) {
TEST_F(PayloadTest, CreateSerializerPayloadWithInvalidFormat) { // NOLINT
// Arrange
std::chrono::milliseconds t(1234);
TimeAsPayloadSerializer timeSerializer;
auto invalidFormat = static_cast<uprotocol::v1::UPayloadFormat>(9999);
TimeAsPayloadSerializer time_serializer;
auto invalid_format = static_cast<uprotocol::v1::UPayloadFormat>(9999);
// Ovreide the format with invalid value
timeSerializer.setFormat(invalidFormat);
time_serializer.setFormat(invalid_format);

auto expectedSerializedObject = timeSerializer.serialize(
auto expected_serialized_object = time_serializer.serialize(
std::chrono::duration_cast<std::chrono::milliseconds>(t));

// Act
EXPECT_THROW(Payload payload(timeSerializer, t), std::out_of_range);
EXPECT_THROW(Payload payload(time_serializer, t), std::out_of_range);
}

// Create a serializer payload and verify moved payload
TEST_F(PayloadTest, CreateSerializerPayloadAndMoveTest) {
TEST_F(PayloadTest, CreateSerializerPayloadAndMoveTest) { // NOLINT
// Arrange
std::chrono::milliseconds t(12345);
TimeAsPayloadSerializer timeSerializer;
timeSerializer.setFormat(
TimeAsPayloadSerializer time_serializer;
time_serializer.setFormat(
uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_RAW);
auto expectedSerializedObject = timeSerializer.serialize(
auto expectedSerializedObject = time_serializer.serialize(
std::chrono::duration_cast<std::chrono::milliseconds>(t));

// Act
Payload payload(timeSerializer, t);
Payload payload(time_serializer, t);

// Assert
auto [payloadData, payloadFormat] = std::move(payload).buildMove();
Expand Down Expand Up @@ -340,6 +342,33 @@ TEST_F(PayloadTest, StringMovePayloadTest) {
EXPECT_THROW(auto _ = payload.buildCopy(), Payload::PayloadMoved);
}

// Create Any and move payload object test
TEST_F(PayloadTest, AnyMovePayloadTest) {
using namespace std;

// Arrange
uprotocol::v1::UUri uriObject;
uriObject.set_authority_name(testStringPayload_);
google::protobuf::Any any;
any.PackFrom(uriObject, "hello_world");

// Act
Payload payload(any);
auto [serializedData, payloadFormat] = std::move(payload).buildMove();

// Assert
EXPECT_EQ(
payloadFormat,
uprotocol::v1::UPayloadFormat::UPAYLOAD_FORMAT_PROTOBUF_WRAPPED_IN_ANY);
google::protobuf::Any parsedAny;
EXPECT_TRUE(parsedAny.ParseFromString(serializedData));
EXPECT_EQ(parsedAny.type_url(), "hello_world/uprotocol.v1.UUri");

uprotocol::v1::UUri parsedUriObject;
EXPECT_TRUE(parsedUriObject.ParseFromString(parsedAny.value()));
EXPECT_EQ(parsedUriObject.authority_name(), testStringPayload_);
}

/////////////////////RValue String Payload Tests/////////////////////

// Create RValue String Payload
Expand Down

0 comments on commit 5467c0e

Please sign in to comment.