lean_ctx/core/context_kernel/
activation_e2e.rs1#[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}