diff --git a/CHANGELOG.md b/CHANGELOG.md index e7454c7a747e..92f45671f955 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,9 @@ ### Added +- [#3662](https://github.com/ChainSafe/forest/pull/3662) Add `--filter` and + `--fail-fast` flags to `forest-tool api compare`. + ### Changed ### Removed diff --git a/src/tool/subcommands/api_cmd.rs b/src/tool/subcommands/api_cmd.rs index c5e8e2d504c9..3b77844b4a6e 100644 --- a/src/tool/subcommands/api_cmd.rs +++ b/src/tool/subcommands/api_cmd.rs @@ -29,6 +29,12 @@ pub enum ApiCommands { /// Snapshot input paths. Supports `.car`, `.car.zst`, and `.forest.car.zst`. #[arg()] snapshot_files: Vec, + /// Filter which tests to run according to method name. Case sensitive. + #[arg(long, default_value = "")] + filter: String, + /// Cancel test run on the first failure + #[arg(long)] + fail_fast: bool, }, } @@ -39,13 +45,15 @@ impl ApiCommands { forest, lotus, snapshot_files, - } => compare_apis(forest, lotus, snapshot_files).await?, + filter, + fail_fast, + } => compare_apis(forest, lotus, snapshot_files, filter, fail_fast).await?, } Ok(()) } } -#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash)] enum EndpointStatus { // RPC method is missing MissingMethod, @@ -310,6 +318,8 @@ async fn compare_apis( forest: ApiInfo, lotus: ApiInfo, snapshot_files: Vec, + filter: String, + fail_fast: bool, ) -> anyhow::Result<()> { let mut tests = vec![]; @@ -325,14 +335,24 @@ async fn compare_apis( tests.extend(snapshot_tests(&store)?); } + tests.sort_by_key(|test| test.request.method_name); + let mut results = HashMap::default(); for test in tests.into_iter() { + if !test.request.method_name.contains(&filter) { + continue; + } let (forest_status, lotus_status) = test.run(&forest, &lotus).await; results .entry((test.request.method_name, forest_status, lotus_status)) .and_modify(|v| *v += 1) .or_insert(1u32); + if (forest_status != EndpointStatus::Valid || lotus_status != EndpointStatus::Valid) + && fail_fast + { + break; + } } let mut results = results.into_iter().collect::>();