Rewrite and rename issue-26092 to rmake

This commit is contained in:
Oneirical
2024-05-24 11:50:35 -04:00
parent 5f44f9511d
commit 6228b3e40e
10 changed files with 83 additions and 67 deletions
+29 -15
View File
@@ -6,7 +6,7 @@
use std::process::{Command as StdCommand, ExitStatus, Output, Stdio};
use crate::drop_bomb::DropBomb;
use crate::{assert_contains, assert_not_contains, handle_failed_output};
use crate::{assert_contains, assert_equals, assert_not_contains, handle_failed_output};
/// This is a custom command wrapper that simplifies working with commands and makes it easier to
/// ensure that we check the exit status of executed processes.
@@ -21,6 +21,7 @@
///
/// [`run`]: Self::run
/// [`run_fail`]: Self::run_fail
/// [`run_unchecked`]: Self::run_unchecked
#[derive(Debug)]
pub struct Command {
cmd: StdCommand,
@@ -116,6 +117,15 @@ pub fn run_fail(&mut self) -> CompletedProcess {
output
}
/// Run the command but do not check its exit status.
/// Only use if you explicitly don't care about the exit status.
/// Prefer to use [`Self::run`] and [`Self::run_fail`]
/// whenever possible.
#[track_caller]
pub fn run_unchecked(&mut self) -> CompletedProcess {
self.command_output()
}
#[track_caller]
fn command_output(&mut self) -> CompletedProcess {
self.drop_bomb.defuse();
@@ -163,41 +173,45 @@ pub fn status(&self) -> ExitStatus {
self.output.status
}
/// Checks that trimmed `stdout` matches trimmed `content`.
/// Checks that trimmed `stdout` matches trimmed `expected`.
#[track_caller]
pub fn assert_stdout_equals<S: AsRef<str>>(&self, content: S) -> &Self {
assert_eq!(self.stdout_utf8().trim(), content.as_ref().trim());
pub fn assert_stdout_equals<S: AsRef<str>>(&self, expected: S) -> &Self {
assert_equals(self.stdout_utf8().trim(), expected.as_ref().trim());
self
}
/// Checks that `stdout` does not contain `unexpected`.
#[track_caller]
pub fn assert_stdout_contains<S: AsRef<str>>(self, needle: S) -> Self {
assert_contains(&self.stdout_utf8(), needle.as_ref());
pub fn assert_stdout_not_contains<S: AsRef<str>>(&self, unexpected: S) -> &Self {
assert_not_contains(&self.stdout_utf8(), unexpected.as_ref());
self
}
/// Checks that `stdout` contains `expected`.
#[track_caller]
pub fn assert_stdout_not_contains<S: AsRef<str>>(&self, needle: S) -> &Self {
assert_not_contains(&self.stdout_utf8(), needle.as_ref());
pub fn assert_stdout_contains<S: AsRef<str>>(&self, expected: S) -> &Self {
assert_contains(&self.stdout_utf8(), expected.as_ref());
self
}
/// Checks that trimmed `stderr` matches trimmed `content`.
/// Checks that trimmed `stderr` matches trimmed `expected`.
#[track_caller]
pub fn assert_stderr_equals<S: AsRef<str>>(&self, content: S) -> &Self {
assert_eq!(self.stderr_utf8().trim(), content.as_ref().trim());
pub fn assert_stderr_equals<S: AsRef<str>>(&self, expected: S) -> &Self {
assert_equals(self.stderr_utf8().trim(), expected.as_ref().trim());
self
}
/// Checks that `stderr` contains `expected`.
#[track_caller]
pub fn assert_stderr_contains<S: AsRef<str>>(&self, needle: S) -> &Self {
assert_contains(&self.stderr_utf8(), needle.as_ref());
pub fn assert_stderr_contains<S: AsRef<str>>(&self, expected: S) -> &Self {
assert_contains(&self.stderr_utf8(), expected.as_ref());
self
}
/// Checks that `stderr` does not contain `unexpected`.
#[track_caller]
pub fn assert_stderr_not_contains<S: AsRef<str>>(&self, needle: S) -> &Self {
assert_not_contains(&self.stdout_utf8(), needle.as_ref());
pub fn assert_stderr_not_contains<S: AsRef<str>>(&self, unexpected: S) -> &Self {
assert_not_contains(&self.stdout_utf8(), unexpected.as_ref());
self
}
+21
View File
@@ -332,6 +332,18 @@ pub fn read_dir<F: Fn(&Path)>(dir: impl AsRef<Path>, callback: F) {
}
}
/// Check that `actual` is equal to `expected`. Panic otherwise.
#[track_caller]
pub fn assert_equals(actual: &str, expected: &str) {
if actual != expected {
eprintln!("=== ACTUAL TEXT ===");
eprintln!("{}", actual);
eprintln!("=== EXPECTED ===");
eprintln!("{}", expected);
panic!("expected text was not found in actual text");
}
}
/// Check that `haystack` contains `needle`. Panic otherwise.
#[track_caller]
pub fn assert_contains(haystack: &str, needle: &str) {
@@ -468,6 +480,15 @@ pub fn run_fail(&mut self) -> crate::command::CompletedProcess {
self.cmd.run_fail()
}
/// Run the command but do not check its exit status.
/// Only use if you explicitly don't care about the exit status.
/// Prefer to use [`Self::run`] and [`Self::run_fail`]
/// whenever possible.
#[track_caller]
pub fn run_unchecked(&mut self) -> crate::command::CompletedProcess {
self.cmd.run_unchecked()
}
/// Set the path where the command will be run.
pub fn current_dir<P: AsRef<::std::path::Path>>(&mut self, path: P) -> &mut Self {
self.cmd.current_dir(path);
@@ -83,7 +83,6 @@ run-make/issue-20626/Makefile
run-make/issue-22131/Makefile
run-make/issue-25581/Makefile
run-make/issue-26006/Makefile
run-make/issue-26092/Makefile
run-make/issue-28595/Makefile
run-make/issue-33329/Makefile
run-make/issue-35164/Makefile
@@ -12,7 +12,6 @@ fn main() {
let output =
rustc().input("main.rs").emit("metadata").extern_("stable", "libstable.rmeta").run();
let version = fs_wrapper::read_to_string(source_root().join("src/version"));
let expected_string = format!("stable since {}", version.trim());
output.assert_stderr_contains(expected_string);
@@ -0,0 +1,13 @@
// When an empty output file is passed to rustc, the ensuing error message
// should be clear. However, calling file_stem on an empty path returns None,
// which, when unwrapped, causes a panic, stopping execution of rustc
// and printing an obscure message instead of reaching the helpful
// error message. This test checks that the panic does not occur.
// See https://github.com/rust-lang/rust/pull/26199
use run_make_support::rustc;
fn main() {
let output = rustc().output("").stdin(b"fn main() {}").run_fail();
output.assert_stderr_not_contains("panic");
}
-6
View File
@@ -1,6 +0,0 @@
include ../tools.mk
# This test ensures that rustc does not panic with `-o ""` option.
all:
$(RUSTC) -o "" blank.rs 2>&1 | $(CGREP) -i 'panic' && exit 1 || exit 0
+10 -14
View File
@@ -7,18 +7,14 @@
use run_make_support::rustc;
fn main() {
let output = String::from_utf8(
rustc()
.input("empty.rs")
.link_arg("-lfoo")
.link_arg("-lbar")
.print("link-args")
.command_output()
.stdout,
)
.unwrap();
assert!(
output.contains("lfoo") || output.contains("lbar"),
"The output did not contain the expected \"lfoo\" or \"lbar\" strings."
);
// We are only checking for the output of --print=link-args,
// rustc failing or succeeding does not matter.
let out = rustc()
.input("empty.rs")
.link_arg("-lfoo")
.link_arg("-lbar")
.print("link-args")
.run_unchecked();
out.assert_stdout_contains("lfoo");
out.assert_stdout_contains("lbar");
}
-12
View File
@@ -1,12 +0,0 @@
# ignore-msvc
include ../tools.mk
all:
$(RUSTC) depa.rs
$(RUSTC) depb.rs
$(RUSTC) depc.rs
$(RUSTC) empty.rs --cfg bar 2>&1 | $(CGREP) '"-ltesta" "-ltestb" "-ltesta"'
$(RUSTC) empty.rs 2>&1 | $(CGREP) '"-ltesta"'
$(RUSTC) empty.rs 2>&1 | $(CGREP) -v '"-ltestb"'
$(RUSTC) empty.rs 2>&1 | $(CGREP) -v '"-ltesta" "-ltesta" "-ltesta"'
+10 -18
View File
@@ -7,26 +7,18 @@
//@ ignore-msvc
use run_make_support::rustc;
fn main() {
rustc().input("depa.rs").run();
rustc().input("depb.rs").run();
rustc().input("depc.rs").run();
let output =
String::from_utf8(rustc().input("empty.rs").cfg("bar").command_output().stderr).unwrap();
let pos_a1 =
output.find("-ltesta").expect("empty.rs, compiled with --cfg, should contain -ltesta");
let pos_b = output[pos_a1..]
.find("-ltestb")
.map(|pos| pos + pos_a1)
.expect("empty.rs, compiled with --cfg, should contain -ltestb");
let _ = output[pos_b..]
.find("-ltesta")
.map(|pos| pos + pos_b)
.expect("empty.rs, compiled with --cfg, should contain a second -ltesta");
let output = String::from_utf8(rustc().input("empty.rs").command_output().stderr).unwrap();
assert!(output.contains("-ltesta"));
let output = String::from_utf8(rustc().input("empty.rs").command_output().stderr).unwrap();
assert!(!output.contains("-ltestb"));
let output = String::from_utf8(rustc().input("empty.rs").command_output().stderr).unwrap();
assert_eq!(output.matches("-ltesta").count, 1);
let output = rustc().input("empty.rs").cfg("bar").run_fail();
output.assert_stderr_contains(r#""-ltesta" "-ltestb" "-ltesta""#);
let output = rustc().input("empty.rs").run_fail();
output.assert_stderr_contains(r#""-ltesta""#);
let output = rustc().input("empty.rs").run_fail();
output.assert_stderr_not_contains(r#""-ltestb""#);
let output = rustc().input("empty.rs").run_fail();
output.assert_stderr_not_contains(r#""-ltesta" "-ltesta" "-ltesta""#);
}