@@ -49,7 +49,7 @@ mod tests {
4949 } ,
5050 Config , Engine , Mailbox ,
5151 } ;
52- use crate :: { Handler , Monitor , Originator } ;
52+ use crate :: { Error , Handler , Monitor , Originator } ;
5353 use commonware_codec:: Encode ;
5454 use commonware_cryptography:: {
5555 ed25519:: { PrivateKey , PublicKey } ,
@@ -208,7 +208,8 @@ mod tests {
208208 let request = Request { id : 1 , data : 1 } ;
209209 let recipients = mailbox1
210210 . send ( Recipients :: One ( peers[ 1 ] . clone ( ) ) , request. clone ( ) )
211- . await ;
211+ . await
212+ . expect ( "send failed" ) ;
212213 assert_eq ! ( recipients, vec![ peers[ 1 ] . clone( ) ] ) ;
213214
214215 // Verify peer 2 received the request
@@ -275,7 +276,8 @@ mod tests {
275276 let commitment = request. commitment ( ) ;
276277 let recipients = mailbox
277278 . send ( Recipients :: One ( peers[ 1 ] . clone ( ) ) , request. clone ( ) )
278- . await ;
279+ . await
280+ . expect ( "send failed" ) ;
279281 assert_eq ! ( recipients, vec![ peers[ 1 ] . clone( ) ] ) ;
280282
281283 // Cancel immediately
@@ -356,7 +358,10 @@ mod tests {
356358
357359 // Broadcast request
358360 let request = Request { id : 3 , data : 3 } ;
359- let recipients = mailbox1. send ( Recipients :: All , request. clone ( ) ) . await ;
361+ let recipients = mailbox1
362+ . send ( Recipients :: All , request. clone ( ) )
363+ . await
364+ . expect ( "send failed" ) ;
360365 assert_eq ! ( recipients. len( ) , 2 ) ;
361366 assert ! ( recipients. contains( & peers[ 1 ] ) ) ;
362367 assert ! ( recipients. contains( & peers[ 2 ] ) ) ;
@@ -434,7 +439,8 @@ mod tests {
434439 for _ in 0 ..3 {
435440 let recipients = mailbox1
436441 . send ( Recipients :: One ( peers[ 1 ] . clone ( ) ) , request. clone ( ) )
437- . await ;
442+ . await
443+ . expect ( "send failed" ) ;
438444 assert_eq ! ( recipients, vec![ peers[ 1 ] . clone( ) ] ) ;
439445 }
440446
@@ -507,10 +513,12 @@ mod tests {
507513 let request2 = Request { id : 20 , data : 20 } ;
508514 mailbox1
509515 . send ( Recipients :: One ( peers[ 1 ] . clone ( ) ) , request1)
510- . await ;
516+ . await
517+ . expect ( "send failed" ) ;
511518 mailbox1
512519 . send ( Recipients :: One ( peers[ 1 ] . clone ( ) ) , request2)
513- . await ;
520+ . await
521+ . expect ( "send failed" ) ;
514522
515523 // Collect both responses
516524 let mut response10_received = false ;
@@ -585,7 +593,8 @@ mod tests {
585593 let request = Request { id : 100 , data : 100 } ;
586594 let recipients = mailbox1
587595 . send ( Recipients :: One ( peers[ 1 ] . clone ( ) ) , request. clone ( ) )
588- . await ;
596+ . await
597+ . expect ( "send failed" ) ;
589598 assert_eq ! ( recipients, vec![ peers[ 1 ] . clone( ) ] ) ;
590599
591600 // Verify handler received request but didn't respond
@@ -632,7 +641,10 @@ mod tests {
632641
633642 // Send request with empty recipients list
634643 let request = Request { id : 1 , data : 1 } ;
635- let recipients = mailbox. send ( Recipients :: All , request. clone ( ) ) . await ;
644+ let recipients = mailbox
645+ . send ( Recipients :: All , request. clone ( ) )
646+ . await
647+ . expect ( "send failed" ) ;
636648 assert_eq ! ( recipients, Vec :: <PublicKey >:: new( ) ) ;
637649
638650 // Verify no responses collected
@@ -647,6 +659,92 @@ mod tests {
647659 } ) ;
648660 }
649661
662+ #[ test_traced]
663+ fn test_send_fails_with_network_error ( ) {
664+ let executor = deterministic:: Runner :: timed ( Duration :: from_secs ( 10 ) ) ;
665+ executor. start ( |context| async move {
666+ let ( oracle, schemes, peers, connections) =
667+ setup_network_and_peers ( & context, & [ 0 , 1 ] ) . await ;
668+ let mut schemes = schemes. into_iter ( ) ;
669+ let mut connections = connections. into_iter ( ) ;
670+
671+ // Setup peer 1 with a failing sender
672+ let scheme = schemes. next ( ) . unwrap ( ) ;
673+ let conn = connections. next ( ) . unwrap ( ) ;
674+ let ( _, receiver1) = conn. 0 ; // Request channel
675+ let sender1 = super :: mocks:: sender:: Failing :: < PublicKey > :: new ( ) ;
676+ let ( sender2, receiver2) = conn. 1 ; // Response channel
677+ let ( engine, mut mailbox) = Engine :: new (
678+ context. with_label ( & format ! ( "engine_{}" , scheme. public_key( ) ) ) ,
679+ Config {
680+ blocker : oracle. control ( scheme. public_key ( ) ) ,
681+ monitor : MockMonitor :: dummy ( ) ,
682+ handler : MockHandler :: dummy ( ) ,
683+ mailbox_size : MAILBOX_SIZE ,
684+ priority_request : false ,
685+ request_codec : ( ) ,
686+ priority_response : false ,
687+ response_codec : ( ) ,
688+ } ,
689+ ) ;
690+
691+ // Start engine
692+ engine. start ( ( sender1, receiver1) , ( sender2, receiver2) ) ;
693+
694+ // Send request
695+ let request = Request { id : 1 , data : 1 } ;
696+ let err = mailbox
697+ . send ( Recipients :: One ( peers[ 1 ] . clone ( ) ) , request. clone ( ) )
698+ . await
699+ . unwrap_err ( ) ;
700+ assert ! ( matches!( err, Error :: SendFailed ( _) ) ) ;
701+ } ) ;
702+ }
703+
704+ #[ test_traced]
705+ fn test_send_fails_with_canceled ( ) {
706+ let executor = deterministic:: Runner :: timed ( Duration :: from_secs ( 10 ) ) ;
707+ executor. start ( |context| async move {
708+ let ( oracle, schemes, peers, connections) =
709+ setup_network_and_peers ( & context, & [ 0 , 1 ] ) . await ;
710+ let mut schemes = schemes. into_iter ( ) ;
711+ let mut connections = connections. into_iter ( ) ;
712+
713+ // Setup peer 1 with a failing sender
714+ let scheme = schemes. next ( ) . unwrap ( ) ;
715+ let conn = connections. next ( ) . unwrap ( ) ;
716+ let ( sender1, receiver1) = conn. 0 ; // Request channel
717+ let ( sender2, receiver2) = conn. 1 ; // Response channel
718+ let ( engine, mut mailbox) = Engine :: new (
719+ context. with_label ( & format ! ( "engine_{}" , scheme. public_key( ) ) ) ,
720+ Config {
721+ blocker : oracle. control ( scheme. public_key ( ) ) ,
722+ monitor : MockMonitor :: dummy ( ) ,
723+ handler : MockHandler :: dummy ( ) ,
724+ mailbox_size : MAILBOX_SIZE ,
725+ priority_request : false ,
726+ request_codec : ( ) ,
727+ priority_response : false ,
728+ response_codec : ( ) ,
729+ } ,
730+ ) ;
731+
732+ // Start engine
733+ let handle = engine. start ( ( sender1, receiver1) , ( sender2, receiver2) ) ;
734+
735+ // Stop the engine (which will result in all further requests being canceled)
736+ handle. abort ( ) ;
737+
738+ // Send request (will return Error::Canceled instead of Error::SendFailed)
739+ let request = Request { id : 1 , data : 1 } ;
740+ let err = mailbox
741+ . send ( Recipients :: One ( peers[ 1 ] . clone ( ) ) , request. clone ( ) )
742+ . await
743+ . unwrap_err ( ) ;
744+ assert ! ( matches!( err, Error :: Canceled ) ) ;
745+ } ) ;
746+ }
747+
650748 #[ test_traced]
651749 fn test_response_from_unknown_peer ( ) {
652750 let executor = deterministic:: Runner :: timed ( Duration :: from_secs ( 10 ) ) ;
@@ -701,7 +799,8 @@ mod tests {
701799 let request_to_peer2 = Request { id : 42 , data : 42 } ;
702800 let recipients = mailbox1
703801 . send ( Recipients :: One ( peers[ 1 ] . clone ( ) ) , request_to_peer2. clone ( ) )
704- . await ;
802+ . await
803+ . expect ( "send failed" ) ;
705804 assert_eq ! ( recipients, vec![ peers[ 1 ] . clone( ) ] ) ;
706805
707806 // Send a response from peer 3 to peer 1
0 commit comments