77 lines
2.2 KiB
Rust
77 lines
2.2 KiB
Rust
#![cfg(all(feature = "client", not(feature = "local")))]
|
|
|
|
use rmcp::{
|
|
ClientHandler, ServerHandler, ServiceExt,
|
|
model::{
|
|
ClientCapabilities, Implementation, ProtocolVersion, RequestMetaObject, ServerCapabilities,
|
|
ServerConfig,
|
|
},
|
|
select_protocol_version,
|
|
};
|
|
|
|
#[derive(Clone, Default)]
|
|
struct DiscoveryServer;
|
|
|
|
impl ServerHandler for DiscoveryServer {
|
|
fn get_info(&self) -> ServerConfig {
|
|
ServerConfig::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");
|
|
}
|