|
5 | 5 | //! handler claims them. |
6 | 6 |
|
7 | 7 | use sacp::link::UntypedLink; |
| 8 | +use sacp::util::run_until; |
8 | 9 | use sacp::{ |
9 | | - JrConnectionCx, JrMessage, JrNotification, JrRequest, JrRequestCx, JrResponse, |
| 10 | + Component, JrConnectionCx, JrMessage, JrNotification, JrRequest, JrRequestCx, JrResponse, |
10 | 11 | JrResponsePayload, |
11 | 12 | }; |
12 | 13 | use serde::{Deserialize, Serialize}; |
@@ -623,3 +624,54 @@ async fn test_handler_claims_notification() { |
623 | 624 | }) |
624 | 625 | .await; |
625 | 626 | } |
| 627 | + |
| 628 | +// ============================================================================ |
| 629 | +// Test 6: JrConnectionBuilder implements Component |
| 630 | +// ============================================================================ |
| 631 | + |
| 632 | +#[tokio::test] |
| 633 | +async fn test_connection_builder_as_component() -> Result<(), sacp::Error> { |
| 634 | + // Create duplex streams |
| 635 | + let (server_stream, client_stream) = tokio::io::duplex(8192); |
| 636 | + let (server_read, server_write) = tokio::io::split(server_stream); |
| 637 | + let (client_read, client_write) = tokio::io::split(client_stream); |
| 638 | + |
| 639 | + // Create a connection builder (server side) |
| 640 | + let server_builder = UntypedLink::builder().on_receive_request( |
| 641 | + async |request: FooRequest, |
| 642 | + request_cx: JrRequestCx<FooResponse>, |
| 643 | + _cx: JrConnectionCx<UntypedLink>| { |
| 644 | + request_cx.respond(FooResponse { |
| 645 | + result: format!("component: {}", request.value), |
| 646 | + }) |
| 647 | + }, |
| 648 | + sacp::on_receive_request!(), |
| 649 | + ); |
| 650 | + |
| 651 | + // Create ByteStreams for both sides |
| 652 | + let server_transport = |
| 653 | + sacp::ByteStreams::new(server_write.compat_write(), server_read.compat()); |
| 654 | + let client_transport = |
| 655 | + sacp::ByteStreams::new(client_write.compat_write(), client_read.compat()); |
| 656 | + |
| 657 | + // Use JrConnectionBuilder as a Component via run_until |
| 658 | + run_until( |
| 659 | + // This uses Component::serve on JrConnectionBuilder |
| 660 | + Component::<UntypedLink>::serve(server_builder, server_transport), |
| 661 | + async move { |
| 662 | + // Client side |
| 663 | + UntypedLink::builder() |
| 664 | + .run_until(client_transport, async |cx| { |
| 665 | + let response = recv(cx.send_request(FooRequest { |
| 666 | + value: "test".to_string(), |
| 667 | + })) |
| 668 | + .await?; |
| 669 | + |
| 670 | + assert_eq!(response.result, "component: test"); |
| 671 | + Ok(()) |
| 672 | + }) |
| 673 | + .await |
| 674 | + }, |
| 675 | + ) |
| 676 | + .await |
| 677 | +} |
0 commit comments