1use std::path::Path;
2#[cfg(test)]
3use std::path::PathBuf;
4
5pub fn gzip_file(from: &Path, into: &Path) -> std::io::Result<()> {
6 let mut source = std::fs::File::open(from)?;
7 let target = std::fs::File::create(into)?;
8 let mut encoder = flate2::write::GzEncoder::new(target, flate2::Compression::default());
9 std::io::copy(&mut source, &mut encoder)?;
10 encoder.finish()?.sync_all()
11}
12
13#[cfg(test)]
14mod tests {
15 use super::*;
16
17 fn scratch(prefix: &str) -> tempfile::TempDir {
18 let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tmp/testscratch");
19 std::fs::create_dir_all(&root).unwrap();
20 tempfile::Builder::new()
21 .prefix(prefix)
22 .tempdir_in(&root)
23 .unwrap()
24 }
25
26 #[test]
27 fn gzip_file_round_trips_the_exact_bytes() {
28 let dir = scratch("archive-gzip-");
29 let from = dir.path().join("plain");
30 let into = dir.path().join("compressed.gz");
31 std::fs::write(&from, b"the quick brown fox jumps over the lazy dog").unwrap();
32
33 gzip_file(&from, &into).unwrap();
34
35 let compressed = std::fs::read(&into).unwrap();
36 assert!(!compressed.is_empty());
37 let mut decoder = flate2::read::GzDecoder::new(&compressed[..]);
38 let mut restored = Vec::new();
39 std::io::Read::read_to_end(&mut decoder, &mut restored).unwrap();
40 assert_eq!(restored, b"the quick brown fox jumps over the lazy dog");
41 }
42}