assert_stdout_contains_regex in run_make_support + variations
This commit is contained in:
parent
d5c073eb09
commit
1a15d90121
@ -3,7 +3,7 @@
|
|||||||
use std::panic;
|
use std::panic;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use crate::fs;
|
use crate::{fs, regex};
|
||||||
|
|
||||||
/// Assert that `actual` is equal to `expected`.
|
/// Assert that `actual` is equal to `expected`.
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
@ -47,6 +47,36 @@ pub fn assert_not_contains<H: AsRef<str>, N: AsRef<str>>(haystack: H, needle: N)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Assert that `haystack` contains the regex pattern `needle`.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_contains_regex<H: AsRef<str>, N: AsRef<str>>(haystack: H, needle: N) {
|
||||||
|
let haystack = haystack.as_ref();
|
||||||
|
let needle = needle.as_ref();
|
||||||
|
let re = regex::Regex::new(needle).unwrap();
|
||||||
|
if !re.is_match(haystack) {
|
||||||
|
eprintln!("=== HAYSTACK ===");
|
||||||
|
eprintln!("{}", haystack);
|
||||||
|
eprintln!("=== NEEDLE ===");
|
||||||
|
eprintln!("{}", needle);
|
||||||
|
panic!("needle was not found in haystack");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Assert that `haystack` does not contain the regex pattern `needle`.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_not_contains_regex<H: AsRef<str>, N: AsRef<str>>(haystack: H, needle: N) {
|
||||||
|
let haystack = haystack.as_ref();
|
||||||
|
let needle = needle.as_ref();
|
||||||
|
let re = regex::Regex::new(needle).unwrap();
|
||||||
|
if re.is_match(haystack) {
|
||||||
|
eprintln!("=== HAYSTACK ===");
|
||||||
|
eprintln!("{}", haystack);
|
||||||
|
eprintln!("=== NEEDLE ===");
|
||||||
|
eprintln!("{}", needle);
|
||||||
|
panic!("needle was unexpectedly found in haystack");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Assert that all files in `dir1` exist and have the same content in `dir2`
|
/// Assert that all files in `dir1` exist and have the same content in `dir2`
|
||||||
pub fn assert_dirs_are_equal(dir1: impl AsRef<Path>, dir2: impl AsRef<Path>) {
|
pub fn assert_dirs_are_equal(dir1: impl AsRef<Path>, dir2: impl AsRef<Path>) {
|
||||||
let dir2 = dir2.as_ref();
|
let dir2 = dir2.as_ref();
|
||||||
|
@ -6,7 +6,10 @@
|
|||||||
use std::process::{Command as StdCommand, ExitStatus, Output, Stdio};
|
use std::process::{Command as StdCommand, ExitStatus, Output, Stdio};
|
||||||
|
|
||||||
use crate::util::handle_failed_output;
|
use crate::util::handle_failed_output;
|
||||||
use crate::{assert_contains, assert_equals, assert_not_contains};
|
use crate::{
|
||||||
|
assert_contains, assert_contains_regex, assert_equals, assert_not_contains,
|
||||||
|
assert_not_contains_regex,
|
||||||
|
};
|
||||||
|
|
||||||
use build_helper::drop_bomb::DropBomb;
|
use build_helper::drop_bomb::DropBomb;
|
||||||
|
|
||||||
@ -192,6 +195,13 @@ pub fn assert_stdout_not_contains<S: AsRef<str>>(&self, unexpected: S) -> &Self
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Checks that `stdout` does not contain the regex pattern `unexpected`.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_stdout_not_contains_regex<S: AsRef<str>>(&self, unexpected: S) -> &Self {
|
||||||
|
assert_not_contains_regex(&self.stdout_utf8(), unexpected);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Checks that `stdout` contains `expected`.
|
/// Checks that `stdout` contains `expected`.
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn assert_stdout_contains<S: AsRef<str>>(&self, expected: S) -> &Self {
|
pub fn assert_stdout_contains<S: AsRef<str>>(&self, expected: S) -> &Self {
|
||||||
@ -199,6 +209,13 @@ pub fn assert_stdout_contains<S: AsRef<str>>(&self, expected: S) -> &Self {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Checks that `stdout` contains the regex pattern `expected`.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_stdout_contains_regex<S: AsRef<str>>(&self, expected: S) -> &Self {
|
||||||
|
assert_contains_regex(&self.stdout_utf8(), expected);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Checks that trimmed `stderr` matches trimmed `expected`.
|
/// Checks that trimmed `stderr` matches trimmed `expected`.
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn assert_stderr_equals<S: AsRef<str>>(&self, expected: S) -> &Self {
|
pub fn assert_stderr_equals<S: AsRef<str>>(&self, expected: S) -> &Self {
|
||||||
@ -213,6 +230,13 @@ pub fn assert_stderr_contains<S: AsRef<str>>(&self, expected: S) -> &Self {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Checks that `stderr` contains the regex pattern `expected`.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_stderr_contains_regex<S: AsRef<str>>(&self, expected: S) -> &Self {
|
||||||
|
assert_contains_regex(&self.stderr_utf8(), expected);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Checks that `stderr` does not contain `unexpected`.
|
/// Checks that `stderr` does not contain `unexpected`.
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn assert_stderr_not_contains<S: AsRef<str>>(&self, unexpected: S) -> &Self {
|
pub fn assert_stderr_not_contains<S: AsRef<str>>(&self, unexpected: S) -> &Self {
|
||||||
@ -220,6 +244,13 @@ pub fn assert_stderr_not_contains<S: AsRef<str>>(&self, unexpected: S) -> &Self
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Checks that `stderr` does not contain the regex pattern `unexpected`.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_stderr_not_contains_regex<S: AsRef<str>>(&self, unexpected: S) -> &Self {
|
||||||
|
assert_not_contains_regex(&self.stdout_utf8(), unexpected);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn assert_exit_code(&self, code: i32) -> &Self {
|
pub fn assert_exit_code(&self, code: i32) -> &Self {
|
||||||
assert!(self.output.status.code() == Some(code));
|
assert!(self.output.status.code() == Some(code));
|
||||||
|
@ -36,6 +36,12 @@ pub fn llvm_ar() -> LlvmAr {
|
|||||||
LlvmAr::new()
|
LlvmAr::new()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Construct a new `llvm-nm` invocation. This assumes that `llvm-nm` is available
|
||||||
|
/// at `$LLVM_BIN_DIR/llvm-nm`.
|
||||||
|
pub fn llvm_nm() -> LlvmNm {
|
||||||
|
LlvmNm::new()
|
||||||
|
}
|
||||||
|
|
||||||
/// A `llvm-readobj` invocation builder.
|
/// A `llvm-readobj` invocation builder.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[must_use]
|
#[must_use]
|
||||||
@ -71,11 +77,19 @@ pub struct LlvmAr {
|
|||||||
cmd: Command,
|
cmd: Command,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A `llvm-nm` invocation builder.
|
||||||
|
#[derive(Debug)]
|
||||||
|
#[must_use]
|
||||||
|
pub struct LlvmNm {
|
||||||
|
cmd: Command,
|
||||||
|
}
|
||||||
|
|
||||||
crate::macros::impl_common_helpers!(LlvmReadobj);
|
crate::macros::impl_common_helpers!(LlvmReadobj);
|
||||||
crate::macros::impl_common_helpers!(LlvmProfdata);
|
crate::macros::impl_common_helpers!(LlvmProfdata);
|
||||||
crate::macros::impl_common_helpers!(LlvmFilecheck);
|
crate::macros::impl_common_helpers!(LlvmFilecheck);
|
||||||
crate::macros::impl_common_helpers!(LlvmObjdump);
|
crate::macros::impl_common_helpers!(LlvmObjdump);
|
||||||
crate::macros::impl_common_helpers!(LlvmAr);
|
crate::macros::impl_common_helpers!(LlvmAr);
|
||||||
|
crate::macros::impl_common_helpers!(LlvmNm);
|
||||||
|
|
||||||
/// Generate the path to the bin directory of LLVM.
|
/// Generate the path to the bin directory of LLVM.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
@ -244,3 +258,19 @@ pub fn output_input(&mut self, out: impl AsRef<Path>, input: impl AsRef<Path>) -
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl LlvmNm {
|
||||||
|
/// Construct a new `llvm-nm` invocation. This assumes that `llvm-nm` is available
|
||||||
|
/// at `$LLVM_BIN_DIR/llvm-nm`.
|
||||||
|
pub fn new() -> Self {
|
||||||
|
let llvm_nm = llvm_bin_dir().join("llvm-nm");
|
||||||
|
let cmd = Command::new(llvm_nm);
|
||||||
|
Self { cmd }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Provide an input file.
|
||||||
|
pub fn input<P: AsRef<Path>>(&mut self, path: P) -> &mut Self {
|
||||||
|
self.cmd.arg(path.as_ref());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -48,8 +48,8 @@ pub mod rfs {
|
|||||||
pub use clang::{clang, Clang};
|
pub use clang::{clang, Clang};
|
||||||
pub use htmldocck::htmldocck;
|
pub use htmldocck::htmldocck;
|
||||||
pub use llvm::{
|
pub use llvm::{
|
||||||
llvm_ar, llvm_filecheck, llvm_objdump, llvm_profdata, llvm_readobj, LlvmAr, LlvmFilecheck,
|
llvm_ar, llvm_filecheck, llvm_nm, llvm_objdump, llvm_profdata, llvm_readobj, LlvmAr,
|
||||||
LlvmObjdump, LlvmProfdata, LlvmReadobj,
|
LlvmFilecheck, LlvmNm, LlvmObjdump, LlvmProfdata, LlvmReadobj,
|
||||||
};
|
};
|
||||||
pub use python::python_command;
|
pub use python::python_command;
|
||||||
pub use rustc::{aux_build, bare_rustc, rustc, Rustc};
|
pub use rustc::{aux_build, bare_rustc, rustc, Rustc};
|
||||||
@ -84,7 +84,8 @@ pub mod rfs {
|
|||||||
pub use scoped_run::{run_in_tmpdir, test_while_readonly};
|
pub use scoped_run::{run_in_tmpdir, test_while_readonly};
|
||||||
|
|
||||||
pub use assertion_helpers::{
|
pub use assertion_helpers::{
|
||||||
assert_contains, assert_dirs_are_equal, assert_equals, assert_not_contains,
|
assert_contains, assert_contains_regex, assert_dirs_are_equal, assert_equals,
|
||||||
|
assert_not_contains, assert_not_contains_regex,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub use string::{
|
pub use string::{
|
||||||
|
@ -4,18 +4,14 @@
|
|||||||
// in rustc flags without a compilation failure or the removal of expected symbols.
|
// in rustc flags without a compilation failure or the removal of expected symbols.
|
||||||
// See https://github.com/rust-lang/rust/pull/100101
|
// See https://github.com/rust-lang/rust/pull/100101
|
||||||
|
|
||||||
//FIXME(Oneirical): try it on test-various
|
use run_make_support::{llvm_ar, llvm_nm, rfs, rust_lib_name, rustc};
|
||||||
|
|
||||||
use run_make_support::{llvm_ar, llvm_readobj, regex, rfs, rust_lib_name, rustc};
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// Build a strangely named dependency.
|
// Build a strangely named dependency.
|
||||||
rustc().input("native_dep.rs").crate_type("staticlib").output("native_dep.ext").run();
|
rustc().input("native_dep.rs").crate_type("staticlib").output("native_dep.ext").run();
|
||||||
|
|
||||||
rustc().input("rust_dep.rs").crate_type("rlib").arg("-Zpacked_bundled_libs").run();
|
rustc().input("rust_dep.rs").crate_type("rlib").arg("-Zpacked_bundled_libs").run();
|
||||||
let symbols = llvm_readobj().symbols().input(rust_lib_name("rust_dep")).run().stdout_utf8();
|
llvm_nm().input(rust_lib_name("rust_dep")).run().assert_stdout_contains_regex("U.*native_f1");
|
||||||
let re = regex::Regex::new("U.*native_f1").unwrap();
|
|
||||||
assert!(re.is_match(&symbols));
|
|
||||||
llvm_ar()
|
llvm_ar()
|
||||||
.arg("t")
|
.arg("t")
|
||||||
.arg(rust_lib_name("rust_dep"))
|
.arg(rust_lib_name("rust_dep"))
|
||||||
|
Loading…
Reference in New Issue
Block a user