diff --git a/test/integration-test/Cargo.toml b/test/integration-test/Cargo.toml index bd6957f0..74b5801b 100644 --- a/test/integration-test/Cargo.toml +++ b/test/integration-test/Cargo.toml @@ -7,6 +7,8 @@ publish = false [dependencies] anyhow = "1" aya = { path = "../../aya" } +clap = { version = "3", features = ["derive"] } +env_logger = "0.9" inventory = "0.2" integration-test-macros = { path = "../integration-test-macros" } lazy_static = "1" @@ -14,4 +16,3 @@ libc = { version = "0.2.105" } log = "0.4" object = { version = "0.29", default-features = false, features = ["std", "read_core", "elf"] } regex = "1" -env_logger = "0.9" diff --git a/test/integration-test/src/main.rs b/test/integration-test/src/main.rs index a9f142b1..60744da5 100644 --- a/test/integration-test/src/main.rs +++ b/test/integration-test/src/main.rs @@ -3,14 +3,72 @@ use log::info; mod tests; use tests::IntegrationTest; +use clap::Parser; + +#[derive(Debug, Parser)] +#[clap(author, version, about, long_about = None)] +#[clap(propagate_version = true)] +pub struct RunOptions { + #[clap(short, long, value_parser)] + tests: Option>, +} + +#[derive(Debug, Parser)] +struct Cli { + #[clap(subcommand)] + command: Option, +} + +#[derive(Debug, Parser)] +enum Command { + /// Run one or more tests: ... -- run -t test1 -t test2 + Run(RunOptions), + /// List all the tests: ... -- list + List, +} + +macro_rules! exec_test { + ($test:expr) => {{ + info!("Running {}", $test.name); + if let Err(e) = ($test.test_fn)() { + panic!("{}", e) + } + }}; +} + +macro_rules! exec_all_tests { + () => {{ + for t in inventory::iter:: { + exec_test!(t) + } + }}; +} + fn main() -> anyhow::Result<()> { env_logger::init(); - // Run the tests - for t in inventory::iter:: { - info!("Running {}", t.name); - if let Err(e) = (t.test_fn)() { - panic!("{}", e) + let cli = Cli::parse(); + + match &cli.command { + Some(Command::Run(opts)) => match &opts.tests { + Some(tests) => { + for t in inventory::iter:: { + if tests.contains(&t.name.into()) { + exec_test!(t) + } + } + } + None => { + exec_all_tests!() + } + }, + Some(Command::List) => { + for t in inventory::iter:: { + info!("{}", t.name); + } + } + None => { + exec_all_tests!() } }