Skip to content

Commit acded0d

Browse files
authored
Do not instantiate Program for each test case run separately when fuzzing (#3827)
Correct me if I am wrong, but it seems we recreate the same test case program multiple times when fuzzing. When run with `snforge test --workspace --features fuzzing --fuzzer-runs 500 ` on OZ: Before: 272.79s After: 208.78s
1 parent 1767475 commit acded0d

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

crates/forge-runner/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,12 @@ fn run_with_fuzzing(
176176

177177
let mut tasks = FuturesUnordered::new();
178178

179+
let program = case.try_into_program(&casm_program)?;
180+
179181
for _ in 1..=fuzzer_runs.get() {
180182
tasks.push(run_fuzz_test(
181183
case.clone(),
184+
program.clone(),
182185
casm_program.clone(),
183186
forge_config.clone(),
184187
versioned_program_path.clone(),

crates/forge-runner/src/running.rs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use blockifier::execution::entry_point_execution::{
1313
use blockifier::execution::errors::EntryPointExecutionError;
1414
use blockifier::state::cached_state::CachedState;
1515
use cairo_vm::Felt252;
16+
use cairo_vm::types::program::Program;
1617
use cairo_vm::vm::errors::cairo_run_errors::CairoRunError;
1718
use cairo_vm::vm::errors::vm_errors::VirtualMachineError;
1819
use camino::{Utf8Path, Utf8PathBuf};
@@ -74,13 +75,17 @@ pub fn run_test(
7475
if send.is_closed() {
7576
return TestCaseSummary::Interrupted {};
7677
}
77-
let run_result = run_test_case(
78-
&case,
79-
&casm_program,
80-
&RuntimeConfig::from(&forge_config.test_runner_config),
81-
None,
82-
&versioned_program_path,
83-
);
78+
79+
let run_result = case.try_into_program(&casm_program).and_then(|program| {
80+
run_test_case(
81+
&case,
82+
&program,
83+
&casm_program,
84+
&RuntimeConfig::from(&forge_config.test_runner_config),
85+
None,
86+
&versioned_program_path,
87+
)
88+
});
8489

8590
if send.is_closed() {
8691
return TestCaseSummary::Interrupted {};
@@ -91,8 +96,10 @@ pub fn run_test(
9196
}
9297

9398
#[tracing::instrument(skip_all, level = "debug")]
99+
#[allow(clippy::too_many_arguments)]
94100
pub(crate) fn run_fuzz_test(
95101
case: Arc<TestCaseWithResolvedConfig>,
102+
program: Program,
96103
casm_program: Arc<AssembledProgramWithDebugInfo>,
97104
forge_config: Arc<ForgeConfig>,
98105
versioned_program_path: Arc<Utf8PathBuf>,
@@ -107,9 +114,9 @@ pub(crate) fn run_fuzz_test(
107114
if send.is_closed() | fuzzing_send.is_closed() {
108115
return TestCaseSummary::Interrupted {};
109116
}
110-
111117
let run_result = run_test_case(
112118
&case,
119+
&program,
113120
&casm_program,
114121
&RuntimeConfig::from(&forge_config.test_runner_config),
115122
Some(rng),
@@ -159,14 +166,14 @@ pub enum RunResult {
159166
#[tracing::instrument(skip_all, level = "debug")]
160167
pub fn run_test_case(
161168
case: &TestCaseWithResolvedConfig,
169+
program: &Program,
162170
casm_program: &AssembledProgramWithDebugInfo,
163171
runtime_config: &RuntimeConfig,
164172
fuzzer_rng: Option<Arc<Mutex<StdRng>>>,
165173
versioned_program_path: &Utf8Path,
166174
) -> Result<RunResult> {
167-
let program = case.try_into_program(casm_program)?;
168175
let (call, entry_point) =
169-
setup::build_test_call_and_entry_point(&case.test_details, casm_program, &program);
176+
setup::build_test_call_and_entry_point(&case.test_details, casm_program, program);
170177

171178
let mut state_reader = ExtendedStateReader {
172179
dict_state_reader: cheatnet_constants::build_testing_state(),
@@ -199,7 +206,7 @@ pub fn run_test_case(
199206
} = setup::initialize_execution_context(
200207
call.clone(),
201208
&hints,
202-
&program,
209+
program,
203210
&mut cached_state,
204211
&mut context,
205212
)?;

0 commit comments

Comments
 (0)