From 495593702ede245bc63a0b55039f2e4e54ae4769 Mon Sep 17 00:00:00 2001 From: Jonathan Giddy Date: Tue, 23 Apr 2024 19:39:54 +0100 Subject: [PATCH] Add tests to show BufRead can be used after decoding Copy the test from `gzip::bufread` to demonstrate that it also works for `zlib` and `deflate`. --- src/deflate/bufread.rs | 47 ++++++++++++++++++++++++++++++++++++++++++ src/zlib/bufread.rs | 47 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) diff --git a/src/deflate/bufread.rs b/src/deflate/bufread.rs index c70a6303..65358374 100644 --- a/src/deflate/bufread.rs +++ b/src/deflate/bufread.rs @@ -243,3 +243,50 @@ impl Write for DeflateDecoder { self.get_mut().flush() } } + +#[cfg(test)] +mod test { + use crate::bufread::DeflateDecoder; + use crate::deflate::write; + use crate::Compression; + use std::io::{Read, Write}; + + // DeflateDecoder consumes one deflate archive and then returns 0 for subsequent reads, allowing any + // additional data to be consumed by the caller. + #[test] + fn decode_extra_data() { + let expected = "Hello World"; + + let compressed = { + let mut e = write::DeflateEncoder::new(Vec::new(), Compression::default()); + e.write(expected.as_ref()).unwrap(); + let mut b = e.finish().unwrap(); + b.push(b'x'); + b + }; + + let mut output = Vec::new(); + let mut decoder = DeflateDecoder::new(compressed.as_slice()); + let decoded_bytes = decoder.read_to_end(&mut output).unwrap(); + assert_eq!(decoded_bytes, output.len()); + let actual = std::str::from_utf8(&output).expect("String parsing error"); + assert_eq!( + actual, expected, + "after decompression we obtain the original input" + ); + + output.clear(); + assert_eq!( + decoder.read(&mut output).unwrap(), + 0, + "subsequent read of decoder returns 0, but inner reader can return additional data" + ); + let mut reader = decoder.into_inner(); + assert_eq!( + reader.read_to_end(&mut output).unwrap(), + 1, + "extra data is accessible in underlying buf-read" + ); + assert_eq!(output, b"x"); + } +} diff --git a/src/zlib/bufread.rs b/src/zlib/bufread.rs index 85bbd38a..cccae9f9 100644 --- a/src/zlib/bufread.rs +++ b/src/zlib/bufread.rs @@ -251,3 +251,50 @@ impl Write for ZlibDecoder { self.get_mut().flush() } } + +#[cfg(test)] +mod test { + use crate::bufread::ZlibDecoder; + use crate::zlib::write; + use crate::Compression; + use std::io::{Read, Write}; + + // GzDecoder consumes one gzip member and then returns 0 for subsequent reads, allowing any + // additional data to be consumed by the caller. + #[test] + fn decode_extra_data() { + let expected = "Hello World"; + + let compressed = { + let mut e = write::ZlibEncoder::new(Vec::new(), Compression::default()); + e.write(expected.as_ref()).unwrap(); + let mut b = e.finish().unwrap(); + b.push(b'x'); + b + }; + + let mut output = Vec::new(); + let mut decoder = ZlibDecoder::new(compressed.as_slice()); + let decoded_bytes = decoder.read_to_end(&mut output).unwrap(); + assert_eq!(decoded_bytes, output.len()); + let actual = std::str::from_utf8(&output).expect("String parsing error"); + assert_eq!( + actual, expected, + "after decompression we obtain the original input" + ); + + output.clear(); + assert_eq!( + decoder.read(&mut output).unwrap(), + 0, + "subsequent read of decoder returns 0, but inner reader can return additional data" + ); + let mut reader = decoder.into_inner(); + assert_eq!( + reader.read_to_end(&mut output).unwrap(), + 1, + "extra data is accessible in underlying buf-read" + ); + assert_eq!(output, b"x"); + } +}