xref: /aosp_15_r20/external/google-benchmark/test/spec_arg_test.cc (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
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 Worker static 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 Worker static 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 Worker int 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