Skip to content

Commit

Permalink
Merge pull request eclipse-uprotocol#186 from ruchirchauhan/feature/c…
Browse files Browse the repository at this point in the history
…ommunication/NotificationSource

Notificationsource Implementation
  • Loading branch information
gregmedd committed Jun 27, 2024
2 parents 50c838a + 7809efc commit 07f7609
Show file tree
Hide file tree
Showing 3 changed files with 188 additions and 9 deletions.
6 changes: 3 additions & 3 deletions include/up-cpp/communication/NotificationSource.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ struct NotificationSource {
/// @param ttl How long messages will be valid from the time notify() is
/// called.
NotificationSource(std::shared_ptr<transport::UTransport> transport,
const v1::UUri& source, const v1::UUri& sink,
v1::UUri&& source, v1::UUri&& sink,
std::optional<v1::UPayloadFormat> payload_format = {},
std::optional<v1::UPriority> priority = {},
std::optional<std::chrono::milliseconds> ttl = {});
Expand All @@ -57,13 +57,13 @@ struct NotificationSource {
///
/// @param A Payload builder containing the payload to be sent with the
/// notification.
v1::UStatus notify(datamodel::builder::Payload&&);
v1::UStatus notify(datamodel::builder::Payload&&) const;

/// @brief Send a notification to the selected sink.
///
/// This can only be called if no payload format was provided at
/// construction time.
v1::UStatus notify();
v1::UStatus notify() const;

private:
std::shared_ptr<transport::UTransport> transport_;
Expand Down
34 changes: 34 additions & 0 deletions src/communication/NotificationSource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,37 @@
// SPDX-License-Identifier: Apache-2.0

#include "up-cpp/communication/NotificationSource.h"

namespace uprotocol::communication {
using namespace uprotocol::datamodel::builder;

NotificationSource::NotificationSource(
std::shared_ptr<transport::UTransport> transport, v1::UUri&& source,
v1::UUri&& sink, std::optional<v1::UPayloadFormat> payload_format,
std::optional<v1::UPriority> priority,
std::optional<std::chrono::milliseconds> ttl)
: transport_(std::move(transport)),
notify_builder_(
UMessageBuilder::notification(std::move(source), std::move(sink))
.withPriority(priority.value_or(v1::UPriority::UPRIORITY_CS1))) {
if (payload_format.has_value()) {
notify_builder_.withPayloadFormat(payload_format.value());
}

if (ttl.has_value()) {
notify_builder_.withTtl(ttl.value());
}
}

v1::UStatus NotificationSource::notify(
datamodel::builder::Payload&& payload) const {
auto message = notify_builder_.build(std::move(payload));
return transport_->send(std::move(message));
}

v1::UStatus NotificationSource::notify() const {
auto message = notify_builder_.build();
return transport_->send(std::move(message));
}

} // namespace uprotocol::communication
157 changes: 151 additions & 6 deletions test/coverage/communication/NotificationSourceTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,30 +11,175 @@

#include <gtest/gtest.h>
#include <up-cpp/communication/NotificationSource.h>
#include <up-cpp/datamodel/builder/Payload.h>
#include <up-cpp/datamodel/serializer/UUri.h>
#include <uprotocol/v1/uri.pb.h>

#include "UTransportMock.h"
#include "up-cpp/datamodel/builder/UMessage.h"
#include "up-cpp/datamodel/validator/UMessage.h"
#include "up-cpp/transport/UTransport.h"

using namespace uprotocol::communication;
using namespace uprotocol::datamodel::builder;
using namespace uprotocol::v1;
using ::testing::_;
using ::testing::Return;

namespace {

class TestFixture : public testing::Test {
class TestNotificationSource : public testing::Test {
protected:
// Run once per TEST_F.
// Used to set up clean environments per test.
void SetUp() override {}
void SetUp() override {
source_.set_authority_name("10.0.0.1");
source_.set_ue_id(0x00011101);
source_.set_ue_version_major(0xF1);
source_.set_resource_id(0x0);

sink_.set_authority_name("10.0.0.1");
sink_.set_ue_id(0x00011101);
sink_.set_ue_version_major(0xF8);
sink_.set_resource_id(0x8101);
transportMock_ =
std::make_shared<uprotocol::test::UTransportMock>(source_);

format_ = UPayloadFormat::UPAYLOAD_FORMAT_TEXT;
priority_ = UPriority::UPRIORITY_CS1;
ttl_ = std::chrono::milliseconds(1000);
}
void TearDown() override {}

// Run once per execution of the test application.
// Used for setup of all tests. Has access to this instance.
TestFixture() = default;
~TestFixture() = default;
TestNotificationSource() = default;
~TestNotificationSource() = default;

// Run once per execution of the test application.
// Used only for global setup outside of tests.
static void SetUpTestSuite() {}
static void TearDownTestSuite() {}

std::shared_ptr<uprotocol::test::UTransportMock> transportMock_;
UUri source_;
UUri sink_;
UPayloadFormat format_;
std::optional<UPriority> priority_;
std::optional<std::chrono::milliseconds> ttl_;
};

// TODO replace
TEST_F(TestFixture, SomeTestName) {}
TEST_F(TestNotificationSource, NotifyWithPayloadSuccess) {
std::string testPayloadStr = "test_payload";
NotificationSource notificationSource(transportMock_, std::move(source_),
std::move(sink_), format_, priority_,
ttl_);
Payload testPayload(testPayloadStr, format_);

uprotocol::v1::UStatus retval;
retval.set_code(uprotocol::v1::UCode::OK);
transportMock_->send_status_ = retval;

auto status = notificationSource.notify(std::move(testPayload));

EXPECT_EQ(status.code(), retval.code());

auto [valid, reason] =
uprotocol::datamodel::validator::message::isValidNotification(
transportMock_->message_);
EXPECT_EQ(valid, true);
}

TEST_F(TestNotificationSource, NotifyWithPayloadSuccessWithoutTTL) {
std::string testPayloadStr = "test_payload";
NotificationSource notificationSource(transportMock_, std::move(source_),
std::move(sink_), format_, priority_);
Payload testPayload(testPayloadStr, format_);

uprotocol::v1::UStatus retval;
retval.set_code(uprotocol::v1::UCode::OK);
transportMock_->send_status_ = retval;

auto status = notificationSource.notify(std::move(testPayload));

EXPECT_EQ(status.code(), retval.code());

auto [valid, reason] =
uprotocol::datamodel::validator::message::isValidNotification(
transportMock_->message_);
EXPECT_EQ(valid, true);

EXPECT_EQ(transportMock_->message_.attributes().ttl(), 0);
}

TEST_F(TestNotificationSource, NotifyWithPayloadSuccessWithoutPriority) {
std::string testPayloadStr = "test_payload";
priority_.reset();
NotificationSource notificationSource(transportMock_, std::move(source_),
std::move(sink_), format_, priority_);
Payload testPayload(testPayloadStr, format_);

uprotocol::v1::UStatus retval;
retval.set_code(uprotocol::v1::UCode::OK);
transportMock_->send_status_ = retval;

auto status = notificationSource.notify(std::move(testPayload));

EXPECT_EQ(status.code(), retval.code());

auto [valid, reason] =
uprotocol::datamodel::validator::message::isValidNotification(
transportMock_->message_);
EXPECT_EQ(valid, true);

EXPECT_EQ(transportMock_->message_.attributes().priority(),
UPriority::UPRIORITY_CS1);
}

TEST_F(TestNotificationSource, NotifyWithPayloadFailure) {
std::string testPayloadStr = "test_payload";
NotificationSource notificationSource(transportMock_, std::move(source_),
std::move(sink_), format_, priority_,
ttl_);
Payload testPayload(testPayloadStr, format_);

uprotocol::v1::UStatus retval;
retval.set_code(uprotocol::v1::UCode::DATA_LOSS);
transportMock_->send_status_ = retval;

auto status = notificationSource.notify(std::move(testPayload));

EXPECT_EQ(status.code(), retval.code());
}

TEST_F(TestNotificationSource, NotifyWithoutPayloadSuccess) {
NotificationSource notificationSource(transportMock_, std::move(source_),
std::move(sink_));

uprotocol::v1::UStatus retval;
retval.set_code(uprotocol::v1::UCode::OK);
transportMock_->send_status_ = retval;

auto status = notificationSource.notify();

EXPECT_EQ(status.code(), retval.code());

EXPECT_EQ(transportMock_->message_.attributes().ttl(), 0);
EXPECT_EQ(transportMock_->message_.attributes().priority(),
UPriority::UPRIORITY_CS1);
}

TEST_F(TestNotificationSource, NotifyWithoutPayloadFailure) {
NotificationSource notificationSource(transportMock_, std::move(source_),
std::move(sink_));

uprotocol::v1::UStatus retval;
retval.set_code(uprotocol::v1::UCode::DATA_LOSS);
transportMock_->send_status_ = retval;

auto status = notificationSource.notify();

EXPECT_EQ(status.code(), retval.code());
}

} // namespace

0 comments on commit 07f7609

Please sign in to comment.