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