annotate libcxx/utils/google-benchmark/test/diagnostics_test.cc @ 167:e037d1dd7369

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