Skip to content

Commit 848af63

Browse files
Implement dsn~usubscription-fetch-subscriptions-invalid-subscriber (eclipse-uprotocol#23)
1 parent 3eda1b3 commit 848af63

File tree

2 files changed

+86
-13
lines changed

2 files changed

+86
-13
lines changed

up-subscription/src/common/helpers.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,26 +92,31 @@ pub(crate) fn duration_until_timestamp(future_timestamp_millis: u128) -> Option<
9292

9393
// Validate that a topic URI
9494
// * is a valid uProtocol URI and
95+
// * is not empty
9596
// * does not contain a _wildcard_ authority and
9697
// * does not contain a _wildcard_ uEntity instance (`ue_id`) and
9798
// * does not contain a _wildcard_ resource ID
98-
pub(crate) fn validate_uri(topic: &UUri) -> Result<(), ServiceInvocationError> {
99-
topic
100-
.check_validity()
101-
.map_err(|e| ServiceInvocationError::InvalidArgument(format!("Invalid topic URI {e}")))?;
102-
if topic.has_wildcard_authority() {
99+
pub(crate) fn validate_uri(uri: &UUri) -> Result<(), ServiceInvocationError> {
100+
uri.check_validity()
101+
.map_err(|e| ServiceInvocationError::InvalidArgument(format!("Invalid URI {e}")))?;
102+
if uri.is_empty() {
103103
return Err(ServiceInvocationError::InvalidArgument(
104-
"Topic URI with wildcard authority".to_string(),
104+
"Empty/default URI".to_string(),
105105
));
106106
};
107-
if topic.has_wildcard_entity_instance() {
107+
if uri.has_wildcard_authority() {
108108
return Err(ServiceInvocationError::InvalidArgument(
109-
"Topic URI with wildcard entity instance".to_string(),
109+
"URI with wildcard authority".to_string(),
110110
));
111111
};
112-
if topic.has_wildcard_resource_id() {
112+
if uri.has_wildcard_entity_instance() {
113113
return Err(ServiceInvocationError::InvalidArgument(
114-
"Topic URI with wildcard resource id".to_string(),
114+
"URI with wildcard entity instance".to_string(),
115+
));
116+
};
117+
if uri.has_wildcard_resource_id() {
118+
return Err(ServiceInvocationError::InvalidArgument(
119+
"URI with wildcard resource id".to_string(),
115120
));
116121
};
117122

up-subscription/src/handlers/fetch_subscriptions.rs

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,13 @@ impl RequestHandler for FetchSubscriptionsRequestHandler {
7474
}
7575
}
7676
Some(Request::Subscriber(subscriber)) => {
77-
if subscriber.uri.is_some() {
78-
RequestKind::Subscriber(subscriber.uri.unwrap_or_default())
77+
if let Some(subscriber) = subscriber.uri.into_option() {
78+
// [impl->dsn~usubscription-fetch-subscriptions-invalid-subscriber~1]
79+
helpers::validate_uri(&subscriber)?;
80+
RequestKind::Subscriber(subscriber)
7981
} else {
8082
return Err(ServiceInvocationError::InvalidArgument(
81-
"Empty subscriber uri in Request::Subscriber".to_string(),
83+
"Missing subscriber uri in Request::Subscriber".to_string(),
8284
));
8385
}
8486
}
@@ -149,8 +151,11 @@ impl RequestHandler for FetchSubscriptionsRequestHandler {
149151
#[cfg(test)]
150152
mod tests {
151153
use super::*;
154+
use test_case::test_case;
152155
use tokio::sync::mpsc::{self};
153156

157+
use up_rust::UUri;
158+
154159
use crate::{helpers, tests::test_lib};
155160

156161
// [utest->dsn~usubscription-fetch-subscriptions-protobuf~1]
@@ -339,4 +344,67 @@ mod tests {
339344
_ => panic!("Wrong error type"),
340345
}
341346
}
347+
348+
// [utest->dsn~usubscription-fetch-subscriptions-invalid-subscriber~1]
349+
#[test_case(UUri::default(); "Bad subscriber UUri")]
350+
#[test_case(UUri {
351+
authority_name: String::from("*"),
352+
ue_id: test_lib::helpers::SUBSCRIBER1_ID,
353+
ue_version_major: test_lib::helpers::SUBSCRIBER1_VERSION as u32,
354+
resource_id: test_lib::helpers::SUBSCRIBER1_RESOURCE as u32,
355+
..Default::default()
356+
}; "Wildcard authority in subscriber UUri")]
357+
#[test_case(UUri {
358+
authority_name: test_lib::helpers::LOCAL_AUTHORITY.into(),
359+
ue_id: 0xFFFF_0000,
360+
ue_version_major: test_lib::helpers::SUBSCRIBER1_VERSION as u32,
361+
resource_id: test_lib::helpers::SUBSCRIBER1_RESOURCE as u32,
362+
..Default::default()
363+
}; "Wildcard entity id in subscriber UUri")]
364+
#[test_case(UUri {
365+
authority_name: test_lib::helpers::LOCAL_AUTHORITY.into(),
366+
ue_id: test_lib::helpers::SUBSCRIBER1_ID,
367+
ue_version_major: test_lib::helpers::SUBSCRIBER1_VERSION as u32,
368+
resource_id: 0x0000_FFFF,
369+
..Default::default()
370+
}; "Wildcard resource id in subscriber UUri")]
371+
#[tokio::test]
372+
async fn test_invalid_subscriber_uri(subscriber: UUri) {
373+
helpers::init_once();
374+
375+
// create request and other required object(s)
376+
let fetch_subscriptions_request = FetchSubscriptionsRequest {
377+
request: Some(up_rust::core::usubscription::Request::Subscriber(
378+
SubscriberInfo {
379+
uri: Some(subscriber).into(),
380+
..Default::default()
381+
},
382+
)),
383+
..Default::default()
384+
};
385+
let request_payload =
386+
UPayload::try_from_protobuf(fetch_subscriptions_request.clone()).unwrap();
387+
let message_attributes = UAttributes {
388+
source: Some(test_lib::helpers::subscriber_uri1()).into(),
389+
..Default::default()
390+
};
391+
let (subscription_sender, _) = mpsc::channel::<SubscriptionEvent>(1);
392+
393+
// create handler and perform tested operation
394+
let request_handler = FetchSubscriptionsRequestHandler::new(subscription_sender);
395+
396+
let result = request_handler
397+
.handle_request(
398+
up_rust::core::usubscription::RESOURCE_ID_FETCH_SUBSCRIPTIONS,
399+
&message_attributes,
400+
Some(request_payload),
401+
)
402+
.await;
403+
404+
assert!(result.is_err());
405+
match result.unwrap_err() {
406+
ServiceInvocationError::InvalidArgument(_) => {}
407+
_ => panic!("Wrong error type"),
408+
}
409+
}
342410
}

0 commit comments

Comments
 (0)