@@ -7,7 +7,14 @@ use futures::{FutureExt, Stream, StreamExt};
77use lazy_static:: lazy_static;
88use libp2p:: core:: transport:: PortUse ;
99use libp2p:: core:: { ConnectedPoint , Endpoint } ;
10- use libp2p:: swarm:: { ConnectionClosed , ConnectionId , FromSwarm , NetworkBehaviour , ToSwarm } ;
10+ use libp2p:: swarm:: {
11+ ConnectionClosed ,
12+ ConnectionId ,
13+ FromSwarm ,
14+ NetworkBehaviour ,
15+ NotifyHandler ,
16+ ToSwarm ,
17+ } ;
1118use libp2p:: { Multiaddr , PeerId , StreamProtocol } ;
1219
1320use super :: super :: handler:: { RequestFromBehaviourEvent , RequestToBehaviourEvent } ;
@@ -319,7 +326,7 @@ async fn create_and_process_outbound_session() {
319326
320327 let peer_id = * DUMMY_PEER_ID ;
321328
322- let outbound_session_id = behaviour. start_query ( QUERY . clone ( ) , PROTOCOL_NAME . clone ( ) ) ;
329+ let outbound_session_id = behaviour. start_query ( QUERY . clone ( ) , PROTOCOL_NAME . clone ( ) , None ) ;
323330
324331 validate_request_peer_assignment_event ( & mut behaviour, outbound_session_id) . await ;
325332 validate_no_events ( & mut behaviour) ;
@@ -354,7 +361,7 @@ async fn connection_closed() {
354361 let peer_id = * DUMMY_PEER_ID ;
355362
356363 // Add an outbound session on the connection.
357- let outbound_session_id = behaviour. start_query ( QUERY . clone ( ) , PROTOCOL_NAME . clone ( ) ) ;
364+ let outbound_session_id = behaviour. start_query ( QUERY . clone ( ) , PROTOCOL_NAME . clone ( ) , None ) ;
358365 // Consume the event to request peer assignment.
359366 behaviour. next ( ) . await . unwrap ( ) ;
360367 simulate_peer_assigned ( & mut behaviour, peer_id, outbound_session_id) ;
@@ -400,7 +407,7 @@ async fn drop_outbound_session() {
400407
401408 let peer_id = * DUMMY_PEER_ID ;
402409
403- let outbound_session_id = behaviour. start_query ( QUERY . clone ( ) , PROTOCOL_NAME . clone ( ) ) ;
410+ let outbound_session_id = behaviour. start_query ( QUERY . clone ( ) , PROTOCOL_NAME . clone ( ) , None ) ;
404411 // Consume the event to request peer assignment.
405412 behaviour. next ( ) . await . unwrap ( ) ;
406413 simulate_peer_assigned ( & mut behaviour, peer_id, outbound_session_id) ;
@@ -464,3 +471,40 @@ fn send_response_non_existing_session_fails() {
464471 behaviour. send_response ( response, InboundSessionId :: default ( ) ) . unwrap_err ( ) ;
465472 }
466473}
474+
475+ #[ tokio:: test]
476+ async fn create_outbound_session_with_specified_peer ( ) {
477+ let mut behaviour = Behaviour :: new ( Config :: get_test_config ( ) ) ;
478+
479+ let peer_id = * DUMMY_PEER_ID ;
480+
481+ // Start a query with a specific peer ID
482+ let outbound_session_id =
483+ behaviour. start_query ( QUERY . clone ( ) , PROTOCOL_NAME . clone ( ) , Some ( peer_id) ) ;
484+
485+ // Should not generate a RequestPeerAssignment event since peer is specified
486+ // Instead, should directly generate a NotifyHandler event
487+ let event = behaviour. next ( ) . await . unwrap ( ) ;
488+ assert_matches ! (
489+ event,
490+ ToSwarm :: NotifyHandler {
491+ peer_id: event_peer_id,
492+ handler: NotifyHandler :: Any ,
493+ event: RequestFromBehaviourEvent :: CreateOutboundSession {
494+ query: event_query,
495+ outbound_session_id: event_outbound_session_id,
496+ protocol_name,
497+ } ,
498+ } if event_peer_id == peer_id
499+ && event_outbound_session_id == outbound_session_id
500+ && event_query == QUERY . clone( )
501+ && protocol_name == PROTOCOL_NAME . clone( )
502+ ) ;
503+ validate_no_events ( & mut behaviour) ;
504+
505+ // Verify the session is tracked
506+ let ( tracked_peer_id, _connection_id) = behaviour
507+ . get_peer_id_and_connection_id_from_session_id ( outbound_session_id. into ( ) )
508+ . unwrap ( ) ;
509+ assert_eq ! ( tracked_peer_id, peer_id) ;
510+ }
0 commit comments