1a8c51b3fSopenharmony_ci#include <algorithm> 2a8c51b3fSopenharmony_ci#include <cassert> 3a8c51b3fSopenharmony_ci#include <cstdint> 4a8c51b3fSopenharmony_ci#include <cstdlib> 5a8c51b3fSopenharmony_ci#include <cstring> 6a8c51b3fSopenharmony_ci#include <iostream> 7a8c51b3fSopenharmony_ci#include <limits> 8a8c51b3fSopenharmony_ci#include <string> 9a8c51b3fSopenharmony_ci#include <vector> 10a8c51b3fSopenharmony_ci 11a8c51b3fSopenharmony_ci#include "benchmark/benchmark.h" 12a8c51b3fSopenharmony_ci 13a8c51b3fSopenharmony_ci// Tests that we can override benchmark-spec value from FLAGS_benchmark_filter 14a8c51b3fSopenharmony_ci// with argument to RunSpecifiedBenchmarks(...). 15a8c51b3fSopenharmony_ci 16a8c51b3fSopenharmony_cinamespace { 17a8c51b3fSopenharmony_ci 18a8c51b3fSopenharmony_ciclass TestReporter : public benchmark::ConsoleReporter { 19a8c51b3fSopenharmony_ci public: 20a8c51b3fSopenharmony_ci bool ReportContext(const Context& context) override { 21a8c51b3fSopenharmony_ci return ConsoleReporter::ReportContext(context); 22a8c51b3fSopenharmony_ci }; 23a8c51b3fSopenharmony_ci 24a8c51b3fSopenharmony_ci void ReportRuns(const std::vector<Run>& report) override { 25a8c51b3fSopenharmony_ci assert(report.size() == 1); 26a8c51b3fSopenharmony_ci matched_functions.push_back(report[0].run_name.function_name); 27a8c51b3fSopenharmony_ci ConsoleReporter::ReportRuns(report); 28a8c51b3fSopenharmony_ci }; 29a8c51b3fSopenharmony_ci 30a8c51b3fSopenharmony_ci TestReporter() {} 31a8c51b3fSopenharmony_ci 32a8c51b3fSopenharmony_ci ~TestReporter() override {} 33a8c51b3fSopenharmony_ci 34a8c51b3fSopenharmony_ci const std::vector<std::string>& GetMatchedFunctions() const { 35a8c51b3fSopenharmony_ci return matched_functions; 36a8c51b3fSopenharmony_ci } 37a8c51b3fSopenharmony_ci 38a8c51b3fSopenharmony_ci private: 39a8c51b3fSopenharmony_ci std::vector<std::string> matched_functions; 40a8c51b3fSopenharmony_ci}; 41a8c51b3fSopenharmony_ci 42a8c51b3fSopenharmony_ci} // end namespace 43a8c51b3fSopenharmony_ci 44a8c51b3fSopenharmony_cistatic void BM_NotChosen(benchmark::State& state) { 45a8c51b3fSopenharmony_ci assert(false && "SHOULD NOT BE CALLED"); 46a8c51b3fSopenharmony_ci for (auto _ : state) { 47a8c51b3fSopenharmony_ci } 48a8c51b3fSopenharmony_ci} 49a8c51b3fSopenharmony_ciBENCHMARK(BM_NotChosen); 50a8c51b3fSopenharmony_ci 51a8c51b3fSopenharmony_cistatic void BM_Chosen(benchmark::State& state) { 52a8c51b3fSopenharmony_ci for (auto _ : state) { 53a8c51b3fSopenharmony_ci } 54a8c51b3fSopenharmony_ci} 55a8c51b3fSopenharmony_ciBENCHMARK(BM_Chosen); 56a8c51b3fSopenharmony_ci 57a8c51b3fSopenharmony_ciint main(int argc, char** argv) { 58a8c51b3fSopenharmony_ci const std::string flag = "BM_NotChosen"; 59a8c51b3fSopenharmony_ci 60a8c51b3fSopenharmony_ci // Verify that argv specify --benchmark_filter=BM_NotChosen. 61a8c51b3fSopenharmony_ci bool found = false; 62a8c51b3fSopenharmony_ci for (int i = 0; i < argc; ++i) { 63a8c51b3fSopenharmony_ci if (strcmp("--benchmark_filter=BM_NotChosen", argv[i]) == 0) { 64a8c51b3fSopenharmony_ci found = true; 65a8c51b3fSopenharmony_ci break; 66a8c51b3fSopenharmony_ci } 67a8c51b3fSopenharmony_ci } 68a8c51b3fSopenharmony_ci assert(found); 69a8c51b3fSopenharmony_ci 70a8c51b3fSopenharmony_ci benchmark::Initialize(&argc, argv); 71a8c51b3fSopenharmony_ci 72a8c51b3fSopenharmony_ci // Check that the current flag value is reported accurately via the 73a8c51b3fSopenharmony_ci // GetBenchmarkFilter() function. 74a8c51b3fSopenharmony_ci if (flag != benchmark::GetBenchmarkFilter()) { 75a8c51b3fSopenharmony_ci std::cerr 76a8c51b3fSopenharmony_ci << "Seeing different value for flags. GetBenchmarkFilter() returns [" 77a8c51b3fSopenharmony_ci << benchmark::GetBenchmarkFilter() << "] expected flag=[" << flag 78a8c51b3fSopenharmony_ci << "]\n"; 79a8c51b3fSopenharmony_ci return 1; 80a8c51b3fSopenharmony_ci } 81a8c51b3fSopenharmony_ci TestReporter test_reporter; 82a8c51b3fSopenharmony_ci const char* const spec = "BM_Chosen"; 83a8c51b3fSopenharmony_ci const size_t returned_count = 84a8c51b3fSopenharmony_ci benchmark::RunSpecifiedBenchmarks(&test_reporter, spec); 85a8c51b3fSopenharmony_ci assert(returned_count == 1); 86a8c51b3fSopenharmony_ci const std::vector<std::string> matched_functions = 87a8c51b3fSopenharmony_ci test_reporter.GetMatchedFunctions(); 88a8c51b3fSopenharmony_ci assert(matched_functions.size() == 1); 89a8c51b3fSopenharmony_ci if (strcmp(spec, matched_functions.front().c_str()) != 0) { 90a8c51b3fSopenharmony_ci std::cerr << "Expected benchmark [" << spec << "] to run, but got [" 91a8c51b3fSopenharmony_ci << matched_functions.front() << "]\n"; 92a8c51b3fSopenharmony_ci return 2; 93a8c51b3fSopenharmony_ci } 94a8c51b3fSopenharmony_ci 95a8c51b3fSopenharmony_ci // Test that SetBenchmarkFilter works. 96a8c51b3fSopenharmony_ci const std::string golden_value = "golden_value"; 97a8c51b3fSopenharmony_ci benchmark::SetBenchmarkFilter(golden_value); 98a8c51b3fSopenharmony_ci std::string current_value = benchmark::GetBenchmarkFilter(); 99a8c51b3fSopenharmony_ci if (golden_value != current_value) { 100a8c51b3fSopenharmony_ci std::cerr << "Expected [" << golden_value 101a8c51b3fSopenharmony_ci << "] for --benchmark_filter but got [" << current_value << "]\n"; 102a8c51b3fSopenharmony_ci return 3; 103a8c51b3fSopenharmony_ci } 104a8c51b3fSopenharmony_ci return 0; 105a8c51b3fSopenharmony_ci} 106