rust/tests/compiletest.rs

139 lines
4.5 KiB
Rust
Raw Normal View History

use colored::*;
use regex::Regex;
use std::env;
2019-12-23 05:56:23 -06:00
use std::path::PathBuf;
use ui_test::{Config, Mode, OutputConflictHandling};
fn miri_path() -> PathBuf {
PathBuf::from(option_env!("MIRI").unwrap_or(env!("CARGO_BIN_EXE_miri")))
}
2017-08-02 11:28:12 -05:00
fn run_tests(mode: Mode, path: &str, target: Option<String>) {
let in_rustc_test_suite = option_env!("RUSTC_STAGE").is_some();
2019-07-31 06:48:15 -05:00
// Add some flags we always want.
let mut flags = Vec::new();
flags.push("--edition".to_owned());
flags.push("2018".to_owned());
2019-08-21 02:07:27 -05:00
if in_rustc_test_suite {
// Less aggressive warnings to make the rustc toolstate management less painful.
// (We often get warnings when e.g. a feature gets stabilized or some lint gets added/improved.)
flags.push("-Astable-features".to_owned());
} else {
flags.push("-Dwarnings".to_owned());
flags.push("-Dunused".to_owned()); // overwrite the -Aunused in compiletest-rs
}
2020-10-22 03:36:01 -05:00
if let Ok(sysroot) = env::var("MIRI_SYSROOT") {
flags.push("--sysroot".to_string());
flags.push(sysroot);
}
2020-10-22 03:36:01 -05:00
if let Ok(extra_flags) = env::var("MIRIFLAGS") {
for flag in extra_flags.split_whitespace() {
flags.push(flag.to_string());
}
}
flags.push("-Zui-testing".to_string());
if let Some(target) = &target {
flags.push("--target".to_string());
flags.push(target.clone());
}
let skip_ui_checks = in_rustc_test_suite || env::var_os("MIRI_SKIP_UI_CHECKS").is_some();
let output_conflict_handling = match (env::var_os("MIRI_BLESS").is_some(), skip_ui_checks) {
(false, false) => OutputConflictHandling::Error,
(true, false) => OutputConflictHandling::Bless,
(false, true) => OutputConflictHandling::Ignore,
(true, true) => panic!("cannot use MIRI_BLESS and MIRI_SKIP_UI_CHECKS at the same time"),
};
2022-05-30 03:27:41 -05:00
// Pass on all arguments as filters.
let path_filter = std::env::args().skip(1);
2022-05-27 06:43:14 -05:00
let config = Config {
args: flags,
target,
stderr_filters: STDERR.clone(),
stdout_filters: STDOUT.clone(),
root_dir: PathBuf::from(path),
mode,
2022-05-30 03:27:41 -05:00
path_filter: path_filter.collect(),
program: miri_path(),
output_conflict_handling,
};
ui_test::run_tests(config)
}
macro_rules! regexes {
($name:ident: $($regex:expr => $replacement:expr,)*) => {lazy_static::lazy_static! {
static ref $name: Vec<(Regex, &'static str)> = vec![
$((Regex::new($regex).unwrap(), $replacement),)*
];
}};
}
regexes! {
STDOUT:
// Windows file paths
r"\\" => "/",
}
regexes! {
STDERR:
// erase line and column info
r"\.rs:[0-9]+:[0-9]+" => ".rs:LL:CC",
// erase alloc ids
"alloc[0-9]+" => "ALLOC",
// erase Stacked Borrows tags
"<[0-9]+>" => "<TAG>",
// erase whitespace that differs between platforms
r" +at (.*\.rs)" => " at $1",
// erase generics in backtraces
"([0-9]+: .*)::<.*>" => "$1",
// erase addresses in backtraces
"([0-9]+: ) +0x[0-9a-f]+ - (.*)" => "$1$2",
// erase long hexadecimals
r"0x[0-9a-fA-F]+[0-9a-fA-F]{2,2}" => "$$HEX",
// erase clocks
r"VClock\(\[[^\]]+\]\)" => "VClock",
// erase specific alignments
"alignment [0-9]+" => "alignment ALIGN",
// erase thread caller ids
r"\(call [0-9]+\)" => "(call ID)",
// erase platform module paths
"sys::[a-z]+::" => "sys::PLATFORM::",
// Windows file paths
r"\\" => "/",
// erase platform file paths
"sys/[a-z]+/" => "sys/PLATFORM/",
// erase error annotations in tests
r"\s*//~.*" => "",
}
fn ui(mode: Mode, path: &str) {
let target = get_target();
2022-05-25 11:12:54 -05:00
let msg = format!(
"## Running ui tests in {path} against miri for {}",
target.as_deref().unwrap_or("host")
);
eprintln!("{}", msg.green().bold());
run_tests(mode, path, target);
2017-07-19 14:52:20 -05:00
}
2017-02-07 05:32:39 -06:00
fn get_target() -> Option<String> {
env::var("MIRI_TEST_TARGET").ok()
}
2017-07-19 14:52:20 -05:00
fn main() {
// Add a test env var to do environment communication tests.
2020-10-22 03:36:01 -05:00
env::set_var("MIRI_ENV_VAR_TEST", "0");
// Let the tests know where to store temp files (they might run for a different target, which can make this hard to find).
2020-10-22 03:36:01 -05:00
env::set_var("MIRI_TEMP", env::temp_dir());
2019-08-13 12:10:24 -05:00
ui(Mode::Pass, "tests/run-pass");
ui(Mode::Panic, "tests/run-fail");
ui(Mode::Fail, "tests/compile-fail");
}