enhance unit test to fail when erasure encodes stray bytes of data blobs
This commit is contained in:
parent
1eec8bf57f
commit
9c06fe25df
|
@ -465,7 +465,8 @@ mod test {
|
||||||
use crdt;
|
use crdt;
|
||||||
use erasure;
|
use erasure;
|
||||||
use logger;
|
use logger;
|
||||||
use packet::{BlobRecycler, BLOB_HEADER_SIZE};
|
use packet::BlobRecycler;
|
||||||
|
use rand::{thread_rng, Rng};
|
||||||
use signature::KeyPair;
|
use signature::KeyPair;
|
||||||
use signature::KeyPairUtil;
|
use signature::KeyPairUtil;
|
||||||
// use std::sync::{Arc, RwLock};
|
// use std::sync::{Arc, RwLock};
|
||||||
|
@ -559,7 +560,6 @@ mod test {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_window(
|
fn generate_window(
|
||||||
data_len: usize,
|
|
||||||
blob_recycler: &BlobRecycler,
|
blob_recycler: &BlobRecycler,
|
||||||
offset: usize,
|
offset: usize,
|
||||||
num_blobs: usize,
|
num_blobs: usize,
|
||||||
|
@ -576,10 +576,17 @@ mod test {
|
||||||
let b = blob_recycler.allocate();
|
let b = blob_recycler.allocate();
|
||||||
let b_ = b.clone();
|
let b_ = b.clone();
|
||||||
let mut w = b.write().unwrap();
|
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);
|
w.set_size(data_len);
|
||||||
|
|
||||||
for k in 0..data_len {
|
for k in 0..data_len {
|
||||||
w.data_mut()[k] = (k + i) as u8;
|
w.data_mut()[k] = (k + i) as u8;
|
||||||
}
|
}
|
||||||
|
// overfill, simulates re-used blobs
|
||||||
|
w.data_mut()[data_len] = thread_rng().gen();
|
||||||
|
|
||||||
blobs.push(b_);
|
blobs.push(b_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -599,16 +606,29 @@ mod test {
|
||||||
window
|
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]
|
#[test]
|
||||||
pub fn test_window_recover_basic() {
|
pub fn test_window_recover_basic() {
|
||||||
logger::setup();
|
logger::setup();
|
||||||
let data_len = 16;
|
|
||||||
let blob_recycler = BlobRecycler::default();
|
let blob_recycler = BlobRecycler::default();
|
||||||
|
|
||||||
// Generate a window
|
// Generate a window
|
||||||
let offset = 1;
|
let offset = 1;
|
||||||
let num_blobs = erasure::NUM_DATA + 2;
|
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:");
|
println!("** after-gen-window:");
|
||||||
print_window(&window);
|
print_window(&window);
|
||||||
|
|
||||||
|
@ -625,6 +645,9 @@ mod test {
|
||||||
window[erase_offset].data = None;
|
window[erase_offset].data = None;
|
||||||
print_window(&window);
|
print_window(&window);
|
||||||
|
|
||||||
|
// put junk in the tails, simulates re-used blobs
|
||||||
|
scramble_window_tails(&mut window, num_blobs);
|
||||||
|
|
||||||
// Recover it from coding
|
// Recover it from coding
|
||||||
assert!(erasure::recover(&blob_recycler, &mut window, offset, num_blobs).is_ok());
|
assert!(erasure::recover(&blob_recycler, &mut window, offset, num_blobs).is_ok());
|
||||||
println!("** after-recover:");
|
println!("** after-recover:");
|
||||||
|
@ -637,11 +660,12 @@ mod test {
|
||||||
let window_l2 = window_l.read().unwrap();
|
let window_l2 = window_l.read().unwrap();
|
||||||
let ref_l = refwindow.clone().unwrap();
|
let ref_l = refwindow.clone().unwrap();
|
||||||
let ref_l2 = ref_l.read().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.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.addr, ref_l2.meta.addr);
|
||||||
assert_eq!(window_l2.meta.port, ref_l2.meta.port);
|
assert_eq!(window_l2.meta.port, ref_l2.meta.port);
|
||||||
assert_eq!(window_l2.meta.v6, ref_l2.meta.v6);
|
assert_eq!(window_l2.meta.v6, ref_l2.meta.v6);
|
||||||
|
@ -671,11 +695,11 @@ mod test {
|
||||||
let window_l2 = window_l.read().unwrap();
|
let window_l2 = window_l.read().unwrap();
|
||||||
let ref_l = refwindow.clone().unwrap();
|
let ref_l = refwindow.clone().unwrap();
|
||||||
let ref_l2 = ref_l.read().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.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.addr, ref_l2.meta.addr);
|
||||||
assert_eq!(window_l2.meta.port, ref_l2.meta.port);
|
assert_eq!(window_l2.meta.port, ref_l2.meta.port);
|
||||||
assert_eq!(window_l2.meta.v6, ref_l2.meta.v6);
|
assert_eq!(window_l2.meta.v6, ref_l2.meta.v6);
|
||||||
|
|
Loading…
Reference in New Issue