-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstream_test.rs
More file actions
106 lines (86 loc) · 2.78 KB
/
stream_test.rs
File metadata and controls
106 lines (86 loc) · 2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
use libdeflate::stream::{DeflateDecoder, DeflateEncoder};
use std::io::{Cursor, Read, Write};
use std::sync::{Arc, Mutex};
#[derive(Clone)]
struct FlushTrackingWriter {
data: Arc<Mutex<Vec<u8>>>,
flush_count: Arc<Mutex<usize>>,
}
impl Write for FlushTrackingWriter {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.data.lock().unwrap().extend_from_slice(buf);
Ok(buf.len())
}
fn flush(&mut self) -> std::io::Result<()> {
*self.flush_count.lock().unwrap() += 1;
Ok(())
}
}
struct ErrorFlushWriter;
impl Write for ErrorFlushWriter {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
Ok(buf.len())
}
fn flush(&mut self) -> std::io::Result<()> {
Err(std::io::Error::new(std::io::ErrorKind::Other, "flush error"))
}
}
#[test]
fn test_stream_round_trip() {
let mut data = Vec::with_capacity(10000);
for i in 0..10000 {
data.push((i % 256) as u8);
}
let mut encoder = DeflateEncoder::new(Vec::new(), 6);
encoder.write_all(&data).unwrap();
let compressed = encoder.finish().unwrap();
let mut decoder = DeflateDecoder::new(Cursor::new(compressed));
let mut decompressed = Vec::new();
decoder.read_to_end(&mut decompressed).unwrap();
assert_eq!(data, decompressed);
}
#[test]
fn test_stream_small_chunks() {
let mut data = Vec::with_capacity(10000);
for i in 0..10000 {
data.push((i % 256) as u8);
}
let mut encoder = DeflateEncoder::new(Vec::new(), 6);
encoder.write_all(&data).unwrap();
let compressed = encoder.finish().unwrap();
let mut decoder = DeflateDecoder::new(Cursor::new(compressed));
let mut decompressed = Vec::new();
let mut buf = [0u8; 10];
loop {
let n = decoder.read(&mut buf).unwrap();
if n == 0 {
break;
}
decompressed.extend_from_slice(&buf[..n]);
}
assert_eq!(data, decompressed);
}
#[test]
fn test_encoder_flush() {
let data = Arc::new(Mutex::new(Vec::new()));
let flush_count = Arc::new(Mutex::new(0));
let writer = FlushTrackingWriter {
data: data.clone(),
flush_count: flush_count.clone(),
};
let mut encoder = DeflateEncoder::new(writer, 6);
encoder.write_all(b"Hello World").unwrap();
encoder.flush().unwrap();
// Verify data was written (compressed)
assert!(!data.lock().unwrap().is_empty());
// Verify flush was called on the underlying writer
assert_eq!(*flush_count.lock().unwrap(), 1);
}
#[test]
fn test_encoder_flush_error() {
let writer = ErrorFlushWriter;
let mut encoder = DeflateEncoder::new(writer, 6);
encoder.write_all(b"Hello World").unwrap();
// flush() should fail because the underlying writer returns an error
assert!(encoder.flush().is_err());
}