Run the tests of popular crates in the CI
This commit is contained in:
parent
8235b26062
commit
6b05753cb3
1
.github/workflows/ci.yml
vendored
1
.github/workflows/ci.yml
vendored
@ -32,6 +32,7 @@ jobs:
|
||||
"--extended-regex-tests",
|
||||
"--test-successful-rustc --nb-parts 2 --current-part 0",
|
||||
"--test-successful-rustc --nb-parts 2 --current-part 1",
|
||||
"--projects",
|
||||
]
|
||||
|
||||
steps:
|
||||
|
@ -152,7 +152,7 @@ fn clone_and_setup<F>(repo_url: &str, checkout_commit: &str, extra: Option<F>) -
|
||||
where
|
||||
F: Fn(&Path) -> Result<(), String>,
|
||||
{
|
||||
let clone_result = git_clone(repo_url, None)?;
|
||||
let clone_result = git_clone(repo_url, None, false)?;
|
||||
if !clone_result.ran_clone {
|
||||
println!("`{}` has already been cloned", clone_result.repo_name);
|
||||
}
|
||||
|
@ -1,13 +1,13 @@
|
||||
use crate::build;
|
||||
use crate::config::{Channel, ConfigInfo};
|
||||
use crate::utils::{
|
||||
get_gcc_path, get_toolchain, remove_file, run_command, run_command_with_env,
|
||||
get_gcc_path, get_toolchain, git_clone, remove_file, run_command, run_command_with_env,
|
||||
run_command_with_output_and_env, rustc_version_info, split_args, walk_dir,
|
||||
};
|
||||
|
||||
use std::collections::{BTreeSet, HashMap};
|
||||
use std::ffi::OsStr;
|
||||
use std::fs::{remove_dir_all, File};
|
||||
use std::fs::{create_dir_all, remove_dir_all, File};
|
||||
use std::io::{BufRead, BufReader};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::str::FromStr;
|
||||
@ -31,6 +31,7 @@ fn get_runners() -> Runners {
|
||||
"--test-failing-rustc",
|
||||
("Run failing rustc tests", test_failing_rustc),
|
||||
);
|
||||
runners.insert("--projects", ("Run the tests of popular crates", test_projects));
|
||||
runners.insert("--test-libcore", ("Run libcore tests", test_libcore));
|
||||
runners.insert("--clean", ("Empty cargo target directory", clean));
|
||||
runners.insert("--build-sysroot", ("Build sysroot", build_sysroot));
|
||||
@ -679,6 +680,57 @@ fn run_cargo_command_with_callback<F>(
|
||||
// echo "[BUILD] sysroot in release mode"
|
||||
// ./build_sysroot/build_sysroot.sh --release
|
||||
|
||||
fn test_projects(env: &Env, args: &TestArg) -> Result<(), String> {
|
||||
let projects = [
|
||||
//"https://gitlab.gnome.org/GNOME/librsvg", // FIXME: doesn't compile in the CI since the
|
||||
// version of cairo and other libraries is too old.
|
||||
"https://github.com/rust-random/getrandom",
|
||||
"https://github.com/BurntSushi/memchr",
|
||||
"https://github.com/dtolnay/itoa",
|
||||
"https://github.com/rust-lang/cfg-if",
|
||||
"https://github.com/rust-lang-nursery/lazy-static.rs",
|
||||
//"https://github.com/marshallpierce/rust-base64", // FIXME: one test is OOM-killed.
|
||||
// TODO: ignore the base64 test that is OOM-killed.
|
||||
"https://github.com/time-rs/time",
|
||||
"https://github.com/rust-lang/log",
|
||||
"https://github.com/bitflags/bitflags",
|
||||
//"https://github.com/serde-rs/serde", // FIXME: one test fails.
|
||||
//"https://github.com/rayon-rs/rayon", // TODO: very slow, only run on master?
|
||||
//"https://github.com/rust-lang/cargo", // TODO: very slow, only run on master?
|
||||
];
|
||||
|
||||
let run_tests = |projects_path, iter: &mut dyn Iterator<Item=&&str>| -> Result<(), String> {
|
||||
for project in iter {
|
||||
let clone_result = git_clone(project, Some(projects_path), true)?;
|
||||
let repo_path = Path::new(&clone_result.repo_dir);
|
||||
run_cargo_command(&[&"build", &"--release"], Some(repo_path), env, args)?;
|
||||
run_cargo_command(&[&"test"], Some(repo_path), env, args)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
};
|
||||
|
||||
let projects_path = Path::new("projects");
|
||||
create_dir_all(projects_path)
|
||||
.map_err(|err| format!("Failed to create directory `projects`: {}", err))?;
|
||||
|
||||
let nb_parts = args.nb_parts.unwrap_or(0);
|
||||
if nb_parts > 0 {
|
||||
// We increment the number of tests by one because if this is an odd number, we would skip
|
||||
// one test.
|
||||
let count = projects.len() / nb_parts + 1;
|
||||
let current_part = args.current_part.unwrap();
|
||||
let start = current_part * count;
|
||||
// We remove the projects we don't want to test.
|
||||
run_tests(projects_path, &mut projects.iter().skip(start).take(count))?;
|
||||
}
|
||||
else {
|
||||
run_tests(projects_path, &mut projects.iter())?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn test_libcore(env: &Env, args: &TestArg) -> Result<(), String> {
|
||||
// FIXME: create a function "display_if_not_quiet" or something along the line.
|
||||
println!("[TEST] libcore");
|
||||
|
@ -283,9 +283,10 @@ pub fn get_gcc_path() -> Result<String, String> {
|
||||
pub struct CloneResult {
|
||||
pub ran_clone: bool,
|
||||
pub repo_name: String,
|
||||
pub repo_dir: String,
|
||||
}
|
||||
|
||||
pub fn git_clone(to_clone: &str, dest: Option<&Path>) -> Result<CloneResult, String> {
|
||||
pub fn git_clone(to_clone: &str, dest: Option<&Path>, shallow_clone: bool) -> Result<CloneResult, String> {
|
||||
let repo_name = to_clone.split('/').last().unwrap();
|
||||
let repo_name = match repo_name.strip_suffix(".git") {
|
||||
Some(n) => n.to_string(),
|
||||
@ -299,13 +300,20 @@ pub fn git_clone(to_clone: &str, dest: Option<&Path>) -> Result<CloneResult, Str
|
||||
return Ok(CloneResult {
|
||||
ran_clone: false,
|
||||
repo_name,
|
||||
repo_dir: dest.display().to_string(),
|
||||
});
|
||||
}
|
||||
|
||||
run_command_with_output(&[&"git", &"clone", &to_clone, &dest], None)?;
|
||||
let mut command: Vec<&dyn AsRef<OsStr>> = vec![&"git", &"clone", &to_clone, &dest];
|
||||
if shallow_clone {
|
||||
command.push(&"--depth");
|
||||
command.push(&"1");
|
||||
}
|
||||
run_command_with_output(&command, None)?;
|
||||
Ok(CloneResult {
|
||||
ran_clone: true,
|
||||
repo_name,
|
||||
repo_dir: dest.display().to_string(),
|
||||
})
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user