forked from brson/miri
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This change makes `cargo test` no longer fail, although it also doesn't test much that's useful. It includes updates so that packages build against the nightly Rust we are using. This also pulls over some changes from miri ot let the test harness find the version of Rust selected by `rustup`. Possibly useful for testing (Issue brson#15).
- Loading branch information
Showing
5 changed files
with
109 additions
and
21 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,24 +1,100 @@ | ||
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) { | ||
let mut config = compiletest::default_config(); | ||
config.rustc_path = "target/debug/miri".into(); | ||
let path = std::env::var("RUST_SYSROOT").expect("env variable `RUST_SYSROOT` not set"); | ||
config.target_rustcflags = Some(format!("--sysroot {}", path)); | ||
config.host_rustcflags = Some(format!("--sysroot {}", path)); | ||
let cfg_mode = mode.parse().ok().expect("Invalid mode"); | ||
|
||
config.mode = cfg_mode; | ||
config.src_base = PathBuf::from(format!("tests/{}", mode)); | ||
fn compile_fail(sysroot: &str) { | ||
let flags = format!("--sysroot {} -Dwarnings", sysroot); | ||
for_all_targets(sysroot, |target| { | ||
let mut config = compiletest::default_config(); | ||
config.host_rustcflags = Some(flags.clone()); | ||
config.mode = "compile-fail".parse().expect("Invalid mode"); | ||
config.run_lib_path = Path::new(sysroot).join("lib").join("rustlib").join(&target).join("lib"); | ||
config.rustc_path = "target/debug/mir2wasm".into(); | ||
config.src_base = PathBuf::from("tests/compile-fail".to_string()); | ||
config.target = target.to_owned(); | ||
config.target_rustcflags = Some(flags.clone()); | ||
compiletest::run_tests(&config); | ||
}); | ||
} | ||
|
||
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()); | ||
compiletest::run_tests(&config); | ||
} | ||
|
||
fn for_all_targets<F: FnMut(String)>(sysroot: &str, mut 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.file_name().into_string().unwrap(); | ||
if target == "etc" { | ||
continue; | ||
} | ||
let stderr = std::io::stderr(); | ||
writeln!(stderr.lock(), "running tests for target {}", target).unwrap(); | ||
f(target); | ||
} | ||
} | ||
|
||
#[test] | ||
fn empty_test() { | ||
// show the test harness is running by getting at least one | ||
// successful test. | ||
} | ||
|
||
#[test] #[ignore] | ||
fn compile_test() { | ||
run_mode("compile-fail"); | ||
run_mode("run-pass"); | ||
run_mode("run-fail"); | ||
// 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(), | ||
}; | ||
compile_fail(&sysroot); | ||
run_pass(); | ||
for_all_targets(&sysroot, |target| { | ||
for file in std::fs::read_dir("tests/run-pass").unwrap() { | ||
let file = file.unwrap(); | ||
let path = file.path(); | ||
|
||
if !file.metadata().unwrap().is_file() || !path.to_str().unwrap().ends_with(".rs") { | ||
continue; | ||
} | ||
|
||
let stderr = std::io::stderr(); | ||
write!(stderr.lock(), "test [miri-pass] {} ... ", path.display()).unwrap(); | ||
let mut cmd = std::process::Command::new("target/debug/miri"); | ||
cmd.arg(path); | ||
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); | ||
|
||
match cmd.output() { | ||
Ok(ref output) if output.status.success() => writeln!(stderr.lock(), "ok").unwrap(), | ||
Ok(output) => { | ||
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 {}", std::str::from_utf8(&output.stderr).unwrap()).unwrap(); | ||
panic!("some tests failed"); | ||
} | ||
Err(e) => { | ||
writeln!(stderr.lock(), "FAILED: {}", e).unwrap(); | ||
panic!("some tests failed"); | ||
}, | ||
} | ||
} | ||
let stderr = std::io::stderr(); | ||
writeln!(stderr.lock(), "").unwrap(); | ||
}); | ||
} |