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