Skip to content

Commit

Permalink
Add new test_while_readonly helper function to run-make-support
Browse files Browse the repository at this point in the history
  • Loading branch information
Oneirical committed Jun 12, 2024
1 parent 7c2b3b5 commit 0e715f7
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 22 deletions.
22 changes: 22 additions & 0 deletions src/tools/run-make-support/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,28 @@ pub fn cwd() -> PathBuf {
env::current_dir().unwrap()
}

// FIXME(Oneirical): This will no longer be required after compiletest receives the ability
// to manipulate read-only files. See https://github.com/rust-lang/rust/issues/126334
/// Ensure that the path P is read-only while the test runs, and restore original permissions
/// at the end so compiletest can clean up.
#[track_caller]
pub fn test_while_readonly<P: AsRef<Path>, F: FnOnce() + std::panic::UnwindSafe>(
path: P,
closure: F,
) {
let path = path.as_ref();
let metadata = fs_wrapper::metadata(&path);
let original_perms = metadata.permissions();

let mut new_perms = original_perms.clone();
new_perms.set_readonly(true);
fs_wrapper::set_permissions(&path, new_perms);

assert!(std::panic::catch_unwind(closure).is_ok());

fs_wrapper::set_permissions(&path, original_perms);
}

/// Use `cygpath -w` on a path to get a Windows path string back. This assumes that `cygpath` is
/// available on the platform!
#[track_caller]
Expand Down
33 changes: 12 additions & 21 deletions tests/run-make/inaccessible-temp-dir/rmake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,32 +13,23 @@
// use a directory with non-existing parent like `/does-not-exist/output`.
// See https://github.com/rust-lang/rust/issues/66530

//@ only-linux
// Reason: set_mode is only available on Unix

//@ ignore-arm
// Reason: linker error on `armhf-gnu`

use run_make_support::{fs_wrapper, rustc};
use run_make_support::{fs_wrapper, rustc, test_while_readonly};

fn main() {
// Create an inaccessible directory.
fs_wrapper::create_dir("inaccessible");
let meta = fs_wrapper::metadata("inaccessible");
let mut perms = meta.permissions();
perms.set_mode(0o000); // Lock down the directory.
fs_wrapper::set_permissions("inaccessible", perms);

// Run rustc with `-Z temps-dir` set to a directory *inside* the inaccessible one,
// so that it can't create `tmp`.
rustc()
.input("program.rs")
.arg("-Ztemps-dir=inaccessible/tmp")
.run_fail()
.assert_stderr_contains(
"failed to find or create the directory specified by `--temps-dir`",
);

perms.set_mode(0o666); // Unlock the directory, so that compiletest can delete it.
fs_wrapper::set_permissions("inaccessible", perms);
test_while_readonly("inaccessible", || {
// Run rustc with `-Z temps-dir` set to a directory *inside* the inaccessible one,
// so that it can't create `tmp`.
rustc()
.input("program.rs")
.arg("-Ztemps-dir=inaccessible/tmp")
.run_fail()
.assert_stderr_contains(
"failed to find or create the directory specified by `--temps-dir`",
);
});
}
2 changes: 1 addition & 1 deletion tests/run-make/output-with-hyphens/rmake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

//@ ignore-cross-compile

use run_make_support::{path, rustc};
use run_make_support::{bin_name, path, rustc};

fn main() {
rustc().input("foo-bar.rs").crate_type("bin").run();
Expand Down

0 comments on commit 0e715f7

Please sign in to comment.