Skip to content

Commit 07c5295

Browse files
authored
Use debugging in forge without a feature flag (#3289)
Related #3164 commit-id:fb008c1d --- **Stack**: - #3319 - #3318 - #3289⚠️ *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 51b1ec1 commit 07c5295

File tree

13 files changed

+177
-31
lines changed

13 files changed

+177
-31
lines changed

crates/forge-runner/Cargo.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,3 @@ universal-sierra-compiler-api = { path = "../universal-sierra-compiler-api" }
4646
which.workspace = true
4747
sanitize-filename.workspace = true
4848
clap.workspace = true
49-
50-
[features]
51-
debugging = []

crates/forge-runner/src/debugging.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use cheatnet::runtime_extensions::forge_runtime_extension::contracts_data::ContractsData;
2+
use cheatnet::state::CallTrace;
3+
use clap::ValueEnum;
4+
5+
/// Trace verbosity level.
6+
#[derive(ValueEnum, Debug, Clone, Copy)]
7+
pub enum TraceVerbosity {
8+
/// Display test name, contract name and selector.
9+
Minimal,
10+
/// Display test name, contract name, selector, calldata and call result.
11+
Standard,
12+
/// Display everything.
13+
Detailed,
14+
}
15+
16+
impl From<TraceVerbosity> for debugging::Verbosity {
17+
fn from(verbosity: TraceVerbosity) -> Self {
18+
match verbosity {
19+
TraceVerbosity::Minimal => debugging::Verbosity::Minimal,
20+
TraceVerbosity::Standard => debugging::Verbosity::Standard,
21+
TraceVerbosity::Detailed => debugging::Verbosity::Detailed,
22+
}
23+
}
24+
}
25+
26+
#[must_use]
27+
pub fn build_debugging_trace(
28+
call_trace: &CallTrace,
29+
contracts_data: &ContractsData,
30+
trace_verbosity: Option<TraceVerbosity>,
31+
test_name: String,
32+
) -> Option<debugging::Trace> {
33+
Some(debugging::Trace::new(
34+
call_trace,
35+
contracts_data,
36+
trace_verbosity?.into(),
37+
test_name,
38+
))
39+
}

crates/forge-runner/src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::coverage_api::run_coverage;
2+
use crate::debugging::TraceVerbosity;
23
use crate::forge_config::{ExecutionDataToSave, ForgeConfig, TestRunnerConfig};
34
use crate::running::{run_fuzz_test, run_test};
45
use crate::test_case_summary::TestCaseSummary;
@@ -33,6 +34,7 @@ pub mod test_case_summary;
3334
pub mod test_target_summary;
3435

3536
pub mod backtrace;
37+
pub mod debugging;
3638
mod gas;
3739
pub mod printing;
3840
pub mod running;
@@ -103,6 +105,7 @@ pub fn run_for_test_case(
103105
forge_config: Arc<ForgeConfig>,
104106
versioned_program_path: Arc<Utf8PathBuf>,
105107
send: Sender<()>,
108+
trace_verbosity: Option<TraceVerbosity>,
106109
) -> JoinHandle<Result<AnyTestCaseSummary>> {
107110
if case.config.fuzzer_config.is_none() {
108111
tokio::task::spawn(async move {
@@ -112,6 +115,7 @@ pub fn run_for_test_case(
112115
forge_config.test_runner_config.clone(),
113116
versioned_program_path,
114117
send,
118+
trace_verbosity,
115119
)
116120
.await?;
117121
Ok(AnyTestCaseSummary::Single(res))
@@ -124,6 +128,7 @@ pub fn run_for_test_case(
124128
forge_config.test_runner_config.clone(),
125129
versioned_program_path,
126130
send,
131+
trace_verbosity,
127132
)
128133
.await??;
129134
Ok(AnyTestCaseSummary::Fuzzing(res))
@@ -137,6 +142,7 @@ fn run_with_fuzzing(
137142
test_runner_config: Arc<TestRunnerConfig>,
138143
versioned_program_path: Arc<Utf8PathBuf>,
139144
send: Sender<()>,
145+
trace_verbosity: Option<TraceVerbosity>,
140146
) -> JoinHandle<Result<TestCaseSummary<Fuzzing>>> {
141147
tokio::task::spawn(async move {
142148
if send.is_closed() {
@@ -169,6 +175,7 @@ fn run_with_fuzzing(
169175
send.clone(),
170176
fuzzing_send.clone(),
171177
rng.clone(),
178+
trace_verbosity,
172179
));
173180
}
174181

crates/forge-runner/src/running.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ mod hints;
6262
mod syscall_handler;
6363
pub mod with_config;
6464

65+
use crate::debugging::{TraceVerbosity, build_debugging_trace};
6566
use crate::running::syscall_handler::build_syscall_handler;
6667
pub use syscall_handler::has_segment_arena;
6768
pub use syscall_handler::syscall_handler_offset;
@@ -73,6 +74,7 @@ pub fn run_test(
7374
test_runner_config: Arc<TestRunnerConfig>,
7475
versioned_program_path: Arc<Utf8PathBuf>,
7576
send: Sender<()>,
77+
trace_verbosity: Option<TraceVerbosity>,
7678
) -> JoinHandle<TestCaseSummary<Single>> {
7779
tokio::task::spawn_blocking(move || {
7880
// Due to the inability of spawn_blocking to be abruptly cancelled,
@@ -100,10 +102,12 @@ pub fn run_test(
100102
&case,
101103
&test_runner_config.contracts_data,
102104
&versioned_program_path,
105+
trace_verbosity,
103106
)
104107
})
105108
}
106109

110+
#[expect(clippy::too_many_arguments)]
107111
pub(crate) fn run_fuzz_test(
108112
case: Arc<TestCaseWithResolvedConfig>,
109113
casm_program: Arc<AssembledProgramWithDebugInfo>,
@@ -112,6 +116,7 @@ pub(crate) fn run_fuzz_test(
112116
send: Sender<()>,
113117
fuzzing_send: Sender<()>,
114118
rng: Arc<Mutex<StdRng>>,
119+
trace_verbosity: Option<TraceVerbosity>,
115120
) -> JoinHandle<TestCaseSummary<Single>> {
116121
tokio::task::spawn_blocking(move || {
117122
// Due to the inability of spawn_blocking to be abruptly cancelled,
@@ -140,6 +145,7 @@ pub(crate) fn run_fuzz_test(
140145
&case,
141146
&test_runner_config.contracts_data,
142147
&versioned_program_path,
148+
trace_verbosity,
143149
)
144150
})
145151
}
@@ -413,6 +419,7 @@ fn extract_test_case_summary(
413419
case: &TestCaseWithResolvedConfig,
414420
contracts_data: &ContractsData,
415421
versioned_program_path: &Utf8Path,
422+
trace_verbosity: Option<TraceVerbosity>,
416423
) -> TestCaseSummary<Single> {
417424
match run_result {
418425
Ok(run_result) => match run_result {
@@ -421,6 +428,7 @@ fn extract_test_case_summary(
421428
case,
422429
contracts_data,
423430
versioned_program_path,
431+
trace_verbosity,
424432
),
425433
RunResult::Error(run_error) => {
426434
let mut message = format!(
@@ -444,14 +452,12 @@ fn extract_test_case_summary(
444452
}),
445453
fuzzer_args: run_error.fuzzer_args,
446454
test_statistics: (),
447-
debugging_trace: cfg!(feature = "debugging").then(|| {
448-
debugging::Trace::new(
449-
&run_error.call_trace.borrow(),
450-
contracts_data,
451-
debugging::Verbosity::Detailed,
452-
case.name.clone(),
453-
)
454-
}),
455+
debugging_trace: build_debugging_trace(
456+
&run_error.call_trace.borrow(),
457+
contracts_data,
458+
trace_verbosity,
459+
case.name.clone(),
460+
),
455461
}
456462
}
457463
},

crates/forge-runner/src/test_case_summary.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +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};
34
use crate::expected_result::{ExpectedPanicValue, ExpectedTestResult};
45
use crate::gas::check_available_gas;
56
use crate::package_tests::with_config_resolved::TestCaseWithResolvedConfig;
@@ -320,17 +321,16 @@ impl TestCaseSummary<Single> {
320321
test_case: &TestCaseWithResolvedConfig,
321322
contracts_data: &ContractsData,
322323
versioned_program_path: &Utf8Path,
324+
trace_verbosity: Option<TraceVerbosity>,
323325
) -> Self {
324326
let name = test_case.name.clone();
325327

326-
let debugging_trace = cfg!(feature = "debugging").then(|| {
327-
debugging::Trace::new(
328-
&call_trace.borrow(),
329-
contracts_data,
330-
debugging::Verbosity::Detailed,
331-
name.clone(),
332-
)
333-
});
328+
let debugging_trace = build_debugging_trace(
329+
&call_trace.borrow(),
330+
contracts_data,
331+
trace_verbosity,
332+
name.clone(),
333+
);
334334

335335
match status {
336336
RunStatus::Success(data) => match &test_case.config.expected_result {

crates/forge/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ smoke = []
1010
scarb_2_9_1 = []
1111
scarb_since_2_10 = []
1212
no_scarb_installed = []
13-
debugging = ["forge_runner/debugging"]
13+
debugging = []
1414
assert_non_exact_gas = ["test_utils/assert_non_exact_gas"]
1515
supports-panic-backtrace = []
1616

crates/forge/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use camino::Utf8PathBuf;
55
use clap::{CommandFactory, Parser, Subcommand, ValueEnum};
66
use derive_more::Display;
77
use forge_runner::CACHE_DIR;
8+
use forge_runner::debugging::TraceVerbosity;
89
use forge_runner::forge_config::ForgeTrackedResource;
910
use run_tests::workspace::run_for_workspace;
1011
use scarb_api::{ScarbCommand, metadata::MetadataCommandExt};
@@ -140,6 +141,11 @@ enum ColorOption {
140141
pub struct TestArgs {
141142
/// Name used to filter tests
142143
test_filter: Option<String>,
144+
145+
/// Trace verbosity level
146+
#[arg(long)]
147+
trace_verbosity: Option<TraceVerbosity>,
148+
143149
/// Use exact matches for `test_filter`
144150
#[arg(short, long)]
145151
exact: bool,

crates/forge/src/run_tests/package.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use anyhow::Result;
2222
use camino::{Utf8Path, Utf8PathBuf};
2323
use cheatnet::runtime_extensions::forge_runtime_extension::contracts_data::ContractsData;
2424
use configuration::load_package_config;
25+
use forge_runner::debugging::TraceVerbosity;
2526
use forge_runner::{
2627
forge_config::ForgeConfig,
2728
package_tests::{raw::TestTargetRaw, with_config_resolved::TestTargetWithResolvedConfig},
@@ -133,6 +134,7 @@ pub async fn run_for_package(
133134
package_name,
134135
}: RunForPackageArgs,
135136
block_number_map: &mut BlockNumberMap,
137+
trace_verbosity: Option<TraceVerbosity>,
136138
) -> Result<Vec<TestTargetSummary>> {
137139
let mut test_targets = test_package_with_config_resolved(
138140
test_targets,
@@ -163,7 +165,8 @@ pub async fn run_for_package(
163165

164166
let forge_config = forge_config.clone();
165167

166-
let summary = run_for_test_target(test_target, forge_config, &tests_filter).await?;
168+
let summary =
169+
run_for_test_target(test_target, forge_config, &tests_filter, trace_verbosity).await?;
167170

168171
match summary {
169172
TestTargetRunResult::Ok(summary) => {

crates/forge/src/run_tests/test_target.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use anyhow::Result;
2+
use forge_runner::debugging::TraceVerbosity;
23
use forge_runner::{
34
TestCaseFilter,
45
forge_config::ForgeConfig,
@@ -23,6 +24,7 @@ pub async fn run_for_test_target(
2324
tests: TestTargetWithResolvedConfig,
2425
forge_config: Arc<ForgeConfig>,
2526
tests_filter: &impl TestCaseFilter,
27+
trace_verbosity: Option<TraceVerbosity>,
2628
) -> Result<TestTargetRunResult> {
2729
let casm_program = tests.casm_program.clone();
2830

@@ -55,6 +57,7 @@ pub async fn run_for_test_target(
5557
forge_config.clone(),
5658
tests.sierra_program_path.clone(),
5759
send.clone(),
60+
trace_verbosity,
5861
));
5962
}
6063

crates/forge/src/run_tests/workspace.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ pub async fn run_for_workspace(args: TestArgs) -> Result<ExitStatus> {
6969

7070
let workspace_root = &scarb_metadata.workspace.root;
7171
let cache_dir = workspace_root.join(CACHE_DIR);
72+
let trace_verbosity = args.trace_verbosity;
7273

7374
for package in packages {
7475
env::set_current_dir(&package.root)?;
@@ -81,7 +82,8 @@ pub async fn run_for_workspace(args: TestArgs) -> Result<ExitStatus> {
8182
&artifacts_dir_path,
8283
)?;
8384

84-
let tests_file_summaries = run_for_package(args, &mut block_number_map).await?;
85+
let tests_file_summaries =
86+
run_for_package(args, &mut block_number_map, trace_verbosity).await?;
8587

8688
all_failed_tests.extend(extract_failed_tests(tests_file_summaries));
8789
}

crates/forge/test_utils/src/running_tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ pub fn run_test_case(
8080
fork_targets: vec![],
8181
},
8282
&mut BlockNumberMap::default(),
83+
Option::default(),
8384
))
8485
.expect("Runner fail")
8586
}

0 commit comments

Comments
 (0)