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
20void TestHandler() {
21#ifndef TEST_HAS_NO_EXCEPTIONS
22 throw std::logic_error("");
23#else
24 std::abort();
25#endif
26}
27
28void try_invalid_pause_resume(benchmark::State& state) {
29#if !defined(TEST_BENCHMARK_LIBRARY_HAS_NO_ASSERTIONS) && \
30 !defined(TEST_HAS_NO_EXCEPTIONS)
31 try {
32 state.PauseTiming();
33 std::abort();
34 } catch (std::logic_error const&) {
35 }
36 try {
37 state.ResumeTiming();
38 std::abort();
39 } catch (std::logic_error const&) {
40 }
41#else
42 (void)state; // avoid unused warning
43#endif
44}
45
46void BM_diagnostic_test(benchmark::State& state) {
47 static bool called_once = false;
48
49 if (called_once == false) try_invalid_pause_resume(state);
50
51 for (auto _ : state) {
52 auto iterations = double(state.iterations()) * double(state.iterations());
53 benchmark::DoNotOptimize(value&: iterations);
54 }
55
56 if (called_once == false) try_invalid_pause_resume(state);
57
58 called_once = true;
59}
60BENCHMARK(BM_diagnostic_test);
61
62void BM_diagnostic_test_keep_running(benchmark::State& state) {
63 static bool called_once = false;
64
65 if (called_once == false) try_invalid_pause_resume(state);
66
67 while (state.KeepRunning()) {
68 auto iterations = double(state.iterations()) * double(state.iterations());
69 benchmark::DoNotOptimize(value&: iterations);
70 }
71
72 if (called_once == false) try_invalid_pause_resume(state);
73
74 called_once = true;
75}
76BENCHMARK(BM_diagnostic_test_keep_running);
77
78int main(int argc, char* argv[]) {
79#ifdef NDEBUG
80 // This test is exercising functionality for debug builds, which are not
81 // available in release builds. Skip the test if we are in that environment
82 // to avoid a test failure.
83 std::cout << "Diagnostic test disabled in release build" << std::endl;
84 (void)argc;
85 (void)argv;
86#else
87 benchmark::internal::GetAbortHandler() = &TestHandler;
88 benchmark::Initialize(argc: &argc, argv);
89 benchmark::RunSpecifiedBenchmarks();
90#endif
91}
92

source code of third-party/benchmark/test/diagnostics_test.cc