2016-04-22 08:34:14 +00:00
|
|
|
extern crate compiletest_rs as compiletest;
|
|
|
|
|
2016-06-15 11:18:35 +00:00
|
|
|
use std::path::{PathBuf, Path};
|
|
|
|
use std::io::Write;
|
2016-04-22 08:34:14 +00:00
|
|
|
|
2016-06-17 13:21:01 +00:00
|
|
|
fn compile_fail(sysroot: &str) {
|
2016-06-14 09:54:28 +00:00
|
|
|
let flags = format!("--sysroot {} -Dwarnings", sysroot);
|
2016-06-15 11:18:35 +00:00
|
|
|
for_all_targets(sysroot, |target| {
|
2016-05-31 10:05:25 +00:00
|
|
|
let mut config = compiletest::default_config();
|
2016-06-14 09:54:28 +00:00
|
|
|
config.host_rustcflags = Some(flags.clone());
|
2016-06-17 13:21:01 +00:00
|
|
|
config.mode = "compile-fail".parse().expect("Invalid mode");
|
2016-06-15 11:18:35 +00:00
|
|
|
config.run_lib_path = Path::new(sysroot).join("lib").join("rustlib").join(&target).join("lib");
|
2016-05-31 10:05:25 +00:00
|
|
|
config.rustc_path = "target/debug/miri".into();
|
2016-06-17 13:21:01 +00:00
|
|
|
config.src_base = PathBuf::from("tests/compile-fail".to_string());
|
2016-05-31 10:05:25 +00:00
|
|
|
config.target = target.to_owned();
|
2016-06-14 09:54:28 +00:00
|
|
|
config.target_rustcflags = Some(flags.clone());
|
2016-05-31 10:05:25 +00:00
|
|
|
compiletest::run_tests(&config);
|
2016-06-15 11:18:35 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-06-17 13:21:01 +00: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 14:12:36 +00:00
|
|
|
config.target_rustcflags = Some("-Dwarnings".to_string());
|
|
|
|
config.host_rustcflags = Some("-Dwarnings".to_string());
|
2016-06-17 13:21:01 +00:00
|
|
|
compiletest::run_tests(&config);
|
|
|
|
}
|
|
|
|
|
2016-12-19 14:46:03 +00:00
|
|
|
fn miri_pass(path: &str, target: &str, host: &str) {
|
2016-12-17 01:10:16 +00:00
|
|
|
let mut config = compiletest::default_config();
|
|
|
|
config.mode = "mir-opt".parse().expect("Invalid mode");
|
|
|
|
config.src_base = PathBuf::from(path);
|
|
|
|
config.target = target.to_owned();
|
|
|
|
config.rustc_path = PathBuf::from("target/debug/miri");
|
2016-12-19 14:46:03 +00:00
|
|
|
// don't actually execute the final binary, it might be for other targets and we only care
|
|
|
|
// about running miri, not the binary.
|
|
|
|
config.runtool = Some("echo \"\" || ".to_owned());
|
|
|
|
if target == host {
|
|
|
|
std::env::set_var("MIRI_HOST_TARGET", "yes");
|
|
|
|
}
|
2016-12-17 01:10:16 +00:00
|
|
|
compiletest::run_tests(&config);
|
2016-12-19 14:46:03 +00:00
|
|
|
std::env::set_var("MIRI_HOST_TARGET", "");
|
2016-12-17 01:10:16 +00:00
|
|
|
}
|
|
|
|
|
2016-12-17 08:54:37 +00:00
|
|
|
fn is_target_dir<P: Into<PathBuf>>(path: P) -> bool {
|
|
|
|
let mut path = path.into();
|
|
|
|
path.push("lib");
|
|
|
|
path.metadata().map(|m| m.is_dir()).unwrap_or(false)
|
|
|
|
}
|
|
|
|
|
2016-06-16 08:54:10 +00:00
|
|
|
fn for_all_targets<F: FnMut(String)>(sysroot: &str, mut f: F) {
|
2016-12-17 08:54:37 +00:00
|
|
|
for entry in std::fs::read_dir(format!("{}/lib/rustlib/", sysroot)).unwrap() {
|
|
|
|
let entry = entry.unwrap();
|
|
|
|
if !is_target_dir(entry.path()) { continue; }
|
|
|
|
let target = entry.file_name().into_string().unwrap();
|
2016-06-15 11:18:35 +00:00
|
|
|
let stderr = std::io::stderr();
|
|
|
|
writeln!(stderr.lock(), "running tests for target {}", target).unwrap();
|
|
|
|
f(target);
|
2016-05-31 10:05:25 +00:00
|
|
|
}
|
2016-04-22 08:34:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn compile_test() {
|
2016-06-15 11:18:35 +00: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 13:21:01 +00:00
|
|
|
run_pass();
|
2016-12-19 14:59:32 +00:00
|
|
|
let host = Path::new(&sysroot).file_name()
|
2016-12-20 08:05:46 +00:00
|
|
|
.expect("sysroot has no last par")
|
2016-12-19 14:59:32 +00:00
|
|
|
.to_str()
|
2016-12-20 08:05:46 +00:00
|
|
|
.expect("sysroot contains non utf8")
|
2016-12-19 14:59:32 +00:00
|
|
|
.splitn(2, '-')
|
|
|
|
.skip(1)
|
|
|
|
.next()
|
2016-12-20 08:05:46 +00:00
|
|
|
.expect("target dir not prefixed");
|
2016-06-15 11:18:35 +00:00
|
|
|
for_all_targets(&sysroot, |target| {
|
2016-12-19 14:46:03 +00:00
|
|
|
miri_pass("tests/run-pass", &target, host);
|
2016-12-17 01:10:16 +00:00
|
|
|
if let Ok(path) = std::env::var("MIRI_RUSTC_TEST") {
|
2016-12-19 14:46:03 +00:00
|
|
|
miri_pass(&path, &target, host);
|
2016-06-15 11:18:35 +00:00
|
|
|
}
|
2016-06-16 08:54:10 +00:00
|
|
|
});
|
2016-09-28 12:53:11 +00:00
|
|
|
compile_fail(&sysroot);
|
2016-04-22 08:34:14 +00:00
|
|
|
}
|