mod deflate_stream { use crate::zlib::stream::DeflateWriter; use crate::zlib::stream::InflateReader; use std::io::{Read, Write}; #[test] fn all_at_once() -> Result<(), Box> { let mut w = DeflateWriter::new(Vec::new()); assert_eq!(w.write(b"hello")?, 5); w.flush()?; let out = w.inner; assert!(out.len() == 12 || out.len() == 13); assert_deflate_buffer(out, b"hello") } fn assert_deflate_buffer(out: Vec, expected: &[u8]) -> Result<(), Box> { let mut actual = Vec::new(); InflateReader::from_read(out.as_slice()).read_to_end(&mut actual)?; assert_eq!(actual, expected); Ok(()) } #[test] fn big_file_small_writes() -> Result<(), Box> { let mut w = DeflateWriter::new(Vec::new()); let bytes = include_bytes!("../../../../tests/fixtures/packs/pack-11fdfa9e156ab73caae3b6da867192221f2089c2.pack"); for chunk in bytes.chunks(2) { assert_eq!(w.write(chunk)?, chunk.len()); } w.flush()?; assert_deflate_buffer(w.inner, bytes) } #[test] fn big_file_a_few_big_writes() -> Result<(), Box> { let mut w = DeflateWriter::new(Vec::new()); let bytes = include_bytes!("../../../../tests/fixtures/packs/pack-11fdfa9e156ab73caae3b6da867192221f2089c2.pack"); for chunk in bytes.chunks(4096 * 9) { assert_eq!(w.write(chunk)?, chunk.len()); } w.flush()?; assert_deflate_buffer(w.inner, bytes) } } mod deflate { use crate::zlib::stream::{deflate::Deflate, Status}; use miniz_oxide::MZFlush; #[test] fn compress_all_data_at_once() { let mut buf = [0u8; 16]; assert_eq!( Deflate::default() .compress(b"hello", &mut buf, MZFlush::Finish) .expect("compression to memory to work"), Status::StreamEnd ); } #[test] fn output_too_small_try_finish() -> Result<(), Box> { let mut buf = [0u8; 6]; let mut deflate = Deflate::default(); let input = b"hello"; assert_eq!(deflate.compress(input, &mut buf, MZFlush::Finish)?, Status::Ok); assert_eq!(deflate.total_in, 5); assert_eq!(deflate.total_out, 6); assert_eq!( deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::Finish)?, Status::Ok ); assert_eq!(deflate.total_in, 5); assert!(deflate.total_out == 13 || deflate.total_out == 12); assert_eq!( deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::Finish)?, Status::StreamEnd ); assert!(deflate.total_out == 13 || deflate.total_out == 12); Ok(()) } #[test] fn output_too_small_do_not_try_to_finish() -> Result<(), Box> { let mut buf = [0u8; 6]; let mut deflate = Deflate::default(); let input = b"hellohellohellohellohellohellohellohellhellohellohellohellohellohellohellohellhellohellohellohellohellohellohellohellooohellohellohellohellohellohellohellohello"; assert_eq!(deflate.compress(input, &mut buf, MZFlush::None)?, Status::Ok); assert_eq!(deflate.total_in, 160); assert_eq!(deflate.total_out, 0); assert_eq!( deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::None)?, Status::BufError, "the output buffer is too small to drop any information" ); let mut buf = [0u8; 32]; assert_eq!( deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::None)?, Status::BufError, "after the first buf error, unless providing more input, probably nothing can be done" ); assert_eq!(deflate.total_out, 0); assert_eq!( deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::Finish)?, Status::Ok, "it wrote some data, but not all" ); assert!(deflate.total_out == 31 || deflate.total_out == 32); assert_eq!( deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::Finish)?, Status::StreamEnd, ); assert_eq!(deflate.total_out, 35); Ok(()) } #[test] fn multiple_inputs_sufficient_output() -> Result<(), Box> { let mut buf = [0u8; 32]; let mut deflate = Deflate::default(); let input = b"hello"; let step = 2; let mut cur = 0; assert_eq!( deflate.compress(&input[cur..cur + step], &mut buf, MZFlush::None)?, Status::Ok ); assert_eq!(deflate.total_in, 2); assert_eq!(deflate.total_out, 0); cur += step; assert_eq!( deflate.compress(&input[cur..cur + step], &mut buf, MZFlush::None)?, Status::Ok ); assert_eq!(deflate.total_in, 4); assert_eq!(deflate.total_out, 0); cur += step; assert_eq!( deflate.compress(&input[cur..], &mut buf, MZFlush::Finish)?, Status::StreamEnd ); assert_eq!(deflate.total_in, 5); assert!(deflate.total_out == 13 || deflate.total_out == 12); Ok(()) } }