use super::*;
use crate::db::MemoryDB;
use crate::shim::executor::StampedEvent;
use fil_actors_shared::fvm_ipld_amt::Amt;
fn create_raw_event_v4(emitter: u64, key: &str) -> fvm_shared4::event::StampedEvent {
fvm_shared4::event::StampedEvent {
emitter,
event: fvm_shared4::event::ActorEvent {
entries: vec![fvm_shared4::event::Entry {
flags: fvm_shared4::event::Flags::FLAG_INDEXED_ALL,
key: key.to_string(),
codec: fvm_ipld_encoding::IPLD_RAW,
value: key.as_bytes().to_vec(),
}],
},
}
}
fn create_raw_event_v3(emitter: u64, key: &str) -> fvm_shared3::event::StampedEvent {
fvm_shared3::event::StampedEvent {
emitter,
event: fvm_shared3::event::ActorEvent {
entries: vec![fvm_shared3::event::Entry {
flags: fvm_shared3::event::Flags::FLAG_INDEXED_ALL,
key: key.to_string(),
codec: fvm_ipld_encoding::IPLD_RAW,
value: key.as_bytes().to_vec(),
}],
},
}
}
#[test]
fn test_events_store_and_retrieve_basic() {
let db: MemoryDB = MemoryDB::default();
let events = [
create_raw_event_v4(1000, "event1"),
create_raw_event_v4(1001, "event2"),
create_raw_event_v4(1002, "event3"),
];
let events_root =
Amt::new_from_iter_with_bit_width(&db, EVENTS_AMT_BITWIDTH, events.iter()).unwrap();
let retrieved_events = StampedEvent::get_events(&db, &events_root).unwrap();
assert_eq!(retrieved_events.len(), 3);
assert_eq!(retrieved_events[0].emitter(), 1000);
assert_eq!(retrieved_events[1].emitter(), 1001);
assert_eq!(retrieved_events[2].emitter(), 1002);
}
#[test]
fn test_events_entries_are_preserved_when_duplicates_are_stored() {
let db = MemoryDB::default();
let event1 = create_raw_event_v4(1001, "event1");
let event2 = create_raw_event_v4(1002, "event2");
let event3 = create_raw_event_v4(1003, "event3");
let events = [event1.clone(), event1.clone(), event2, event3, event1];
let events_root =
Amt::new_from_iter_with_bit_width(&db, EVENTS_AMT_BITWIDTH, events.iter()).unwrap();
let retrieved_events = StampedEvent::get_events(&db, &events_root).unwrap();
assert_eq!(retrieved_events.len(), 5);
assert_eq!(retrieved_events[0].emitter(), 1001);
assert_eq!(retrieved_events[1].emitter(), 1001); assert_eq!(retrieved_events[2].emitter(), 1002);
assert_eq!(retrieved_events[3].emitter(), 1003);
assert_eq!(retrieved_events[4].emitter(), 1001); }
#[test]
fn test_events_preserve_order() {
let db = MemoryDB::default();
let events = [
create_raw_event_v4(100, "first"),
create_raw_event_v4(200, "second"),
create_raw_event_v4(300, "third"),
create_raw_event_v4(400, "fourth"),
create_raw_event_v4(500, "fifth"),
];
let events_root =
Amt::new_from_iter_with_bit_width(&db, EVENTS_AMT_BITWIDTH, events.iter()).unwrap();
let retrieved_events = StampedEvent::get_events(&db, &events_root).unwrap();
assert_eq!(retrieved_events.len(), 5);
assert_eq!(retrieved_events[0].emitter(), 100);
assert_eq!(retrieved_events[1].emitter(), 200);
assert_eq!(retrieved_events[2].emitter(), 300);
assert_eq!(retrieved_events[3].emitter(), 400);
assert_eq!(retrieved_events[4].emitter(), 500);
}
#[test]
fn test_events_same_content_same_cid() {
let db = MemoryDB::default();
let events1 = [
create_raw_event_v4(1000, "event_a"),
create_raw_event_v4(1001, "event_b"),
];
let events2 = [
create_raw_event_v4(1000, "event_a"),
create_raw_event_v4(1001, "event_b"),
];
let root1 =
Amt::new_from_iter_with_bit_width(&db, EVENTS_AMT_BITWIDTH, events1.iter()).unwrap();
let root2 =
Amt::new_from_iter_with_bit_width(&db, EVENTS_AMT_BITWIDTH, events2.iter()).unwrap();
assert_eq!(
root1, root2,
"Identical events should produce identical CIDs"
);
}
#[test]
fn test_events_empty_list() {
let db = MemoryDB::default();
let events: Vec<fvm_shared4::event::StampedEvent> = vec![];
let events_root =
Amt::new_from_iter_with_bit_width(&db, EVENTS_AMT_BITWIDTH, events.iter()).unwrap();
let retrieved_events = StampedEvent::get_events(&db, &events_root).unwrap();
assert!(
retrieved_events.is_empty(),
"Empty events list should return empty"
);
}
#[test]
fn test_events_v3_store_and_retrieve() {
let db = MemoryDB::default();
let events = [
create_raw_event_v3(2000, "v3_event1"),
create_raw_event_v3(2001, "v3_event2"),
];
let events_root =
Amt::new_from_iter_with_bit_width(&db, EVENTS_AMT_BITWIDTH, events.iter()).unwrap();
let retrieved_events = StampedEvent::get_events(&db, &events_root).unwrap();
assert_eq!(retrieved_events.len(), 2);
assert_eq!(retrieved_events[0].emitter(), 2000);
assert_eq!(retrieved_events[1].emitter(), 2001);
}
#[test]
fn test_identical_events_produce_same_root() {
let db = MemoryDB::default();
let events1 = [
create_raw_event_v4(1000, "event_a"),
create_raw_event_v4(1001, "event_b"),
];
let events2 = [
create_raw_event_v4(1000, "event_a"),
create_raw_event_v4(1001, "event_b"),
];
let root1 =
Amt::new_from_iter_with_bit_width(&db, EVENTS_AMT_BITWIDTH, events1.iter()).unwrap();
let root2 =
Amt::new_from_iter_with_bit_width(&db, EVENTS_AMT_BITWIDTH, events2.iter()).unwrap();
assert_eq!(root1, root2);
let retrieved_events = StampedEvent::get_events(&db, &root1).unwrap();
assert_eq!(retrieved_events.len(), 2);
assert_eq!(retrieved_events[0].emitter(), 1000);
assert_eq!(retrieved_events[1].emitter(), 1001);
}