71 lines
2.1 KiB
Rust
71 lines
2.1 KiB
Rust
use mem_store::{EventRecord, LogWriter, RebuildState};
|
|||
|
|
use serde_json::json;
|
||
|
|
use std::fs;
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn m2_gate_rebuild_idempotent() {
|
||
|
|
// Write events to log
|
||
|
|
let _ = fs::remove_dir_all("log/test/rebuild");
|
||
|
|
let mut writer = LogWriter::new("test", "rebuild", "r1").unwrap();
|
||
|
|
|
||
|
|
for i in 1..=5 {
|
||
|
|
writer.log(EventRecord {
|
||
|
|
project: "test".to_string(),
|
||
|
|
query: "q1".to_string(),
|
||
|
|
run: "r1".to_string(),
|
||
|
|
turn: i,
|
||
|
|
event_type: format!("event_{}", i),
|
||
|
|
data: json!({"n": i}),
|
||
|
|
}).unwrap();
|
||
|
|
}
|
||
|
|
|
||
|
|
// Read back
|
||
|
|
let events1 = writer.read_all().unwrap();
|
||
|
|
|
||
|
|
// Rebuild state
|
||
|
|
let state1 = RebuildState::from_events(&events1).unwrap();
|
||
|
|
|
||
|
|
// Read again - should be identical
|
||
|
|
let events2 = writer.read_all().unwrap();
|
||
|
|
let state2 = RebuildState::from_events(&events2).unwrap();
|
||
|
|
|
||
|
|
// Proof: events are identical
|
||
|
|
assert_eq!(events1.len(), events2.len());
|
||
|
|
for (e1, e2) in events1.iter().zip(events2.iter()) {
|
||
|
|
assert_eq!(e1.turn, e2.turn);
|
||
|
|
assert_eq!(e1.event_type, e2.event_type);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Proof: rebuild produces same state
|
||
|
|
assert_eq!(state1.event_count, state2.event_count);
|
||
|
|
assert_eq!(state1.chunks_seen, state2.chunks_seen);
|
||
|
|
assert_eq!(state1.chunks_used, state2.chunks_used);
|
||
|
|
|
||
|
|
let _ = fs::remove_dir_all("log/test/rebuild");
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn m2_gate_rebuild_byte_identical() {
|
||
|
|
// Key proof: serialize -> deserialize -> serialize produces identical bytes
|
||
|
|
let _ = fs::remove_dir_all("log/test/byte_id");
|
||
|
|
let mut writer = LogWriter::new("test", "byte_id", "r2").unwrap();
|
||
|
|
|
||
|
|
let original = EventRecord {
|
||
|
|
project: "test".to_string(),
|
||
|
|
query: "q1".to_string(),
|
||
|
|
run: "r2".to_string(),
|
||
|
|
turn: 1,
|
||
|
|
event_type: "test_event".to_string(),
|
||
|
|
data: json!({"key": "value", "num": 42}),
|
||
|
|
};
|
||
|
|
|
||
|
|
writer.log(original.clone()).unwrap();
|
||
|
|
|
||
|
|
// Read back and verify it's byte-identical
|
||
|
|
let events = writer.read_all().unwrap();
|
||
|
|
assert_eq!(events.len(), 1);
|
||
|
|
assert_eq!(events[0], original);
|
||
|
|
|
||
|
|
let _ = fs::remove_dir_all("log/test/byte_id");
|
||
|
|
}
|