Skip to content
31 changes: 28 additions & 3 deletions include/up-cpp/datamodel/validator/UUri.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,10 +150,35 @@ isValidDefaultSource(const v1::UUri&);
/// This is just a check for a zero-length authority name string.
[[nodiscard]] bool isLocal(const v1::UUri&);

/// @brief Checks if a UUri uses wildcards
/// @brief Checks if a UUri has a wildcard authority name.
///
/// Checks for all types of wildcards, returns true if any are found.
[[nodiscard]] bool uses_wildcards(const v1::UUri&);
/// Checks if a UUri has a wildcard authority name, returns true if yes.
[[nodiscard]] bool has_wildcard_authority(const v1::UUri& uuri);

/// @brief Checks if a UUri has a wildcard service id.
///
/// Checks if a UUri has a wildcard service id, returns true if yes.
[[nodiscard]] bool has_wildcard_service_id(const v1::UUri& uuri);

/// @brief Checks if a UUri has a wildcard service instance id.
///
/// Checks if a UUri has a wildcard service instance id, returns true if yes.
[[nodiscard]] bool has_wildcard_service_instance_id(const v1::UUri& uuri);

/// @brief Checks if a UUri has a wildcard version.
///
/// Checks if a UUri has a wildcard version, returns true if yes.
[[nodiscard]] bool has_wildcard_version(const v1::UUri& uuri);

/// @brief Checks if a UUri has a wildcard resoruce id.
///
/// Checks if a UUri has a wildcard resoruce id, returns true if yes.
[[nodiscard]] bool has_wildcard_resource_id(const v1::UUri& uuri);

/// @brief Checks if a UUri uses no wildcards
///
/// Checks for all types of wildcards, returns true if no wildcards are found.
[[nodiscard]] bool verify_no_wildcards(const v1::UUri&);

/// @brief This exception indicates that a UUri object was provided that
/// did not contain valid UUri data.
Expand Down
55 changes: 30 additions & 25 deletions src/datamodel/validator/UUri.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,29 +72,34 @@ std::string_view message(Reason reason) {
}
}

bool uses_wildcards(const v1::UUri& uuri) {
constexpr auto LOWER_8_BIT_MASK = 0xFF;
bool has_wildcard_authority(const v1::UUri& uuri) {
return uuri.authority_name() == "*";
}

bool has_wildcard_service_id(const v1::UUri& uuri) {
constexpr auto LOWER_16_BIT_MASK = 0xFFFF;
return (uuri.ue_id() & LOWER_16_BIT_MASK) == LOWER_16_BIT_MASK;
}

bool has_wildcard_service_instance_id(const v1::UUri& uuri) {
constexpr auto UPPER_16_BIT_MASK = 0xFFFF0000;
return (uuri.ue_id() & UPPER_16_BIT_MASK) == UPPER_16_BIT_MASK;
}

if (uuri.authority_name().find_first_of('*') != std::string::npos) {
return true;
}
if ((uuri.ue_id() & LOWER_16_BIT_MASK) ==
LOWER_16_BIT_MASK) { // service ID
return true;
}
if ((uuri.ue_id() & UPPER_16_BIT_MASK) ==
UPPER_16_BIT_MASK) { // service instance ID
return true;
}
if (uuri.ue_version_major() == LOWER_8_BIT_MASK) {
return true;
}
if (uuri.resource_id() == LOWER_16_BIT_MASK) {
return true;
}
return false;
bool has_wildcard_version(const v1::UUri& uuri) {
constexpr auto LOWER_8_BIT_MASK = 0xFF;
return uuri.ue_version_major() == LOWER_8_BIT_MASK;
}

bool has_wildcard_resource_id(const v1::UUri& uuri) {
constexpr auto LOWER_16_BIT_MASK = 0xFFFF;
return uuri.resource_id() == LOWER_16_BIT_MASK;
}

bool verify_no_wildcards(const v1::UUri& uuri) {
return !has_wildcard_authority(uuri) && !has_wildcard_service_id(uuri) &&
!has_wildcard_service_instance_id(uuri) &&
!has_wildcard_version(uuri) && !has_wildcard_resource_id(uuri);
}

ValidationResult isValid(const v1::UUri& uuri) {
Expand Down Expand Up @@ -145,7 +150,7 @@ ValidationResult isValidFilter(const v1::UUri& uuri) {

ValidationResult isValidRpcMethod(const v1::UUri& uuri) {
// disallow wildcards
if (uses_wildcards(uuri)) {
if (!verify_no_wildcards(uuri)) {
return {false, Reason::DISALLOWED_WILDCARD};
}

Expand All @@ -159,7 +164,7 @@ ValidationResult isValidRpcMethod(const v1::UUri& uuri) {

ValidationResult isValidRpcResponse(const v1::UUri& uuri) {
// disallow wildcards
if (uses_wildcards(uuri)) {
if (!verify_no_wildcards(uuri)) {
return {false, Reason::DISALLOWED_WILDCARD};
}

Expand All @@ -183,7 +188,7 @@ ValidationResult isValidDefaultSource(const v1::UUri& uuri) {

ValidationResult isValidPublishTopic(const v1::UUri& uuri) {
// disallow wildcards
if (uses_wildcards(uuri)) {
if (!verify_no_wildcards(uuri)) {
return {false, Reason::DISALLOWED_WILDCARD};
}

Expand All @@ -197,7 +202,7 @@ ValidationResult isValidPublishTopic(const v1::UUri& uuri) {

ValidationResult isValidNotificationSource(const v1::UUri& uuri) {
// disallow wildcards
if (uses_wildcards(uuri)) {
if (!verify_no_wildcards(uuri)) {
return {false, Reason::DISALLOWED_WILDCARD};
}

Expand All @@ -211,7 +216,7 @@ ValidationResult isValidNotificationSource(const v1::UUri& uuri) {

ValidationResult isValidNotificationSink(const v1::UUri& uuri) {
// disallow wildcards
if (uses_wildcards(uuri)) {
if (!verify_no_wildcards(uuri)) {
return {false, Reason::DISALLOWED_WILDCARD};
}

Expand Down
67 changes: 51 additions & 16 deletions test/coverage/datamodel/UUriValidatorTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ TEST_F(TestUUriValidator, Valid) { // NOLINT
{
auto uuri = get_u_uri();
uuri.set_resource_id(WILDCARD);
EXPECT_TRUE(uses_wildcards(uuri));
EXPECT_TRUE(has_wildcard_resource_id(uuri));
EXPECT_FALSE(verify_no_wildcards(uuri));

auto [valid, reason] = isValid(uuri);
EXPECT_FALSE(valid);
Expand All @@ -123,41 +124,50 @@ TEST_F(TestUUriValidator, Wildcards) { // NOLINT

{ // Check for no wildcards
auto uuri = get_u_uri();
EXPECT_FALSE(uses_wildcards(uuri));
EXPECT_FALSE(has_wildcard_authority(uuri));
EXPECT_FALSE(has_wildcard_service_id(uuri));
EXPECT_FALSE(has_wildcard_service_instance_id(uuri));
EXPECT_FALSE(has_wildcard_version(uuri));
EXPECT_FALSE(has_wildcard_resource_id(uuri));
EXPECT_TRUE(verify_no_wildcards(uuri));
}

{ // Change Authority name to "hello*" (Any)
{ // Change Authority name to "*" (Any)
auto uuri = get_u_uri();
uuri.set_authority_name("hello*");
EXPECT_TRUE(uses_wildcards(uuri));
uuri.set_authority_name("*");
EXPECT_TRUE(has_wildcard_authority(uuri));
EXPECT_FALSE(verify_no_wildcards(uuri));
}

{ // Set Service ID to FFFF (Any) and Instance ID to 1
constexpr uint32_t WILDCARD_SERVICE_UE_ID = 0x0001FFFF;
auto uuri = get_u_uri();
uuri.set_ue_id(WILDCARD_SERVICE_UE_ID);
EXPECT_TRUE(uses_wildcards(uuri));
EXPECT_TRUE(has_wildcard_service_id(uuri));
EXPECT_FALSE(verify_no_wildcards(uuri));
}

{ // Set Service ID to 1 and Instance ID to FFFF (Any)
constexpr uint32_t WILDCARD_INSTANCE_UE_ID = 0xFFFF0001;
// This changed in 581291f in up-spec
auto uuri = get_u_uri();
uuri.set_ue_id(WILDCARD_INSTANCE_UE_ID);
EXPECT_TRUE(uses_wildcards(uuri));
EXPECT_TRUE(has_wildcard_service_instance_id(uuri));
EXPECT_FALSE(verify_no_wildcards(uuri));
}

{ // Set major version to FF (Any)
constexpr uint32_t WILDCARD_VERSION_MAJOR = 0xFF;
auto uuri = get_u_uri();
uuri.set_ue_version_major(WILDCARD_VERSION_MAJOR);
EXPECT_TRUE(uses_wildcards(uuri));
EXPECT_TRUE(has_wildcard_version(uuri));
EXPECT_FALSE(verify_no_wildcards(uuri));
}

{ // Set Resource ID to FFFF (any)
auto uuri = get_u_uri();
uuri.set_resource_id(WILDCARD);
EXPECT_TRUE(uses_wildcards(uuri));
EXPECT_TRUE(has_wildcard_resource_id(uuri));
EXPECT_FALSE(verify_no_wildcards(uuri));
}
}

Expand All @@ -183,7 +193,12 @@ TEST_F(TestUUriValidator, ValidRpcMethod) { // NOLINT
auto [valid, reason] = isValidRpcMethod(uuri);
EXPECT_TRUE(valid);
EXPECT_FALSE(reason.has_value());
EXPECT_FALSE(uses_wildcards(uuri));
EXPECT_FALSE(has_wildcard_authority(uuri));
EXPECT_FALSE(has_wildcard_service_id(uuri));
EXPECT_FALSE(has_wildcard_service_instance_id(uuri));
EXPECT_FALSE(has_wildcard_version(uuri));
EXPECT_FALSE(has_wildcard_resource_id(uuri));
EXPECT_TRUE(verify_no_wildcards(uuri));
}

{
Expand Down Expand Up @@ -234,7 +249,7 @@ TEST_F(TestUUriValidator, ValidRpcResponse) { // NOLINT
auto [valid, reason] = isValidRpcResponse(uuri);
EXPECT_TRUE(valid);
EXPECT_FALSE(reason.has_value());
EXPECT_FALSE(uses_wildcards(uuri));
EXPECT_TRUE(verify_no_wildcards(uuri));
}

{
Expand Down Expand Up @@ -285,7 +300,12 @@ TEST_F(TestUUriValidator, ValidPublishTopic) { // NOLINT
auto [valid, reason] = isValidPublishTopic(uuri);
EXPECT_TRUE(valid);
EXPECT_FALSE(reason.has_value());
EXPECT_FALSE(uses_wildcards(uuri));
EXPECT_FALSE(has_wildcard_authority(uuri));
EXPECT_FALSE(has_wildcard_service_id(uuri));
EXPECT_FALSE(has_wildcard_service_instance_id(uuri));
EXPECT_FALSE(has_wildcard_version(uuri));
EXPECT_FALSE(has_wildcard_resource_id(uuri));
EXPECT_TRUE(verify_no_wildcards(uuri));
}

{
Expand Down Expand Up @@ -345,7 +365,12 @@ TEST_F(TestUUriValidator, ValidNotificationSource) { // NOLINT
auto [valid, reason] = isValidNotificationSource(uuri);
EXPECT_TRUE(valid);
EXPECT_FALSE(reason.has_value());
EXPECT_FALSE(uses_wildcards(uuri));
EXPECT_FALSE(has_wildcard_authority(uuri));
EXPECT_FALSE(has_wildcard_service_id(uuri));
EXPECT_FALSE(has_wildcard_service_instance_id(uuri));
EXPECT_FALSE(has_wildcard_version(uuri));
EXPECT_FALSE(has_wildcard_resource_id(uuri));
EXPECT_TRUE(verify_no_wildcards(uuri));
}

{
Expand Down Expand Up @@ -404,7 +429,12 @@ TEST_F(TestUUriValidator, ValidNotificationSink) { // NOLINT
auto [valid, reason] = isValidNotificationSink(uuri);
EXPECT_TRUE(valid);
EXPECT_FALSE(reason.has_value());
EXPECT_FALSE(uses_wildcards(uuri));
EXPECT_FALSE(has_wildcard_authority(uuri));
EXPECT_FALSE(has_wildcard_service_id(uuri));
EXPECT_FALSE(has_wildcard_service_instance_id(uuri));
EXPECT_FALSE(has_wildcard_version(uuri));
EXPECT_FALSE(has_wildcard_resource_id(uuri));
EXPECT_TRUE(verify_no_wildcards(uuri));
}

{
Expand Down Expand Up @@ -448,7 +478,12 @@ TEST_F(TestUUriValidator, ValidSubscription) { // NOLINT
auto [valid, reason] = isValidSubscription(uuri);
EXPECT_TRUE(valid);
EXPECT_FALSE(reason.has_value());
EXPECT_FALSE(uses_wildcards(uuri));
EXPECT_FALSE(has_wildcard_authority(uuri));
EXPECT_FALSE(has_wildcard_service_id(uuri));
EXPECT_FALSE(has_wildcard_service_instance_id(uuri));
EXPECT_FALSE(has_wildcard_version(uuri));
EXPECT_FALSE(has_wildcard_resource_id(uuri));
EXPECT_TRUE(verify_no_wildcards(uuri));
}

{
Expand Down
Loading