use flashsieve::{BlockIndex, BlockIndexBuilder};
use rand::rngs::StdRng;
use rand::{Rng, SeedableRng};
#[test]
fn test_random_corruption_recovery() {
let block_size = 256;
let bloom_bits = 512;
let data = vec![b'x'; block_size * 10];
let original = BlockIndexBuilder::new()
.block_size(block_size)
.bloom_bits(bloom_bits)
.build(&data)
.unwrap();
let valid_bytes = original.to_bytes();
let mut rng = StdRng::seed_from_u64(0x1234567890ABCDEF);
for _ in 0..1000 {
let mut corrupted = valid_bytes.clone();
let idx = rng.gen_range(0..corrupted.len());
corrupted[idx] = corrupted[idx].wrapping_add(rng.gen_range(1..255));
let result = std::panic::catch_unwind(|| BlockIndex::from_bytes_checked(&corrupted));
assert!(
result.is_ok(),
"FINDING: BlockIndex::from_bytes_checked panicked on corrupted bytes at index {}",
idx
);
let inner_result = result.unwrap();
assert!(inner_result.is_err(), "FINDING: Corruption was not detected! BlockIndex::from_bytes_checked returned Ok despite random corruption.");
let result_unchecked = std::panic::catch_unwind(|| BlockIndex::from_bytes(&corrupted));
assert!(
result_unchecked.is_ok(),
"FINDING: BlockIndex::from_bytes panicked on corrupted bytes at index {}",
idx
);
}
}