blob: c3cb004d524196da082123db656d3e1e57660f14 [file] [log] [blame]
#[cfg(test)]
use alloc::vec;
#[cfg(test)]
use alloc::vec::Vec;
#[cfg(test)]
extern crate std;
#[cfg(all(test, not(feature = "std")))]
impl crate::io_nostd::Read for std::fs::File {
fn read(&mut self, buf: &mut [u8]) -> Result<usize, crate::io_nostd::Error> {
std::io::Read::read(self, buf).map_err(|e| {
if e.get_ref().is_none() {
crate::io_nostd::Error::from(crate::io_nostd::ErrorKind::Other)
} else {
crate::io_nostd::Error::new(
crate::io_nostd::ErrorKind::Other,
alloc::boxed::Box::new(e.into_inner().unwrap()),
)
}
})
}
}
#[cfg(all(test, feature = "std"))]
#[allow(dead_code)]
fn assure_error_impl() {
// not a real test just there to throw an compiler error if Error is not derived correctly
use crate::frame_decoder::FrameDecoderError;
let _err: &dyn std::error::Error = &FrameDecoderError::NotYetInitialized;
}
#[test]
fn skippable_frame() {
use crate::frame;
let mut content = vec![];
content.extend_from_slice(&0x184D2A50u32.to_le_bytes());
content.extend_from_slice(&300u32.to_le_bytes());
assert_eq!(8, content.len());
let err = frame::read_frame_header(content.as_slice());
assert!(matches!(
err,
Err(frame::ReadFrameHeaderError::SkipFrame(0x184D2A50u32, 300))
));
content.clear();
content.extend_from_slice(&0x184D2A5Fu32.to_le_bytes());
content.extend_from_slice(&0xFFFFFFFFu32.to_le_bytes());
assert_eq!(8, content.len());
let err = frame::read_frame_header(content.as_slice());
assert!(matches!(
err,
Err(frame::ReadFrameHeaderError::SkipFrame(
0x184D2A5Fu32,
0xFFFFFFFF
))
));
}
#[cfg(test)]
#[test]
fn test_frame_header_reading() {
use crate::frame;
use std::fs;
let mut content = fs::File::open("./decodecorpus_files/z000088.zst").unwrap();
let (_frame, _) = frame::read_frame_header(&mut content).unwrap();
}
#[test]
fn test_block_header_reading() {
use crate::decoding;
use crate::frame;
use std::fs;
let mut content = fs::File::open("./decodecorpus_files/z000088.zst").unwrap();
let (_frame, _) = frame::read_frame_header(&mut content).unwrap();
let mut block_dec = decoding::block_decoder::new();
let block_header = block_dec.read_block_header(&mut content).unwrap();
let _ = block_header; //TODO validate blockheader in a smart way
}
#[test]
fn test_frame_decoder() {
use crate::frame_decoder;
use std::fs;
let mut content = fs::File::open("./decodecorpus_files/z000088.zst").unwrap();
struct NullWriter(());
impl std::io::Write for NullWriter {
fn write(&mut self, buf: &[u8]) -> Result<usize, std::io::Error> {
Ok(buf.len())
}
fn flush(&mut self) -> Result<(), std::io::Error> {
Ok(())
}
}
let mut _null_target = NullWriter(());
let mut frame_dec = frame_decoder::FrameDecoder::new();
frame_dec.reset(&mut content).unwrap();
frame_dec
.decode_blocks(&mut content, frame_decoder::BlockDecodingStrategy::All)
.unwrap();
}
#[test]
fn test_decode_from_to() {
use crate::frame_decoder;
use std::fs::File;
use std::io::Read;
let f = File::open("./decodecorpus_files/z000088.zst").unwrap();
let mut frame_dec = frame_decoder::FrameDecoder::new();
let content: Vec<u8> = f.bytes().map(|x| x.unwrap()).collect();
let mut target = vec![0u8; 1024 * 1024];
// first part
let source1 = &content[..50 * 1024];
let (read1, written1) = frame_dec
.decode_from_to(source1, target.as_mut_slice())
.unwrap();
//second part explicitely without checksum
let source2 = &content[read1..content.len() - 4];
let (read2, written2) = frame_dec
.decode_from_to(source2, &mut target[written1..])
.unwrap();
//must have decoded until checksum
assert!(read1 + read2 == content.len() - 4);
//insert checksum separatly to test that this is handled correctly
let chksum_source = &content[read1 + read2..];
let (read3, written3) = frame_dec
.decode_from_to(chksum_source, &mut target[written1 + written2..])
.unwrap();
//this must result in these values because just the checksum was processed
assert!(read3 == 4);
assert!(written3 == 0);
let read = read1 + read2 + read3;
let written = written1 + written2;
let result = &target.as_slice()[..written];
if read != content.len() {
panic!(
"Byte counter: {} was wrong. Should be: {}",
read,
content.len()
);
}
match frame_dec.get_checksum_from_data() {
Some(chksum) => {
if frame_dec.get_calculated_checksum().unwrap() != chksum {
std::println!(
"Checksum did not match! From data: {}, calculated while decoding: {}\n",
chksum,
frame_dec.get_calculated_checksum().unwrap()
);
} else {
std::println!("Checksums are ok!\n");
}
}
None => std::println!("No checksums to test\n"),
}
let original_f = File::open("./decodecorpus_files/z000088").unwrap();
let original: Vec<u8> = original_f.bytes().map(|x| x.unwrap()).collect();
if original.len() != result.len() {
panic!(
"Result has wrong length: {}, should be: {}",
result.len(),
original.len()
);
}
let mut counter = 0;
let min = if original.len() < result.len() {
original.len()
} else {
result.len()
};
for idx in 0..min {
if original[idx] != result[idx] {
counter += 1;
//std::println!(
// "Original {:3} not equal to result {:3} at byte: {}",
// original[idx], result[idx], idx,
//);
}
}
if counter > 0 {
panic!("Result differs in at least {} bytes from original", counter);
}
}
#[test]
fn test_specific_file() {
use crate::frame_decoder;
use std::fs;
use std::io::Read;
let path = "./decodecorpus_files/z000068.zst";
let mut content = fs::File::open(path).unwrap();
struct NullWriter(());
impl std::io::Write for NullWriter {
fn write(&mut self, buf: &[u8]) -> Result<usize, std::io::Error> {
Ok(buf.len())
}
fn flush(&mut self) -> Result<(), std::io::Error> {
Ok(())
}
}
let mut _null_target = NullWriter(());
let mut frame_dec = frame_decoder::FrameDecoder::new();
frame_dec.reset(&mut content).unwrap();
frame_dec
.decode_blocks(&mut content, frame_decoder::BlockDecodingStrategy::All)
.unwrap();
let result = frame_dec.collect().unwrap();
let original_f = fs::File::open("./decodecorpus_files/z000088").unwrap();
let original: Vec<u8> = original_f.bytes().map(|x| x.unwrap()).collect();
std::println!("Results for file: {}", path);
if original.len() != result.len() {
std::println!(
"Result has wrong length: {}, should be: {}",
result.len(),
original.len()
);
}
let mut counter = 0;
let min = if original.len() < result.len() {
original.len()
} else {
result.len()
};
for idx in 0..min {
if original[idx] != result[idx] {
counter += 1;
//std::println!(
// "Original {:3} not equal to result {:3} at byte: {}",
// original[idx], result[idx], idx,
//);
}
}
if counter > 0 {
std::println!("Result differs in at least {} bytes from original", counter);
}
}
#[test]
#[cfg(feature = "std")]
fn test_streaming() {
use std::fs;
use std::io::Read;
let mut content = fs::File::open("./decodecorpus_files/z000088.zst").unwrap();
let mut stream = crate::streaming_decoder::StreamingDecoder::new(&mut content).unwrap();
let mut result = Vec::new();
Read::read_to_end(&mut stream, &mut result).unwrap();
let original_f = fs::File::open("./decodecorpus_files/z000088").unwrap();
let original: Vec<u8> = original_f.bytes().map(|x| x.unwrap()).collect();
if original.len() != result.len() {
panic!(
"Result has wrong length: {}, should be: {}",
result.len(),
original.len()
);
}
let mut counter = 0;
let min = if original.len() < result.len() {
original.len()
} else {
result.len()
};
for idx in 0..min {
if original[idx] != result[idx] {
counter += 1;
//std::println!(
// "Original {:3} not equal to result {:3} at byte: {}",
// original[idx], result[idx], idx,
//);
}
}
if counter > 0 {
panic!("Result differs in at least {} bytes from original", counter);
}
// Test resetting to a new file while keeping the old decoder
let mut content = fs::File::open("./decodecorpus_files/z000068.zst").unwrap();
let mut stream =
crate::streaming_decoder::StreamingDecoder::new_with_decoder(&mut content, stream.inner())
.unwrap();
let mut result = Vec::new();
Read::read_to_end(&mut stream, &mut result).unwrap();
let original_f = fs::File::open("./decodecorpus_files/z000068").unwrap();
let original: Vec<u8> = original_f.bytes().map(|x| x.unwrap()).collect();
std::println!("Results for file:");
if original.len() != result.len() {
panic!(
"Result has wrong length: {}, should be: {}",
result.len(),
original.len()
);
}
let mut counter = 0;
let min = if original.len() < result.len() {
original.len()
} else {
result.len()
};
for idx in 0..min {
if original[idx] != result[idx] {
counter += 1;
//std::println!(
// "Original {:3} not equal to result {:3} at byte: {}",
// original[idx], result[idx], idx,
//);
}
}
if counter > 0 {
panic!("Result differs in at least {} bytes from original", counter);
}
}
#[test]
#[cfg(not(feature = "std"))]
fn test_streaming_no_std() {
use crate::io::Read;
let content = include_bytes!("../../decodecorpus_files/z000088.zst");
let mut content = content.as_slice();
let mut stream = crate::streaming_decoder::StreamingDecoder::new(&mut content).unwrap();
let original = include_bytes!("../../decodecorpus_files/z000088");
let mut result = vec![0; original.len()];
Read::read_exact(&mut stream, &mut result).unwrap();
if original.len() != result.len() {
panic!(
"Result has wrong length: {}, should be: {}",
result.len(),
original.len()
);
}
let mut counter = 0;
let min = if original.len() < result.len() {
original.len()
} else {
result.len()
};
for idx in 0..min {
if original[idx] != result[idx] {
counter += 1;
//std::println!(
// "Original {:3} not equal to result {:3} at byte: {}",
// original[idx], result[idx], idx,
//);
}
}
if counter > 0 {
panic!("Result differs in at least {} bytes from original", counter);
}
// Test resetting to a new file while keeping the old decoder
let content = include_bytes!("../../decodecorpus_files/z000068.zst");
let mut content = content.as_slice();
let mut stream =
crate::streaming_decoder::StreamingDecoder::new_with_decoder(&mut content, stream.inner())
.unwrap();
let original = include_bytes!("../../decodecorpus_files/z000068");
let mut result = vec![0; original.len()];
Read::read_exact(&mut stream, &mut result).unwrap();
std::println!("Results for file:");
if original.len() != result.len() {
panic!(
"Result has wrong length: {}, should be: {}",
result.len(),
original.len()
);
}
let mut counter = 0;
let min = if original.len() < result.len() {
original.len()
} else {
result.len()
};
for idx in 0..min {
if original[idx] != result[idx] {
counter += 1;
//std::println!(
// "Original {:3} not equal to result {:3} at byte: {}",
// original[idx], result[idx], idx,
//);
}
}
if counter > 0 {
panic!("Result differs in at least {} bytes from original", counter);
}
}
pub mod bit_reader;
pub mod decode_corpus;
pub mod dict_test;
pub mod fuzz_regressions;