From c6c270cd282a788240ea98d1949b7006760a696e Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Fri, 17 Apr 2020 20:58:55 +0100 Subject: [PATCH] Update tests; expand verbose_mode test --- benches/deflate.rs | 180 +++++------------------------------------- src/deflate/cfzlib.rs | 2 +- tests/filters.rs | 1 - tests/flags.rs | 92 ++++++++++++++++++--- tests/interlaced.rs | 1 - tests/lib.rs | 18 ++--- tests/reduction.rs | 1 - tests/regression.rs | 1 - 8 files changed, 106 insertions(+), 190 deletions(-) diff --git a/benches/deflate.rs b/benches/deflate.rs index c1133bdc..29bfada9 100644 --- a/benches/deflate.rs +++ b/benches/deflate.rs @@ -16,14 +16,7 @@ fn deflate_16_bits_strategy_0(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 0, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 0, 15, &min, &Deadline::new(None)) }); } @@ -34,14 +27,7 @@ fn deflate_8_bits_strategy_0(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 0, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 0, 15, &min, &Deadline::new(None)) }); } @@ -54,14 +40,7 @@ fn deflate_4_bits_strategy_0(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 0, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 0, 15, &min, &Deadline::new(None)) }); } @@ -74,14 +53,7 @@ fn deflate_2_bits_strategy_0(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 0, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 0, 15, &min, &Deadline::new(None)) }); } @@ -94,14 +66,7 @@ fn deflate_1_bits_strategy_0(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 0, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 0, 15, &min, &Deadline::new(None)) }); } @@ -112,14 +77,7 @@ fn deflate_16_bits_strategy_1(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 1, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 1, 15, &min, &Deadline::new(None)) }); } @@ -130,14 +88,7 @@ fn deflate_8_bits_strategy_1(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 1, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 1, 15, &min, &Deadline::new(None)) }); } @@ -150,14 +101,7 @@ fn deflate_4_bits_strategy_1(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 1, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 1, 15, &min, &Deadline::new(None)) }); } @@ -170,14 +114,7 @@ fn deflate_2_bits_strategy_1(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 1, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 1, 15, &min, &Deadline::new(None)) }); } @@ -190,14 +127,7 @@ fn deflate_1_bits_strategy_1(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 1, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 1, 15, &min, &Deadline::new(None)) }); } @@ -208,14 +138,7 @@ fn deflate_16_bits_strategy_2(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 2, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 2, 15, &min, &Deadline::new(None)) }); } @@ -226,14 +149,7 @@ fn deflate_8_bits_strategy_2(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 2, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 2, 15, &min, &Deadline::new(None)) }); } @@ -246,14 +162,7 @@ fn deflate_4_bits_strategy_2(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 2, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 2, 15, &min, &Deadline::new(None)) }); } @@ -266,14 +175,7 @@ fn deflate_2_bits_strategy_2(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 2, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 2, 15, &min, &Deadline::new(None)) }); } @@ -286,14 +188,7 @@ fn deflate_1_bits_strategy_2(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 2, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 2, 15, &min, &Deadline::new(None)) }); } @@ -304,14 +199,7 @@ fn deflate_16_bits_strategy_3(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 3, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 3, 15, &min, &Deadline::new(None)) }); } @@ -322,14 +210,7 @@ fn deflate_8_bits_strategy_3(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 3, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 3, 15, &min, &Deadline::new(None)) }); } @@ -342,14 +223,7 @@ fn deflate_4_bits_strategy_3(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 3, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 3, 15, &min, &Deadline::new(None)) }); } @@ -362,14 +236,7 @@ fn deflate_2_bits_strategy_3(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 3, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 3, 15, &min, &Deadline::new(None)) }); } @@ -382,14 +249,7 @@ fn deflate_1_bits_strategy_3(b: &mut Bencher) { b.iter(|| { let min = AtomicMin::new(None); - deflate( - png.raw.data.as_ref(), - 9, - 3, - 15, - &min, - &Deadline::new(None, false), - ) + deflate(png.raw.data.as_ref(), 9, 3, 15, &min, &Deadline::new(None)) }); } diff --git a/src/deflate/cfzlib.rs b/src/deflate/cfzlib.rs index e2316f55..bad4da6f 100644 --- a/src/deflate/cfzlib.rs +++ b/src/deflate/cfzlib.rs @@ -46,7 +46,7 @@ fn compress_test() { Z_DEFAULT_STRATEGY as u8, 15, &AtomicMin::new(None), - &Deadline::new(None, false), + &Deadline::new(None), ) .unwrap(); let res = crate::deflate::inflate(&vec).unwrap(); diff --git a/tests/filters.rs b/tests/filters.rs index 41f92ca8..124baed4 100644 --- a/tests/filters.rs +++ b/tests/filters.rs @@ -7,7 +7,6 @@ use std::path::PathBuf; fn get_opts(input: &Path) -> (OutFile, oxipng::Options) { let mut options = oxipng::Options::default(); - options.verbosity = None; options.force = true; let mut filter = IndexSet::new(); filter.insert(0); diff --git a/tests/flags.rs b/tests/flags.rs index 42954193..649120ce 100644 --- a/tests/flags.rs +++ b/tests/flags.rs @@ -7,7 +7,6 @@ use std::path::PathBuf; fn get_opts(input: &Path) -> (OutFile, oxipng::Options) { let mut options = oxipng::Options::default(); - options.verbosity = None; options.force = true; let mut filter = IndexSet::new(); filter.insert(0); @@ -56,19 +55,86 @@ fn test_it_converts( #[test] fn verbose_mode() { - let input = PathBuf::from("tests/files/verbose_mode.png"); - let (output, mut opts) = get_opts(&input); - opts.verbosity = Some(1); + use log::{set_logger, set_max_level, Level, LevelFilter, Log, Metadata, Record}; + use std::cell::RefCell; + use std::sync::mpsc::{sync_channel, SyncSender}; - test_it_converts( - input, - &output, - &opts, - ColorType::RGB, - BitDepth::Eight, - ColorType::RGB, - BitDepth::Eight, - ); + // Rust runs tests in parallel by default. + // We want to make sure that we verify only logs from our test. + // + // For that, we store an Option in a thread-local variable and + // initialise it with Some(sender) only on threads spawned within + // our test. + thread_local! { + static VERBOSE_LOGS: RefCell>> = RefCell::new(None); + } + + struct LogTester; + + impl Log for LogTester { + fn enabled(&self, metadata: &Metadata) -> bool { + metadata.level() <= Level::Debug + } + + fn log(&self, record: &Record) { + if record.level() == Level::Debug { + VERBOSE_LOGS.with(|logs| { + // If current thread has a storage for logs, add our line. + // Otherwise our handler is invoked from an unrelated test. + if let Some(logs) = logs.borrow().as_ref() { + logs.send(record.args().to_string()).unwrap(); + } + }); + } + } + + fn flush(&self) {} + } + + set_logger(&LogTester).unwrap(); + set_max_level(LevelFilter::Debug); + + let input = PathBuf::from("tests/files/verbose_mode.png"); + let (output, opts) = get_opts(&input); + + let (sender, receiver) = sync_channel(4); + + let thread_init = move || { + // Initialise logs storage for all threads within our test. + VERBOSE_LOGS.with(|logs| *logs.borrow_mut() = Some(sender.clone())); + }; + let thread_exec = move || { + test_it_converts( + input, + &output, + &opts, + ColorType::RGB, + BitDepth::Eight, + ColorType::RGB, + BitDepth::Eight, + ); + }; + + #[cfg(feature = "rayon")] + rayon::ThreadPoolBuilder::new() + .start_handler(move |_| thread_init()) + .build() + .unwrap() + .install(move || rayon::spawn(thread_exec)); + + #[cfg(not(feature = "rayon"))] + std::thread::spawn(move || { + thread_init(); + thread_exec(); + }); + + let mut logs: Vec<_> = receiver.into_iter().collect(); + assert_eq!(logs.len(), 4); + logs.sort(); + for (i, log) in logs.into_iter().enumerate() { + let expected_prefix = format!(" zc = 9 zs = {} f = 0 ", i); + assert!(log.starts_with(&expected_prefix), "logs[{}] = {:?} doesn't start with {:?}", i, log, expected_prefix); + } } #[test] diff --git a/tests/interlaced.rs b/tests/interlaced.rs index 8bc93df1..b7f15afc 100644 --- a/tests/interlaced.rs +++ b/tests/interlaced.rs @@ -7,7 +7,6 @@ use std::path::PathBuf; fn get_opts(input: &Path) -> (OutFile, oxipng::Options) { let mut options = oxipng::Options::default(); - options.verbosity = None; options.force = true; let mut filter = IndexSet::new(); filter.insert(0); diff --git a/tests/lib.rs b/tests/lib.rs index a97cd27e..cce5520e 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -13,8 +13,7 @@ fn optimize_from_memory() { let mut in_file_buf: Vec = Vec::new(); in_file.read_to_end(&mut in_file_buf).unwrap(); - let mut opts: oxipng::Options = Default::default(); - opts.verbosity = Some(1); + let opts: oxipng::Options = Default::default(); let result = oxipng::optimize_from_memory(&in_file_buf, &opts); assert!(result.is_ok()); @@ -26,8 +25,7 @@ fn optimize_from_memory_corrupted() { let mut in_file_buf: Vec = Vec::new(); in_file.read_to_end(&mut in_file_buf).unwrap(); - let mut opts: oxipng::Options = Default::default(); - opts.verbosity = Some(1); + let opts: oxipng::Options = Default::default(); let result = oxipng::optimize_from_memory(&in_file_buf, &opts); assert!(result.is_err()); @@ -39,8 +37,7 @@ fn optimize_from_memory_apng() { let mut in_file_buf: Vec = Vec::new(); in_file.read_to_end(&mut in_file_buf).unwrap(); - let mut opts: oxipng::Options = Default::default(); - opts.verbosity = Some(1); + let opts: oxipng::Options = Default::default(); let result = oxipng::optimize_from_memory(&in_file_buf, &opts); assert!(result.is_err()); @@ -48,8 +45,7 @@ fn optimize_from_memory_apng() { #[test] fn optimize() { - let mut opts: oxipng::Options = Default::default(); - opts.verbosity = Some(1); + let opts: oxipng::Options = Default::default(); let result = oxipng::optimize( &"tests/files/fully_optimized.png".into(), @@ -61,8 +57,7 @@ fn optimize() { #[test] fn optimize_corrupted() { - let mut opts: oxipng::Options = Default::default(); - opts.verbosity = Some(1); + let opts: oxipng::Options = Default::default(); let result = oxipng::optimize( &"tests/files/corrupted_header.png".into(), @@ -74,8 +69,7 @@ fn optimize_corrupted() { #[test] fn optimize_apng() { - let mut opts: oxipng::Options = Default::default(); - opts.verbosity = Some(1); + let opts: oxipng::Options = Default::default(); let result = oxipng::optimize( &"tests/files/apng_file.png".into(), diff --git a/tests/reduction.rs b/tests/reduction.rs index a27cd2a0..1431c586 100644 --- a/tests/reduction.rs +++ b/tests/reduction.rs @@ -7,7 +7,6 @@ use std::path::PathBuf; fn get_opts(input: &Path) -> (OutFile, oxipng::Options) { let mut options = oxipng::Options::default(); - options.verbosity = None; options.force = true; let mut filter = IndexSet::new(); filter.insert(0); diff --git a/tests/regression.rs b/tests/regression.rs index 096fe8d8..2085741f 100644 --- a/tests/regression.rs +++ b/tests/regression.rs @@ -7,7 +7,6 @@ use std::path::PathBuf; fn get_opts(input: &Path) -> (OutFile, oxipng::Options) { let mut options = oxipng::Options::default(); - options.verbosity = None; options.force = true; let mut filter = IndexSet::new(); filter.insert(0);