summaryrefslogtreecommitdiffstats
path: root/vendor/ruzstd/src/tests/dict_test.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/ruzstd/src/tests/dict_test.rs')
-rw-r--r--vendor/ruzstd/src/tests/dict_test.rs252
1 files changed, 252 insertions, 0 deletions
diff --git a/vendor/ruzstd/src/tests/dict_test.rs b/vendor/ruzstd/src/tests/dict_test.rs
new file mode 100644
index 000000000..a8a5fd46b
--- /dev/null
+++ b/vendor/ruzstd/src/tests/dict_test.rs
@@ -0,0 +1,252 @@
+#[test]
+fn test_dict_parsing() {
+ use crate::decoding::dictionary::Dictionary;
+ let mut raw = vec![0u8; 8];
+
+ // correct magic num
+ raw[0] = 0x37;
+ raw[1] = 0xA4;
+ raw[2] = 0x30;
+ raw[3] = 0xEC;
+
+ //dict-id
+ let dict_id = 0x47232101;
+ raw[4] = 0x01;
+ raw[5] = 0x21;
+ raw[6] = 0x23;
+ raw[7] = 0x47;
+
+ // tables copied from ./dict_tests/dictionary
+ let raw_tables = &[
+ 54, 16, 192, 155, 4, 0, 207, 59, 239, 121, 158, 116, 220, 93, 114, 229, 110, 41, 249, 95,
+ 165, 255, 83, 202, 254, 68, 74, 159, 63, 161, 100, 151, 137, 21, 184, 183, 189, 100, 235,
+ 209, 251, 174, 91, 75, 91, 185, 19, 39, 75, 146, 98, 177, 249, 14, 4, 35, 0, 0, 0, 40, 40,
+ 20, 10, 12, 204, 37, 196, 1, 173, 122, 0, 4, 0, 128, 1, 2, 2, 25, 32, 27, 27, 22, 24, 26,
+ 18, 12, 12, 15, 16, 11, 69, 37, 225, 48, 20, 12, 6, 2, 161, 80, 40, 20, 44, 137, 145, 204,
+ 46, 0, 0, 0, 0, 0, 116, 253, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ ];
+ raw.extend(&raw_tables[..]);
+
+ //offset history 3,10,0x00ABCDEF
+ raw.extend(vec![3, 0, 0, 0]);
+ raw.extend(vec![10, 0, 0, 0]);
+ raw.extend(vec![0xEF, 0xCD, 0xAB, 0]);
+
+ //just some random bytes
+ let raw_content = vec![
+ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 123, 3, 234, 23, 234, 34, 23, 234, 34, 34, 234, 234,
+ ];
+ raw.extend(&raw_content);
+
+ let dict = Dictionary::decode_dict(&raw).unwrap();
+
+ if dict.id != dict_id {
+ panic!(
+ "Dict-id did not get parsed correctly. Is: {}, Should be: {}",
+ dict.id, dict_id
+ );
+ }
+
+ if !dict.dict_content.eq(&raw_content) {
+ panic!(
+ "dict content did not get parsed correctly. Is: {:?}, Should be: {:?}",
+ dict.dict_content, raw_content
+ );
+ }
+
+ if !dict.offset_hist.eq(&[3, 10, 0x00ABCDEF]) {
+ panic!(
+ "offset history did not get parsed correctly. Is: {:?}, Should be: {:?}",
+ dict.offset_hist,
+ [3, 10, 0x00ABCDEF]
+ );
+ }
+
+ // test magic num checking
+ raw[0] = 1;
+ raw[1] = 1;
+ raw[2] = 1;
+ raw[3] = 1;
+ match Dictionary::decode_dict(&raw) {
+ Ok(_) => panic!("The dict got decoded but the magic num was incorrect!"),
+ Err(_) => { /* This is what should happen*/ }
+ }
+}
+
+#[test]
+fn test_dict_decoding() {
+ use crate::frame_decoder;
+ use std::fs;
+ use std::io::Read;
+
+ let mut success_counter = 0;
+ let mut fail_counter_diff = 0;
+ let mut fail_counter_size = 0;
+ let mut fail_counter_bytes_read = 0;
+ let mut total_counter = 0;
+ let mut failed: Vec<String> = Vec::new();
+
+ let mut speeds = Vec::new();
+ let mut speeds_read = Vec::new();
+
+ let mut files: Vec<_> = fs::read_dir("./dict_tests/files").unwrap().collect();
+ let dict = fs::File::open("./dict_tests/dictionary").unwrap();
+ let dict: Vec<u8> = dict.bytes().map(|x| x.unwrap()).collect();
+
+ files.sort_by_key(|x| match x {
+ Err(_) => "".to_owned(),
+ Ok(entry) => entry.path().to_str().unwrap().to_owned(),
+ });
+
+ let mut frame_dec = frame_decoder::FrameDecoder::new();
+ frame_dec.add_dict(&dict).unwrap();
+
+ for file in files {
+ let f = file.unwrap();
+ let metadata = f.metadata().unwrap();
+ let file_size = metadata.len();
+
+ let p = String::from(f.path().to_str().unwrap());
+ if !p.ends_with(".zst") {
+ continue;
+ }
+ println!("Trying file: {}", p);
+
+ let mut content = fs::File::open(f.path()).unwrap();
+
+ frame_dec.reset(&mut content).unwrap();
+
+ let start_time = std::time::Instant::now();
+ /////DECODING
+ frame_dec
+ .decode_blocks(&mut content, frame_decoder::BlockDecodingStrategy::All)
+ .unwrap();
+ let result = frame_dec.collect().unwrap();
+ let end_time = start_time.elapsed();
+
+ match frame_dec.get_checksum_from_data() {
+ Some(chksum) => {
+ if frame_dec.get_calculated_checksum().unwrap() != chksum {
+ println!(
+ "Checksum did not match! From data: {}, calculated while decoding: {}\n",
+ chksum,
+ frame_dec.get_calculated_checksum().unwrap()
+ );
+ } else {
+ println!("Checksums are ok!\n");
+ }
+ }
+ None => println!("No checksums to test\n"),
+ }
+
+ let mut original_p = p.clone();
+ original_p.truncate(original_p.len() - 4);
+ let original_f = fs::File::open(original_p).unwrap();
+ let original: Vec<u8> = original_f.bytes().map(|x| x.unwrap()).collect();
+
+ println!("Results for file: {}", p.clone());
+ let mut success = true;
+
+ if original.len() != result.len() {
+ println!(
+ "Result has wrong length: {}, should be: {}",
+ result.len(),
+ original.len()
+ );
+ success = false;
+ fail_counter_size += 1;
+ }
+
+ if frame_dec.bytes_read_from_source() != file_size {
+ println!(
+ "Framedecoder counted wrong amount of bytes: {}, should be: {}",
+ frame_dec.bytes_read_from_source(),
+ file_size
+ );
+ success = false;
+ fail_counter_bytes_read += 1;
+ }
+
+ let mut counter = 0;
+ let min = if original.len() < result.len() {
+ original.len()
+ } else {
+ result.len()
+ };
+ for idx in 0..min {
+ if original[idx] != result[idx] {
+ counter += 1;
+ //println!(
+ // "Original {} not equal to result {} at byte: {}",
+ // original[idx], result[idx], idx,
+ //);
+ }
+ }
+
+ if counter > 0 {
+ println!("Result differs in at least {} bytes from original", counter);
+ success = false;
+ fail_counter_diff += 1;
+ }
+
+ if success {
+ success_counter += 1;
+ } else {
+ failed.push(p.clone().to_string());
+ }
+ total_counter += 1;
+
+ let dur = end_time.as_micros() as usize;
+ let speed = result.len() / if dur == 0 { 1 } else { dur };
+ let speed_read = file_size as usize / if dur == 0 { 1 } else { dur };
+ println!("SPEED: {}", speed);
+ println!("SPEED_read: {}", speed_read);
+ speeds.push(speed);
+ speeds_read.push(speed_read);
+ }
+
+ println!("###################");
+ println!("Summary:");
+ println!("###################");
+ println!(
+ "Total: {}, Success: {}, WrongSize: {}, WrongBytecount: {}, Diffs: {}",
+ total_counter,
+ success_counter,
+ fail_counter_size,
+ fail_counter_bytes_read,
+ fail_counter_diff
+ );
+ println!("Failed files: ");
+ for f in &failed {
+ println!("{}", f);
+ }
+
+ let speed_len = speeds.len();
+ let sum_speed: usize = speeds.into_iter().sum();
+ let avg_speed = sum_speed / speed_len;
+ let avg_speed_bps = avg_speed * 1_000_000;
+ if avg_speed_bps < 1000 {
+ println!("Average speed: {} B/s", avg_speed_bps);
+ } else if avg_speed_bps < 1_000_000 {
+ println!("Average speed: {} KB/s", avg_speed_bps / 1000);
+ } else {
+ println!("Average speed: {} MB/s", avg_speed_bps / 1_000_000);
+ }
+
+ let speed_read_len = speeds_read.len();
+ let sum_speed_read: usize = speeds_read.into_iter().sum();
+ let avg_speed_read = sum_speed_read / speed_read_len;
+ let avg_speed_read_bps = avg_speed_read * 1_000_000;
+ if avg_speed_read_bps < 1000 {
+ println!("Average speed reading: {} B/s", avg_speed_read_bps);
+ } else if avg_speed_bps < 1_000_000 {
+ println!("Average speed reading: {} KB/s", avg_speed_read_bps / 1000);
+ } else {
+ println!(
+ "Average speed reading: {} MB/s",
+ avg_speed_read_bps / 1_000_000
+ );
+ }
+
+ assert!(failed.is_empty());
+}