enhance unit test to fail when erasure encodes stray bytes of data blobs

This commit is contained in:
Rob Walker 2018-07-19 14:20:42 -07:00
parent 1eec8bf57f
commit 9c06fe25df
1 changed files with 36 additions and 12 deletions

View File

@ -465,7 +465,8 @@ mod test {
use crdt;
use erasure;
use logger;
use packet::{BlobRecycler, BLOB_HEADER_SIZE};
use packet::BlobRecycler;
use rand::{thread_rng, Rng};
use signature::KeyPair;
use signature::KeyPairUtil;
// use std::sync::{Arc, RwLock};
@ -559,7 +560,6 @@ mod test {
}
fn generate_window(
data_len: usize,
blob_recycler: &BlobRecycler,
offset: usize,
num_blobs: usize,
@ -576,10 +576,17 @@ mod test {
let b = blob_recycler.allocate();
let b_ = b.clone();
let mut w = b.write().unwrap();
// generate a random length, multiple of 4 between 8 and 32
let data_len = thread_rng().gen_range(2, 8) * 4;
eprintln!("data_len of {} is {}", i, data_len);
w.set_size(data_len);
for k in 0..data_len {
w.data_mut()[k] = (k + i) as u8;
}
// overfill, simulates re-used blobs
w.data_mut()[data_len] = thread_rng().gen();
blobs.push(b_);
}
@ -599,16 +606,29 @@ mod test {
window
}
fn scramble_window_tails(window: &mut [WindowSlot], num_blobs: usize) {
for i in 0..num_blobs {
if let Some(b) = &window[i].data {
let size = {
let b_l = b.read().unwrap();
b_l.meta.size
} as usize;
let mut b_l = b.write().unwrap();
b_l.data[size] = thread_rng().gen();
}
}
}
#[test]
pub fn test_window_recover_basic() {
logger::setup();
let data_len = 16;
let blob_recycler = BlobRecycler::default();
// Generate a window
let offset = 1;
let num_blobs = erasure::NUM_DATA + 2;
let mut window = generate_window(data_len, &blob_recycler, 0, num_blobs);
let mut window = generate_window(&blob_recycler, 0, num_blobs);
println!("** after-gen-window:");
print_window(&window);
@ -625,6 +645,9 @@ mod test {
window[erase_offset].data = None;
print_window(&window);
// put junk in the tails, simulates re-used blobs
scramble_window_tails(&mut window, num_blobs);
// Recover it from coding
assert!(erasure::recover(&blob_recycler, &mut window, offset, num_blobs).is_ok());
println!("** after-recover:");
@ -637,11 +660,12 @@ mod test {
let window_l2 = window_l.read().unwrap();
let ref_l = refwindow.clone().unwrap();
let ref_l2 = ref_l.read().unwrap();
assert_eq!(
window_l2.data[..(data_len + BLOB_HEADER_SIZE)],
ref_l2.data[..(data_len + BLOB_HEADER_SIZE)]
);
assert_eq!(window_l2.meta.size, ref_l2.meta.size);
assert_eq!(
window_l2.data[..window_l2.meta.size],
ref_l2.data[..window_l2.meta.size]
);
assert_eq!(window_l2.meta.addr, ref_l2.meta.addr);
assert_eq!(window_l2.meta.port, ref_l2.meta.port);
assert_eq!(window_l2.meta.v6, ref_l2.meta.v6);
@ -671,11 +695,11 @@ mod test {
let window_l2 = window_l.read().unwrap();
let ref_l = refwindow.clone().unwrap();
let ref_l2 = ref_l.read().unwrap();
assert_eq!(
window_l2.data[..(data_len + BLOB_HEADER_SIZE)],
ref_l2.data[..(data_len + BLOB_HEADER_SIZE)]
);
assert_eq!(window_l2.meta.size, ref_l2.meta.size);
assert_eq!(
window_l2.data[..window_l2.meta.size],
ref_l2.data[..window_l2.meta.size]
);
assert_eq!(window_l2.meta.addr, ref_l2.meta.addr);
assert_eq!(window_l2.meta.port, ref_l2.meta.port);
assert_eq!(window_l2.meta.v6, ref_l2.meta.v6);