Skip to main content

lean_ctx/core/context_kernel/
bridge_e2e.rs

1//! End-to-end conformance tests for the proxy-to-kernel bridge.
2
3#[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}