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