Skip to content

Commit 8a8e4ed

Browse files
authored
Add option to specify verbosity via cli (#3601)
commit-id:00fe6d0d --- **Stack**: - #3612 - #3609 - #3605 - #3601⚠️ *Part of a stack created by [spr](https://github.com/ejoffe/spr). Do not merge manually using the UI - doing so may have unexpected results.*
1 parent d0e62de commit 8a8e4ed

File tree

15 files changed

+97
-70
lines changed

15 files changed

+97
-70
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use crate::debugging::TraceVerbosity;
2+
use crate::debugging::component::Component;
3+
use clap::Args;
4+
use debugging::Components;
5+
6+
#[derive(Args, Debug, Clone, Default, Eq, PartialEq)]
7+
#[group(required = false, multiple = false)]
8+
pub struct TraceArgs {
9+
/// Trace verbosity level
10+
#[arg(long)]
11+
trace_verbosity: Option<TraceVerbosity>,
12+
13+
/// Components to include in the trace.
14+
#[arg(long, num_args = 1.., value_delimiter = ' ')]
15+
trace_components: Option<Vec<Component>>,
16+
}
17+
18+
impl TraceArgs {
19+
/// Returns the [`Option<Components>`] based on the provided arguments.
20+
#[must_use]
21+
pub fn to_components(&self) -> Option<Components> {
22+
match (&self.trace_components, &self.trace_verbosity) {
23+
(None, Some(verbosity)) => Some(build_components(verbosity.to_components_vec())),
24+
(Some(components), None) => Some(build_components(components)),
25+
(None, None) => None,
26+
(Some(_), Some(_)) => {
27+
unreachable!("this case is impossible, as it is handled by clap")
28+
}
29+
}
30+
}
31+
}
32+
33+
fn build_components<'a>(iter: impl IntoIterator<Item = &'a Component>) -> Components {
34+
Components::new(iter.into_iter().map(debugging::Component::from).collect())
35+
}

crates/forge-runner/src/debugging/component.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use crate::debugging::trace_verbosity::TraceVerbosity;
2+
use clap::ValueEnum;
23
use strum_macros::VariantArray;
34

45
/// Components that will be included in the trace.
5-
#[derive(Clone, VariantArray)]
6+
#[derive(ValueEnum, Clone, VariantArray, Debug, Eq, PartialEq)]
67
pub enum Component {
78
/// The name of the contract being called.
89
ContractName,
@@ -34,8 +35,8 @@ impl Component {
3435
}
3536
}
3637

37-
impl From<Component> for debugging::Component {
38-
fn from(component: Component) -> Self {
38+
impl From<&Component> for debugging::Component {
39+
fn from(component: &Component) -> Self {
3940
match component {
4041
Component::ContractName => debugging::Component::ContractName,
4142
Component::EntryPointType => debugging::Component::EntryPointType,
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,28 @@
1+
mod args;
12
mod component;
23
mod trace_verbosity;
34

45
use cheatnet::forking::data::ForkData;
56
use cheatnet::runtime_extensions::forge_runtime_extension::contracts_data::ContractsData;
67
use cheatnet::state::CallTrace;
78

9+
pub use args::TraceArgs;
810
pub use trace_verbosity::TraceVerbosity;
911

1012
#[must_use]
1113
pub fn build_debugging_trace(
1214
call_trace: &CallTrace,
1315
contracts_data: &ContractsData,
14-
trace_verbosity: Option<TraceVerbosity>,
16+
trace_args: &TraceArgs,
1517
test_name: String,
1618
fork_data: &ForkData,
1719
) -> Option<debugging::Trace> {
20+
let components = trace_args.to_components()?;
1821
let contracts_data_store = debugging::ContractsDataStore::new(contracts_data, fork_data);
1922
Some(debugging::Trace::new(
2023
call_trace,
2124
&contracts_data_store,
22-
&trace_verbosity?.to_components(),
25+
&components,
2326
test_name,
2427
))
2528
}
Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::debugging::component::Component;
22
use clap::ValueEnum;
3-
use debugging::Components;
43
use strum::VariantArray;
54

65
/// Trace verbosity level.
@@ -15,16 +14,12 @@ pub enum TraceVerbosity {
1514
}
1615

1716
impl TraceVerbosity {
18-
/// Converts the [`TraceVerbosity`] to a [`Components`] that will be included in the trace.
17+
/// Converts the [`TraceVerbosity`] to a vector of [`Component`].
1918
#[must_use]
20-
pub fn to_components(&self) -> Components {
21-
Components::new(
22-
Component::VARIANTS
23-
.iter()
24-
.filter(|component| component.verbosity() <= *self)
25-
.cloned()
26-
.map(debugging::Component::from)
27-
.collect(),
28-
)
19+
pub fn to_components_vec(&self) -> Vec<&Component> {
20+
Component::VARIANTS
21+
.iter()
22+
.filter(|component| component.verbosity() <= *self)
23+
.collect()
2924
}
3025
}

crates/forge-runner/src/forge_config.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::debugging::TraceArgs;
12
use blockifier::execution::contract_class::TrackedResource;
23
use camino::Utf8PathBuf;
34
use cheatnet::runtime_extensions::forge_runtime_extension::contracts_data::ContractsData;
@@ -29,6 +30,7 @@ pub struct TestRunnerConfig {
2930

3031
#[derive(Debug, PartialEq)]
3132
pub struct OutputConfig {
33+
pub trace_args: TraceArgs,
3234
pub detailed_resources: bool,
3335
pub execution_data_to_save: ExecutionDataToSave,
3436
}

crates/forge-runner/src/lib.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::coverage_api::run_coverage;
2-
use crate::debugging::TraceVerbosity;
3-
use crate::forge_config::{ExecutionDataToSave, ForgeConfig, TestRunnerConfig};
2+
use crate::forge_config::{ExecutionDataToSave, ForgeConfig};
43
use crate::running::{run_fuzz_test, run_test};
54
use crate::test_case_summary::TestCaseSummary;
65
use anyhow::Result;
@@ -110,7 +109,6 @@ pub fn run_for_test_case(
110109
forge_config: Arc<ForgeConfig>,
111110
versioned_program_path: Arc<Utf8PathBuf>,
112111
send: Sender<()>,
113-
trace_verbosity: Option<TraceVerbosity>,
114112
ui: &Arc<UI>,
115113
) -> JoinHandle<Result<AnyTestCaseSummary>> {
116114
if case.config.fuzzer_config.is_none() {
@@ -119,10 +117,9 @@ pub fn run_for_test_case(
119117
let res = run_test(
120118
case,
121119
casm_program,
122-
forge_config.test_runner_config.clone(),
120+
forge_config,
123121
versioned_program_path,
124122
send,
125-
trace_verbosity,
126123
ui,
127124
)
128125
.await?;
@@ -134,10 +131,9 @@ pub fn run_for_test_case(
134131
let res = run_with_fuzzing(
135132
case,
136133
casm_program,
137-
forge_config.test_runner_config.clone(),
134+
forge_config.clone(),
138135
versioned_program_path,
139136
send,
140-
trace_verbosity,
141137
ui,
142138
)
143139
.await??;
@@ -149,13 +145,13 @@ pub fn run_for_test_case(
149145
fn run_with_fuzzing(
150146
case: Arc<TestCaseWithResolvedConfig>,
151147
casm_program: Arc<AssembledProgramWithDebugInfo>,
152-
test_runner_config: Arc<TestRunnerConfig>,
148+
forge_config: Arc<ForgeConfig>,
153149
versioned_program_path: Arc<Utf8PathBuf>,
154150
send: Sender<()>,
155-
trace_verbosity: Option<TraceVerbosity>,
156151
ui: Arc<UI>,
157152
) -> JoinHandle<Result<TestCaseSummary<Fuzzing>>> {
158153
tokio::task::spawn(async move {
154+
let test_runner_config = &forge_config.test_runner_config;
159155
if send.is_closed() {
160156
return Ok(TestCaseSummary::Interrupted {});
161157
}
@@ -182,12 +178,11 @@ fn run_with_fuzzing(
182178
tasks.push(run_fuzz_test(
183179
case.clone(),
184180
casm_program.clone(),
185-
test_runner_config.clone(),
181+
forge_config.clone(),
186182
versioned_program_path.clone(),
187183
send.clone(),
188184
fuzzing_send.clone(),
189185
rng.clone(),
190-
trace_verbosity,
191186
ui,
192187
));
193188
}

crates/forge-runner/src/running.rs

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::backtrace::add_backtrace_footer;
2-
use crate::forge_config::{RuntimeConfig, TestRunnerConfig};
2+
use crate::forge_config::{ForgeConfig, RuntimeConfig};
33
use crate::gas::calculate_used_gas;
44
use crate::package_tests::with_config_resolved::{ResolvedForkConfig, TestCaseWithResolvedConfig};
55
use crate::test_case_summary::{Single, TestCaseSummary};
@@ -20,7 +20,6 @@ use cheatnet::forking::state::ForkStateReader;
2020
use cheatnet::runtime_extensions::call_to_blockifier_runtime_extension::CallToBlockifierExtension;
2121
use cheatnet::runtime_extensions::call_to_blockifier_runtime_extension::rpc::UsedResources;
2222
use cheatnet::runtime_extensions::cheatable_starknet_runtime_extension::CheatableStarknetRuntimeExtension;
23-
use cheatnet::runtime_extensions::forge_runtime_extension::contracts_data::ContractsData;
2423
use cheatnet::runtime_extensions::forge_runtime_extension::{
2524
ForgeExtension, ForgeRuntime, add_resources_to_top_call, get_all_used_resources,
2625
update_top_call_l1_resources, update_top_call_resources, update_top_call_vm_trace,
@@ -52,7 +51,7 @@ mod setup;
5251
mod syscall_handler;
5352
pub mod with_config;
5453

55-
use crate::debugging::{TraceVerbosity, build_debugging_trace};
54+
use crate::debugging::build_debugging_trace;
5655
pub use hints::hints_to_params;
5756
use setup::VmExecutionContext;
5857
pub use syscall_handler::has_segment_arena;
@@ -62,10 +61,9 @@ pub use syscall_handler::syscall_handler_offset;
6261
pub fn run_test(
6362
case: Arc<TestCaseWithResolvedConfig>,
6463
casm_program: Arc<AssembledProgramWithDebugInfo>,
65-
test_runner_config: Arc<TestRunnerConfig>,
64+
forge_config: Arc<ForgeConfig>,
6665
versioned_program_path: Arc<Utf8PathBuf>,
6766
send: Sender<()>,
68-
trace_verbosity: Option<TraceVerbosity>,
6967
ui: Arc<UI>,
7068
) -> JoinHandle<TestCaseSummary<Single>> {
7169
tokio::task::spawn_blocking(move || {
@@ -78,7 +76,7 @@ pub fn run_test(
7876
let run_result = run_test_case(
7977
&case,
8078
&casm_program,
81-
&RuntimeConfig::from(&test_runner_config),
79+
&RuntimeConfig::from(&forge_config.test_runner_config),
8280
None,
8381
);
8482

@@ -89,9 +87,8 @@ pub fn run_test(
8987
extract_test_case_summary(
9088
run_result,
9189
&case,
92-
&test_runner_config.contracts_data,
90+
&forge_config,
9391
&versioned_program_path,
94-
trace_verbosity,
9592
&ui,
9693
)
9794
})
@@ -101,12 +98,11 @@ pub fn run_test(
10198
pub(crate) fn run_fuzz_test(
10299
case: Arc<TestCaseWithResolvedConfig>,
103100
casm_program: Arc<AssembledProgramWithDebugInfo>,
104-
test_runner_config: Arc<TestRunnerConfig>,
101+
forge_config: Arc<ForgeConfig>,
105102
versioned_program_path: Arc<Utf8PathBuf>,
106103
send: Sender<()>,
107104
fuzzing_send: Sender<()>,
108105
rng: Arc<Mutex<StdRng>>,
109-
trace_verbosity: Option<TraceVerbosity>,
110106
ui: Arc<UI>,
111107
) -> JoinHandle<TestCaseSummary<Single>> {
112108
tokio::task::spawn_blocking(move || {
@@ -120,7 +116,7 @@ pub(crate) fn run_fuzz_test(
120116
let run_result = run_test_case(
121117
&case,
122118
&casm_program,
123-
&Arc::new(RuntimeConfig::from(&test_runner_config)),
119+
&RuntimeConfig::from(&forge_config.test_runner_config),
124120
Some(rng),
125121
);
126122

@@ -134,9 +130,8 @@ pub(crate) fn run_fuzz_test(
134130
extract_test_case_summary(
135131
run_result,
136132
&case,
137-
&test_runner_config.contracts_data,
133+
&forge_config,
138134
&versioned_program_path,
139-
trace_verbosity,
140135
&ui,
141136
)
142137
})
@@ -391,19 +386,20 @@ pub fn run_test_case(
391386
fn extract_test_case_summary(
392387
run_result: Result<RunResult>,
393388
case: &TestCaseWithResolvedConfig,
394-
contracts_data: &ContractsData,
389+
forge_config: &ForgeConfig,
395390
versioned_program_path: &Utf8Path,
396-
trace_verbosity: Option<TraceVerbosity>,
397391
ui: &UI,
398392
) -> TestCaseSummary<Single> {
393+
let contracts_data = &forge_config.test_runner_config.contracts_data;
394+
let trace_args = &forge_config.output_config.trace_args;
399395
match run_result {
400396
Ok(run_result) => match run_result {
401397
RunResult::Completed(run_completed) => TestCaseSummary::from_run_completed(
402398
*run_completed,
403399
case,
404400
contracts_data,
405401
versioned_program_path,
406-
trace_verbosity,
402+
trace_args,
407403
ui,
408404
),
409405
RunResult::Error(run_error) => {
@@ -431,7 +427,7 @@ fn extract_test_case_summary(
431427
debugging_trace: build_debugging_trace(
432428
&run_error.call_trace.borrow(),
433429
contracts_data,
434-
trace_verbosity,
430+
trace_args,
435431
case.name.clone(),
436432
&run_error.fork_data,
437433
),

crates/forge-runner/src/test_case_summary.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::backtrace::{add_backtrace_footer, get_backtrace, is_backtrace_enabled};
22
use crate::build_trace_data::build_profiler_call_trace;
3-
use crate::debugging::{TraceVerbosity, build_debugging_trace};
3+
use crate::debugging::{TraceArgs, build_debugging_trace};
44
use crate::expected_result::{ExpectedPanicValue, ExpectedTestResult};
55
use crate::gas::check_available_gas;
66
use crate::package_tests::with_config_resolved::TestCaseWithResolvedConfig;
@@ -324,15 +324,15 @@ impl TestCaseSummary<Single> {
324324
test_case: &TestCaseWithResolvedConfig,
325325
contracts_data: &ContractsData,
326326
versioned_program_path: &Utf8Path,
327-
trace_verbosity: Option<TraceVerbosity>,
327+
trace_args: &TraceArgs,
328328
ui: &UI,
329329
) -> Self {
330330
let name = test_case.name.clone();
331331

332332
let debugging_trace = build_debugging_trace(
333333
&call_trace.borrow(),
334334
contracts_data,
335-
trace_verbosity,
335+
trace_args,
336336
name.clone(),
337337
&fork_data,
338338
);

0 commit comments

Comments
 (0)