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