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) && !defined(TEST_HAS_NO_EXCEPTIONS)
30   try {
31     state.PauseTiming();
32     std::abort();
33   } catch (std::logic_error const&) {
34   }
35   try {
36     state.ResumeTiming();
37     std::abort();
38   } catch (std::logic_error const&) {
39   }
40 #else
41   (void)state;  // avoid unused warning
42 #endif
43 }
44 
BM_diagnostic_test(benchmark::State & state)45 void BM_diagnostic_test(benchmark::State& state) {
46   static bool called_once = false;
47 
48   if (called_once == false) try_invalid_pause_resume(state);
49 
50   for (auto _ : state) {
51     benchmark::DoNotOptimize(state.iterations());
52   }
53 
54   if (called_once == false) try_invalid_pause_resume(state);
55 
56   called_once = true;
57 }
58 BENCHMARK(BM_diagnostic_test);
59 
60 
BM_diagnostic_test_keep_running(benchmark::State & state)61 void BM_diagnostic_test_keep_running(benchmark::State& state) {
62   static bool called_once = false;
63 
64   if (called_once == false) try_invalid_pause_resume(state);
65 
66   while(state.KeepRunning()) {
67     benchmark::DoNotOptimize(state.iterations());
68   }
69 
70   if (called_once == false) try_invalid_pause_resume(state);
71 
72   called_once = true;
73 }
74 BENCHMARK(BM_diagnostic_test_keep_running);
75 
main(int argc,char * argv[])76 int main(int argc, char* argv[]) {
77   benchmark::internal::GetAbortHandler() = &TestHandler;
78   benchmark::Initialize(&argc, argv);
79   benchmark::RunSpecifiedBenchmarks();
80 }
81