#![cfg(all(feature = "client", not(feature = "local")))]
use rmcp::{
ClientHandler, ServerHandler, ServiceExt,
model::{
ClientCapabilities, Implementation, ProtocolVersion, RequestMetaObject, ServerCapabilities,
ServerInfo,
},
select_protocol_version,
};
#[derive(Clone, Default)]
struct DiscoveryServer;
impl ServerHandler for DiscoveryServer {
fn get_info(&self) -> ServerInfo {
ServerInfo::new(ServerCapabilities::builder().enable_tools().build())
.with_server_info(Implementation::new("discovery-server", "1.0.0"))
}
}
#[derive(Clone, Default)]
struct DiscoveryClient;
impl ClientHandler for DiscoveryClient {}
#[test]
fn select_protocol_version_uses_client_preference_order() {
let selected = select_protocol_version(
&[ProtocolVersion::V_2026_07_28, ProtocolVersion::V_2025_11_25],
&[ProtocolVersion::V_2025_11_25, ProtocolVersion::V_2026_07_28],
);
assert_eq!(selected, Some(ProtocolVersion::V_2026_07_28));
}
#[test]
fn select_protocol_version_returns_none_without_overlap() {
let selected = select_protocol_version(
&[ProtocolVersion::V_2026_07_28],
&[ProtocolVersion::V_2025_11_25],
);
assert_eq!(selected, None);
}
#[tokio::test]
async fn client_discover_helper_returns_typed_result() {
let (server_transport, client_transport) = tokio::io::duplex(4096);
tokio::spawn(async move {
let _ = DiscoveryServer
.serve(server_transport)
.await
.expect("server should start")
.waiting()
.await;
});
let client = DiscoveryClient
.serve(client_transport)
.await
.expect("client should connect");
let mut meta = RequestMetaObject::new();
meta.set_protocol_version(ProtocolVersion::V_2026_07_28);
meta.set_client_info(Implementation::new("discovery-client", "1.0.0"));
meta.set_client_capabilities(ClientCapabilities::default());
let result = client
.discover(meta)
.await
.expect("discover should succeed");
assert_eq!(
result.server_info(),
Some(Implementation::new("discovery-server", "1.0.0"))
);
client.cancel().await.expect("client should cancel");
}