Skip to content

Commit 96ce9d4

Browse files
committed
test: add mixed v1/v2 replay and scale round-trip tests
1 parent 4cf928c commit 96ce9d4

2 files changed

Lines changed: 45 additions & 0 deletions

File tree

.claude/worktrees/pr361-pp-fix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit a673ab740ab2224e0f8314e5041fc0a3fe3c3143

cc-eventlog/src/runtime_events.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,4 +286,48 @@ mod tests {
286286
"event\"with\\special\nchars"
287287
);
288288
}
289+
290+
#[test]
291+
fn mixed_v1_v2_replay() {
292+
let events = vec![
293+
RuntimeEvent::new("app-id".to_string(), vec![1, 2], EventLogVersion::V1),
294+
RuntimeEvent::new("compose-hash".to_string(), vec![3, 4], EventLogVersion::V2),
295+
RuntimeEvent::new("instance-id".to_string(), vec![5, 6], EventLogVersion::V1),
296+
];
297+
let mr = replay_events::<Sha384>(&events, None);
298+
// Replay manually to verify
299+
let mut expected = Sha384::zeros();
300+
expected = Sha384::hash((expected, events[0].digest::<Sha384>()));
301+
expected = Sha384::hash((expected, events[1].digest::<Sha384>()));
302+
expected = Sha384::hash((expected, events[2].digest::<Sha384>()));
303+
assert_eq!(mr, expected, "mixed v1/v2 replay must work correctly");
304+
}
305+
306+
#[test]
307+
fn scale_roundtrip_preserves_event_data() {
308+
use scale::{Decode, Encode};
309+
// V1 event
310+
let v1 = RuntimeEvent::new("test".to_string(), vec![1, 2, 3], EventLogVersion::V1);
311+
let encoded = v1.encode();
312+
let decoded = RuntimeEvent::decode(&mut &encoded[..]).unwrap();
313+
assert_eq!(decoded.event, v1.event);
314+
assert_eq!(decoded.payload, v1.payload);
315+
// version is #[codec(skip)] so it defaults to V1 on decode
316+
assert_eq!(decoded.version, EventLogVersion::V1);
317+
}
318+
319+
#[test]
320+
fn scale_decode_old_format_without_version() {
321+
use scale::{Decode, Encode};
322+
// Encode a current RuntimeEvent (version is skipped by codec),
323+
// then decode — simulates reading data from before version was added
324+
let original =
325+
RuntimeEvent::new("app-id".to_string(), vec![0xaa, 0xbb], EventLogVersion::V2);
326+
let encoded = original.encode();
327+
let decoded = RuntimeEvent::decode(&mut &encoded[..]).unwrap();
328+
assert_eq!(decoded.event, "app-id");
329+
assert_eq!(decoded.payload, vec![0xaa, 0xbb]);
330+
// version is #[codec(skip)] so always decodes as default (V1)
331+
assert_eq!(decoded.version, EventLogVersion::V1);
332+
}
289333
}

0 commit comments

Comments
 (0)