Skip to content

Commit 2f7fd2e

Browse files
committed
add StaticBenchAsTestFn and DynBenchAsTestFn to convert benches to tests
Before this commit, both static and dynamic benches were converted to a DynTestFn, with a boxed closure that ran the benchmarks exactly once. While this worked, it conflicted with -Z panic-abort-tests as the flag does not support dynamic tests. With this change, a StaticBenchFn is converted to a StaticBenchAsTestFn, avoiding any dynamic test creation. DynBenchFn is also converted to DynBenchAsTestFn for completeness.
1 parent fa451fe commit 2f7fd2e

File tree

3 files changed

+23
-19
lines changed

3 files changed

+23
-19
lines changed

library/test/src/console.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ pub fn list_tests_console(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> io::Res
199199
let TestDescAndFn { desc, testfn } = test;
200200

201201
let fntype = match testfn {
202-
StaticTestFn(..) | DynTestFn(..) => {
202+
StaticTestFn(..) | DynTestFn(..) | StaticBenchAsTestFn(..) | DynBenchAsTestFn(..) => {
203203
st.tests += 1;
204204
"test"
205205
}

library/test/src/lib.rs

+4-18
Original file line numberDiff line numberDiff line change
@@ -240,16 +240,6 @@ impl FilteredTests {
240240
self.tests.push((TestId(self.next_id), test));
241241
self.next_id += 1;
242242
}
243-
fn add_bench_as_test(
244-
&mut self,
245-
desc: TestDesc,
246-
benchfn: impl Fn(&mut Bencher) -> Result<(), String> + Send + 'static,
247-
) {
248-
let testfn = DynTestFn(Box::new(move || {
249-
bench::run_once(|b| __rust_begin_short_backtrace(|| benchfn(b)))
250-
}));
251-
self.add_test(desc, testfn);
252-
}
253243
fn total_len(&self) -> usize {
254244
self.tests.len() + self.benches.len()
255245
}
@@ -307,14 +297,14 @@ where
307297
if opts.bench_benchmarks {
308298
filtered.add_bench(desc, DynBenchFn(benchfn));
309299
} else {
310-
filtered.add_bench_as_test(desc, benchfn);
300+
filtered.add_test(desc, DynBenchAsTestFn(benchfn));
311301
}
312302
}
313303
StaticBenchFn(benchfn) => {
314304
if opts.bench_benchmarks {
315305
filtered.add_bench(desc, StaticBenchFn(benchfn));
316306
} else {
317-
filtered.add_bench_as_test(desc, benchfn);
307+
filtered.add_test(desc, StaticBenchAsTestFn(benchfn));
318308
}
319309
}
320310
testfn => {
@@ -525,12 +515,8 @@ pub fn convert_benchmarks_to_tests(tests: Vec<TestDescAndFn>) -> Vec<TestDescAnd
525515
.into_iter()
526516
.map(|x| {
527517
let testfn = match x.testfn {
528-
DynBenchFn(benchfn) => DynTestFn(Box::new(move || {
529-
bench::run_once(|b| __rust_begin_short_backtrace(|| benchfn(b)))
530-
})),
531-
StaticBenchFn(benchfn) => DynTestFn(Box::new(move || {
532-
bench::run_once(|b| __rust_begin_short_backtrace(|| benchfn(b)))
533-
})),
518+
DynBenchFn(benchfn) => DynBenchAsTestFn(benchfn),
519+
StaticBenchFn(benchfn) => StaticBenchAsTestFn(benchfn),
534520
f => f,
535521
};
536522
TestDescAndFn { desc: x.desc, testfn }

library/test/src/types.rs

+18
Original file line numberDiff line numberDiff line change
@@ -85,26 +85,32 @@ impl fmt::Display for TestName {
8585
pub enum TestFn {
8686
StaticTestFn(fn() -> Result<(), String>),
8787
StaticBenchFn(fn(&mut Bencher) -> Result<(), String>),
88+
StaticBenchAsTestFn(fn(&mut Bencher) -> Result<(), String>),
8889
DynTestFn(Box<dyn FnOnce() -> Result<(), String> + Send>),
8990
DynBenchFn(Box<dyn Fn(&mut Bencher) -> Result<(), String> + Send>),
91+
DynBenchAsTestFn(Box<dyn Fn(&mut Bencher) -> Result<(), String> + Send>),
9092
}
9193

9294
impl TestFn {
9395
pub fn padding(&self) -> NamePadding {
9496
match *self {
9597
StaticTestFn(..) => PadNone,
9698
StaticBenchFn(..) => PadOnRight,
99+
StaticBenchAsTestFn(..) => PadNone,
97100
DynTestFn(..) => PadNone,
98101
DynBenchFn(..) => PadOnRight,
102+
DynBenchAsTestFn(..) => PadNone,
99103
}
100104
}
101105

102106
pub(crate) fn into_runnable(self) -> Runnable {
103107
match self {
104108
StaticTestFn(f) => Runnable::Test(RunnableTest::Static(f)),
105109
StaticBenchFn(f) => Runnable::Bench(RunnableBench::Static(f)),
110+
StaticBenchAsTestFn(f) => Runnable::Test(RunnableTest::StaticBenchAsTest(f)),
106111
DynTestFn(f) => Runnable::Test(RunnableTest::Dynamic(f)),
107112
DynBenchFn(f) => Runnable::Bench(RunnableBench::Dynamic(f)),
113+
DynBenchAsTestFn(f) => Runnable::Test(RunnableTest::DynamicBenchAsTest(f)),
108114
}
109115
}
110116
}
@@ -114,8 +120,10 @@ impl fmt::Debug for TestFn {
114120
f.write_str(match *self {
115121
StaticTestFn(..) => "StaticTestFn(..)",
116122
StaticBenchFn(..) => "StaticBenchFn(..)",
123+
StaticBenchAsTestFn(..) => "StaticBenchAsTestFn(..)",
117124
DynTestFn(..) => "DynTestFn(..)",
118125
DynBenchFn(..) => "DynBenchFn(..)",
126+
DynBenchAsTestFn(..) => "DynBenchAsTestFn(..)",
119127
})
120128
}
121129
}
@@ -128,20 +136,30 @@ pub(crate) enum Runnable {
128136
pub(crate) enum RunnableTest {
129137
Static(fn() -> Result<(), String>),
130138
Dynamic(Box<dyn FnOnce() -> Result<(), String> + Send>),
139+
StaticBenchAsTest(fn(&mut Bencher) -> Result<(), String>),
140+
DynamicBenchAsTest(Box<dyn Fn(&mut Bencher) -> Result<(), String> + Send>),
131141
}
132142

133143
impl RunnableTest {
134144
pub(crate) fn run(self) -> Result<(), String> {
135145
match self {
136146
RunnableTest::Static(f) => __rust_begin_short_backtrace(f),
137147
RunnableTest::Dynamic(f) => __rust_begin_short_backtrace(f),
148+
RunnableTest::StaticBenchAsTest(f) => {
149+
crate::bench::run_once(|b| __rust_begin_short_backtrace(|| f(b)))
150+
}
151+
RunnableTest::DynamicBenchAsTest(f) => {
152+
crate::bench::run_once(|b| __rust_begin_short_backtrace(|| f(b)))
153+
}
138154
}
139155
}
140156

141157
pub(crate) fn is_dynamic(&self) -> bool {
142158
match self {
143159
RunnableTest::Static(_) => false,
160+
RunnableTest::StaticBenchAsTest(_) => false,
144161
RunnableTest::Dynamic(_) => true,
162+
RunnableTest::DynamicBenchAsTest(_) => true,
145163
}
146164
}
147165
}

0 commit comments

Comments
 (0)