safe_buffer/
lib.rs

1#![feature(linked_list_cursors)]
2#![feature(allocator_api)]
3
4use std::collections::LinkedList;
5use std::io;
6use std::io::{Error, ErrorKind, SeekFrom};
7use std::alloc::Allocator;
8
9
10include!("buffer.rs");
11include!("chunk.rs");
12include!("list.rs");
13
14#[cfg(test)]
15mod tests {
16    use std::io::{Seek, Write};
17    use rand::{Rng};
18    use zip::write::SimpleFileOptions;
19    use zip::ZipWriter;
20    use super::*;
21
22    #[test]
23    fn random_write() {
24        _random_write_and_read(0);
25        _random_write_and_read(10);
26        _random_write_and_read(3048);
27        _random_write_and_read(CHUNK_SIZE + 1);
28        _random_write_and_read(10_000);
29        _random_write_and_read(1_000_000);
30    }
31
32    fn _random_write_and_read(len: usize) {
33        // write
34        let mut rng = rand::thread_rng();
35        let mut data = Vec::with_capacity(len);
36        for _ in 0..len {
37            data.push(rng.gen_range(0..u8::MAX));
38        }
39
40        let mut buffer = Buffer::new();
41        buffer.write(data.as_slice()).expect("write failed");
42
43        // read
44        let mut ret = Vec::with_capacity(len);
45        while let Some(chunk) = buffer.pop_front() {
46            for b in chunk.as_slice() {
47                ret.push(*b);
48            }
49        }
50
51        assert_eq!(ret, data);
52    }
53
54    fn _prepare(len: usize) -> Buffer {
55        let mut rng = rand::thread_rng();
56
57        let mut data = Vec::with_capacity(len);
58        for _ in 0..len {
59            data.push(rng.gen_range(0..u8::MAX));
60        }
61
62        let mut buffer = Buffer::new();
63        buffer.write(data.as_slice()).expect("write failed");
64
65        buffer
66    }
67
68    #[test]
69    fn seek_end() {
70        let mut buffer = _prepare(1_000_000);
71        buffer.seek(SeekFrom::End(0)).expect("seek failed");
72    }
73
74    #[test]
75    fn zip_test() {
76        let mut buf: Buffer = Buffer::new();
77        let mut zip = ZipWriter::new(&mut buf);
78
79        let options = SimpleFileOptions::default().compression_method(zip::CompressionMethod::Stored);
80
81        fn fetch_img(img_url: &str) -> Result<Vec<u8>, reqwest::Error> {
82            let res = reqwest::blocking::get(img_url)?;
83            let data = res.bytes()?;
84            let data_vec = data.to_vec();
85
86            Ok(data_vec)
87        }
88
89        let data = &fetch_img("https://cdn.esawebb.org/archives/images/screen/weic2216b.jpg").expect("failed to fetch image");
90
91        for i in 0..500 {
92            let name = format!("img{i}.jpg");
93
94            zip.start_file(name, options).expect("Failed to start file");
95            zip.write(&data).expect("write failed");
96        };
97
98        zip.finish().expect("finish failed");
99    }
100}