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