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