1 | #[test ] |
2 | fn test_decode_corpus_files() { |
3 | extern crate std; |
4 | use crate::frame_decoder; |
5 | use alloc::borrow::ToOwned; |
6 | use alloc::string::{String, ToString}; |
7 | use alloc::vec::Vec; |
8 | use std::fs; |
9 | use std::io::Read; |
10 | use std::println; |
11 | |
12 | let mut success_counter = 0; |
13 | let mut fail_counter_diff = 0; |
14 | let mut fail_counter_size = 0; |
15 | let mut fail_counter_bytes_read = 0; |
16 | #[cfg_attr (not(feature = "hash" ), allow(unused_mut))] |
17 | let mut fail_counter_chksum = 0; |
18 | let mut total_counter = 0; |
19 | let mut failed: Vec<String> = Vec::new(); |
20 | |
21 | let mut speeds = Vec::new(); |
22 | let mut speeds_read = Vec::new(); |
23 | |
24 | let mut files: Vec<_> = fs::read_dir("./decodecorpus_files" ).unwrap().collect(); |
25 | if fs::read_dir("./local_corpus_files" ).is_ok() { |
26 | files.extend(fs::read_dir("./local_corpus_files" ).unwrap()); |
27 | } |
28 | |
29 | files.sort_by_key(|x| match x { |
30 | Err(_) => "" .to_owned(), |
31 | Ok(entry) => entry.path().to_str().unwrap().to_owned(), |
32 | }); |
33 | |
34 | let mut frame_dec = frame_decoder::FrameDecoder::new(); |
35 | |
36 | for file in files { |
37 | let f = file.unwrap(); |
38 | let metadata = f.metadata().unwrap(); |
39 | let file_size = metadata.len(); |
40 | |
41 | let p = String::from(f.path().to_str().unwrap()); |
42 | if !p.ends_with(".zst" ) { |
43 | continue; |
44 | } |
45 | println!("Trying file: {}" , p); |
46 | |
47 | let mut content = fs::File::open(f.path()).unwrap(); |
48 | |
49 | frame_dec.reset(&mut content).unwrap(); |
50 | |
51 | let start_time = std::time::Instant::now(); |
52 | /////DECODING |
53 | frame_dec |
54 | .decode_blocks(&mut content, frame_decoder::BlockDecodingStrategy::All) |
55 | .unwrap(); |
56 | let result = frame_dec.collect().unwrap(); |
57 | let end_time = start_time.elapsed(); |
58 | |
59 | match frame_dec.get_checksum_from_data() { |
60 | Some(chksum) => { |
61 | #[cfg (feature = "hash" )] |
62 | if frame_dec.get_calculated_checksum().unwrap() != chksum { |
63 | println!( |
64 | "Checksum did not match! From data: {}, calculated while decoding: {} \n" , |
65 | chksum, |
66 | frame_dec.get_calculated_checksum().unwrap() |
67 | ); |
68 | fail_counter_chksum += 1; |
69 | failed.push(p.clone().to_string()); |
70 | } else { |
71 | println!("Checksums are ok! \n" ); |
72 | } |
73 | #[cfg (not(feature = "hash" ))] |
74 | println!( |
75 | "Checksum feature not enabled, skipping. From data: {} \n" , |
76 | chksum |
77 | ); |
78 | } |
79 | None => println!("No checksums to test \n" ), |
80 | } |
81 | |
82 | let mut original_p = p.clone(); |
83 | original_p.truncate(original_p.len() - 4); |
84 | let original_f = fs::File::open(original_p).unwrap(); |
85 | let original: Vec<u8> = original_f.bytes().map(|x| x.unwrap()).collect(); |
86 | |
87 | println!("Results for file: {}" , p.clone()); |
88 | let mut success = true; |
89 | |
90 | if original.len() != result.len() { |
91 | println!( |
92 | "Result has wrong length: {}, should be: {}" , |
93 | result.len(), |
94 | original.len() |
95 | ); |
96 | success = false; |
97 | fail_counter_size += 1; |
98 | } |
99 | |
100 | if frame_dec.bytes_read_from_source() != file_size { |
101 | println!( |
102 | "Framedecoder counted wrong amount of bytes: {}, should be: {}" , |
103 | frame_dec.bytes_read_from_source(), |
104 | file_size |
105 | ); |
106 | success = false; |
107 | fail_counter_bytes_read += 1; |
108 | } |
109 | |
110 | let mut counter = 0; |
111 | let min = if original.len() < result.len() { |
112 | original.len() |
113 | } else { |
114 | result.len() |
115 | }; |
116 | for idx in 0..min { |
117 | if original[idx] != result[idx] { |
118 | counter += 1; |
119 | //println!( |
120 | // "Original {} not equal to result {} at byte: {}", |
121 | // original[idx], result[idx], idx, |
122 | //); |
123 | } |
124 | } |
125 | |
126 | if counter > 0 { |
127 | println!("Result differs in at least {} bytes from original" , counter); |
128 | success = false; |
129 | fail_counter_diff += 1; |
130 | } |
131 | |
132 | if success { |
133 | success_counter += 1; |
134 | } else { |
135 | failed.push(p.clone().to_string()); |
136 | } |
137 | total_counter += 1; |
138 | |
139 | let dur = end_time.as_micros() as usize; |
140 | let speed = result.len() / if dur == 0 { 1 } else { dur }; |
141 | let speed_read = file_size as usize / if dur == 0 { 1 } else { dur }; |
142 | println!("SPEED: {}" , speed); |
143 | println!("SPEED_read: {}" , speed_read); |
144 | speeds.push(speed); |
145 | speeds_read.push(speed_read); |
146 | } |
147 | |
148 | println!("###################" ); |
149 | println!("Summary:" ); |
150 | println!("###################" ); |
151 | println!( |
152 | "Total: {}, Success: {}, WrongSize: {}, WrongBytecount: {}, WrongChecksum: {}, Diffs: {}" , |
153 | total_counter, |
154 | success_counter, |
155 | fail_counter_size, |
156 | fail_counter_bytes_read, |
157 | fail_counter_chksum, |
158 | fail_counter_diff |
159 | ); |
160 | println!("Failed files: " ); |
161 | for f in &failed { |
162 | println!("{}" , f); |
163 | } |
164 | |
165 | let speed_len = speeds.len(); |
166 | let sum_speed: usize = speeds.into_iter().sum(); |
167 | let avg_speed = sum_speed / speed_len; |
168 | let avg_speed_bps = avg_speed * 1_000_000; |
169 | if avg_speed_bps < 1000 { |
170 | println!("Average speed: {} B/s" , avg_speed_bps); |
171 | } else if avg_speed_bps < 1_000_000 { |
172 | println!("Average speed: {} KB/s" , avg_speed_bps / 1000); |
173 | } else { |
174 | println!("Average speed: {} MB/s" , avg_speed_bps / 1_000_000); |
175 | } |
176 | |
177 | let speed_read_len = speeds_read.len(); |
178 | let sum_speed_read: usize = speeds_read.into_iter().sum(); |
179 | let avg_speed_read = sum_speed_read / speed_read_len; |
180 | let avg_speed_read_bps = avg_speed_read * 1_000_000; |
181 | if avg_speed_read_bps < 1000 { |
182 | println!("Average speed reading: {} B/s" , avg_speed_read_bps); |
183 | } else if avg_speed_bps < 1_000_000 { |
184 | println!("Average speed reading: {} KB/s" , avg_speed_read_bps / 1000); |
185 | } else { |
186 | println!( |
187 | "Average speed reading: {} MB/s" , |
188 | avg_speed_read_bps / 1_000_000 |
189 | ); |
190 | } |
191 | |
192 | assert!(failed.is_empty()); |
193 | } |
194 | |