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 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 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}