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 Workervoid 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 Workervoid 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 Workervoid 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 Workervoid 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 Workerint 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