2016-04-22 03:34:14 -05:00
|
|
|
extern crate compiletest_rs as compiletest;
|
|
|
|
|
2016-06-15 06:18:35 -05:00
|
|
|
use std::path::{PathBuf, Path};
|
|
|
|
use std::io::Write;
|
2016-04-22 03:34:14 -05:00
|
|
|
|
2016-06-17 08:21:01 -05:00
|
|
|
fn compile_fail(sysroot: &str) {
|
2016-06-14 04:54:28 -05:00
|
|
|
let flags = format!("--sysroot {} -Dwarnings", sysroot);
|
2016-06-15 06:18:35 -05:00
|
|
|
for_all_targets(sysroot, |target| {
|
2016-05-31 05:05:25 -05:00
|
|
|
let mut config = compiletest::default_config();
|
2016-06-14 04:54:28 -05:00
|
|
|
config.host_rustcflags = Some(flags.clone());
|
2016-06-17 08:21:01 -05:00
|
|
|
config.mode = "compile-fail".parse().expect("Invalid mode");
|
2016-06-15 06:18:35 -05:00
|
|
|
config.run_lib_path = Path::new(sysroot).join("lib").join("rustlib").join(&target).join("lib");
|
2016-05-31 05:05:25 -05:00
|
|
|
config.rustc_path = "target/debug/miri".into();
|
2016-06-17 08:21:01 -05:00
|
|
|
config.src_base = PathBuf::from("tests/compile-fail".to_string());
|
2016-05-31 05:05:25 -05:00
|
|
|
config.target = target.to_owned();
|
2016-06-14 04:54:28 -05:00
|
|
|
config.target_rustcflags = Some(flags.clone());
|
2016-05-31 05:05:25 -05:00
|
|
|
compiletest::run_tests(&config);
|
2016-06-15 06:18:35 -05:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-06-17 08:21:01 -05:00
|
|
|
fn run_pass() {
|
|
|
|
let mut config = compiletest::default_config();
|
|
|
|
config.mode = "run-pass".parse().expect("Invalid mode");
|
|
|
|
config.src_base = PathBuf::from("tests/run-pass".to_string());
|
2016-09-15 09:12:36 -05:00
|
|
|
config.target_rustcflags = Some("-Dwarnings".to_string());
|
|
|
|
config.host_rustcflags = Some("-Dwarnings".to_string());
|
2016-06-17 08:21:01 -05:00
|
|
|
compiletest::run_tests(&config);
|
|
|
|
}
|
|
|
|
|
2016-06-16 03:54:10 -05:00
|
|
|
fn for_all_targets<F: FnMut(String)>(sysroot: &str, mut f: F) {
|
2016-06-15 06:18:35 -05:00
|
|
|
for target in std::fs::read_dir(format!("{}/lib/rustlib/", sysroot)).unwrap() {
|
|
|
|
let target = target.unwrap();
|
|
|
|
if !target.metadata().unwrap().is_dir() {
|
|
|
|
continue;
|
|
|
|
}
|
2016-06-16 03:34:05 -05:00
|
|
|
let target = target.file_name().into_string().unwrap();
|
2016-06-15 06:18:35 -05:00
|
|
|
if target == "etc" {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
let stderr = std::io::stderr();
|
|
|
|
writeln!(stderr.lock(), "running tests for target {}", target).unwrap();
|
|
|
|
f(target);
|
2016-05-31 05:05:25 -05:00
|
|
|
}
|
2016-04-22 03:34:14 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn compile_test() {
|
2016-06-15 06:18:35 -05:00
|
|
|
// Taken from https://github.com/Manishearth/rust-clippy/pull/911.
|
|
|
|
let home = option_env!("RUSTUP_HOME").or(option_env!("MULTIRUST_HOME"));
|
|
|
|
let toolchain = option_env!("RUSTUP_TOOLCHAIN").or(option_env!("MULTIRUST_TOOLCHAIN"));
|
|
|
|
let sysroot = match (home, toolchain) {
|
|
|
|
(Some(home), Some(toolchain)) => format!("{}/toolchains/{}", home, toolchain),
|
|
|
|
_ => option_env!("RUST_SYSROOT")
|
|
|
|
.expect("need to specify RUST_SYSROOT env var or use rustup or multirust")
|
|
|
|
.to_owned(),
|
|
|
|
};
|
2016-06-17 08:21:01 -05:00
|
|
|
run_pass();
|
2016-06-15 06:18:35 -05:00
|
|
|
for_all_targets(&sysroot, |target| {
|
2016-09-15 09:13:54 -05:00
|
|
|
let files = std::fs::read_dir("tests/run-pass").unwrap();
|
|
|
|
let files: Box<Iterator<Item=_>> = if let Ok(path) = std::env::var("MIRI_RUSTC_TEST") {
|
|
|
|
Box::new(files.chain(std::fs::read_dir(path).unwrap()))
|
|
|
|
} else {
|
|
|
|
Box::new(files)
|
|
|
|
};
|
|
|
|
let mut mir_not_found = 0;
|
|
|
|
let mut crate_not_found = 0;
|
|
|
|
let mut success = 0;
|
|
|
|
let mut failed = 0;
|
|
|
|
for file in files {
|
2016-06-15 06:18:35 -05:00
|
|
|
let file = file.unwrap();
|
2016-06-17 22:06:20 -05:00
|
|
|
let path = file.path();
|
|
|
|
|
|
|
|
if !file.metadata().unwrap().is_file() || !path.to_str().unwrap().ends_with(".rs") {
|
2016-06-15 06:18:35 -05:00
|
|
|
continue;
|
|
|
|
}
|
2016-06-17 22:06:20 -05:00
|
|
|
|
2016-06-15 06:18:35 -05:00
|
|
|
let stderr = std::io::stderr();
|
2016-06-17 22:06:20 -05:00
|
|
|
write!(stderr.lock(), "test [miri-pass] {} ... ", path.display()).unwrap();
|
2016-06-15 06:18:35 -05:00
|
|
|
let mut cmd = std::process::Command::new("target/debug/miri");
|
2016-06-17 22:06:20 -05:00
|
|
|
cmd.arg(path);
|
2016-06-16 03:30:47 -05:00
|
|
|
cmd.arg(format!("--target={}", target));
|
2016-06-15 06:18:35 -05:00
|
|
|
let libs = Path::new(&sysroot).join("lib");
|
|
|
|
let sysroot = libs.join("rustlib").join(&target).join("lib");
|
|
|
|
let paths = std::env::join_paths(&[libs, sysroot]).unwrap();
|
|
|
|
cmd.env(compiletest::procsrv::dylib_env_var(), paths);
|
2016-06-17 22:06:20 -05:00
|
|
|
|
2016-06-16 03:30:47 -05:00
|
|
|
match cmd.output() {
|
2016-09-15 09:13:54 -05:00
|
|
|
Ok(ref output) if output.status.success() => {
|
|
|
|
success += 1;
|
|
|
|
writeln!(stderr.lock(), "ok").unwrap()
|
|
|
|
},
|
2016-06-16 03:30:47 -05:00
|
|
|
Ok(output) => {
|
2016-09-15 09:13:54 -05:00
|
|
|
let output_err = std::str::from_utf8(&output.stderr).unwrap();
|
2016-09-28 07:53:43 -05:00
|
|
|
if let Some(text) = output_err.splitn(2, "no mir for `").nth(1) {
|
2016-09-15 09:13:54 -05:00
|
|
|
mir_not_found += 1;
|
|
|
|
let end = text.find('`').unwrap();
|
|
|
|
writeln!(stderr.lock(), "NO MIR FOR `{}`", &text[..end]).unwrap();
|
|
|
|
} else if let Some(text) = output_err.splitn(2, "can't find crate for `").nth(1) {
|
|
|
|
crate_not_found += 1;
|
|
|
|
let end = text.find('`').unwrap();
|
|
|
|
writeln!(stderr.lock(), "CAN'T FIND CRATE FOR `{}`", &text[..end]).unwrap();
|
|
|
|
} else {
|
|
|
|
failed += 1;
|
|
|
|
writeln!(stderr.lock(), "FAILED with exit code {:?}", output.status.code()).unwrap();
|
|
|
|
writeln!(stderr.lock(), "stdout: \n {}", std::str::from_utf8(&output.stdout).unwrap()).unwrap();
|
|
|
|
writeln!(stderr.lock(), "stderr: \n {}", output_err).unwrap();
|
|
|
|
}
|
2016-06-16 03:30:47 -05:00
|
|
|
}
|
2016-06-16 03:50:23 -05:00
|
|
|
Err(e) => {
|
|
|
|
writeln!(stderr.lock(), "FAILED: {}", e).unwrap();
|
2016-09-15 09:13:54 -05:00
|
|
|
panic!("failed to execute miri");
|
2016-06-16 03:50:23 -05:00
|
|
|
},
|
2016-06-16 03:30:47 -05:00
|
|
|
}
|
2016-06-15 06:18:35 -05:00
|
|
|
}
|
|
|
|
let stderr = std::io::stderr();
|
2016-09-15 09:13:54 -05:00
|
|
|
writeln!(stderr.lock(), "{} success, {} mir not found, {} crate not found, {} failed", success, mir_not_found, crate_not_found, failed).unwrap();
|
2016-09-27 10:02:24 -05:00
|
|
|
assert_eq!(failed, 0, "some tests failed");
|
2016-06-16 03:54:10 -05:00
|
|
|
});
|
2016-09-28 07:53:11 -05:00
|
|
|
compile_fail(&sysroot);
|
2016-04-22 03:34:14 -05:00
|
|
|
}
|