Auto merge of #2383 - rust-lang:dot_mode, r=oli-obk
Print one . character per test instead of one line `./miri bless -- --quiet` now prints a dot per test, along with the regular Rust unit tests that listen to this flag
This commit is contained in:
commit
3800933ff0
@ -48,8 +48,17 @@ fn run_tests(mode: Mode, path: &str, target: Option<String>) -> Result<()> {
|
|||||||
(true, true) => panic!("cannot use MIRI_BLESS and MIRI_SKIP_UI_CHECKS at the same time"),
|
(true, true) => panic!("cannot use MIRI_BLESS and MIRI_SKIP_UI_CHECKS at the same time"),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Pass on all arguments as filters.
|
// Pass on all unknown arguments as filters.
|
||||||
let path_filter = std::env::args().skip(1);
|
let mut quiet = false;
|
||||||
|
let path_filter = std::env::args().skip(1).filter(|arg| {
|
||||||
|
match &**arg {
|
||||||
|
"--quiet" => {
|
||||||
|
quiet = true;
|
||||||
|
false
|
||||||
|
}
|
||||||
|
_ => true,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
let use_std = env::var_os("MIRI_NO_STD").is_none();
|
let use_std = env::var_os("MIRI_NO_STD").is_none();
|
||||||
|
|
||||||
@ -76,6 +85,7 @@ fn run_tests(mode: Mode, path: &str, target: Option<String>) -> Result<()> {
|
|||||||
],
|
],
|
||||||
envs: vec![],
|
envs: vec![],
|
||||||
}),
|
}),
|
||||||
|
quiet,
|
||||||
};
|
};
|
||||||
ui_test::run_tests(config)
|
ui_test::run_tests(config)
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,8 @@ pub struct Config {
|
|||||||
/// Can be used to override what command to run instead of `cargo` to build the
|
/// Can be used to override what command to run instead of `cargo` to build the
|
||||||
/// dependencies in `manifest_path`
|
/// dependencies in `manifest_path`
|
||||||
pub dependency_builder: Option<DependencyBuilder>,
|
pub dependency_builder: Option<DependencyBuilder>,
|
||||||
|
/// Print one character per test instead of one line
|
||||||
|
pub quiet: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -123,11 +125,50 @@ pub fn run_tests(mut config: Config) -> Result<()> {
|
|||||||
drop(submit);
|
drop(submit);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// A channel for the messages emitted by the individual test threads.
|
||||||
|
let (finished_files_sender, finished_files_recv) = crossbeam::channel::unbounded();
|
||||||
|
enum TestResult {
|
||||||
|
Ok,
|
||||||
|
Failed,
|
||||||
|
Ignored,
|
||||||
|
}
|
||||||
|
|
||||||
|
s.spawn(|_| {
|
||||||
|
if config.quiet {
|
||||||
|
for (i, (_, result)) in finished_files_recv.into_iter().enumerate() {
|
||||||
|
// Humans start counting at 1
|
||||||
|
let i = i + 1;
|
||||||
|
match result {
|
||||||
|
TestResult::Ok => eprint!("{}", ".".green()),
|
||||||
|
TestResult::Failed => eprint!("{}", "F".red().bold()),
|
||||||
|
TestResult::Ignored => eprint!("{}", "i".yellow()),
|
||||||
|
}
|
||||||
|
if i % 100 == 0 {
|
||||||
|
eprintln!(" {i}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (msg, result) in finished_files_recv {
|
||||||
|
eprint!("{msg} ... ");
|
||||||
|
eprintln!(
|
||||||
|
"{}",
|
||||||
|
match result {
|
||||||
|
TestResult::Ok => "ok".green(),
|
||||||
|
TestResult::Failed => "FAILED".red().bold(),
|
||||||
|
TestResult::Ignored => "ignored (in-test comment)".yellow(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
let mut threads = vec![];
|
let mut threads = vec![];
|
||||||
|
|
||||||
// Create N worker threads that receive files to test.
|
// Create N worker threads that receive files to test.
|
||||||
for _ in 0..std::thread::available_parallelism().unwrap().get() {
|
for _ in 0..std::thread::available_parallelism().unwrap().get() {
|
||||||
|
let finished_files_sender = finished_files_sender.clone();
|
||||||
threads.push(s.spawn(|_| -> Result<()> {
|
threads.push(s.spawn(|_| -> Result<()> {
|
||||||
|
let finished_files_sender = finished_files_sender;
|
||||||
for path in &receive {
|
for path in &receive {
|
||||||
if !config.path_filter.is_empty() {
|
if !config.path_filter.is_empty() {
|
||||||
let path_display = path.display().to_string();
|
let path_display = path.display().to_string();
|
||||||
@ -140,11 +181,8 @@ pub fn run_tests(mut config: Config) -> Result<()> {
|
|||||||
// Ignore file if only/ignore rules do (not) apply
|
// Ignore file if only/ignore rules do (not) apply
|
||||||
if !test_file_conditions(&comments, &target, &config) {
|
if !test_file_conditions(&comments, &target, &config) {
|
||||||
ignored.fetch_add(1, Ordering::Relaxed);
|
ignored.fetch_add(1, Ordering::Relaxed);
|
||||||
eprintln!(
|
finished_files_sender
|
||||||
"{} ... {}",
|
.send((path.display().to_string(), TestResult::Ignored))?;
|
||||||
path.display(),
|
|
||||||
"ignored (in-test comment)".yellow()
|
|
||||||
);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Run the test for all revisions
|
// Run the test for all revisions
|
||||||
@ -159,12 +197,11 @@ pub fn run_tests(mut config: Config) -> Result<()> {
|
|||||||
if !revision.is_empty() {
|
if !revision.is_empty() {
|
||||||
write!(msg, "(revision `{revision}`) ").unwrap();
|
write!(msg, "(revision `{revision}`) ").unwrap();
|
||||||
}
|
}
|
||||||
write!(msg, "... ").unwrap();
|
|
||||||
if errors.is_empty() {
|
if errors.is_empty() {
|
||||||
eprintln!("{msg}{}", "ok".green());
|
finished_files_sender.send((msg, TestResult::Ok))?;
|
||||||
succeeded.fetch_add(1, Ordering::Relaxed);
|
succeeded.fetch_add(1, Ordering::Relaxed);
|
||||||
} else {
|
} else {
|
||||||
eprintln!("{msg}{}", "FAILED".red().bold());
|
finished_files_sender.send((msg, TestResult::Failed))?;
|
||||||
failures.lock().unwrap().push((
|
failures.lock().unwrap().push((
|
||||||
path.clone(),
|
path.clone(),
|
||||||
m,
|
m,
|
||||||
@ -178,6 +215,7 @@ pub fn run_tests(mut config: Config) -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
for thread in threads {
|
for thread in threads {
|
||||||
thread.join().unwrap()?;
|
thread.join().unwrap()?;
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ fn config() -> Config {
|
|||||||
output_conflict_handling: OutputConflictHandling::Error,
|
output_conflict_handling: OutputConflictHandling::Error,
|
||||||
dependencies_crate_manifest_path: None,
|
dependencies_crate_manifest_path: None,
|
||||||
dependency_builder: None,
|
dependency_builder: None,
|
||||||
|
quiet: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user