use bytes::Bytes;
use bytes::BytesMut;
use rand::RngCore;
use rand::thread_rng;
use sha2::Digest;
use sha2::Sha256;
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum WriteAction {
Write(usize),
}
pub struct WriteChecker {
chunks: Vec<Bytes>,
data: Bytes,
}
impl WriteChecker {
pub fn new(size: Vec<usize>) -> Self {
let mut rng = thread_rng();
let mut chunks = Vec::with_capacity(size.len());
for i in size {
let mut bs = vec![0u8; i];
rng.fill_bytes(&mut bs);
chunks.push(Bytes::from(bs));
}
let data = chunks.iter().fold(BytesMut::new(), |mut acc, x| {
acc.extend_from_slice(x);
acc
});
WriteChecker {
chunks,
data: data.freeze(),
}
}
pub fn chunks(&self) -> &[Bytes] {
&self.chunks
}
pub fn check(&self, actual: &[u8]) {
assert_eq!(
format!("{:x}", Sha256::digest(actual)),
format!("{:x}", Sha256::digest(&self.data)),
"check failed: result is not expected"
)
}
}