@@ -493,7 +493,7 @@ async fn test_do_exchange() {
493
493
. set_do_exchange_response ( output_flight_data. clone ( ) . into_iter ( ) . map ( Ok ) . collect ( ) ) ;
494
494
495
495
let response_stream = client
496
- . do_exchange ( futures:: stream:: iter ( input_flight_data. clone ( ) ) )
496
+ . do_exchange ( futures:: stream:: iter ( input_flight_data. clone ( ) ) . map ( Ok ) )
497
497
. await
498
498
. expect ( "error making request" ) ;
499
499
@@ -528,7 +528,7 @@ async fn test_do_exchange_error() {
528
528
let input_flight_data = test_flight_data ( ) . await ;
529
529
530
530
let response = client
531
- . do_exchange ( futures:: stream:: iter ( input_flight_data. clone ( ) ) )
531
+ . do_exchange ( futures:: stream:: iter ( input_flight_data. clone ( ) ) . map ( Ok ) )
532
532
. await ;
533
533
let response = match response {
534
534
Ok ( _) => panic ! ( "unexpected success" ) ,
@@ -572,7 +572,7 @@ async fn test_do_exchange_error_stream() {
572
572
test_server. set_do_exchange_response ( response) ;
573
573
574
574
let response_stream = client
575
- . do_exchange ( futures:: stream:: iter ( input_flight_data. clone ( ) ) )
575
+ . do_exchange ( futures:: stream:: iter ( input_flight_data. clone ( ) ) . map ( Ok ) )
576
576
. await
577
577
. expect ( "error making request" ) ;
578
578
@@ -593,6 +593,97 @@ async fn test_do_exchange_error_stream() {
593
593
. await ;
594
594
}
595
595
596
+ #[ tokio:: test]
597
+ async fn test_do_exchange_error_stream_client ( ) {
598
+ do_test ( |test_server, mut client| async move {
599
+ client. add_header ( "foo-header" , "bar-header-value" ) . unwrap ( ) ;
600
+
601
+ let e = Status :: invalid_argument ( "bad arg: client" ) ;
602
+
603
+ // input stream to client sends good FlightData followed by an error
604
+ let input_flight_data = test_flight_data ( ) . await ;
605
+ let input_stream = futures:: stream:: iter ( input_flight_data. clone ( ) )
606
+ . map ( Ok )
607
+ . chain ( futures:: stream:: iter ( vec ! [ Err ( FlightError :: from(
608
+ e. clone( ) ,
609
+ ) ) ] ) ) ;
610
+
611
+ let output_flight_data = FlightData :: new ( )
612
+ . with_descriptor ( FlightDescriptor :: new_cmd ( "Sample command" ) )
613
+ . with_data_body ( "body" . as_bytes ( ) )
614
+ . with_data_header ( "header" . as_bytes ( ) )
615
+ . with_app_metadata ( "metadata" . as_bytes ( ) ) ;
616
+
617
+ // server responds with one good message
618
+ let response = vec ! [ Ok ( output_flight_data) ] ;
619
+ test_server. set_do_exchange_response ( response) ;
620
+
621
+ let response_stream = client
622
+ . do_exchange ( input_stream)
623
+ . await
624
+ . expect ( "error making request" ) ;
625
+
626
+ let response: Result < Vec < _ > , _ > = response_stream. try_collect ( ) . await ;
627
+ let response = match response {
628
+ Ok ( _) => panic ! ( "unexpected success" ) ,
629
+ Err ( e) => e,
630
+ } ;
631
+
632
+ // expect to the error made from the client
633
+ expect_status ( response, e) ;
634
+ // server still got the request messages until the client sent the error
635
+ assert_eq ! (
636
+ test_server. take_do_exchange_request( ) ,
637
+ Some ( input_flight_data)
638
+ ) ;
639
+ ensure_metadata ( & client, & test_server) ;
640
+ } )
641
+ . await ;
642
+ }
643
+
644
+ #[ tokio:: test]
645
+ async fn test_do_exchange_error_client_and_server ( ) {
646
+ do_test ( |test_server, mut client| async move {
647
+ client. add_header ( "foo-header" , "bar-header-value" ) . unwrap ( ) ;
648
+
649
+ let e_client = Status :: invalid_argument ( "bad arg: client" ) ;
650
+ let e_server = Status :: invalid_argument ( "bad arg: server" ) ;
651
+
652
+ // input stream to client sends good FlightData followed by an error
653
+ let input_flight_data = test_flight_data ( ) . await ;
654
+ let input_stream = futures:: stream:: iter ( input_flight_data. clone ( ) )
655
+ . map ( Ok )
656
+ . chain ( futures:: stream:: iter ( vec ! [ Err ( FlightError :: from(
657
+ e_client. clone( ) ,
658
+ ) ) ] ) ) ;
659
+
660
+ // server responds with an error (e.g. because it got truncated data)
661
+ let response = vec ! [ Err ( e_server) ] ;
662
+ test_server. set_do_exchange_response ( response) ;
663
+
664
+ let response_stream = client
665
+ . do_exchange ( input_stream)
666
+ . await
667
+ . expect ( "error making request" ) ;
668
+
669
+ let response: Result < Vec < _ > , _ > = response_stream. try_collect ( ) . await ;
670
+ let response = match response {
671
+ Ok ( _) => panic ! ( "unexpected success" ) ,
672
+ Err ( e) => e,
673
+ } ;
674
+
675
+ // expect to the error made from the client (not the server)
676
+ expect_status ( response, e_client) ;
677
+ // server still got the request messages until the client sent the error
678
+ assert_eq ! (
679
+ test_server. take_do_exchange_request( ) ,
680
+ Some ( input_flight_data)
681
+ ) ;
682
+ ensure_metadata ( & client, & test_server) ;
683
+ } )
684
+ . await ;
685
+ }
686
+
596
687
#[ tokio:: test]
597
688
async fn test_get_schema ( ) {
598
689
do_test ( |test_server, mut client| async move {
0 commit comments