Skip to main content

lean_ctx/core/context_kernel/
smoke_test.rs

1#[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}