@@ -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) ]
150152mod 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