]> git.lizzy.rs Git - rust.git/blob - tests/compile-test.rs
7cfbfcf16a997111fca94964b7545ec5988e7793
[rust.git] / tests / compile-test.rs
1 #![feature(test)]
2
3 use compiletest_rs as compiletest;
4 use compiletest_rs::common::Mode as TestMode;
5
6 use std::env::{self, set_var};
7 use std::ffi::OsStr;
8 use std::fs;
9 use std::io;
10 use std::path::{Path, PathBuf};
11
12 mod cargo;
13
14 #[must_use]
15 fn rustc_test_suite() -> Option<PathBuf> {
16     option_env!("RUSTC_TEST_SUITE").map(PathBuf::from)
17 }
18
19 #[must_use]
20 fn rustc_lib_path() -> PathBuf {
21     option_env!("RUSTC_LIB_PATH").unwrap().into()
22 }
23
24 fn default_config() -> compiletest::Config {
25     let build_info = cargo::BuildInfo::new();
26     let mut config = compiletest::Config::default();
27
28     if let Ok(name) = env::var("TESTNAME") {
29         config.filter = Some(name);
30     }
31
32     if rustc_test_suite().is_some() {
33         let path = rustc_lib_path();
34         config.run_lib_path = path.clone();
35         config.compile_lib_path = path;
36     }
37
38     let disambiguated: Vec<_> = cargo::BuildInfo::third_party_crates()
39         .iter()
40         .map(|(krate, path)| format!("--extern {}={}", krate, path.display()))
41         .collect();
42
43     config.target_rustcflags = Some(format!(
44         "-L {0} -L {1} -Dwarnings -Zui-testing {2}",
45         build_info.host_lib().join("deps").display(),
46         build_info.target_lib().join("deps").display(),
47         disambiguated.join(" ")
48     ));
49
50     config.build_base = if rustc_test_suite().is_some() {
51         // we don't need access to the stderr files on travis
52         let mut path = PathBuf::from(env!("OUT_DIR"));
53         path.push("test_build_base");
54         path
55     } else {
56         build_info.host_lib().join("test_build_base")
57     };
58     config.rustc_path = build_info.clippy_driver_path();
59     config
60 }
61
62 fn run_mode(cfg: &mut compiletest::Config) {
63     cfg.mode = TestMode::Ui;
64     cfg.src_base = Path::new("tests").join("ui");
65     compiletest::run_tests(&cfg);
66 }
67
68 #[allow(clippy::identity_conversion)]
69 fn run_ui_toml_tests(config: &compiletest::Config, mut tests: Vec<tester::TestDescAndFn>) -> Result<bool, io::Error> {
70     let mut result = true;
71     let opts = compiletest::test_opts(config);
72     for dir in fs::read_dir(&config.src_base)? {
73         let dir = dir?;
74         if !dir.file_type()?.is_dir() {
75             continue;
76         }
77         let dir_path = dir.path();
78         set_var("CARGO_MANIFEST_DIR", &dir_path);
79         for file in fs::read_dir(&dir_path)? {
80             let file = file?;
81             let file_path = file.path();
82             if file.file_type()?.is_dir() {
83                 continue;
84             }
85             if file_path.extension() != Some(OsStr::new("rs")) {
86                 continue;
87             }
88             let paths = compiletest::common::TestPaths {
89                 file: file_path,
90                 base: config.src_base.clone(),
91                 relative_dir: dir_path.file_name().unwrap().into(),
92             };
93             let test_name = compiletest::make_test_name(&config, &paths);
94             let index = tests
95                 .iter()
96                 .position(|test| test.desc.name == test_name)
97                 .expect("The test should be in there");
98             result &= tester::run_tests_console(&opts, vec![tests.swap_remove(index)])?;
99         }
100     }
101     Ok(result)
102 }
103
104 fn run_ui_toml(config: &mut compiletest::Config) {
105     config.mode = TestMode::Ui;
106     config.src_base = Path::new("tests").join("ui-toml").canonicalize().unwrap();
107
108     let tests = compiletest::make_tests(&config);
109
110     let res = run_ui_toml_tests(&config, tests);
111     match res {
112         Ok(true) => {},
113         Ok(false) => panic!("Some tests failed"),
114         Err(e) => {
115             println!("I/O failure during tests: {:?}", e);
116         },
117     }
118 }
119
120 fn prepare_env() {
121     set_var("CLIPPY_DISABLE_DOCS_LINKS", "true");
122     set_var("CLIPPY_TESTS", "true");
123     //set_var("RUST_BACKTRACE", "0");
124 }
125
126 #[test]
127 fn compile_test() {
128     prepare_env();
129     let mut config = default_config();
130     run_mode(&mut config);
131     run_ui_toml(&mut config);
132 }