Skip to content

Commit a64be1d

Browse files
committed
Add test for lazy deletion behavior
We add a testcase that ensures we only delete a lazily-deleted key after the next write operation succeeds.
1 parent 1b73398 commit a64be1d

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

src/io/vss_store.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,4 +661,87 @@ mod tests {
661661
do_read_write_remove_list_persist(&vss_store);
662662
drop(vss_store)
663663
}
664+
665+
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
666+
async fn vss_lazy_delete() {
667+
let vss_base_url = std::env::var("TEST_VSS_BASE_URL").unwrap();
668+
let mut rng = thread_rng();
669+
let rand_store_id: String = (0..7).map(|_| rng.sample(Alphanumeric) as char).collect();
670+
let mut vss_seed = [0u8; 32];
671+
rng.fill_bytes(&mut vss_seed);
672+
let header_provider = Arc::new(FixedHeaders::new(HashMap::new()));
673+
let logger = Arc::new(Logger::new_log_facade());
674+
let runtime = Arc::new(Runtime::new(logger).unwrap());
675+
let vss_store =
676+
VssStore::new(vss_base_url, rand_store_id, vss_seed, header_provider, runtime);
677+
678+
let primary_namespace = "test_namespace";
679+
let secondary_namespace = "";
680+
let key_to_delete = "key_to_delete";
681+
let key_for_trigger = "key_for_trigger";
682+
let data_to_delete = b"data_to_delete".to_vec();
683+
let trigger_data = b"trigger_data".to_vec();
684+
685+
// Write the key that we'll later lazily delete
686+
KVStore::write(
687+
&vss_store,
688+
primary_namespace,
689+
secondary_namespace,
690+
key_to_delete,
691+
data_to_delete.clone(),
692+
)
693+
.await
694+
.unwrap();
695+
696+
// Verify the key exists
697+
let read_data =
698+
KVStore::read(&vss_store, primary_namespace, secondary_namespace, key_to_delete)
699+
.await
700+
.unwrap();
701+
assert_eq!(read_data, data_to_delete);
702+
703+
// Perform a lazy delete
704+
KVStore::remove(&vss_store, primary_namespace, secondary_namespace, key_to_delete, true)
705+
.await
706+
.unwrap();
707+
708+
// Verify the key still exists (lazy delete doesn't immediately remove it)
709+
let read_data =
710+
KVStore::read(&vss_store, primary_namespace, secondary_namespace, key_to_delete)
711+
.await
712+
.unwrap();
713+
assert_eq!(read_data, data_to_delete);
714+
715+
// Verify the key is still in the list
716+
let keys = KVStore::list(&vss_store, primary_namespace, secondary_namespace).await.unwrap();
717+
assert!(keys.contains(&key_to_delete.to_string()));
718+
719+
// Trigger the actual deletion by performing a write operation
720+
KVStore::write(
721+
&vss_store,
722+
primary_namespace,
723+
secondary_namespace,
724+
key_for_trigger,
725+
trigger_data.clone(),
726+
)
727+
.await
728+
.unwrap();
729+
730+
// Now verify the key is actually deleted
731+
let read_result =
732+
KVStore::read(&vss_store, primary_namespace, secondary_namespace, key_to_delete).await;
733+
assert!(read_result.is_err());
734+
assert_eq!(read_result.unwrap_err().kind(), ErrorKind::NotFound);
735+
736+
// Verify the key is no longer in the list
737+
let keys = KVStore::list(&vss_store, primary_namespace, secondary_namespace).await.unwrap();
738+
assert!(!keys.contains(&key_to_delete.to_string()));
739+
740+
// Verify the trigger key still exists
741+
let read_data =
742+
KVStore::read(&vss_store, primary_namespace, secondary_namespace, key_for_trigger)
743+
.await
744+
.unwrap();
745+
assert_eq!(read_data, trigger_data);
746+
}
664747
}

0 commit comments

Comments
 (0)