lean_ctx/core/context_kernel/
smoke_test.rs1#[cfg(test)]
2mod tests {
3 use std::sync::MutexGuard;
4
5 use crate::core::context_kernel::{
6 ctx_read_dedup, envelope_wiring, kernel_config, list_tools_opt, live_dashboard, mcp_bridge,
7 proxy_bridge, startup,
8 };
9
10 fn isolated() -> MutexGuard<'static, ()> {
11 let guard = kernel_config::KERNEL_TEST_LOCK
12 .lock()
13 .unwrap_or_else(std::sync::PoisonError::into_inner);
14 kernel_config::reset_features();
15 crate::core::context_kernel::dedup_wiring::reset_dedup();
16 crate::core::context_kernel::schema_wiring::reset_schema_state();
17 envelope_wiring::reset_evidence();
18 proxy_bridge::reset_state();
19 mcp_bridge::reset_mcp_state();
20 startup::reset();
21 crate::core::context_kernel::ctx_read_dedup::reset();
22 list_tools_opt::reset();
23 guard
24 }
25
26 fn long_content() -> String {
27 "pub fn wired_context() -> &'static str { \"context\" }\n".repeat(100)
28 }
29
30 fn tools() -> Vec<(String, String, usize)> {
31 (0..10)
32 .map(|index| (format!("tool_{index}"), "d".repeat(4_000), 1_000))
33 .collect()
34 }
35
36 fn proxy_data() -> proxy_bridge::ProxyRequestData {
37 proxy_bridge::ProxyRequestData {
38 input_tokens: 100,
39 output_tokens: 20,
40 tokens_saved: 40,
41 request_count: 1,
42 ..proxy_bridge::ProxyRequestData::default()
43 }
44 }
45
46 fn mcp_data(call_number: usize) -> mcp_bridge::McpCallData {
47 mcp_bridge::McpCallData {
48 tool_name: "ctx_read".to_owned(),
49 input_tokens: 80,
50 output_tokens: 20,
51 call_number,
52 ..mcp_bridge::McpCallData::default()
53 }
54 }
55
56 fn process_proxy() {
57 let data = proxy_data();
58 let result = proxy_bridge::process_proxy_request(&data);
59 envelope_wiring::process_proxy_evidence(&data, &result);
60 }
61
62 fn process_mcp(call_number: usize) {
63 let data = mcp_data(call_number);
64 mcp_bridge::record_mcp_call(&data);
65 envelope_wiring::process_mcp_evidence(&data);
66 }
67
68 #[test]
69 fn startup_initializes_kernel() {
70 let _guard = isolated();
71
72 startup::initialize();
73
74 assert!(startup::is_initialized());
75 assert!(kernel_config::is_enabled());
76 }
77
78 #[test]
79 fn dedup_hook_detects_repeated_content() {
80 let _guard = isolated();
81 let content = long_content();
82
83 assert_eq!(ctx_read_dedup::try_dedup("a.rs", &content), None);
84 let stub = ctx_read_dedup::try_dedup("a.rs", &content)
85 .expect("repeated content should produce a deduplication stub");
86
87 assert!(stub.len() < content.len());
88 }
89
90 #[test]
91 fn schema_opt_works_for_cursor() {
92 let _guard = isolated();
93 let original = tools();
94 let before: usize = original.iter().map(|tool| tool.1.len()).sum();
95
96 let optimized = list_tools_opt::optimize_descriptions(original, "cursor");
97 let after: usize = optimized.iter().map(|tool| tool.1.len()).sum();
98
99 assert!(optimized.len() <= 10, "should not exceed original count");
100 assert!(after < before);
101 assert_eq!(
102 list_tools_opt::schema_opt_summary().optimizations_applied,
103 1
104 );
105 }
106
107 #[test]
108 fn kernel_disabled_all_hooks_noop() {
109 let _guard = isolated();
110 let features = kernel_config::KernelFeatures {
111 enabled: false,
112 ..kernel_config::KernelFeatures::default()
113 };
114 kernel_config::update_features(features);
115 let content = long_content();
116
117 assert_eq!(ctx_read_dedup::try_dedup("disabled.rs", &content), None);
118 assert_eq!(ctx_read_dedup::try_dedup("disabled.rs", &content), None);
119 assert!(!list_tools_opt::should_optimize_for_client("cursor"));
120 process_proxy();
121 process_mcp(1);
122 assert_eq!(
123 envelope_wiring::evidence_summary(),
124 envelope_wiring::EvidenceSummary::default()
125 );
126 }
127
128 #[test]
129 fn evidence_records_after_activity() {
130 let _guard = isolated();
131
132 for _ in 0..3 {
133 process_proxy();
134 }
135 for call_number in 1..=2 {
136 process_mcp(call_number);
137 }
138
139 let summary = envelope_wiring::evidence_summary();
140 assert_eq!(summary.proxy_requests, 3);
141 assert_eq!(summary.mcp_calls, 2);
142 assert_eq!(summary.total_envelopes, 5);
143 assert_eq!(summary.chain_entries, 5);
144 }
145
146 #[test]
147 fn full_lifecycle() {
148 let _guard = isolated();
149 startup::initialize();
150 let content = long_content();
151
152 assert_eq!(ctx_read_dedup::try_dedup("lifecycle.rs", &content), None);
153 assert!(ctx_read_dedup::try_dedup("lifecycle.rs", &content).is_some());
154 let optimized = list_tools_opt::optimize_descriptions(tools(), "cursor");
155 process_proxy();
156 process_mcp(1);
157
158 let dashboard = live_dashboard::snapshot();
159 assert!(optimized.len() <= 10, "should not exceed original count");
160 assert!(dashboard.usage.total_requests > 0);
161 assert!(dashboard.chain.total_entries > 0);
162 assert!(!live_dashboard::format_summary().is_empty());
163 }
164}