version = "0.1.0"
dependencies = [
"byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "compiletest_rs 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "compiletest_rs 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"log_settings 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
[[package]]
name = "compiletest_rs"
-version = "0.1.3"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
+[[package]]
+name = "rustc-serialize"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
[[package]]
name = "thread-id"
version = "2.0.0"
extern crate compiletest_rs as compiletest;
-use std::path::PathBuf;
+use std::path::{PathBuf, Path};
+use std::io::Write;
-fn run_mode(mode: &'static str) {
+fn run_mode(dir: &'static str, mode: &'static str, sysroot: &str) {
// Disable rustc's new error fomatting. It breaks these tests.
std::env::remove_var("RUST_NEW_ERROR_FORMAT");
-
- // 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(),
- };
let flags = format!("--sysroot {} -Dwarnings", sysroot);
-
- // FIXME: read directories in sysroot/lib/rustlib and generate the test targets from that
- let targets = &["x86_64-unknown-linux-gnu", "i686-unknown-linux-gnu"];
-
- for &target in targets {
- use std::io::Write;
- let stderr = std::io::stderr();
- write!(stderr.lock(), "running tests for target {}", target).unwrap();
+ for_all_targets(sysroot, |target| {
let mut config = compiletest::default_config();
config.host_rustcflags = Some(flags.clone());
config.mode = mode.parse().expect("Invalid mode");
- config.run_lib_path = format!("{}/lib/rustlib/{}/lib", sysroot, target);
+ config.run_lib_path = Path::new(sysroot).join("lib").join("rustlib").join(&target).join("lib");
config.rustc_path = "target/debug/miri".into();
- config.src_base = PathBuf::from(format!("tests/{}", mode));
+ config.src_base = PathBuf::from(format!("tests/{}", dir));
config.target = target.to_owned();
config.target_rustcflags = Some(flags.clone());
compiletest::run_tests(&config);
+ });
+}
+
+fn for_all_targets<F: Fn(String)>(sysroot: &str, f: F) {
+ for target in std::fs::read_dir(format!("{}/lib/rustlib/", sysroot)).unwrap() {
+ let target = target.unwrap();
+ if !target.metadata().unwrap().is_dir() {
+ continue;
+ }
+ let target = target.path().iter().rev().next().unwrap().to_str().unwrap().to_owned();
+ if target == "etc" {
+ continue;
+ }
+ let stderr = std::io::stderr();
+ writeln!(stderr.lock(), "running tests for target {}", target).unwrap();
+ f(target);
}
}
#[test]
fn compile_test() {
- run_mode("compile-fail");
- run_mode("run-pass");
+ // 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(),
+ };
+ run_mode("compile-fail", "compile-fail", &sysroot);
+ for_all_targets(&sysroot, |target| {
+ for file in std::fs::read_dir("tests/run-pass").unwrap() {
+ let file = file.unwrap();
+ if !file.metadata().unwrap().is_file() {
+ continue;
+ }
+ let file = file.path();
+ let stderr = std::io::stderr();
+ writeln!(stderr.lock(), "test [miri-pass] {}", file.to_str().unwrap()).unwrap();
+ let mut cmd = std::process::Command::new("target/debug/miri");
+ cmd.arg(file);
+ cmd.arg(format!("--sysroot={}", sysroot));
+ cmd.arg("-Dwarnings");
+ cmd.arg(format!("-target={}", target));
+ 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);
+ }
+ let stderr = std::io::stderr();
+ writeln!(stderr.lock(), "").unwrap();
+ })
}