use affidavit::chain::ChainAssembler;
use affidavit::ocel::{build_event, object_ref, SeqCounter};
use affidavit::verifier::verify;
use std::hint::black_box;
use std::time::Instant;
#[test]
fn test_throughput_harness_execution() {
let counts = [1, 5, 10, 50, 100];
println!("\nThroughput Benchmark Test Report");
println!("================================");
for &n in &counts {
let (throughput, elapsed) = measure_pipeline_throughput(n);
println!(
"n={:>3} events | elapsed: {:>10.2?} | throughput: {:>10.2} ops/sec",
n, elapsed, throughput
);
assert!(throughput > 0.0, "Throughput for n={} must be > 0", n);
}
println!("================================\n");
}
fn measure_pipeline_throughput(n: usize) -> (f64, std::time::Duration) {
let start = Instant::now();
let mut asm = ChainAssembler::new();
let mut counter = SeqCounter::new();
for i in 0..n {
let event = build_event(
black_box("throughput-op"),
vec![object_ref(
black_box(format!("obj-{i}")),
black_box("artifact"),
)],
black_box(format!("payload-{i}").as_bytes()),
&mut counter,
)
.expect("failed to build event during throughput test");
asm.append(event)
.expect("failed to append event during throughput test");
}
let receipt = asm.finalize();
let verdict = verify(black_box(&receipt));
assert!(
verdict.accepted,
"Throughput test receipt was rejected: {}",
verdict.reason
);
let elapsed = start.elapsed();
let throughput = n as f64 / elapsed.as_secs_f64();
(throughput, elapsed)
}
#[test]
fn test_emit_scaling_harness() {
let base_n = 10;
let large_n = 100;
let base_tps = measure_single_append_throughput(base_n);
let large_tps = measure_single_append_throughput(large_n);
println!("Emit Scaling (Single Append):");
println!(" n={:>3} | throughput: {:>10.2} ops/sec", base_n, base_tps);
println!(
" n={:>3} | throughput: {:>10.2} ops/sec",
large_n, large_tps
);
assert!(base_tps > 0.0);
assert!(large_tps > 0.0);
}
fn measure_single_append_throughput(pre_populated_n: usize) -> f64 {
let mut asm = ChainAssembler::new();
let mut counter = SeqCounter::new();
for i in 0..pre_populated_n {
let event = build_event("setup", vec![], b"", &mut counter).unwrap();
asm.append(event).unwrap();
}
let start = Instant::now();
let iterations = 1000;
for _ in 0..iterations {
let mut asm_clone = asm.clone();
let mut counter_clone = counter.clone();
let event = build_event(
black_box("scaling-op"),
vec![object_ref("new-obj", "artifact")],
black_box(b"new-payload"),
&mut counter_clone,
)
.unwrap();
asm_clone.append(black_box(event)).unwrap();
black_box(asm_clone);
}
let elapsed = start.elapsed();
iterations as f64 / elapsed.as_secs_f64()
}
fn main() {
test_throughput_harness_execution();
test_emit_scaling_harness();
println!("All throughput tests passed!");
}