diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index c3ee30b65fe4b8017433ec7cb36d5ba283fcf734..3b20cc4ca39290751d6306538845fde82879fdce 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -348,7 +348,11 @@ fn run(v: &[StepDescription], builder: &Builder<'_>, paths: &[PathBuf]) { eprintln!( "note: if you are adding a new Step to bootstrap itself, make sure you register it with `describe!`" ); + #[cfg(not(test))] std::process::exit(1); + #[cfg(test)] + // so we can use #[should_panic] + panic!() } } } diff --git a/src/bootstrap/builder/tests.rs b/src/bootstrap/builder/tests.rs index f030917d7a43140fba98d059eab95c26b62d2152..70cb0de7cce04401dfdf5a7c972fa0b02cdb73d6 100644 --- a/src/bootstrap/builder/tests.rs +++ b/src/bootstrap/builder/tests.rs @@ -3,7 +3,11 @@ use std::thread; fn configure(cmd: &str, host: &[&str], target: &[&str]) -> Config { - let mut config = Config::parse(&[cmd.to_owned()]); + configure_with_args(&[cmd.to_owned()], host, target) +} + +fn configure_with_args(cmd: &[String], host: &[&str], target: &[&str]) -> Config { + let mut config = Config::parse(cmd); // don't save toolstates config.save_toolstates = None; config.dry_run = true; @@ -46,11 +50,39 @@ fn run_build(paths: &[PathBuf], config: Config) -> Cache { builder.cache } +fn check_cli(paths: [&str; N]) { + run_build( + &paths.map(PathBuf::from), + configure_with_args(&paths.map(String::from), &["A"], &["A"]), + ); +} + +#[test] +fn test_valid() { + // make sure multi suite paths are accepted + check_cli(["test", "src/test/ui/attr-start.rs", "src/test/ui/attr-shebang.rs"]); +} + +#[test] +#[should_panic] +fn test_invalid() { + // make sure that invalid paths are caught, even when combined with valid paths + check_cli(["test", "library/std", "x"]); +} + #[test] fn test_intersection() { - let set = PathSet::Set(["library/core", "library/alloc", "library/std"].into_iter().map(TaskPath::parse).collect()); - let subset = set.intersection(&[Path::new("library/core"), Path::new("library/alloc"), Path::new("library/stdarch")], None); - assert_eq!(subset, PathSet::Set(["library/core", "library/alloc"].into_iter().map(TaskPath::parse).collect())); + let set = PathSet::Set( + ["library/core", "library/alloc", "library/std"].into_iter().map(TaskPath::parse).collect(), + ); + let mut command_paths = + vec![Path::new("library/core"), Path::new("library/alloc"), Path::new("library/stdarch")]; + let subset = set.intersection_removing_matches(&mut command_paths, None); + assert_eq!( + subset, + PathSet::Set(["library/core", "library/alloc"].into_iter().map(TaskPath::parse).collect()) + ); + assert_eq!(command_paths, vec![Path::new("library/stdarch")]); } #[test]