#![allow(clippy::unwrap_used, clippy::expect_used)]
use mcp_conformance_core::requirement::Registry;
use mcp_trace_validator::report::Verdict;
use mcp_trace_validator::{engine, reader};
use std::fmt::Write as _;
fn long_session(pings: usize) -> String {
let mut doc = String::new();
doc.push_str(r#"{"seq":0,"direction":"client-to-server","transport":"stdio","kind":"message","payload":{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"t","version":"0"}}}}"#);
doc.push('\n');
doc.push_str(r#"{"seq":1,"direction":"server-to-client","transport":"stdio","kind":"message","payload":{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-11-25","capabilities":{},"serverInfo":{"name":"s","version":"0"}}}}"#);
doc.push('\n');
doc.push_str(r#"{"seq":2,"direction":"client-to-server","transport":"stdio","kind":"message","payload":{"jsonrpc":"2.0","method":"notifications/initialized"}}"#);
let mut seq = 3;
for ping in 0..pings {
let id = ping + 2;
write!(
doc,
"\n{{\"seq\":{seq},\"direction\":\"client-to-server\",\"transport\":\"stdio\",\"kind\":\"message\",\"payload\":{{\"jsonrpc\":\"2.0\",\"id\":{id},\"method\":\"ping\"}}}}"
)
.unwrap();
write!(
doc,
"\n{{\"seq\":{},\"direction\":\"server-to-client\",\"transport\":\"stdio\",\"kind\":\"message\",\"payload\":{{\"jsonrpc\":\"2.0\",\"id\":{id},\"result\":{{}}}}}}",
seq + 1
)
.unwrap();
seq += 2;
}
doc
}
#[test]
fn one_hundred_thousand_events_validate_within_test_patience() {
let document = long_session(50_000 - 2); let events = reader::parse_trace(&document, &reader::Limits::default())
.expect("a long conformant session parses");
assert!(events.len() > 99_000);
let registry = Registry::builtin_2025_11_25().unwrap();
let report = engine::validate(®istry, &events);
assert_eq!(
report.verdict(),
Verdict::Pass,
"conformant remains conformant at scale:\n{}",
report.render_human()
);
}
#[test]
fn pathological_id_reuse_stays_linear_and_is_judged() {
let mut doc = String::new();
doc.push_str(r#"{"seq":0,"direction":"client-to-server","transport":"stdio","kind":"message","payload":{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"t","version":"0"}}}}"#);
doc.push('\n');
doc.push_str(r#"{"seq":1,"direction":"server-to-client","transport":"stdio","kind":"message","payload":{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-11-25","capabilities":{},"serverInfo":{"name":"s","version":"0"}}}}"#);
doc.push('\n');
doc.push_str(r#"{"seq":2,"direction":"client-to-server","transport":"stdio","kind":"message","payload":{"jsonrpc":"2.0","method":"notifications/initialized"}}"#);
for index in 0..20_000u32 {
write!(
doc,
"\n{{\"seq\":{},\"direction\":\"client-to-server\",\"transport\":\"stdio\",\"kind\":\"message\",\"payload\":{{\"jsonrpc\":\"2.0\",\"id\":7,\"method\":\"ping\"}}}}",
index + 3
)
.unwrap();
}
let events = reader::parse_trace(&doc, &reader::Limits::default()).unwrap();
let registry = Registry::builtin_2025_11_25().unwrap();
let report = engine::validate(®istry, &events);
let reuse = report
.requirements
.iter()
.find(|row| row.id == "BASE-003")
.expect("BASE-003 row");
assert!(
!reuse.findings.is_empty(),
"mass id reuse must be flagged, not absorbed"
);
}
#[test]
fn deeply_nested_payload_is_rejected_at_parse_with_a_named_line() {
let depth = 10_000;
let payload = format!("{}\"x\"{}", "[".repeat(depth), "]".repeat(depth));
let line = format!(
r#"{{"seq":0,"direction":"client-to-server","transport":"stdio","kind":"message","payload":{payload}}}"#
);
let error = reader::parse_trace(&line, &reader::Limits::default())
.expect_err("hostile nesting must not parse");
let message = error.to_string();
assert!(
message.contains("line 1"),
"the error names the offending line: {message}"
);
}