//! Smoke test for the observability exporter HTTP server use std::net::SocketAddr; use std::sync::Arc; use tokio::time::{sleep, Duration}; use vaultmesh_observability::ObservabilityEngine; #[tokio::test] async fn test_metrics_endpoint_returns_200() { let engine = Arc::new(ObservabilityEngine::new()); let addr: SocketAddr = "127.0.0.1:19108".parse().unwrap(); // Prometheus only outputs metrics after they've been observed engine.observe_emitted("test", 0.01); engine.set_anchor_age(1700000000.0); engine.clone().serve(&addr).await.expect("serve failed"); // Give the server time to start sleep(Duration::from_millis(100)).await; // Request /metrics let resp = reqwest::get("http://127.0.0.1:19108/metrics") .await .expect("request failed"); assert!(resp.status().is_success(), "Expected 200 OK"); let body = resp.text().await.expect("body read failed"); assert!( body.contains("vaultmesh_receipts_total"), "Expected vaultmesh_receipts_total metric" ); assert!( body.contains("vaultmesh_anchor_age_seconds"), "Expected vaultmesh_anchor_age_seconds metric" ); } #[tokio::test] async fn test_health_endpoint() { let engine = Arc::new(ObservabilityEngine::new()); let addr: SocketAddr = "127.0.0.1:19109".parse().unwrap(); engine.clone().serve(&addr).await.expect("serve failed"); sleep(Duration::from_millis(100)).await; let resp = reqwest::get("http://127.0.0.1:19109/health") .await .expect("request failed"); assert!(resp.status().is_success()); let body = resp.text().await.unwrap(); assert_eq!(body, "ok"); } #[tokio::test] async fn test_metrics_after_observations() { let engine = Arc::new(ObservabilityEngine::new()); let addr: SocketAddr = "127.0.0.1:19110".parse().unwrap(); // Record some metrics before starting server engine.observe_emitted("guardian", 0.05); engine.observe_emitted("treasury", 0.02); engine.observe_failed("mesh", "timeout"); engine.set_anchor_age(1700000000.0); engine.clone().serve(&addr).await.expect("serve failed"); sleep(Duration::from_millis(100)).await; let resp = reqwest::get("http://127.0.0.1:19110/metrics") .await .expect("request failed"); let body = resp.text().await.unwrap(); // Check that our recorded metrics appear assert!(body.contains("guardian"), "Expected guardian label"); assert!(body.contains("treasury"), "Expected treasury label"); assert!(body.contains("mesh"), "Expected mesh label"); assert!(body.contains("timeout"), "Expected timeout reason"); assert!( body.contains("1.7e+09") || body.contains("1700000000"), "Expected anchor age value" ); }