summaryrefslogtreecommitdiff
path: root/src/libtest/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libtest/tests.rs')
-rw-r--r--src/libtest/tests.rs688
1 files changed, 0 insertions, 688 deletions
diff --git a/src/libtest/tests.rs b/src/libtest/tests.rs
deleted file mode 100644
index 85a0705f69c..00000000000
--- a/src/libtest/tests.rs
+++ /dev/null
@@ -1,688 +0,0 @@
-use super::*;
-
-use crate::{
- bench::Bencher,
- console::OutputLocation,
- formatters::PrettyFormatter,
- options::OutputFormat,
- test::{
- filter_tests,
- parse_opts,
- run_test,
- DynTestFn,
- DynTestName,
- MetricMap,
- RunIgnored,
- RunStrategy,
- ShouldPanic,
- StaticTestName,
- TestDesc,
- TestDescAndFn,
- TestOpts,
- TrIgnored,
- TrOk,
- // FIXME (introduced by #65251)
- // ShouldPanic, StaticTestName, TestDesc, TestDescAndFn, TestOpts, TestTimeOptions,
- // TestType, TrFailedMsg, TrIgnored, TrOk,
- },
- time::{TestTimeOptions, TimeThreshold},
-};
-use std::any::TypeId;
-use std::sync::mpsc::channel;
-use std::time::Duration;
-
-impl TestOpts {
- fn new() -> TestOpts {
- TestOpts {
- list: false,
- filter: None,
- filter_exact: false,
- force_run_in_process: false,
- exclude_should_panic: false,
- run_ignored: RunIgnored::No,
- run_tests: false,
- bench_benchmarks: false,
- logfile: None,
- nocapture: false,
- color: AutoColor,
- format: OutputFormat::Pretty,
- test_threads: None,
- skip: vec![],
- time_options: None,
- options: Options::new(),
- }
- }
-}
-
-fn one_ignored_one_unignored_test() -> Vec<TestDescAndFn> {
- vec![
- TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("1"),
- ignore: true,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(move || {})),
- },
- TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("2"),
- ignore: false,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(move || {})),
- },
- ]
-}
-
-#[test]
-pub fn do_not_run_ignored_tests() {
- fn f() {
- panic!();
- }
- let desc = TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("whatever"),
- ignore: true,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(f)),
- };
- let (tx, rx) = channel();
- run_test(&TestOpts::new(), false, desc, RunStrategy::InProcess, tx, Concurrent::No);
- let result = rx.recv().unwrap().result;
- assert_ne!(result, TrOk);
-}
-
-#[test]
-pub fn ignored_tests_result_in_ignored() {
- fn f() {}
- let desc = TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("whatever"),
- ignore: true,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(f)),
- };
- let (tx, rx) = channel();
- run_test(&TestOpts::new(), false, desc, RunStrategy::InProcess, tx, Concurrent::No);
- let result = rx.recv().unwrap().result;
- assert_eq!(result, TrIgnored);
-}
-
-// FIXME: Re-enable emscripten once it can catch panics again (introduced by #65251)
-#[test]
-#[cfg(not(target_os = "emscripten"))]
-fn test_should_panic() {
- fn f() {
- panic!();
- }
- let desc = TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("whatever"),
- ignore: false,
- should_panic: ShouldPanic::Yes,
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(f)),
- };
- let (tx, rx) = channel();
- run_test(&TestOpts::new(), false, desc, RunStrategy::InProcess, tx, Concurrent::No);
- let result = rx.recv().unwrap().result;
- assert_eq!(result, TrOk);
-}
-
-// FIXME: Re-enable emscripten once it can catch panics again (introduced by #65251)
-#[test]
-#[cfg(not(target_os = "emscripten"))]
-fn test_should_panic_good_message() {
- fn f() {
- panic!("an error message");
- }
- let desc = TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("whatever"),
- ignore: false,
- should_panic: ShouldPanic::YesWithMessage("error message"),
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(f)),
- };
- let (tx, rx) = channel();
- run_test(&TestOpts::new(), false, desc, RunStrategy::InProcess, tx, Concurrent::No);
- let result = rx.recv().unwrap().result;
- assert_eq!(result, TrOk);
-}
-
-// FIXME: Re-enable emscripten once it can catch panics again (introduced by #65251)
-#[test]
-#[cfg(not(target_os = "emscripten"))]
-fn test_should_panic_bad_message() {
- use crate::tests::TrFailedMsg;
- fn f() {
- panic!("an error message");
- }
- let expected = "foobar";
- let failed_msg = r#"panic did not contain expected string
- panic message: `"an error message"`,
- expected substring: `"foobar"`"#;
- let desc = TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("whatever"),
- ignore: false,
- should_panic: ShouldPanic::YesWithMessage(expected),
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(f)),
- };
- let (tx, rx) = channel();
- run_test(&TestOpts::new(), false, desc, RunStrategy::InProcess, tx, Concurrent::No);
- let result = rx.recv().unwrap().result;
- assert_eq!(result, TrFailedMsg(failed_msg.to_string()));
-}
-
-// FIXME: Re-enable emscripten once it can catch panics again (introduced by #65251)
-#[test]
-#[cfg(not(target_os = "emscripten"))]
-fn test_should_panic_non_string_message_type() {
- use crate::tests::TrFailedMsg;
- fn f() {
- panic!(1i32);
- }
- let expected = "foobar";
- let failed_msg = format!(
- r#"expected panic with string value,
- found non-string value: `{:?}`
- expected substring: `"foobar"`"#,
- TypeId::of::<i32>()
- );
- let desc = TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("whatever"),
- ignore: false,
- should_panic: ShouldPanic::YesWithMessage(expected),
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(f)),
- };
- let (tx, rx) = channel();
- run_test(&TestOpts::new(), false, desc, RunStrategy::InProcess, tx, Concurrent::No);
- let result = rx.recv().unwrap().result;
- assert_eq!(result, TrFailedMsg(failed_msg));
-}
-
-// FIXME: Re-enable emscripten once it can catch panics again (introduced by #65251)
-#[test]
-#[cfg(not(target_os = "emscripten"))]
-fn test_should_panic_but_succeeds() {
- fn f() {}
- let desc = TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("whatever"),
- ignore: false,
- should_panic: ShouldPanic::Yes,
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(f)),
- };
- let (tx, rx) = channel();
- run_test(&TestOpts::new(), false, desc, RunStrategy::InProcess, tx, Concurrent::No);
- let result = rx.recv().unwrap().result;
- assert_eq!(result, TrFailedMsg("test did not panic as expected".to_string()));
-}
-
-fn report_time_test_template(report_time: bool) -> Option<TestExecTime> {
- fn f() {}
- let desc = TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("whatever"),
- ignore: false,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(f)),
- };
- let time_options = if report_time { Some(TestTimeOptions::default()) } else { None };
-
- let test_opts = TestOpts { time_options, ..TestOpts::new() };
- let (tx, rx) = channel();
- run_test(&test_opts, false, desc, RunStrategy::InProcess, tx, Concurrent::No);
- let exec_time = rx.recv().unwrap().exec_time;
- exec_time
-}
-
-#[test]
-fn test_should_not_report_time() {
- let exec_time = report_time_test_template(false);
- assert!(exec_time.is_none());
-}
-
-#[test]
-fn test_should_report_time() {
- let exec_time = report_time_test_template(true);
- assert!(exec_time.is_some());
-}
-
-fn time_test_failure_template(test_type: TestType) -> TestResult {
- fn f() {}
- let desc = TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("whatever"),
- ignore: false,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type,
- },
- testfn: DynTestFn(Box::new(f)),
- };
- // `Default` will initialize all the thresholds to 0 milliseconds.
- let mut time_options = TestTimeOptions::default();
- time_options.error_on_excess = true;
-
- let test_opts = TestOpts { time_options: Some(time_options), ..TestOpts::new() };
- let (tx, rx) = channel();
- run_test(&test_opts, false, desc, RunStrategy::InProcess, tx, Concurrent::No);
- let result = rx.recv().unwrap().result;
-
- result
-}
-
-#[test]
-fn test_error_on_exceed() {
- let types = [TestType::UnitTest, TestType::IntegrationTest, TestType::DocTest];
-
- for test_type in types.iter() {
- let result = time_test_failure_template(*test_type);
-
- assert_eq!(result, TestResult::TrTimedFail);
- }
-
- // Check that for unknown tests thresholds aren't applied.
- let result = time_test_failure_template(TestType::Unknown);
- assert_eq!(result, TestResult::TrOk);
-}
-
-fn typed_test_desc(test_type: TestType) -> TestDesc {
- TestDesc {
- name: StaticTestName("whatever"),
- ignore: false,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type,
- }
-}
-
-fn test_exec_time(millis: u64) -> TestExecTime {
- TestExecTime(Duration::from_millis(millis))
-}
-
-#[test]
-fn test_time_options_threshold() {
- let unit = TimeThreshold::new(Duration::from_millis(50), Duration::from_millis(100));
- let integration = TimeThreshold::new(Duration::from_millis(500), Duration::from_millis(1000));
- let doc = TimeThreshold::new(Duration::from_millis(5000), Duration::from_millis(10000));
-
- let options = TestTimeOptions {
- error_on_excess: false,
- colored: false,
- unit_threshold: unit.clone(),
- integration_threshold: integration.clone(),
- doctest_threshold: doc.clone(),
- };
-
- let test_vector = [
- (TestType::UnitTest, unit.warn.as_millis() - 1, false, false),
- (TestType::UnitTest, unit.warn.as_millis(), true, false),
- (TestType::UnitTest, unit.critical.as_millis(), true, true),
- (TestType::IntegrationTest, integration.warn.as_millis() - 1, false, false),
- (TestType::IntegrationTest, integration.warn.as_millis(), true, false),
- (TestType::IntegrationTest, integration.critical.as_millis(), true, true),
- (TestType::DocTest, doc.warn.as_millis() - 1, false, false),
- (TestType::DocTest, doc.warn.as_millis(), true, false),
- (TestType::DocTest, doc.critical.as_millis(), true, true),
- ];
-
- for (test_type, time, expected_warn, expected_critical) in test_vector.iter() {
- let test_desc = typed_test_desc(*test_type);
- let exec_time = test_exec_time(*time as u64);
-
- assert_eq!(options.is_warn(&test_desc, &exec_time), *expected_warn);
- assert_eq!(options.is_critical(&test_desc, &exec_time), *expected_critical);
- }
-}
-
-#[test]
-fn parse_ignored_flag() {
- let args = vec!["progname".to_string(), "filter".to_string(), "--ignored".to_string()];
- let opts = parse_opts(&args).unwrap().unwrap();
- assert_eq!(opts.run_ignored, RunIgnored::Only);
-}
-
-#[test]
-fn parse_show_output_flag() {
- let args = vec!["progname".to_string(), "filter".to_string(), "--show-output".to_string()];
- let opts = parse_opts(&args).unwrap().unwrap();
- assert!(opts.options.display_output);
-}
-
-#[test]
-fn parse_include_ignored_flag() {
- let args = vec![
- "progname".to_string(),
- "filter".to_string(),
- "-Zunstable-options".to_string(),
- "--include-ignored".to_string(),
- ];
- let opts = parse_opts(&args).unwrap().unwrap();
- assert_eq!(opts.run_ignored, RunIgnored::Yes);
-}
-
-#[test]
-pub fn filter_for_ignored_option() {
- // When we run ignored tests the test filter should filter out all the
- // unignored tests and flip the ignore flag on the rest to false
-
- let mut opts = TestOpts::new();
- opts.run_tests = true;
- opts.run_ignored = RunIgnored::Only;
-
- let tests = one_ignored_one_unignored_test();
- let filtered = filter_tests(&opts, tests);
-
- assert_eq!(filtered.len(), 1);
- assert_eq!(filtered[0].desc.name.to_string(), "1");
- assert!(!filtered[0].desc.ignore);
-}
-
-#[test]
-pub fn run_include_ignored_option() {
- // When we "--include-ignored" tests, the ignore flag should be set to false on
- // all tests and no test filtered out
-
- let mut opts = TestOpts::new();
- opts.run_tests = true;
- opts.run_ignored = RunIgnored::Yes;
-
- let tests = one_ignored_one_unignored_test();
- let filtered = filter_tests(&opts, tests);
-
- assert_eq!(filtered.len(), 2);
- assert!(!filtered[0].desc.ignore);
- assert!(!filtered[1].desc.ignore);
-}
-
-#[test]
-pub fn exclude_should_panic_option() {
- let mut opts = TestOpts::new();
- opts.run_tests = true;
- opts.exclude_should_panic = true;
-
- let mut tests = one_ignored_one_unignored_test();
- tests.push(TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName("3"),
- ignore: false,
- should_panic: ShouldPanic::Yes,
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(move || {})),
- });
-
- let filtered = filter_tests(&opts, tests);
-
- assert_eq!(filtered.len(), 2);
- assert!(filtered.iter().all(|test| test.desc.should_panic == ShouldPanic::No));
-}
-
-#[test]
-pub fn exact_filter_match() {
- fn tests() -> Vec<TestDescAndFn> {
- vec!["base", "base::test", "base::test1", "base::test2"]
- .into_iter()
- .map(|name| TestDescAndFn {
- desc: TestDesc {
- name: StaticTestName(name),
- ignore: false,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(move || {})),
- })
- .collect()
- }
-
- let substr =
- filter_tests(&TestOpts { filter: Some("base".into()), ..TestOpts::new() }, tests());
- assert_eq!(substr.len(), 4);
-
- let substr = filter_tests(&TestOpts { filter: Some("bas".into()), ..TestOpts::new() }, tests());
- assert_eq!(substr.len(), 4);
-
- let substr =
- filter_tests(&TestOpts { filter: Some("::test".into()), ..TestOpts::new() }, tests());
- assert_eq!(substr.len(), 3);
-
- let substr =
- filter_tests(&TestOpts { filter: Some("base::test".into()), ..TestOpts::new() }, tests());
- assert_eq!(substr.len(), 3);
-
- let exact = filter_tests(
- &TestOpts { filter: Some("base".into()), filter_exact: true, ..TestOpts::new() },
- tests(),
- );
- assert_eq!(exact.len(), 1);
-
- let exact = filter_tests(
- &TestOpts { filter: Some("bas".into()), filter_exact: true, ..TestOpts::new() },
- tests(),
- );
- assert_eq!(exact.len(), 0);
-
- let exact = filter_tests(
- &TestOpts { filter: Some("::test".into()), filter_exact: true, ..TestOpts::new() },
- tests(),
- );
- assert_eq!(exact.len(), 0);
-
- let exact = filter_tests(
- &TestOpts { filter: Some("base::test".into()), filter_exact: true, ..TestOpts::new() },
- tests(),
- );
- assert_eq!(exact.len(), 1);
-}
-
-#[test]
-pub fn sort_tests() {
- let mut opts = TestOpts::new();
- opts.run_tests = true;
-
- let names = vec![
- "sha1::test".to_string(),
- "isize::test_to_str".to_string(),
- "isize::test_pow".to_string(),
- "test::do_not_run_ignored_tests".to_string(),
- "test::ignored_tests_result_in_ignored".to_string(),
- "test::first_free_arg_should_be_a_filter".to_string(),
- "test::parse_ignored_flag".to_string(),
- "test::parse_include_ignored_flag".to_string(),
- "test::filter_for_ignored_option".to_string(),
- "test::run_include_ignored_option".to_string(),
- "test::sort_tests".to_string(),
- ];
- let tests = {
- fn testfn() {}
- let mut tests = Vec::new();
- for name in &names {
- let test = TestDescAndFn {
- desc: TestDesc {
- name: DynTestName((*name).clone()),
- ignore: false,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type: TestType::Unknown,
- },
- testfn: DynTestFn(Box::new(testfn)),
- };
- tests.push(test);
- }
- tests
- };
- let filtered = filter_tests(&opts, tests);
-
- let expected = vec![
- "isize::test_pow".to_string(),
- "isize::test_to_str".to_string(),
- "sha1::test".to_string(),
- "test::do_not_run_ignored_tests".to_string(),
- "test::filter_for_ignored_option".to_string(),
- "test::first_free_arg_should_be_a_filter".to_string(),
- "test::ignored_tests_result_in_ignored".to_string(),
- "test::parse_ignored_flag".to_string(),
- "test::parse_include_ignored_flag".to_string(),
- "test::run_include_ignored_option".to_string(),
- "test::sort_tests".to_string(),
- ];
-
- for (a, b) in expected.iter().zip(filtered) {
- assert_eq!(*a, b.desc.name.to_string());
- }
-}
-
-#[test]
-pub fn test_metricmap_compare() {
- let mut m1 = MetricMap::new();
- let mut m2 = MetricMap::new();
- m1.insert_metric("in-both-noise", 1000.0, 200.0);
- m2.insert_metric("in-both-noise", 1100.0, 200.0);
-
- m1.insert_metric("in-first-noise", 1000.0, 2.0);
- m2.insert_metric("in-second-noise", 1000.0, 2.0);
-
- m1.insert_metric("in-both-want-downwards-but-regressed", 1000.0, 10.0);
- m2.insert_metric("in-both-want-downwards-but-regressed", 2000.0, 10.0);
-
- m1.insert_metric("in-both-want-downwards-and-improved", 2000.0, 10.0);
- m2.insert_metric("in-both-want-downwards-and-improved", 1000.0, 10.0);
-
- m1.insert_metric("in-both-want-upwards-but-regressed", 2000.0, -10.0);
- m2.insert_metric("in-both-want-upwards-but-regressed", 1000.0, -10.0);
-
- m1.insert_metric("in-both-want-upwards-and-improved", 1000.0, -10.0);
- m2.insert_metric("in-both-want-upwards-and-improved", 2000.0, -10.0);
-}
-
-#[test]
-pub fn test_bench_once_no_iter() {
- fn f(_: &mut Bencher) {}
- bench::run_once(f);
-}
-
-#[test]
-pub fn test_bench_once_iter() {
- fn f(b: &mut Bencher) {
- b.iter(|| {})
- }
- bench::run_once(f);
-}
-
-#[test]
-pub fn test_bench_no_iter() {
- fn f(_: &mut Bencher) {}
-
- let (tx, rx) = channel();
-
- let desc = TestDesc {
- name: StaticTestName("f"),
- ignore: false,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type: TestType::Unknown,
- };
-
- crate::bench::benchmark(desc, tx, true, f);
- rx.recv().unwrap();
-}
-
-#[test]
-pub fn test_bench_iter() {
- fn f(b: &mut Bencher) {
- b.iter(|| {})
- }
-
- let (tx, rx) = channel();
-
- let desc = TestDesc {
- name: StaticTestName("f"),
- ignore: false,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type: TestType::Unknown,
- };
-
- crate::bench::benchmark(desc, tx, true, f);
- rx.recv().unwrap();
-}
-
-#[test]
-fn should_sort_failures_before_printing_them() {
- let test_a = TestDesc {
- name: StaticTestName("a"),
- ignore: false,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type: TestType::Unknown,
- };
-
- let test_b = TestDesc {
- name: StaticTestName("b"),
- ignore: false,
- should_panic: ShouldPanic::No,
- allow_fail: false,
- test_type: TestType::Unknown,
- };
-
- let mut out = PrettyFormatter::new(OutputLocation::Raw(Vec::new()), false, 10, false, None);
-
- let st = console::ConsoleTestState {
- log_out: None,
- total: 0,
- passed: 0,
- failed: 0,
- ignored: 0,
- allowed_fail: 0,
- filtered_out: 0,
- measured: 0,
- metrics: MetricMap::new(),
- failures: vec![(test_b, Vec::new()), (test_a, Vec::new())],
- options: Options::new(),
- not_failures: Vec::new(),
- time_failures: Vec::new(),
- };
-
- out.write_failures(&st).unwrap();
- let s = match out.output_location() {
- &OutputLocation::Raw(ref m) => String::from_utf8_lossy(&m[..]),
- &OutputLocation::Pretty(_) => unreachable!(),
- };
-
- let apos = s.find("a").unwrap();
- let bpos = s.find("b").unwrap();
- assert!(apos < bpos);
-}