2019-08-12 10:05:11 +00:00
|
|
|
use failure::*;
|
|
|
|
use std::io::Cursor;
|
2019-08-13 16:10:38 +00:00
|
|
|
use std::io::{ Read, Write, Seek, SeekFrom };
|
|
|
|
use lazy_static::lazy_static;
|
2019-08-12 10:05:11 +00:00
|
|
|
|
|
|
|
use proxmox_backup::backup::*;
|
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
lazy_static! {
|
|
|
|
static ref TEST_DATA: Vec<u8> = {
|
|
|
|
let mut data = Vec::new();
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
for i in 0..100_000 {
|
|
|
|
data.push((i%255) as u8);
|
2019-08-12 10:05:11 +00:00
|
|
|
}
|
2019-08-13 16:10:38 +00:00
|
|
|
|
|
|
|
data
|
2019-08-12 10:05:11 +00:00
|
|
|
};
|
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
static ref CRYPT_CONFIG: CryptConfig = {
|
|
|
|
let key = [1u8; 32];
|
|
|
|
CryptConfig::new(key).unwrap()
|
|
|
|
};
|
|
|
|
}
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
fn verify_test_blob(mut cursor: Cursor<Vec<u8>>) -> Result<(), Error> {
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
// run read tests with different buffer sizes
|
|
|
|
for size in [1, 3, 64*1024].iter() {
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
println!("Starting DataBlobReader test (size = {})", size);
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
cursor.seek(SeekFrom::Start(0))?;
|
|
|
|
let mut reader = DataBlobReader::new(&mut cursor, Some(&CRYPT_CONFIG))?;
|
|
|
|
let mut buffer = Vec::<u8>::new();
|
|
|
|
// read the whole file
|
|
|
|
//reader.read_to_end(&mut buffer)?;
|
|
|
|
let mut buf = vec![0u8; *size];
|
|
|
|
loop {
|
|
|
|
let count = reader.read(&mut buf)?;
|
|
|
|
if count == 0 { break; }
|
|
|
|
buffer.extend(&buf[..count]);
|
|
|
|
}
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
reader.finish()?;
|
|
|
|
if buffer != *TEST_DATA {
|
|
|
|
bail!("blob data is wrong (read buffer size {})", size);
|
|
|
|
}
|
2019-08-12 10:05:11 +00:00
|
|
|
}
|
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
let raw_data = cursor.into_inner();
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
let blob = DataBlob::from_raw(raw_data)?;
|
|
|
|
blob.verify_crc()?;
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
let data = blob.decode(Some(&CRYPT_CONFIG))?;
|
|
|
|
if data != *TEST_DATA {
|
|
|
|
bail!("blob data is wrong (decode)");
|
2019-08-12 10:05:11 +00:00
|
|
|
}
|
2019-08-13 16:10:38 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
#[test]
|
|
|
|
fn test_uncompressed_blob_writer() -> Result<(), Error> {
|
|
|
|
let tmp = Cursor::new(Vec::<u8>::new());
|
|
|
|
let mut blob_writer = DataBlobWriter::new_uncompressed(tmp)?;
|
|
|
|
blob_writer.write_all(&TEST_DATA)?;
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
verify_test_blob(blob_writer.finish()?)
|
|
|
|
}
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
#[test]
|
|
|
|
fn test_compressed_blob_writer() -> Result<(), Error> {
|
|
|
|
let tmp = Cursor::new(Vec::<u8>::new());
|
|
|
|
let mut blob_writer = DataBlobWriter::new_compressed(tmp)?;
|
|
|
|
blob_writer.write_all(&TEST_DATA)?;
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
verify_test_blob(blob_writer.finish()?)
|
|
|
|
}
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
#[test]
|
|
|
|
fn test_signed_blob_writer() -> Result<(), Error> {
|
|
|
|
let tmp = Cursor::new(Vec::<u8>::new());
|
|
|
|
let mut blob_writer = DataBlobWriter::new_signed(tmp, &CRYPT_CONFIG)?;
|
|
|
|
blob_writer.write_all(&TEST_DATA)?;
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
verify_test_blob(blob_writer.finish()?)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_signed_compressed_blob_writer() -> Result<(), Error> {
|
|
|
|
let tmp = Cursor::new(Vec::<u8>::new());
|
|
|
|
let mut blob_writer = DataBlobWriter::new_signed_compressed(tmp, &CRYPT_CONFIG)?;
|
|
|
|
blob_writer.write_all(&TEST_DATA)?;
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
verify_test_blob(blob_writer.finish()?)
|
|
|
|
}
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
#[test]
|
|
|
|
fn test_encrypted_blob_writer() -> Result<(), Error> {
|
|
|
|
let tmp = Cursor::new(Vec::<u8>::new());
|
|
|
|
let mut blob_writer = DataBlobWriter::new_encrypted(tmp, &CRYPT_CONFIG)?;
|
|
|
|
blob_writer.write_all(&TEST_DATA)?;
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
verify_test_blob(blob_writer.finish()?)
|
|
|
|
}
|
2019-08-12 10:05:11 +00:00
|
|
|
|
2019-08-13 16:10:38 +00:00
|
|
|
#[test]
|
|
|
|
fn test_encrypted_compressed_blob_writer() -> Result<(), Error> {
|
|
|
|
let tmp = Cursor::new(Vec::<u8>::new());
|
|
|
|
let mut blob_writer = DataBlobWriter::new_encrypted_compressed(tmp, &CRYPT_CONFIG)?;
|
|
|
|
blob_writer.write_all(&TEST_DATA)?;
|
|
|
|
|
|
|
|
verify_test_blob(blob_writer.finish()?)
|
2019-08-12 10:05:11 +00:00
|
|
|
}
|