clnrm_core/coverage/
tracker.rs

1//! Coverage tracker for CleanroomEnvironment integration
2
3use crate::coverage::BehaviorCoverage;
4use std::sync::Arc;
5use tokio::sync::RwLock;
6
7/// Thread-safe behavior coverage tracker
8#[derive(Debug, Clone)]
9pub struct CoverageTracker {
10    coverage: Arc<RwLock<BehaviorCoverage>>,
11}
12
13impl CoverageTracker {
14    /// Create a new coverage tracker
15    pub fn new() -> Self {
16        Self {
17            coverage: Arc::new(RwLock::new(BehaviorCoverage::new())),
18        }
19    }
20
21    /// Get a snapshot of current coverage
22    pub async fn snapshot(&self) -> BehaviorCoverage {
23        self.coverage.read().await.clone()
24    }
25
26    /// Record API endpoint coverage
27    pub async fn record_api(&self, endpoint: String) {
28        self.coverage.write().await.record_api_endpoint(endpoint);
29    }
30
31    /// Record state transition coverage
32    pub async fn record_transition(&self, entity: String, from: Option<String>, to: String) {
33        use crate::coverage::StateTransition;
34        let transition = StateTransition::new(entity, from, to);
35        self.coverage
36            .write()
37            .await
38            .record_state_transition(transition);
39    }
40
41    /// Record error scenario coverage
42    pub async fn record_error(&self, scenario: String) {
43        self.coverage.write().await.record_error_scenario(scenario);
44    }
45
46    /// Record data flow coverage
47    pub async fn record_flow(&self, flow: String) {
48        self.coverage.write().await.record_data_flow(flow);
49    }
50
51    /// Record integration operation coverage
52    pub async fn record_integration(&self, service: String, operation: String) {
53        self.coverage
54            .write()
55            .await
56            .record_integration(service, operation);
57    }
58
59    /// Record span observation
60    pub async fn record_span(&self, span_name: String) {
61        self.coverage.write().await.record_span(span_name);
62    }
63
64    /// Merge another coverage tracker
65    pub async fn merge(&self, other: &CoverageTracker) {
66        let other_coverage = other.snapshot().await;
67        self.coverage.write().await.merge(&other_coverage);
68    }
69
70    /// Reset coverage to empty state
71    pub async fn reset(&self) {
72        *self.coverage.write().await = BehaviorCoverage::new();
73    }
74}
75
76impl Default for CoverageTracker {
77    fn default() -> Self {
78        Self::new()
79    }
80}