rmcp-client/src/streamable_http_retry_tests.rs
74 lines
use std::any::TypeId;use codex_exec_server::ExecServerError;use pretty_assertions::assert_eq;use rmcp::transport::DynamicTransportError;use rmcp::transport::streamable_http_client::StreamableHttpError;use crate::http_client_adapter::StreamableHttpClientAdapterError;use super::*;#[test]fn retryable_initialize_error_includes_initialized_notification_context() { let contexts = [ "send initialize request", "send initialized notification", "receive initialize response", ]; assert_eq!( contexts.map(|context| { RmcpClient::is_retryable_client_initialize_error(&retryable_initialize_error(context)) }), [true, true, false], );}#[test]fn retryable_streamable_http_error_includes_remote_body_stream_failure() { let errors = [ StreamableHttpError::Client(StreamableHttpClientAdapterError::HttpRequest( ExecServerError::HttpRequest("error sending request for url".to_string()), )), StreamableHttpError::Client(StreamableHttpClientAdapterError::HttpRequest( ExecServerError::Server { code: JSON_RPC_INTERNAL_ERROR_CODE, message: "http/request failed: error sending request for url".to_string(), }, )), StreamableHttpError::Client(StreamableHttpClientAdapterError::HttpRequest( ExecServerError::Protocol( "http response stream `http-1` failed: exec-server transport disconnected" .to_string(), ), )), StreamableHttpError::Client(StreamableHttpClientAdapterError::HttpRequest( ExecServerError::Protocol( "http response stream `http-1` received seq 2, expected 1".to_string(), ), )), StreamableHttpError::UnexpectedServerResponse("HTTP 502: upstream failure".into()), StreamableHttpError::UnexpectedServerResponse("HTTP 400: bad request".into()), ]; assert_eq!( errors.map(|error| RmcpClient::is_retryable_streamable_http_error(&error)), [true, true, true, false, true, false], );}fn retryable_initialize_error(context: &'static str) -> rmcp::service::ClientInitializeError { rmcp::service::ClientInitializeError::TransportError { error: DynamicTransportError::from_parts( "streamable_http", TypeId::of::<()>(), Box::new(StreamableHttpError::Client( StreamableHttpClientAdapterError::HttpRequest(ExecServerError::HttpRequest( "error sending request for url".to_string(), )), )), ), context: context.into(), }}