Skip to main content

lean_ctx/core/context_kernel/
activation_e2e.rs

1#[cfg(test)]
2mod tests {
3    use std::sync::MutexGuard;
4
5    use super::super::dedup_wiring::{self, DedupAction};
6    use super::super::envelope_wiring;
7    use super::super::kernel_config::{self, KernelFeatures};
8    use super::super::live_dashboard;
9    use super::super::mcp_bridge::{self, McpCallData};
10    use super::super::proxy_bridge::{self, ProxyRequestData};
11    use super::super::receipt_chain;
12    use super::super::schema_wiring;
13    use super::super::usage_normalizer;
14
15    fn reset_all() -> MutexGuard<'static, ()> {
16        let guard = crate::core::context_kernel::kernel_config::KERNEL_TEST_LOCK
17            .lock()
18            .unwrap_or_else(std::sync::PoisonError::into_inner);
19        kernel_config::reset_features();
20        proxy_bridge::reset_state();
21        mcp_bridge::reset_mcp_state();
22        usage_normalizer::reset_usage();
23        receipt_chain::reset_chain();
24        dedup_wiring::reset_dedup();
25        schema_wiring::reset_schema_state();
26        guard
27    }
28
29    fn proxy_request(index: usize) -> ProxyRequestData {
30        ProxyRequestData {
31            headers: vec![("x-user-id".to_owned(), format!("activation-{index}"))],
32            input_tokens: 100 + index,
33            output_tokens: 20,
34            reasoning_tokens: 5,
35            tokens_saved: 30,
36            model: Some("gpt-5".to_owned()),
37            provider: Some("openai".to_owned()),
38            request_count: 1,
39            ..ProxyRequestData::default()
40        }
41    }
42
43    fn mcp_call(index: usize) -> McpCallData {
44        McpCallData {
45            tool_name: format!("ctx_tool_{index}"),
46            input_tokens: 60 + index,
47            output_tokens: 10,
48            call_number: index + 1,
49            ..McpCallData::default()
50        }
51    }
52
53    fn process_proxy_requests(count: usize) {
54        for index in 0..count {
55            let data = proxy_request(index);
56            let result = proxy_bridge::process_proxy_request(&data);
57            envelope_wiring::process_proxy_evidence(&data, &result);
58        }
59    }
60
61    fn mixed_requests(count: usize) {
62        for index in 0..count {
63            if index % 2 == 0 {
64                let data = proxy_request(index);
65                let result = proxy_bridge::process_proxy_request(&data);
66                envelope_wiring::process_proxy_evidence(&data, &result);
67            } else {
68                envelope_wiring::process_mcp_evidence(&mcp_call(index));
69            }
70        }
71    }
72
73    fn schemas() -> Vec<(String, String, usize)> {
74        (0..15)
75            .map(|index| {
76                (
77                    format!("tool_{index}"),
78                    format!(
79                        "Tool {index} provides detailed contextual analysis. {}",
80                        "This deliberately verbose schema description exercises budget reduction. "
81                            .repeat(60)
82                    ),
83                    8,
84                )
85            })
86            .collect()
87    }
88
89    #[test]
90    fn full_kernel_activation_pipeline() {
91        let _guard = reset_all();
92
93        process_proxy_requests(3);
94        for index in 0..2 {
95            envelope_wiring::process_mcp_evidence(&mcp_call(index));
96        }
97
98        assert!(usage_normalizer::session_usage().total_requests >= 5);
99        assert!(receipt_chain::chain_length() >= 5);
100        assert!(live_dashboard::snapshot().usage.total_requests >= 5);
101    }
102
103    #[test]
104    fn kernel_disabled_no_recording() {
105        let _guard = reset_all();
106        let features = KernelFeatures {
107            enabled: false,
108            ..KernelFeatures::default()
109        };
110        kernel_config::update_features(features);
111
112        process_proxy_requests(5);
113
114        assert_eq!(usage_normalizer::session_usage().total_requests, 0);
115        assert_eq!(receipt_chain::chain_length(), 0);
116    }
117
118    #[test]
119    fn schema_optimization_pipeline() {
120        let _guard = reset_all();
121        let entries = schemas();
122
123        let cursor = schema_wiring::optimize_tool_list(&entries, "cursor");
124        let unknown = schema_wiring::optimize_tool_list(&entries, "unknown");
125
126        assert!(cursor.tokens_after < cursor.tokens_before);
127        assert!(unknown.tokens_after < unknown.tokens_before);
128        assert!(cursor.tokens_after > unknown.tokens_after);
129    }
130
131    #[test]
132    fn dedup_pipeline() {
133        let _guard = reset_all();
134
135        assert_eq!(
136            dedup_wiring::check_content("file.rs", "fn main() {}"),
137            DedupAction::DeliverFull
138        );
139        assert!(matches!(
140            dedup_wiring::check_content("file.rs", "fn main() {}"),
141            DedupAction::DeliverStub { .. }
142        ));
143        assert!(matches!(
144            dedup_wiring::check_content("file.rs", "fn main() { work(); }"),
145            DedupAction::DeliverModified | DedupAction::DeliverFull
146        ));
147        assert!(dedup_wiring::dedup_stats().hit_rate > 0.0);
148    }
149
150    #[test]
151    fn selective_feature_disable() {
152        let _guard = reset_all();
153        let features = KernelFeatures {
154            receipt_chain: false,
155            ..KernelFeatures::default()
156        };
157        kernel_config::update_features(features);
158
159        process_proxy_requests(3);
160
161        assert_eq!(usage_normalizer::session_usage().total_requests, 3);
162        assert_eq!(receipt_chain::chain_length(), 0);
163    }
164
165    #[test]
166    fn evidence_summary_matches_dashboard() {
167        let _guard = reset_all();
168        mixed_requests(10);
169
170        let evidence = envelope_wiring::evidence_summary();
171        let dashboard = live_dashboard::snapshot();
172        assert_eq!(evidence.total_envelopes, dashboard.usage.total_requests);
173    }
174
175    #[test]
176    fn config_max_budget_respected() {
177        let _guard = reset_all();
178        let features = KernelFeatures {
179            max_kernel_budget: 50,
180            ..KernelFeatures::default()
181        };
182        kernel_config::update_features(features);
183
184        assert_eq!(kernel_config::features().max_kernel_budget, 50);
185    }
186
187    #[test]
188    fn dedup_disabled_always_full() {
189        let _guard = reset_all();
190        let features = KernelFeatures {
191            content_dedup: false,
192            ..KernelFeatures::default()
193        };
194        kernel_config::update_features(features);
195
196        for _ in 0..10 {
197            assert_eq!(
198                dedup_wiring::check_content("file.rs", "fn main() {}"),
199                DedupAction::DeliverFull
200            );
201        }
202        assert_eq!(dedup_wiring::dedup_stats().cache_hits, 0);
203    }
204}