use aa_proto::assembly::audit::v1::AuditEvent;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum EventSource {
Sdk,
EBpf,
Proxy,
}
#[derive(Debug, Clone)]
pub struct EnrichedEvent {
pub inner: AuditEvent,
pub received_at_ms: i64,
pub source: EventSource,
pub agent_id: String,
pub connection_id: u64,
pub sequence_number: u64,
}
#[derive(Debug, Clone)]
pub enum PipelineEvent {
Audit(Box<EnrichedEvent>),
LayerDegradation(LayerDegradationInfo),
}
#[derive(Debug, Clone)]
pub struct LayerDegradationInfo {
pub layer: String,
pub reason: String,
pub remaining_layers: Vec<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn enriched_event_fields_are_accessible() {
let audit_event = AuditEvent::default();
let received_at_ms: i64 = 1234567890;
let source = EventSource::Sdk;
let agent_id = "test-agent".to_string();
let connection_id: u64 = 42;
let enriched_event = EnrichedEvent {
inner: audit_event.clone(),
received_at_ms,
source: source.clone(),
agent_id: agent_id.clone(),
connection_id,
sequence_number: 0,
};
assert_eq!(enriched_event.inner, audit_event);
assert_eq!(enriched_event.received_at_ms, received_at_ms);
assert_eq!(enriched_event.source, source);
assert_eq!(enriched_event.agent_id, agent_id);
assert_eq!(enriched_event.connection_id, connection_id);
assert_eq!(enriched_event.sequence_number, 0);
}
#[test]
fn event_source_variants_are_distinct() {
assert_ne!(EventSource::Sdk, EventSource::EBpf);
assert_ne!(EventSource::EBpf, EventSource::Proxy);
assert_ne!(EventSource::Sdk, EventSource::Proxy);
}
#[test]
fn enriched_event_is_clone() {
let audit_event = AuditEvent::default();
let original = EnrichedEvent {
inner: audit_event,
received_at_ms: 1234567890,
source: EventSource::EBpf,
agent_id: "original-agent".to_string(),
connection_id: 7,
sequence_number: 3,
};
let cloned = original.clone();
assert_eq!(cloned.agent_id, original.agent_id);
assert_eq!(cloned.connection_id, original.connection_id);
}
#[test]
fn layer_degradation_info_fields_are_accessible() {
let info = LayerDegradationInfo {
layer: "ebpf".to_string(),
reason: "kernel version 4.18 < 5.8".to_string(),
remaining_layers: vec!["proxy".to_string(), "sdk".to_string()],
};
assert_eq!(info.layer, "ebpf");
assert_eq!(info.reason, "kernel version 4.18 < 5.8");
assert_eq!(info.remaining_layers, vec!["proxy", "sdk"]);
}
#[test]
fn pipeline_event_audit_variant() {
let event = PipelineEvent::Audit(Box::new(EnrichedEvent {
inner: AuditEvent::default(),
received_at_ms: 0,
source: EventSource::Sdk,
agent_id: "a".to_string(),
connection_id: 0,
sequence_number: 0,
}));
assert!(matches!(event, PipelineEvent::Audit(_)));
}
#[test]
fn pipeline_event_layer_degradation_variant() {
let event = PipelineEvent::LayerDegradation(LayerDegradationInfo {
layer: "ebpf".to_string(),
reason: "missing".to_string(),
remaining_layers: vec!["sdk".to_string()],
});
assert!(matches!(event, PipelineEvent::LayerDegradation(_)));
}
#[test]
fn pipeline_event_is_clone() {
let event = PipelineEvent::Audit(Box::new(EnrichedEvent {
inner: AuditEvent::default(),
received_at_ms: 0,
source: EventSource::Sdk,
agent_id: "a".to_string(),
connection_id: 0,
sequence_number: 0,
}));
let cloned = event.clone();
assert!(matches!(cloned, PipelineEvent::Audit(_)));
}
#[test]
fn layer_degradation_info_is_clone() {
let original = LayerDegradationInfo {
layer: "proxy".to_string(),
reason: "aa-proxy not in PATH".to_string(),
remaining_layers: vec!["sdk".to_string()],
};
let cloned = original.clone();
assert_eq!(cloned.layer, original.layer);
assert_eq!(cloned.reason, original.reason);
assert_eq!(cloned.remaining_layers, original.remaining_layers);
}
}