lean_ctx/core/context_kernel/
bridge_e2e.rs1#[cfg(test)]
4mod tests {
5 use std::sync::MutexGuard;
6
7 fn isolated() -> MutexGuard<'static, ()> {
8 let guard = crate::core::context_kernel::kernel_config::KERNEL_TEST_LOCK
9 .lock()
10 .unwrap_or_else(std::sync::PoisonError::into_inner);
11 crate::core::context_kernel::proxy_bridge::reset_state();
12 crate::core::context_kernel::mcp_bridge::reset_mcp_state();
13 guard
14 }
15 use super::super::accounting_fix;
16 use super::super::coverage_class::CoverageClass;
17 use super::super::hotpath_wiring;
18 use super::super::identity::CallerRole;
19 use super::super::proxy_bridge::{self, ProxyRequestData};
20 use super::super::tool_surface;
21
22 fn request_for(user_id: &str) -> ProxyRequestData {
23 ProxyRequestData {
24 headers: vec![("x-user-id".to_owned(), user_id.to_owned())],
25 input_tokens: 1_000,
26 output_tokens: 200,
27 tokens_saved: 300,
28 request_count: 1,
29 ..ProxyRequestData::default()
30 }
31 }
32
33 #[test]
34 fn full_proxy_lifecycle() {
35 let _guard = isolated();
36 let request = ProxyRequestData {
37 headers: vec![
38 ("x-user-id".to_owned(), "alice".to_owned()),
39 ("x-team-id".to_owned(), "backend".to_owned()),
40 ],
41 input_tokens: 1_000,
42 output_tokens: 200,
43 tokens_saved: 300,
44 request_count: 1,
45 ..ProxyRequestData::default()
46 };
47
48 let result = proxy_bridge::process_proxy_request(&request);
49
50 assert_eq!(result.identity.user_id.as_deref(), Some("alice"));
51 assert_eq!(result.identity.role, CallerRole::Developer);
52 assert_eq!(result.coverage, CoverageClass::FullInline);
53 assert!(result.is_addressable);
54 }
55
56 #[test]
57 fn proxy_records_etpao() {
58 let _guard = isolated();
59 for _ in 0..5 {
60 let _ = proxy_bridge::process_proxy_request(&request_for("alice"));
61 }
62
63 assert!(proxy_bridge::current_etpao() > 0.0);
64 }
65
66 #[test]
67 fn proxy_records_identity_ledger() {
68 let _guard = isolated();
69 for _ in 0..3 {
70 let _ = proxy_bridge::process_proxy_request(&request_for("bob"));
71 }
72
73 assert!(proxy_bridge::identity_summary().total_users >= 1);
74 }
75
76 #[test]
77 fn tool_optimization_saves_tokens() {
78 let _guard = isolated();
79 let schemas = (0..15)
80 .map(|index| tool_surface::ToolSchema {
81 name: format!("tool-{index}"),
82 description: "Conformance test tool".to_owned(),
83 parameters_json: r#"{"type":"object"}"#.to_owned(),
84 token_count: 2_000,
85 priority: 1,
86 category: tool_surface::ToolCategory::Core,
87 })
88 .collect::<Vec<_>>();
89
90 let reduction = tool_surface::optimize_for_request(&[], &schemas);
91
92 assert!(reduction.tokens_saved > 0);
93 }
94
95 #[test]
96 fn honest_accounting_detects_phantom() {
97 let _guard = isolated();
98 let accounting = accounting_fix::account_proxy_request(1_000, 300, 200, 50);
99
100 assert!(accounting.phantom_savings_pct > 0.0);
101 assert!(accounting_fix::format_proxy_accounting(&accounting).contains("phantom"));
102 }
103
104 #[test]
105 fn mcp_integration_respects_coverage() {
106 let _guard = isolated();
107 let managed = hotpath_wiring::integrate_for_mcp("q", "/tmp", &[], 1_000, 300);
108 let unmanaged_headers = vec![("x-coverage-class".to_owned(), "unmanaged".to_owned())];
109 let unmanaged =
110 hotpath_wiring::integrate_for_mcp("q", "/tmp", &unmanaged_headers, 1_000, 300);
111
112 assert_eq!(managed.accounting.original_tokens, 1_000);
113 assert_eq!(unmanaged.budget_used, 0);
114 }
115
116 #[test]
117 fn end_to_end_identity_to_etpao() {
118 let _guard = isolated();
119 for index in 0..10 {
120 let user = format!("user-{}", index % 3);
121 let _ = proxy_bridge::process_proxy_request(&request_for(&user));
122 }
123
124 assert!(proxy_bridge::identity_summary().total_users >= 3);
125 let summary = proxy_bridge::etpao_summary();
126 assert!(summary.total_tokens > 0);
127 assert!(summary.accepted_outcomes > 0);
128 }
129
130 #[test]
131 fn outcome_signal_integrated() {
132 let _guard = isolated();
133 let request = ProxyRequestData {
134 is_retry: true,
135 request_count: 3,
136 ..request_for("alice")
137 };
138
139 let result = proxy_bridge::process_proxy_request(&request);
140
141 assert_eq!(
142 result.outcome_signal.outcome,
143 super::super::types::ReceiptOutcome::Rejected
144 );
145 }
146}