1a8c51b3fSopenharmony_ci#include <cassert> 2a8c51b3fSopenharmony_ci#include <climits> 3a8c51b3fSopenharmony_ci#include <cmath> 4a8c51b3fSopenharmony_ci#include <cstdlib> 5a8c51b3fSopenharmony_ci#include <cstring> 6a8c51b3fSopenharmony_ci#include <iostream> 7a8c51b3fSopenharmony_ci#include <string> 8a8c51b3fSopenharmony_ci#include <vector> 9a8c51b3fSopenharmony_ci 10a8c51b3fSopenharmony_ci#include "benchmark/benchmark.h" 11a8c51b3fSopenharmony_ci 12a8c51b3fSopenharmony_ci// Tests that we can specify the min time with 13a8c51b3fSopenharmony_ci// --benchmark_min_time=<NUM> (no suffix needed) OR 14a8c51b3fSopenharmony_ci// --benchmark_min_time=<NUM>s 15a8c51b3fSopenharmony_cinamespace { 16a8c51b3fSopenharmony_ci 17a8c51b3fSopenharmony_ci// This is from benchmark.h 18a8c51b3fSopenharmony_citypedef int64_t IterationCount; 19a8c51b3fSopenharmony_ci 20a8c51b3fSopenharmony_ciclass TestReporter : public benchmark::ConsoleReporter { 21a8c51b3fSopenharmony_ci public: 22a8c51b3fSopenharmony_ci virtual bool ReportContext(const Context& context) BENCHMARK_OVERRIDE { 23a8c51b3fSopenharmony_ci return ConsoleReporter::ReportContext(context); 24a8c51b3fSopenharmony_ci }; 25a8c51b3fSopenharmony_ci 26a8c51b3fSopenharmony_ci virtual void ReportRuns(const std::vector<Run>& report) BENCHMARK_OVERRIDE { 27a8c51b3fSopenharmony_ci assert(report.size() == 1); 28a8c51b3fSopenharmony_ci ConsoleReporter::ReportRuns(report); 29a8c51b3fSopenharmony_ci }; 30a8c51b3fSopenharmony_ci 31a8c51b3fSopenharmony_ci virtual void ReportRunsConfig(double min_time, bool /* has_explicit_iters */, 32a8c51b3fSopenharmony_ci IterationCount /* iters */) BENCHMARK_OVERRIDE { 33a8c51b3fSopenharmony_ci min_times_.push_back(min_time); 34a8c51b3fSopenharmony_ci } 35a8c51b3fSopenharmony_ci 36a8c51b3fSopenharmony_ci TestReporter() {} 37a8c51b3fSopenharmony_ci 38a8c51b3fSopenharmony_ci virtual ~TestReporter() {} 39a8c51b3fSopenharmony_ci 40a8c51b3fSopenharmony_ci const std::vector<double>& GetMinTimes() const { return min_times_; } 41a8c51b3fSopenharmony_ci 42a8c51b3fSopenharmony_ci private: 43a8c51b3fSopenharmony_ci std::vector<double> min_times_; 44a8c51b3fSopenharmony_ci}; 45a8c51b3fSopenharmony_ci 46a8c51b3fSopenharmony_cibool AlmostEqual(double a, double b) { 47a8c51b3fSopenharmony_ci return std::fabs(a - b) < std::numeric_limits<double>::epsilon(); 48a8c51b3fSopenharmony_ci} 49a8c51b3fSopenharmony_ci 50a8c51b3fSopenharmony_civoid DoTestHelper(int* argc, const char** argv, double expected) { 51a8c51b3fSopenharmony_ci benchmark::Initialize(argc, const_cast<char**>(argv)); 52a8c51b3fSopenharmony_ci 53a8c51b3fSopenharmony_ci TestReporter test_reporter; 54a8c51b3fSopenharmony_ci const size_t returned_count = 55a8c51b3fSopenharmony_ci benchmark::RunSpecifiedBenchmarks(&test_reporter, "BM_MyBench"); 56a8c51b3fSopenharmony_ci assert(returned_count == 1); 57a8c51b3fSopenharmony_ci 58a8c51b3fSopenharmony_ci // Check the min_time 59a8c51b3fSopenharmony_ci const std::vector<double>& min_times = test_reporter.GetMinTimes(); 60a8c51b3fSopenharmony_ci assert(!min_times.empty() && AlmostEqual(min_times[0], expected)); 61a8c51b3fSopenharmony_ci} 62a8c51b3fSopenharmony_ci 63a8c51b3fSopenharmony_ci} // end namespace 64a8c51b3fSopenharmony_ci 65a8c51b3fSopenharmony_cistatic void BM_MyBench(benchmark::State& state) { 66a8c51b3fSopenharmony_ci for (auto s : state) { 67a8c51b3fSopenharmony_ci } 68a8c51b3fSopenharmony_ci} 69a8c51b3fSopenharmony_ciBENCHMARK(BM_MyBench); 70a8c51b3fSopenharmony_ci 71a8c51b3fSopenharmony_ciint main(int argc, char** argv) { 72a8c51b3fSopenharmony_ci // Make a fake argv and append the new --benchmark_min_time=<foo> to it. 73a8c51b3fSopenharmony_ci int fake_argc = argc + 1; 74a8c51b3fSopenharmony_ci const char** fake_argv = new const char*[static_cast<size_t>(fake_argc)]; 75a8c51b3fSopenharmony_ci 76a8c51b3fSopenharmony_ci for (int i = 0; i < argc; ++i) fake_argv[i] = argv[i]; 77a8c51b3fSopenharmony_ci 78a8c51b3fSopenharmony_ci const char* no_suffix = "--benchmark_min_time=4"; 79a8c51b3fSopenharmony_ci const char* with_suffix = "--benchmark_min_time=4.0s"; 80a8c51b3fSopenharmony_ci double expected = 4.0; 81a8c51b3fSopenharmony_ci 82a8c51b3fSopenharmony_ci fake_argv[argc] = no_suffix; 83a8c51b3fSopenharmony_ci DoTestHelper(&fake_argc, fake_argv, expected); 84a8c51b3fSopenharmony_ci 85a8c51b3fSopenharmony_ci fake_argv[argc] = with_suffix; 86a8c51b3fSopenharmony_ci DoTestHelper(&fake_argc, fake_argv, expected); 87a8c51b3fSopenharmony_ci 88a8c51b3fSopenharmony_ci delete[] fake_argv; 89a8c51b3fSopenharmony_ci return 0; 90a8c51b3fSopenharmony_ci} 91