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