xref: /aosp_15_r20/external/libcxx/utils/google-benchmark/test/diagnostics_test.cc (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker // Testing:
2*58b9f456SAndroid Build Coastguard Worker //   State::PauseTiming()
3*58b9f456SAndroid Build Coastguard Worker //   State::ResumeTiming()
4*58b9f456SAndroid Build Coastguard Worker // Test that CHECK's within these function diagnose when they are called
5*58b9f456SAndroid Build Coastguard Worker // outside of the KeepRunning() loop.
6*58b9f456SAndroid Build Coastguard Worker //
7*58b9f456SAndroid Build Coastguard Worker // NOTE: Users should NOT include or use src/check.h. This is only done in
8*58b9f456SAndroid Build Coastguard Worker // order to test library internals.
9*58b9f456SAndroid Build Coastguard Worker 
10*58b9f456SAndroid Build Coastguard Worker #include <cstdlib>
11*58b9f456SAndroid Build Coastguard Worker #include <stdexcept>
12*58b9f456SAndroid Build Coastguard Worker 
13*58b9f456SAndroid Build Coastguard Worker #include "../src/check.h"
14*58b9f456SAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
15*58b9f456SAndroid Build Coastguard Worker 
16*58b9f456SAndroid Build Coastguard Worker #if defined(__GNUC__) && !defined(__EXCEPTIONS)
17*58b9f456SAndroid Build Coastguard Worker #define TEST_HAS_NO_EXCEPTIONS
18*58b9f456SAndroid Build Coastguard Worker #endif
19*58b9f456SAndroid Build Coastguard Worker 
TestHandler()20*58b9f456SAndroid Build Coastguard Worker void TestHandler() {
21*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_HAS_NO_EXCEPTIONS
22*58b9f456SAndroid Build Coastguard Worker   throw std::logic_error("");
23*58b9f456SAndroid Build Coastguard Worker #else
24*58b9f456SAndroid Build Coastguard Worker   std::abort();
25*58b9f456SAndroid Build Coastguard Worker #endif
26*58b9f456SAndroid Build Coastguard Worker }
27*58b9f456SAndroid Build Coastguard Worker 
try_invalid_pause_resume(benchmark::State & state)28*58b9f456SAndroid Build Coastguard Worker void try_invalid_pause_resume(benchmark::State& state) {
29*58b9f456SAndroid Build Coastguard Worker #if !defined(TEST_BENCHMARK_LIBRARY_HAS_NO_ASSERTIONS) && !defined(TEST_HAS_NO_EXCEPTIONS)
30*58b9f456SAndroid Build Coastguard Worker   try {
31*58b9f456SAndroid Build Coastguard Worker     state.PauseTiming();
32*58b9f456SAndroid Build Coastguard Worker     std::abort();
33*58b9f456SAndroid Build Coastguard Worker   } catch (std::logic_error const&) {
34*58b9f456SAndroid Build Coastguard Worker   }
35*58b9f456SAndroid Build Coastguard Worker   try {
36*58b9f456SAndroid Build Coastguard Worker     state.ResumeTiming();
37*58b9f456SAndroid Build Coastguard Worker     std::abort();
38*58b9f456SAndroid Build Coastguard Worker   } catch (std::logic_error const&) {
39*58b9f456SAndroid Build Coastguard Worker   }
40*58b9f456SAndroid Build Coastguard Worker #else
41*58b9f456SAndroid Build Coastguard Worker   (void)state;  // avoid unused warning
42*58b9f456SAndroid Build Coastguard Worker #endif
43*58b9f456SAndroid Build Coastguard Worker }
44*58b9f456SAndroid Build Coastguard Worker 
BM_diagnostic_test(benchmark::State & state)45*58b9f456SAndroid Build Coastguard Worker void BM_diagnostic_test(benchmark::State& state) {
46*58b9f456SAndroid Build Coastguard Worker   static bool called_once = false;
47*58b9f456SAndroid Build Coastguard Worker 
48*58b9f456SAndroid Build Coastguard Worker   if (called_once == false) try_invalid_pause_resume(state);
49*58b9f456SAndroid Build Coastguard Worker 
50*58b9f456SAndroid Build Coastguard Worker   for (auto _ : state) {
51*58b9f456SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(state.iterations());
52*58b9f456SAndroid Build Coastguard Worker   }
53*58b9f456SAndroid Build Coastguard Worker 
54*58b9f456SAndroid Build Coastguard Worker   if (called_once == false) try_invalid_pause_resume(state);
55*58b9f456SAndroid Build Coastguard Worker 
56*58b9f456SAndroid Build Coastguard Worker   called_once = true;
57*58b9f456SAndroid Build Coastguard Worker }
58*58b9f456SAndroid Build Coastguard Worker BENCHMARK(BM_diagnostic_test);
59*58b9f456SAndroid Build Coastguard Worker 
60*58b9f456SAndroid Build Coastguard Worker 
BM_diagnostic_test_keep_running(benchmark::State & state)61*58b9f456SAndroid Build Coastguard Worker void BM_diagnostic_test_keep_running(benchmark::State& state) {
62*58b9f456SAndroid Build Coastguard Worker   static bool called_once = false;
63*58b9f456SAndroid Build Coastguard Worker 
64*58b9f456SAndroid Build Coastguard Worker   if (called_once == false) try_invalid_pause_resume(state);
65*58b9f456SAndroid Build Coastguard Worker 
66*58b9f456SAndroid Build Coastguard Worker   while(state.KeepRunning()) {
67*58b9f456SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(state.iterations());
68*58b9f456SAndroid Build Coastguard Worker   }
69*58b9f456SAndroid Build Coastguard Worker 
70*58b9f456SAndroid Build Coastguard Worker   if (called_once == false) try_invalid_pause_resume(state);
71*58b9f456SAndroid Build Coastguard Worker 
72*58b9f456SAndroid Build Coastguard Worker   called_once = true;
73*58b9f456SAndroid Build Coastguard Worker }
74*58b9f456SAndroid Build Coastguard Worker BENCHMARK(BM_diagnostic_test_keep_running);
75*58b9f456SAndroid Build Coastguard Worker 
main(int argc,char * argv[])76*58b9f456SAndroid Build Coastguard Worker int main(int argc, char* argv[]) {
77*58b9f456SAndroid Build Coastguard Worker   benchmark::internal::GetAbortHandler() = &TestHandler;
78*58b9f456SAndroid Build Coastguard Worker   benchmark::Initialize(&argc, argv);
79*58b9f456SAndroid Build Coastguard Worker   benchmark::RunSpecifiedBenchmarks();
80*58b9f456SAndroid Build Coastguard Worker }
81