1 extern crate flate2; 2 3 use flate2::read::GzDecoder; 4 use flate2::read::MultiGzDecoder; 5 use std::fs::File; 6 use std::io::prelude::*; 7 use std::io::{self, BufReader}; 8 use std::path::Path; 9 10 // test extraction of a gzipped file 11 #[test] test_extract_success()12fn test_extract_success() { 13 let content = extract_file(Path::new("tests/good-file.gz")).unwrap(); 14 let mut expected = Vec::new(); 15 File::open("tests/good-file.txt") 16 .unwrap() 17 .read_to_end(&mut expected) 18 .unwrap(); 19 assert!(content == expected); 20 } 21 // 22 // test partial extraction of a multistream gzipped file 23 #[test] test_extract_success_partial_multi()24fn test_extract_success_partial_multi() { 25 let content = extract_file(Path::new("tests/multi.gz")).unwrap(); 26 let mut expected = String::new(); 27 BufReader::new(File::open("tests/multi.txt").unwrap()) 28 .read_line(&mut expected) 29 .unwrap(); 30 assert_eq!(content, expected.as_bytes()); 31 } 32 33 // test extraction fails on a corrupt file 34 #[test] test_extract_failure()35fn test_extract_failure() { 36 let result = extract_file(Path::new("tests/corrupt-gz-file.bin")); 37 assert_eq!(result.err().unwrap().kind(), io::ErrorKind::InvalidInput); 38 } 39 40 //test complete extraction of a multistream gzipped file 41 #[test] test_extract_success_multi()42fn test_extract_success_multi() { 43 let content = extract_file_multi(Path::new("tests/multi.gz")).unwrap(); 44 let mut expected = Vec::new(); 45 File::open("tests/multi.txt") 46 .unwrap() 47 .read_to_end(&mut expected) 48 .unwrap(); 49 assert_eq!(content, expected); 50 } 51 52 // Tries to extract path into memory (assuming a .gz file). extract_file(path_compressed: &Path) -> io::Result<Vec<u8>>53fn extract_file(path_compressed: &Path) -> io::Result<Vec<u8>> { 54 let mut v = Vec::new(); 55 let f = File::open(path_compressed)?; 56 GzDecoder::new(f).read_to_end(&mut v)?; 57 Ok(v) 58 } 59 60 // Tries to extract path into memory (decompressing all members in case 61 // of a multi member .gz file). extract_file_multi(path_compressed: &Path) -> io::Result<Vec<u8>>62fn extract_file_multi(path_compressed: &Path) -> io::Result<Vec<u8>> { 63 let mut v = Vec::new(); 64 let f = File::open(path_compressed)?; 65 MultiGzDecoder::new(f).read_to_end(&mut v)?; 66 Ok(v) 67 } 68 69 #[test] empty_error_once()70fn empty_error_once() { 71 let data: &[u8] = &[]; 72 let cbjson = GzDecoder::new(data); 73 let reader = BufReader::new(cbjson); 74 let mut stream = reader.lines(); 75 assert!(stream.next().unwrap().is_err()); 76 assert!(stream.next().is_none()); 77 } 78