use proof_stream::events::{LogLevel, ProofEvent};
use proof_stream::sink::ProofSink;
fn make_log_event() -> ProofEvent {
ProofEvent::Log {
level: LogLevel::Info,
message: "bench".into(),
}
}
#[test]
fn test_null_sink_zero_overhead() {
let sink = ProofSink::none();
let iters = 1_000_000usize;
let start = std::time::Instant::now();
for _ in 0..iters {
sink.emit_if(make_log_event);
}
let elapsed = start.elapsed();
assert!(
elapsed.as_millis() < 100,
"NullSink took {}ms for {iters} iterations",
elapsed.as_millis()
);
}
#[test]
fn test_collecting_sink() {
use proof_stream::sink::CollectingSink;
let collector = CollectingSink::new();
let sink = ProofSink::new(collector.clone());
assert!(sink.is_active());
sink.emit(ProofEvent::Log {
level: LogLevel::Info,
message: "first".into(),
});
sink.emit(ProofEvent::Log {
level: LogLevel::Warn,
message: "second".into(),
});
let events = collector.snapshot();
assert_eq!(events.len(), 2);
assert!(matches!(events[0], ProofEvent::Log { .. }));
assert!(matches!(events[1], ProofEvent::Log { .. }));
}
#[test]
fn test_emit_if_not_called_when_inactive() {
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
let sink = ProofSink::none();
let call_count = Arc::new(AtomicUsize::new(0));
let cc = Arc::clone(&call_count);
for _ in 0..10 {
sink.emit_if(|| {
cc.fetch_add(1, Ordering::Relaxed);
make_log_event()
});
}
assert_eq!(call_count.load(Ordering::Relaxed), 0);
}
#[test]
fn test_channel_sink() {
use proof_stream::sink::ChannelSink;
let (chan_sink, rx) = ChannelSink::new(64);
let sink = ProofSink::new(chan_sink);
sink.emit(ProofEvent::StarkProofStart {
num_activation_layers: 40,
num_add_layers: 40,
num_layernorm_layers: 40,
});
sink.emit(ProofEvent::StarkProofEnd { duration_ms: 320 });
let e1 = rx.recv().unwrap();
let e2 = rx.recv().unwrap();
assert!(matches!(e1, ProofEvent::StarkProofStart { .. }));
assert!(matches!(e2, ProofEvent::StarkProofEnd { .. }));
}