diff --git a/src/librustdoc/doctest.rs b/src/librustdoc/doctest.rs index 35b2af5370fff..bc6bfc27b7ba0 100644 --- a/src/librustdoc/doctest.rs +++ b/src/librustdoc/doctest.rs @@ -575,7 +575,7 @@ pub(crate) struct RunnableDocTest<'a> { /// In a standalone test this is just the regular test code. full_test_code: String, full_test_line_offset: usize, - test_opts: &'a IndividualTestOptions, + test_opts: IndividualTestOptions, global_opts: &'a GlobalTestOptions, langstr: LangString, line: usize, @@ -1143,8 +1143,6 @@ fn generate_test_desc_and_fn( unused_externs: Arc>>, ) -> test::TestDescAndFn { let target_str = rustdoc_options.target.to_string(); - let rustdoc_test_options = - IndividualTestOptions::new(&rustdoc_options, &test.test_id, scraped_test.local_path()); debug!("creating test {}: {}", scraped_test.name, scraped_test.text); test::TestDescAndFn { @@ -1168,8 +1166,13 @@ fn generate_test_desc_and_fn( test_type: test::TestType::DocTest, }, testfn: test::DynTestFn(Arc::new(move || { + let rustdoc_test_options = IndividualTestOptions::new( + &rustdoc_options, + &test.test_id, + scraped_test.local_path(), + ); doctest_run_fn( - &rustdoc_test_options, + rustdoc_test_options, &opts, &test, &scraped_test, @@ -1181,7 +1184,7 @@ fn generate_test_desc_and_fn( } fn doctest_run_fn( - test_opts: &IndividualTestOptions, + test_opts: IndividualTestOptions, global_opts: &GlobalTestOptions, doctest: &DocTestBuilder, scraped_test: &ScrapedDocTest, diff --git a/src/librustdoc/doctest/runner.rs b/src/librustdoc/doctest/runner.rs index 3e4b4209f4145..d1d149b72ac4e 100644 --- a/src/librustdoc/doctest/runner.rs +++ b/src/librustdoc/doctest/runner.rs @@ -198,7 +198,7 @@ test::test_main(test_args, tests) let runnable_test = RunnableDocTest { full_test_code: format!("{code_prefix}{code}", code = self.output), full_test_line_offset: 0, - test_opts: &test_options, + test_opts: test_options, global_opts: opts, langstr: LangString::default(), line: 0, diff --git a/tests/run-make/rustdoc-doctest-tempdir-cleanup/lib.rs b/tests/run-make/rustdoc-doctest-tempdir-cleanup/lib.rs new file mode 100644 index 0000000000000..a8585bd0bd082 --- /dev/null +++ b/tests/run-make/rustdoc-doctest-tempdir-cleanup/lib.rs @@ -0,0 +1,18 @@ +/// ``` +/// assert!(true); +/// ``` +pub fn a() {} + +/// ``` +/// let count = std::fs::read_dir(std::env::temp_dir()) +/// .unwrap() +/// .filter(|entry| { +/// entry.as_ref().unwrap().file_name().to_str().unwrap().starts_with("rustdoctest") +/// }) +/// .count(); +/// // It's 2 and not one because rustdoc creates a temp dir where it puts the `rustdoc-cfgs` +/// // file which contains the list of flags to be passed down to the doctests. It lives +/// // until all doctests have been run. +/// assert_eq!(count, 2); +/// ``` +pub fn b() {} diff --git a/tests/run-make/rustdoc-doctest-tempdir-cleanup/rmake.rs b/tests/run-make/rustdoc-doctest-tempdir-cleanup/rmake.rs new file mode 100644 index 0000000000000..789002533833c --- /dev/null +++ b/tests/run-make/rustdoc-doctest-tempdir-cleanup/rmake.rs @@ -0,0 +1,23 @@ +// This test ensures that a temporary doctest directory is removed as soon as the doctest +// was run to prevent "No space left on device". To ensure it works, we use a file with two +// doctests, run without the "merged doctests" feature (hence the "2021" edition) with +// one thread to prevent potential concurrent cleanups. +// Regression test for . + +//@ ignore-cross-compile +//@ only-linux + +use run_make_support::{is_windows, path, rfs, rustdoc}; + +fn main() { + let tmp = path("tmp"); + rfs::create_dir(&tmp); + + let mut cmd = rustdoc() + .env("TMPDIR", &tmp) + .input("lib.rs") + .edition("2021") + .arg("--test") + .arg("--test-args=--test-threads=1") + .run(); +} diff --git a/tests/rustdoc-ui/issues/issue-98690.rs b/tests/rustdoc-ui/issues/issue-98690.rs index 01708f3f64d3e..1c7eb844a272a 100644 --- a/tests/rustdoc-ui/issues/issue-98690.rs +++ b/tests/rustdoc-ui/issues/issue-98690.rs @@ -1,6 +1,8 @@ //@ compile-flags: --test --persist-doctests /../../ -Z unstable-options //@ failure-status: 101 //@ only-linux +//@ normalize-stdout: "finished in \d+\.\d+s" -> "finished in $$TIME" +//@ normalize-stdout: ".rs:\d+:\d+" -> ".rs:$$LINE:$$COL" #![crate_name = "foo"] diff --git a/tests/rustdoc-ui/issues/issue-98690.stderr b/tests/rustdoc-ui/issues/issue-98690.stderr deleted file mode 100644 index 47d94f99a4563..0000000000000 --- a/tests/rustdoc-ui/issues/issue-98690.stderr +++ /dev/null @@ -1 +0,0 @@ -Couldn't create directory for doctest executables: Permission denied (os error 13) diff --git a/tests/rustdoc-ui/issues/issue-98690.stdout b/tests/rustdoc-ui/issues/issue-98690.stdout new file mode 100644 index 0000000000000..970583175f18b --- /dev/null +++ b/tests/rustdoc-ui/issues/issue-98690.stdout @@ -0,0 +1,15 @@ + +running 1 test +test $DIR/issue-98690.rs - (line 9) ... FAILED + +failures: + +---- $DIR/issue-98690.rs - (line 9) stdout ---- +Couldn't create directory for doctest executables: Permission denied (os error 13) + + +failures: + $DIR/issue-98690.rs - (line 9) + +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME +