@@ -6,7 +6,6 @@ use common::handlers::TestServer;
66use rmcp:: {
77 ServiceExt ,
88 model:: { ClientJsonRpcMessage , ServerJsonRpcMessage , ServerResult } ,
9- service:: ServerInitializeError ,
109 transport:: { IntoTransport , Transport } ,
1110} ;
1211
@@ -54,7 +53,7 @@ async fn do_initialize(client: &mut impl Transport<rmcp::RoleClient>) {
5453 let _response = client. receive ( ) . await . unwrap ( ) ;
5554}
5655
57- // Server responds with EmptyResult to setLevel received before initialized.
56+ // Server handles setLevel sent before initialized notification (processed by serve_inner) .
5857#[ tokio:: test]
5958async fn server_init_set_level_response_is_empty_result ( ) {
6059 let ( server_transport, client_transport) = tokio:: io:: duplex ( 4096 ) ;
@@ -64,7 +63,14 @@ async fn server_init_set_level_response_is_empty_result() {
6463 do_initialize ( & mut client) . await ;
6564 client. send ( set_level_request ( 2 ) ) . await . unwrap ( ) ;
6665
67- let response = client. receive ( ) . await . unwrap ( ) ;
66+ // The handler may send logging notifications before the response;
67+ // skip notifications to find the EmptyResult response.
68+ let response = loop {
69+ let msg = client. receive ( ) . await . unwrap ( ) ;
70+ if matches ! ( msg, ServerJsonRpcMessage :: Response ( _) ) {
71+ break msg;
72+ }
73+ } ;
6874 assert ! (
6975 matches!(
7076 response,
@@ -85,7 +91,13 @@ async fn server_init_succeeds_after_set_level_before_initialized() {
8591
8692 do_initialize ( & mut client) . await ;
8793 client. send ( set_level_request ( 2 ) ) . await . unwrap ( ) ;
88- let _response = client. receive ( ) . await . unwrap ( ) ;
94+ // Skip notifications until we get the response
95+ loop {
96+ let msg = client. receive ( ) . await . unwrap ( ) ;
97+ if matches ! ( msg, ServerJsonRpcMessage :: Response ( _) ) {
98+ break ;
99+ }
100+ }
89101 client. send ( initialized_notification ( ) ) . await . unwrap ( ) ;
90102
91103 let result = server_handle. await . unwrap ( ) ;
@@ -179,23 +191,66 @@ async fn server_init_succeeds_after_ping_before_initialized() {
179191 result. unwrap ( ) . cancel ( ) . await . unwrap ( ) ;
180192}
181193
182- // Server returns ExpectedInitializedNotification for any other message before initialized .
194+ // Server buffers tools/list sent before initialized and processes it after initialization .
183195#[ tokio:: test]
184- async fn server_init_rejects_unexpected_message_before_initialized ( ) {
196+ async fn server_init_buffers_request_before_initialized ( ) {
185197 let ( server_transport, client_transport) = tokio:: io:: duplex ( 4096 ) ;
186198 let server_handle =
187199 tokio:: spawn ( async move { TestServer :: new ( ) . serve ( server_transport) . await } ) ;
188200 let mut client = IntoTransport :: < rmcp:: RoleClient , _ , _ > :: into_transport ( client_transport) ;
189201
190202 do_initialize ( & mut client) . await ;
203+ // Send tools/list before initialized notification
191204 client. send ( list_tools_request ( 2 ) ) . await . unwrap ( ) ;
205+ // Now send initialized notification
206+ client. send ( initialized_notification ( ) ) . await . unwrap ( ) ;
207+
208+ // The buffered tools/list should be processed — expect a response
209+ let response = client. receive ( ) . await . unwrap ( ) ;
210+ assert ! (
211+ matches!( response, ServerJsonRpcMessage :: Response ( _) ) ,
212+ "expected response for buffered tools/list, got: {response:?}"
213+ ) ;
192214
193215 let result = server_handle. await . unwrap ( ) ;
194216 assert ! (
195- matches!(
196- result,
197- Err ( ServerInitializeError :: ExpectedInitializedNotification ( _) )
198- ) ,
199- "expected ExpectedInitializedNotification error"
217+ result. is_ok( ) ,
218+ "server should initialize successfully when buffering pre-init messages"
200219 ) ;
220+ result. unwrap ( ) . cancel ( ) . await . unwrap ( ) ;
221+ }
222+
223+ // Server buffers multiple requests before initialized and processes them in order.
224+ #[ tokio:: test]
225+ async fn server_init_buffers_multiple_requests_before_initialized ( ) {
226+ let ( server_transport, client_transport) = tokio:: io:: duplex ( 4096 ) ;
227+ let server_handle =
228+ tokio:: spawn ( async move { TestServer :: new ( ) . serve ( server_transport) . await } ) ;
229+ let mut client = IntoTransport :: < rmcp:: RoleClient , _ , _ > :: into_transport ( client_transport) ;
230+
231+ do_initialize ( & mut client) . await ;
232+ // Send two requests before initialized
233+ client. send ( list_tools_request ( 2 ) ) . await . unwrap ( ) ;
234+ client. send ( ping_request ( 3 ) ) . await . unwrap ( ) ;
235+ // Now send initialized notification
236+ client. send ( initialized_notification ( ) ) . await . unwrap ( ) ;
237+
238+ // Both buffered messages should get responses
239+ let response1 = client. receive ( ) . await . unwrap ( ) ;
240+ let response2 = client. receive ( ) . await . unwrap ( ) ;
241+ assert ! (
242+ matches!( response1, ServerJsonRpcMessage :: Response ( _) ) ,
243+ "expected response for first buffered message, got: {response1:?}"
244+ ) ;
245+ assert ! (
246+ matches!( response2, ServerJsonRpcMessage :: Response ( _) ) ,
247+ "expected response for second buffered message, got: {response2:?}"
248+ ) ;
249+
250+ let result = server_handle. await . unwrap ( ) ;
251+ assert ! (
252+ result. is_ok( ) ,
253+ "server should initialize successfully with multiple buffered messages"
254+ ) ;
255+ result. unwrap ( ) . cancel ( ) . await . unwrap ( ) ;
201256}
0 commit comments