compression/bzip2/
mod.rs

1//! rust-compression
2//!
3//! # Licensing
4//! This Source Code is subject to the terms of the Mozilla Public License
5//! version 2.0 (the "License"). You can obtain a copy of the License at
6//! <http://mozilla.org/MPL/2.0/>.
7#![cfg(feature = "bzip2")]
8
9pub(crate) mod decoder;
10pub(crate) mod encoder;
11pub(crate) mod error;
12mod mtf;
13
14const HEADER_B: u8 = 0x42;
15const HEADER_Z: u8 = 0x5a;
16#[allow(non_upper_case_globals)]
17const HEADER_h: u8 = 0x68;
18const HEADER_0: u8 = 0x30;
19
20const BZ_G_SIZE: usize = 50;
21
22#[cfg(test)]
23mod tests {
24    use crate::action::Action;
25    use crate::bzip2::decoder::BZip2Decoder;
26    use crate::bzip2::encoder::BZip2Encoder;
27    use crate::traits::decoder::DecodeExt;
28    use crate::traits::encoder::EncodeExt;
29    #[cfg(not(feature = "std"))]
30    #[allow(unused_imports)]
31    use alloc::vec;
32    #[cfg(not(feature = "std"))]
33    use alloc::vec::Vec;
34    use log::debug;
35    use simple_logger;
36
37    fn setup() {
38        let _ = simple_logger::init();
39    }
40
41    #[test]
42    fn test_unit() {
43        setup();
44        let ret = b"a\n"
45            .iter()
46            .cloned()
47            .encode(&mut BZip2Encoder::new(9), Action::Finish)
48            .collect::<Result<Vec<_>, _>>();
49
50        assert_eq!(
51            ret,
52            Ok(vec![
53                0x42, 0x5A, 0x68, 0x39, 0x31, 0x41, 0x59, 0x26, 0x53, 0x59,
54                0x63, 0x3E, 0xD6, 0xE2, 0x00, 0x00, 0x00, 0xC1, 0x00, 0x00,
55                0x10, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x82, 0xB1, 0x77,
56                0x24, 0x53, 0x85, 0x09, 0x06, 0x33, 0xED, 0x6E, 0x20,
57            ])
58        );
59
60        let ret2 = ret
61            .unwrap()
62            .iter()
63            .cloned()
64            .decode(&mut BZip2Decoder::new())
65            .collect::<Result<Vec<_>, _>>();
66        if let Err(e) = ret2 {
67            debug!("{}", e);
68        }
69        assert_eq!(ret2, Ok(b"a\n".to_vec()));
70    }
71
72    fn check_unzip(actual: &[u8], expected: &[u8]) {
73        let ret2 = actual
74            .iter()
75            .cloned()
76            .decode(&mut BZip2Decoder::new())
77            .collect::<Result<Vec<_>, _>>();
78        if let Err(e) = ret2 {
79            debug!("{}", e);
80        }
81        assert!(ret2 == Ok(expected.to_vec()), "invalid unzip");
82    }
83
84    #[test]
85    fn test_sample1() {
86        setup();
87
88        let mut encoder = BZip2Encoder::new(1);
89        let ret = include_bytes!("../../data/sample1.ref")
90            .iter()
91            .cloned()
92            .encode(&mut encoder, Action::Finish)
93            .collect::<Result<Vec<_>, _>>()
94            .unwrap();
95        check_unzip(&ret, include_bytes!("../../data/sample1.ref"));
96
97        check_unzip(
98            include_bytes!("../../data/sample1.bz2"),
99            include_bytes!("../../data/sample1.ref"),
100        );
101    }
102
103    #[test]
104    fn test_sample2() {
105        setup();
106
107        let mut encoder = BZip2Encoder::new(2);
108        let ret = include_bytes!("../../data/sample2.ref")
109            .iter()
110            .cloned()
111            .encode(&mut encoder, Action::Finish)
112            .collect::<Result<Vec<_>, _>>()
113            .unwrap();
114        check_unzip(&ret, include_bytes!("../../data/sample2.ref"));
115
116        check_unzip(
117            include_bytes!("../../data/sample2.bz2"),
118            include_bytes!("../../data/sample2.ref"),
119        );
120    }
121
122    #[test]
123    fn test_sample3() {
124        setup();
125
126        let mut encoder = BZip2Encoder::new(3);
127        let ret = include_bytes!("../../data/sample3.ref")
128            .iter()
129            .cloned()
130            .encode(&mut encoder, Action::Finish)
131            .collect::<Result<Vec<_>, _>>()
132            .unwrap();
133        check_unzip(&ret, include_bytes!("../../data/sample3.ref"));
134
135        check_unzip(
136            include_bytes!("../../data/sample3.bz2"),
137            include_bytes!("../../data/sample3.ref"),
138        );
139    }
140
141    #[test]
142    fn test_sample4() {
143        setup();
144        check_unzip(
145            include_bytes!("../../data/sample4.bz2"),
146            include_bytes!("../../data/sample4.ref"),
147        );
148    }
149
150    #[test]
151    fn test_long() {
152        setup();
153        let data = b"a".iter().cycle().take(1000).cloned().collect::<Vec<u8>>();
154
155        let compressed = data
156            .iter()
157            .cloned()
158            .encode(&mut BZip2Encoder::new(9), Action::Finish)
159            .collect::<Result<Vec<_>, _>>();
160
161        let decompressed = compressed
162            .unwrap()
163            .iter()
164            .cloned()
165            .decode(&mut BZip2Decoder::new())
166            .collect::<Result<Vec<_>, _>>();
167
168        if let Err(e) = decompressed {
169            debug!("{}", e);
170        }
171        assert_eq!(decompressed, Ok(data));
172    }
173}