Skip to content

Commit b671576

Browse files
authored
chore(forge): simplify run_tests, reduce parallel tasks (#7283)
1 parent 4a91072 commit b671576

File tree

1 file changed

+47
-43
lines changed

1 file changed

+47
-43
lines changed

crates/forge/src/runner.rs

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -253,58 +253,62 @@ impl<'a> ContractRunner<'a> {
253253
)
254254
}
255255

256-
let functions: Vec<_> = self.contract.functions().collect();
257-
let mut test_results = functions
258-
.par_iter()
259-
.filter(|&&func| func.is_test() && filter.matches_test(&func.signature()))
260-
.map(|&func| {
261-
let should_fail = func.is_test_fail();
262-
let res = if func.is_fuzz_test() {
263-
let runner = test_options.fuzz_runner(self.name, &func.name);
264-
let fuzz_config = test_options.fuzz_config(self.name, &func.name);
265-
self.run_fuzz_test(func, should_fail, runner, setup.clone(), *fuzz_config)
266-
} else {
267-
self.run_test(func, should_fail, setup.clone())
268-
};
269-
(func.signature(), res)
270-
})
271-
.collect::<BTreeMap<_, _>>();
256+
// Filter out functions sequentially since it's very fast and there is no need to do it
257+
// in parallel.
258+
let find_timer = Instant::now();
259+
let functions = self
260+
.contract
261+
.functions()
262+
.filter(|func| func.is_test() || func.is_invariant_test())
263+
.map(|func| (func.signature(), func))
264+
.filter(|(sig, _func)| filter.matches_test(sig))
265+
.collect::<Vec<_>>();
266+
let find_time = find_timer.elapsed();
267+
debug!(
268+
"Found {} test functions out of {} in {:?}",
269+
functions.len(),
270+
self.contract.functions().count(),
271+
find_time,
272+
);
272273

273-
if has_invariants {
274-
let identified_contracts = load_contracts(setup.traces.clone(), known_contracts);
275-
let results: Vec<_> = functions
276-
.par_iter()
277-
.filter(|&&func| func.is_invariant_test() && filter.matches_test(&func.signature()))
278-
.map(|&func| {
274+
let identified_contracts =
275+
has_invariants.then(|| load_contracts(setup.traces.clone(), known_contracts));
276+
let test_results = functions
277+
.into_par_iter()
278+
.map(|(sig, func)| {
279+
let setup = setup.clone();
280+
let should_fail = func.is_test_fail();
281+
let res = if func.is_invariant_test() {
279282
let runner = test_options.invariant_runner(self.name, &func.name);
280283
let invariant_config = test_options.invariant_config(self.name, &func.name);
281-
let res = self.run_invariant_test(
284+
self.run_invariant_test(
282285
runner,
283-
setup.clone(),
286+
setup,
284287
*invariant_config,
285288
func,
286289
known_contracts,
287-
&identified_contracts,
288-
);
289-
(func.signature(), res)
290-
})
291-
.collect();
292-
test_results.extend(results);
293-
}
290+
identified_contracts.as_ref().unwrap(),
291+
)
292+
} else if func.is_fuzz_test() {
293+
let runner = test_options.fuzz_runner(self.name, &func.name);
294+
let fuzz_config = test_options.fuzz_config(self.name, &func.name);
295+
self.run_fuzz_test(func, should_fail, runner, setup, *fuzz_config)
296+
} else {
297+
self.run_test(func, should_fail, setup)
298+
};
299+
(sig, res)
300+
})
301+
.collect::<BTreeMap<_, _>>();
294302

295303
let duration = start.elapsed();
296-
if !test_results.is_empty() {
297-
let successful =
298-
test_results.iter().filter(|(_, tst)| tst.status == TestStatus::Success).count();
299-
info!(
300-
duration = ?duration,
301-
"done. {}/{} successful",
302-
successful,
303-
test_results.len()
304-
);
305-
}
306-
307-
SuiteResult::new(duration, test_results, warnings)
304+
let suite_result = SuiteResult::new(duration, test_results, warnings);
305+
info!(
306+
duration=?suite_result.duration,
307+
"done. {}/{} successful",
308+
suite_result.passed(),
309+
suite_result.test_results.len()
310+
);
311+
suite_result
308312
}
309313

310314
/// Runs a single test

0 commit comments

Comments
 (0)