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:
bors 2022-07-21 07:40:32 +00:00
commit 3800933ff0
3 changed files with 59 additions and 10 deletions

View File

@ -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)
} }

View File

@ -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()?;
} }

View File

@ -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,
} }
} }