Index: third_party/google_benchmark/test/diagnostics_test.cc |
diff --git a/third_party/google_benchmark/test/diagnostics_test.cc b/third_party/google_benchmark/test/diagnostics_test.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1046730b0fc1c477287c6181e920d0e9879d9695 |
--- /dev/null |
+++ b/third_party/google_benchmark/test/diagnostics_test.cc |
@@ -0,0 +1,64 @@ |
+// Testing: |
+// State::PauseTiming() |
+// State::ResumeTiming() |
+// Test that CHECK's within these function diagnose when they are called |
+// outside of the KeepRunning() loop. |
+// |
+// NOTE: Users should NOT include or use src/check.h. This is only done in |
+// order to test library internals. |
+ |
+#include <cstdlib> |
+#include <stdexcept> |
+ |
+#include "../src/check.h" |
+#include "benchmark/benchmark_api.h" |
+ |
+#if defined(__GNUC__) && !defined(__EXCEPTIONS) |
+#define TEST_HAS_NO_EXCEPTIONS |
+#endif |
+ |
+void TestHandler() { |
+#ifndef TEST_HAS_NO_EXCEPTIONS |
+ throw std::logic_error(""); |
+#else |
+ std::abort(); |
+#endif |
+} |
+ |
+void try_invalid_pause_resume(benchmark::State& state) { |
+#if !defined(TEST_BENCHMARK_LIBRARY_HAS_NO_ASSERTIONS) && !defined(TEST_HAS_NO_EXCEPTIONS) |
+ try { |
+ state.PauseTiming(); |
+ std::abort(); |
+ } catch (std::logic_error const&) { |
+ } |
+ try { |
+ state.ResumeTiming(); |
+ std::abort(); |
+ } catch (std::logic_error const&) { |
+ } |
+#else |
+ (void)state; // avoid unused warning |
+#endif |
+} |
+ |
+void BM_diagnostic_test(benchmark::State& state) { |
+ static bool called_once = false; |
+ |
+ if (called_once == false) try_invalid_pause_resume(state); |
+ |
+ while (state.KeepRunning()) { |
+ benchmark::DoNotOptimize(state.iterations()); |
+ } |
+ |
+ if (called_once == false) try_invalid_pause_resume(state); |
+ |
+ called_once = true; |
+} |
+BENCHMARK(BM_diagnostic_test); |
+ |
+int main(int argc, char* argv[]) { |
+ benchmark::internal::GetAbortHandler() = &TestHandler; |
+ benchmark::Initialize(&argc, argv); |
+ benchmark::RunSpecifiedBenchmarks(); |
+} |