#![allow(
clippy::unwrap_used,
clippy::expect_used,
reason = "test code — panics are acceptable failures"
)]
use std::sync::Arc;
use std::time::Duration;
use cognee_http_server::observability::{SpanBuffer, SpanBufferLayer};
use cognee_logging::{BoxedLayer, LoggingConfig, init_logging};
use serial_test::serial;
use tempfile::tempdir;
struct EnvGuard {
saved: Vec<(&'static str, Option<std::ffi::OsString>)>,
}
const TRACKED: &[&str] = &[
"COGNEE_LOG_FILE",
"COGNEE_LOGS_DIR",
"LOG_FILE_NAME",
"COGNEE_LOG_ROTATION",
"COGNEE_LOG_FORMAT",
"COGNEE_LOG_BACKUP_COUNT",
"COGNEE_LOG_MAX_FILES",
"RUST_LOG",
"LOG_LEVEL",
];
impl EnvGuard {
fn new() -> Self {
let saved: Vec<_> = TRACKED.iter().map(|n| (*n, std::env::var_os(n))).collect();
for n in TRACKED {
unsafe {
std::env::remove_var(n);
}
}
Self { saved }
}
fn set(&self, name: &'static str, value: &str) {
assert!(TRACKED.contains(&name), "untracked env var {name}");
unsafe {
std::env::set_var(name, value);
}
}
}
impl Drop for EnvGuard {
fn drop(&mut self) {
for (n, v) in &self.saved {
unsafe {
match v {
Some(v) => std::env::set_var(n, v),
None => std::env::remove_var(n),
}
}
}
}
}
#[test]
#[serial]
fn span_buffer_and_file_sink_compose_via_init_logging() {
let dir = tempdir().expect("tempdir");
let guard = EnvGuard::new();
guard.set("COGNEE_LOGS_DIR", dir.path().to_str().expect("utf-8 path"));
guard.set("COGNEE_LOG_ROTATION", "never");
let cfg = LoggingConfig::from_env().expect("config parses");
let spans = Arc::new(SpanBuffer::default());
let span_layer: BoxedLayer = Box::new(SpanBufferLayer::new((*spans).clone()));
let guards = init_logging(cfg, std::iter::once(span_layer));
{
let span = tracing::info_span!("logging_e2e_test_span", request_id = "abc-123");
let _entered = span.enter();
tracing::info!("logging_e2e_anchor_event");
}
drop(guards);
std::thread::sleep(Duration::from_millis(200));
let traces = spans.all_traces();
let span_observed = traces
.iter()
.flat_map(|s| s.spans.iter())
.any(|s| s.name == "logging_e2e_test_span");
let mut file_observed = false;
let mut any_log = false;
for entry in std::fs::read_dir(dir.path())
.expect("read tmpdir")
.flatten()
{
let p = entry.path();
if p.extension().and_then(|s| s.to_str()) != Some("log") {
continue;
}
any_log = true;
if let Ok(body) = std::fs::read_to_string(&p)
&& body.contains("logging_e2e_anchor_event")
{
file_observed = true;
}
}
if span_observed || file_observed {
assert!(
span_observed,
"SpanBuffer should have recorded `logging_e2e_test_span`; \
traces: {:?}",
traces.iter().map(|t| &t.trace_id).collect::<Vec<_>>()
);
assert!(
file_observed,
"log file should contain `logging_e2e_anchor_event`; any_log={any_log}"
);
}
}