benchmark/test/output_test_helper.cc
Go to the documentation of this file.
1 #include <cstdio>
2 #include <cstring>
3 #include <fstream>
4 #include <iostream>
5 #include <map>
6 #include <memory>
7 #include <random>
8 #include <sstream>
9 #include <streambuf>
10 
11 #include "../src/benchmark_api_internal.h"
12 #include "../src/check.h" // NOTE: check.h is for internal use only!
13 #include "../src/log.h" // NOTE: log.h is for internal use only
14 #include "../src/re.h" // NOTE: re.h is for internal use only
15 #include "output_test.h"
16 
17 // ========================================================================= //
18 // ------------------------------ Internals -------------------------------- //
19 // ========================================================================= //
20 namespace internal {
21 namespace {
22 
23 using TestCaseList = std::vector<TestCase>;
24 
25 // Use a vector because the order elements are added matters during iteration.
26 // std::map/unordered_map don't guarantee that.
27 // For example:
28 // SetSubstitutions({{"%HelloWorld", "Hello"}, {"%Hello", "Hi"}});
29 // Substitute("%HelloWorld") // Always expands to Hello.
30 using SubMap = std::vector<std::pair<std::string, std::string>>;
31 
32 TestCaseList& GetTestCaseList(TestCaseID ID) {
33  // Uses function-local statics to ensure initialization occurs
34  // before first use.
35  static TestCaseList lists[TC_NumID];
36  return lists[ID];
37 }
38 
39 SubMap& GetSubstitutions() {
40  // Don't use 'dec_re' from header because it may not yet be initialized.
41  // clang-format off
42  static std::string safe_dec_re = "[0-9]*[.]?[0-9]+([eE][-+][0-9]+)?";
43  static std::string time_re = "([0-9]+[.])?[0-9]+";
44  static std::string percentage_re = "[0-9]+[.][0-9]{2}";
45  static SubMap map = {
46  {"%float", "[0-9]*[.]?[0-9]+([eE][-+][0-9]+)?"},
47  // human-readable float
48  {"%hrfloat", "[0-9]*[.]?[0-9]+([eE][-+][0-9]+)?[kMGTPEZYmunpfazy]?"},
49  {"%percentage", percentage_re},
50  {"%int", "[ ]*[0-9]+"},
51  {" %s ", "[ ]+"},
52  {"%time", "[ ]*" + time_re + "[ ]+ns"},
53  {"%console_report", "[ ]*" + time_re + "[ ]+ns [ ]*" + time_re + "[ ]+ns [ ]*[0-9]+"},
54  {"%console_percentage_report", "[ ]*" + percentage_re + "[ ]+% [ ]*" + percentage_re + "[ ]+% [ ]*[0-9]+"},
55  {"%console_us_report", "[ ]*" + time_re + "[ ]+us [ ]*" + time_re + "[ ]+us [ ]*[0-9]+"},
56  {"%console_ms_report", "[ ]*" + time_re + "[ ]+ms [ ]*" + time_re + "[ ]+ms [ ]*[0-9]+"},
57  {"%console_s_report", "[ ]*" + time_re + "[ ]+s [ ]*" + time_re + "[ ]+s [ ]*[0-9]+"},
58  {"%console_time_only_report", "[ ]*" + time_re + "[ ]+ns [ ]*" + time_re + "[ ]+ns"},
59  {"%console_us_report", "[ ]*" + time_re + "[ ]+us [ ]*" + time_re + "[ ]+us [ ]*[0-9]+"},
60  {"%console_us_time_only_report", "[ ]*" + time_re + "[ ]+us [ ]*" + time_re + "[ ]+us"},
61  {"%csv_header",
62  "name,iterations,real_time,cpu_time,time_unit,bytes_per_second,"
63  "items_per_second,label,error_occurred,error_message"},
64  {"%csv_report", "[0-9]+," + safe_dec_re + "," + safe_dec_re + ",ns,,,,,"},
65  {"%csv_us_report", "[0-9]+," + safe_dec_re + "," + safe_dec_re + ",us,,,,,"},
66  {"%csv_ms_report", "[0-9]+," + safe_dec_re + "," + safe_dec_re + ",ms,,,,,"},
67  {"%csv_s_report", "[0-9]+," + safe_dec_re + "," + safe_dec_re + ",s,,,,,"},
68  {"%csv_bytes_report",
69  "[0-9]+," + safe_dec_re + "," + safe_dec_re + ",ns," + safe_dec_re + ",,,,"},
70  {"%csv_items_report",
71  "[0-9]+," + safe_dec_re + "," + safe_dec_re + ",ns,," + safe_dec_re + ",,,"},
72  {"%csv_bytes_items_report",
73  "[0-9]+," + safe_dec_re + "," + safe_dec_re + ",ns," + safe_dec_re +
74  "," + safe_dec_re + ",,,"},
75  {"%csv_label_report_begin", "[0-9]+," + safe_dec_re + "," + safe_dec_re + ",ns,,,"},
76  {"%csv_label_report_end", ",,"}};
77  // clang-format on
78  return map;
79 }
80 
81 std::string PerformSubstitutions(std::string source) {
82  SubMap const& subs = GetSubstitutions();
83  using SizeT = std::string::size_type;
84  for (auto const& KV : subs) {
85  SizeT pos;
86  SizeT next_start = 0;
87  while ((pos = source.find(KV.first, next_start)) != std::string::npos) {
88  next_start = pos + KV.second.size();
89  source.replace(pos, KV.first.size(), KV.second);
90  }
91  }
92  return source;
93 }
94 
95 void CheckCase(std::stringstream& remaining_output, TestCase const& TC,
96  TestCaseList const& not_checks) {
97  std::string first_line;
98  bool on_first = true;
100  while (remaining_output.eof() == false) {
101  BM_CHECK(remaining_output.good());
102  std::getline(remaining_output, line);
103  if (on_first) {
104  first_line = line;
105  on_first = false;
106  }
107  for (const auto& NC : not_checks) {
108  BM_CHECK(!NC.regex->Match(line))
109  << "Unexpected match for line \"" << line << "\" for MR_Not regex \""
110  << NC.regex_str << "\""
111  << "\n actual regex string \"" << TC.substituted_regex << "\""
112  << "\n started matching near: " << first_line;
113  }
114  if (TC.regex->Match(line)) return;
116  << "Expected line \"" << line << "\" to match regex \"" << TC.regex_str
117  << "\""
118  << "\n actual regex string \"" << TC.substituted_regex << "\""
119  << "\n started matching near: " << first_line;
120  }
121  BM_CHECK(remaining_output.eof() == false)
122  << "End of output reached before match for regex \"" << TC.regex_str
123  << "\" was found"
124  << "\n actual regex string \"" << TC.substituted_regex << "\""
125  << "\n started matching near: " << first_line;
126 }
127 
128 void CheckCases(TestCaseList const& checks, std::stringstream& output) {
129  std::vector<TestCase> not_checks;
130  for (size_t i = 0; i < checks.size(); ++i) {
131  const auto& TC = checks[i];
132  if (TC.match_rule == MR_Not) {
133  not_checks.push_back(TC);
134  continue;
135  }
136  CheckCase(output, TC, not_checks);
137  not_checks.clear();
138  }
139 }
140 
141 class TestReporter : public benchmark::BenchmarkReporter {
142  public:
143  TestReporter(std::vector<benchmark::BenchmarkReporter*> reps)
144  : reporters_(reps) {}
145 
146  virtual bool ReportContext(const Context& context) BENCHMARK_OVERRIDE {
147  bool last_ret = false;
148  bool first = true;
149  for (auto rep : reporters_) {
150  bool new_ret = rep->ReportContext(context);
151  BM_CHECK(first || new_ret == last_ret)
152  << "Reports return different values for ReportContext";
153  first = false;
154  last_ret = new_ret;
155  }
156  (void)first;
157  return last_ret;
158  }
159 
160  void ReportRuns(const std::vector<Run>& report) BENCHMARK_OVERRIDE {
161  for (auto rep : reporters_) rep->ReportRuns(report);
162  }
163  void Finalize() BENCHMARK_OVERRIDE {
164  for (auto rep : reporters_) rep->Finalize();
165  }
166 
167  private:
168  std::vector<benchmark::BenchmarkReporter*> reporters_;
169 };
170 } // namespace
171 
172 } // end namespace internal
173 
174 // ========================================================================= //
175 // -------------------------- Results checking ----------------------------- //
176 // ========================================================================= //
177 
178 namespace internal {
179 
180 // Utility class to manage subscribers for checking benchmark results.
181 // It works by parsing the CSV output to read the results.
183  public:
184  struct PatternAndFn : public TestCase { // reusing TestCase for its regexes
186  : TestCase(rx), fn(fn_) {}
188  };
189 
190  std::vector<PatternAndFn> check_patterns;
191  std::vector<Results> results;
192  std::vector<std::string> field_names;
193 
194  void Add(const std::string& entry_pattern, ResultsCheckFn fn);
195 
196  void CheckResults(std::stringstream& output);
197 
198  private:
199  void SetHeader_(const std::string& csv_header);
200  void SetValues_(const std::string& entry_csv_line);
201 
202  std::vector<std::string> SplitCsv_(const std::string& line);
203 };
204 
205 // store the static ResultsChecker in a function to prevent initialization
206 // order problems
208  static ResultsChecker rc;
209  return rc;
210 }
211 
212 // add a results checker for a benchmark
213 void ResultsChecker::Add(const std::string& entry_pattern, ResultsCheckFn fn) {
214  check_patterns.emplace_back(entry_pattern, fn);
215 }
216 
217 // check the results of all subscribed benchmarks
218 void ResultsChecker::CheckResults(std::stringstream& output) {
219  // first reset the stream to the start
220  {
221  auto start = std::stringstream::pos_type(0);
222  // clear before calling tellg()
223  output.clear();
224  // seek to zero only when needed
225  if (output.tellg() > start) output.seekg(start);
226  // and just in case
227  output.clear();
228  }
229  // now go over every line and publish it to the ResultsChecker
231  bool on_first = true;
232  while (output.eof() == false) {
233  BM_CHECK(output.good());
234  std::getline(output, line);
235  if (on_first) {
236  SetHeader_(line); // this is important
237  on_first = false;
238  continue;
239  }
240  SetValues_(line);
241  }
242  // finally we can call the subscribed check functions
243  for (const auto& p : check_patterns) {
244  BM_VLOG(2) << "--------------------------------\n";
245  BM_VLOG(2) << "checking for benchmarks matching " << p.regex_str << "...\n";
246  for (const auto& r : results) {
247  if (!p.regex->Match(r.name)) {
248  BM_VLOG(2) << p.regex_str << " is not matched by " << r.name << "\n";
249  continue;
250  } else {
251  BM_VLOG(2) << p.regex_str << " is matched by " << r.name << "\n";
252  }
253  BM_VLOG(1) << "Checking results of " << r.name << ": ... \n";
254  p.fn(r);
255  BM_VLOG(1) << "Checking results of " << r.name << ": OK.\n";
256  }
257  }
258 }
259 
260 // prepare for the names in this header
261 void ResultsChecker::SetHeader_(const std::string& csv_header) {
262  field_names = SplitCsv_(csv_header);
263 }
264 
265 // set the values for a benchmark
266 void ResultsChecker::SetValues_(const std::string& entry_csv_line) {
267  if (entry_csv_line.empty()) return; // some lines are empty
268  BM_CHECK(!field_names.empty());
269  auto vals = SplitCsv_(entry_csv_line);
270  BM_CHECK_EQ(vals.size(), field_names.size());
271  results.emplace_back(vals[0]); // vals[0] is the benchmark name
272  auto& entry = results.back();
273  for (size_t i = 1, e = vals.size(); i < e; ++i) {
274  entry.values[field_names[i]] = vals[i];
275  }
276 }
277 
278 // a quick'n'dirty csv splitter (eliminating quotes)
279 std::vector<std::string> ResultsChecker::SplitCsv_(const std::string& line) {
280  std::vector<std::string> out;
281  if (line.empty()) return out;
282  if (!field_names.empty()) out.reserve(field_names.size());
283  size_t prev = 0, pos = line.find_first_of(','), curr = pos;
284  while (pos != line.npos) {
285  BM_CHECK(curr > 0);
286  if (line[prev] == '"') ++prev;
287  if (line[curr - 1] == '"') --curr;
288  out.push_back(line.substr(prev, curr - prev));
289  prev = pos + 1;
290  pos = line.find_first_of(',', pos + 1);
291  curr = pos;
292  }
293  curr = line.size();
294  if (line[prev] == '"') ++prev;
295  if (line[curr - 1] == '"') --curr;
296  out.push_back(line.substr(prev, curr - prev));
297  return out;
298 }
299 
300 } // end namespace internal
301 
302 size_t AddChecker(const char* bm_name, ResultsCheckFn fn) {
303  auto& rc = internal::GetResultsChecker();
304  rc.Add(bm_name, fn);
305  return rc.results.size();
306 }
307 
308 int Results::NumThreads() const {
309  auto pos = name.find("/threads:");
310  if (pos == name.npos) return 1;
311  auto end = name.find('/', pos + 9);
312  std::stringstream ss;
313  ss << name.substr(pos + 9, end);
314  int num = 1;
315  ss >> num;
316  BM_CHECK(!ss.fail());
317  return num;
318 }
319 
320 double Results::NumIterations() const {
321  return GetAs<double>("iterations");
322 }
323 
326  const char* which_str = which == kCpuTime ? "cpu_time" : "real_time";
327  double val = GetAs<double>(which_str);
328  auto unit = Get("time_unit");
329  BM_CHECK(unit);
330  if (*unit == "ns") {
331  return val * 1.e-9;
332  } else if (*unit == "us") {
333  return val * 1.e-6;
334  } else if (*unit == "ms") {
335  return val * 1.e-3;
336  } else if (*unit == "s") {
337  return val;
338  } else {
339  BM_CHECK(1 == 0) << "unknown time unit: " << *unit;
340  return 0;
341  }
342 }
343 
344 // ========================================================================= //
345 // -------------------------- Public API Definitions------------------------ //
346 // ========================================================================= //
347 
349  : regex_str(std::move(re)),
350  match_rule(rule),
351  substituted_regex(internal::PerformSubstitutions(regex_str)),
352  regex(std::make_shared<benchmark::Regex>()) {
353  std::string err_str;
354  regex->Init(substituted_regex, &err_str);
355  BM_CHECK(err_str.empty())
356  << "Could not construct regex \"" << substituted_regex << "\""
357  << "\n originally \"" << regex_str << "\""
358  << "\n got error: " << err_str;
359 }
360 
361 int AddCases(TestCaseID ID, std::initializer_list<TestCase> il) {
362  auto& L = internal::GetTestCaseList(ID);
363  L.insert(L.end(), il);
364  return 0;
365 }
366 
368  std::initializer_list<std::pair<std::string, std::string>> il) {
369  auto& subs = internal::GetSubstitutions();
370  for (auto KV : il) {
371  bool exists = false;
372  KV.second = internal::PerformSubstitutions(KV.second);
373  for (auto& EKV : subs) {
374  if (EKV.first == KV.first) {
375  EKV.second = std::move(KV.second);
376  exists = true;
377  break;
378  }
379  }
380  if (!exists) subs.push_back(std::move(KV));
381  }
382  return 0;
383 }
384 
385 // Disable deprecated warnings temporarily because we need to reference
386 // CSVReporter but don't want to trigger -Werror=-Wdeprecated-declarations
387 #ifdef __GNUC__
388 #pragma GCC diagnostic push
389 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
390 #endif
391 void RunOutputTests(int argc, char* argv[]) {
392  using internal::GetTestCaseList;
393  benchmark::Initialize(&argc, argv);
394  auto options = benchmark::internal::GetOutputOptions(/*force_no_color*/ true);
398  struct ReporterTest {
399  const char* name;
400  std::vector<TestCase>& output_cases;
401  std::vector<TestCase>& error_cases;
403  std::stringstream out_stream;
404  std::stringstream err_stream;
405 
406  ReporterTest(const char* n, std::vector<TestCase>& out_tc,
407  std::vector<TestCase>& err_tc,
409  : name(n), output_cases(out_tc), error_cases(err_tc), reporter(br) {
410  reporter.SetOutputStream(&out_stream);
411  reporter.SetErrorStream(&err_stream);
412  }
413  } TestCases[] = {
414  {"ConsoleReporter", GetTestCaseList(TC_ConsoleOut),
415  GetTestCaseList(TC_ConsoleErr), CR},
416  {"JSONReporter", GetTestCaseList(TC_JSONOut), GetTestCaseList(TC_JSONErr),
417  JR},
418  {"CSVReporter", GetTestCaseList(TC_CSVOut), GetTestCaseList(TC_CSVErr),
419  CSVR},
420  };
421 
422  // Create the test reporter and run the benchmarks.
423  std::cout << "Running benchmarks...\n";
424  internal::TestReporter test_rep({&CR, &JR, &CSVR});
426 
427  for (auto& rep_test : TestCases) {
428  std::string msg = std::string("\nTesting ") + rep_test.name + " Output\n";
429  std::string banner(msg.size() - 1, '-');
430  std::cout << banner << msg << banner << "\n";
431 
432  std::cerr << rep_test.err_stream.str();
433  std::cout << rep_test.out_stream.str();
434 
435  internal::CheckCases(rep_test.error_cases, rep_test.err_stream);
436  internal::CheckCases(rep_test.output_cases, rep_test.out_stream);
437 
438  std::cout << "\n";
439  }
440 
441  // now that we know the output is as expected, we can dispatch
442  // the checks to subscribees.
443  auto& csv = TestCases[2];
444  // would use == but gcc spits a warning
445  BM_CHECK(std::strcmp(csv.name, "CSVReporter") == 0);
446  internal::GetResultsChecker().CheckResults(csv.out_stream);
447 }
448 
449 #ifdef __GNUC__
450 #pragma GCC diagnostic pop
451 #endif
452 
453 int SubstrCnt(const std::string& haystack, const std::string& pat) {
454  if (pat.length() == 0) return 0;
455  int count = 0;
456  for (size_t offset = haystack.find(pat); offset != std::string::npos;
457  offset = haystack.find(pat, offset + pat.length()))
458  ++count;
459  return count;
460 }
461 
462 static char ToHex(int ch) {
463  return ch < 10 ? static_cast<char>('0' + ch)
464  : static_cast<char>('a' + (ch - 10));
465 }
466 
467 static char RandomHexChar() {
468  static std::mt19937 rd{std::random_device{}()};
469  static std::uniform_int_distribution<int> mrand{0, 15};
470  return ToHex(mrand(rd));
471 }
472 
474  std::string model = "test.%%%%%%";
475  for (auto & ch : model) {
476  if (ch == '%')
477  ch = RandomHexChar();
478  }
479  return model;
480 }
481 
482 static bool FileExists(std::string const& name) {
483  std::ifstream in(name.c_str());
484  return in.good();
485 }
486 
488  // This function attempts to avoid race conditions where two tests
489  // create the same file at the same time. However, it still introduces races
490  // similar to tmpnam.
491  int retries = 3;
492  while (--retries) {
494  if (!FileExists(name))
495  return name;
496  }
497  std::cerr << "Failed to create unique temporary file name" << std::endl;
498  std::abort();
499 }
500 
501 std::string GetFileReporterOutput(int argc, char* argv[]) {
502  std::vector<char*> new_argv(argv, argv + argc);
503  assert(static_cast<decltype(new_argv)::size_type>(argc) == new_argv.size());
504 
505  std::string tmp_file_name = GetTempFileName();
506  std::cout << "Will be using this as the tmp file: " << tmp_file_name << '\n';
507 
508  std::string tmp = "--benchmark_out=";
509  tmp += tmp_file_name;
510  new_argv.emplace_back(const_cast<char*>(tmp.c_str()));
511 
512  argc = int(new_argv.size());
513 
514  benchmark::Initialize(&argc, new_argv.data());
516 
517  // Read the output back from the file, and delete the file.
518  std::ifstream tmp_stream(tmp_file_name);
519  std::string output = std::string((std::istreambuf_iterator<char>(tmp_stream)),
520  std::istreambuf_iterator<char>());
521  std::remove(tmp_file_name.c_str());
522 
523  return output;
524 }
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
benchmark::BenchmarkReporter::SetErrorStream
void SetErrorStream(std::ostream *err)
Definition: benchmark/include/benchmark/benchmark.h:1548
pos
int pos
Definition: libuv/docs/code/tty-gravity/main.c:11
Results::NumThreads
int NumThreads() const
Definition: benchmark/test/output_test_helper.cc:308
internal::ResultsChecker::PatternAndFn
Definition: benchmark/test/output_test_helper.cc:184
TC_NumID
@ TC_NumID
Definition: benchmark/test/output_test.h:48
benchmark
Definition: bm_alarm.cc:55
ResultsCheckFn
std::function< void(Results const &)> ResultsCheckFn
Definition: benchmark/test/output_test.h:85
internal::ResultsChecker
Definition: benchmark/test/output_test_helper.cc:182
TestCase::substituted_regex
std::string substituted_regex
Definition: benchmark/test/output_test.h:36
internal::ResultsChecker::check_patterns
std::vector< PatternAndFn > check_patterns
Definition: benchmark/test/output_test_helper.cc:190
benchmark::CSVReporter
Definition: bloaty/third_party/protobuf/third_party/benchmark/include/benchmark/benchmark.h:1171
BM_CHECK
#define BM_CHECK(b)
Definition: benchmark/src/check.h:58
options
double_dict options[]
Definition: capstone_test.c:55
TC_CSVErr
@ TC_CSVErr
Definition: benchmark/test/output_test.h:46
TestCase::regex_str
std::string regex_str
Definition: benchmark/test/output_test.h:34
MR_Next
@ MR_Next
Definition: benchmark/test/output_test.h:26
RandomHexChar
static char RandomHexChar()
Definition: benchmark/test/output_test_helper.cc:467
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
GetRandomFileName
static std::string GetRandomFileName()
Definition: benchmark/test/output_test_helper.cc:473
MR_Not
@ MR_Not
Definition: benchmark/test/output_test.h:27
TC_ConsoleErr
@ TC_ConsoleErr
Definition: benchmark/test/output_test.h:42
gen_header_frame.vals
list vals
Definition: gen_header_frame.py:73
setup.name
name
Definition: setup.py:542
AddCases
int AddCases(TestCaseID ID, std::initializer_list< TestCase > il)
Definition: benchmark/test/output_test_helper.cc:361
TC_CSVOut
@ TC_CSVOut
Definition: benchmark/test/output_test.h:45
TestCase::TestCase
TestCase(std::string re, int rule=MR_Default)
Definition: benchmark/test/output_test_helper.cc:348
TC_JSONOut
@ TC_JSONOut
Definition: benchmark/test/output_test.h:43
map
zval * map
Definition: php/ext/google/protobuf/encode_decode.c:480
output_test.h
TestCaseID
TestCaseID
Definition: benchmark/test/output_test.h:40
Results::NumIterations
double NumIterations() const
Definition: benchmark/test/output_test_helper.cc:320
benchmark::RunSpecifiedBenchmarks
size_t RunSpecifiedBenchmarks()
Definition: benchmark/src/benchmark.cc:437
in
const char * in
Definition: third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc:391
start
static uint64_t start
Definition: benchmark-pound.c:74
benchmark::internal::GetOutputOptions
ConsoleReporter::OutputOptions GetOutputOptions(bool force_no_color)
Definition: benchmark/src/benchmark.cc:411
AddChecker
size_t AddChecker(const char *bm_name, ResultsCheckFn fn)
Definition: benchmark/test/output_test_helper.cc:302
xds_interop_client.int
int
Definition: xds_interop_client.py:113
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
generate-asm-lcov.fn
fn
Definition: generate-asm-lcov.py:146
TestCase::regex
std::shared_ptr< benchmark::Regex > regex
Definition: benchmark/test/output_test.h:37
gmock_output_test.output
output
Definition: bloaty/third_party/googletest/googlemock/test/gmock_output_test.py:175
BENCHMARK_OVERRIDE
#define BENCHMARK_OVERRIDE
Definition: benchmark/include/benchmark/benchmark.h:271
internal::ResultsChecker::PatternAndFn::fn
ResultsCheckFn fn
Definition: benchmark/test/output_test_helper.cc:187
internal::ResultsChecker::Add
void Add(const std::string &entry_pattern, ResultsCheckFn fn)
Definition: benchmark/test/output_test_helper.cc:213
Results::kCpuTime
@ kCpuTime
Definition: benchmark/test/output_test.h:104
internal::ResultsChecker::SplitCsv_
std::vector< std::string > SplitCsv_(const std::string &line)
Definition: benchmark/test/output_test_helper.cc:279
GetTempFileName
static std::string GetTempFileName()
Definition: benchmark/test/output_test_helper.cc:487
internal::ResultsChecker::results
std::vector< Results > results
Definition: benchmark/test/output_test_helper.cc:191
python_utils.jobset.which
def which(filename)
Definition: jobset.py:157
internal::ResultsChecker::SetValues_
void SetValues_(const std::string &entry_csv_line)
Definition: benchmark/test/output_test_helper.cc:266
BM_VLOG
#define BM_VLOG(x)
Definition: third_party/benchmark/src/log.h:70
internal::ResultsChecker::PatternAndFn::PatternAndFn
PatternAndFn(const std::string &rx, ResultsCheckFn fn_)
Definition: benchmark/test/output_test_helper.cc:185
benchmark::Initialize
void Initialize(int *argc, char **argv)
Definition: benchmark/src/benchmark.cc:602
TestCase
Definition: benchmark/test/output_test.h:31
benchmark::ConsoleReporter
Definition: benchmark/include/benchmark/benchmark.h:1571
SubstrCnt
int SubstrCnt(const std::string &haystack, const std::string &pat)
Definition: benchmark/test/output_test_helper.cc:453
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
reporters_
std::vector< benchmark::BenchmarkReporter * > reporters_
Definition: benchmark/test/output_test_helper.cc:168
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
TC_ConsoleOut
@ TC_ConsoleOut
Definition: benchmark/test/output_test.h:41
benchmark::BenchmarkReporter::SetOutputStream
void SetOutputStream(std::ostream *out)
Definition: benchmark/include/benchmark/benchmark.h:1541
BM_CHECK_EQ
#define BM_CHECK_EQ(a, b)
Definition: benchmark/src/check.h:68
TC_JSONErr
@ TC_JSONErr
Definition: benchmark/test/output_test.h:44
internal::GetResultsChecker
ResultsChecker & GetResultsChecker()
Definition: benchmark/test/output_test_helper.cc:207
internal::ResultsChecker::SetHeader_
void SetHeader_(const std::string &csv_header)
Definition: benchmark/test/output_test_helper.cc:261
Results::kRealTime
@ kRealTime
Definition: benchmark/test/output_test.h:104
benchmark::BenchmarkReporter
Definition: benchmark/include/benchmark/benchmark.h:1412
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
absl::variant_internal::SizeT
std::integral_constant< std::size_t, I > SizeT
Definition: abseil-cpp/absl/types/internal/variant.h:127
RunOutputTests
void RunOutputTests(int argc, char *argv[])
Definition: benchmark/test/output_test_helper.cc:391
L
lua_State * L
Definition: upb/upb/bindings/lua/main.c:35
fix_build_deps.r
r
Definition: fix_build_deps.py:491
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
first
StrT first
Definition: cxa_demangle.cpp:4884
GetFileReporterOutput
std::string GetFileReporterOutput(int argc, char *argv[])
Definition: benchmark/test/output_test_helper.cc:501
xds_manager.num
num
Definition: xds_manager.py:56
regen-readme.line
line
Definition: regen-readme.py:30
rep
const CordRep * rep
Definition: cord_analysis.cc:53
FileExists
static bool FileExists(std::string const &name)
Definition: benchmark/test/output_test_helper.cc:482
TestCase::match_rule
int match_rule
Definition: benchmark/test/output_test.h:35
internal
Definition: benchmark/test/output_test_helper.cc:20
internal::ResultsChecker::CheckResults
void CheckResults(std::stringstream &output)
Definition: benchmark/test/output_test_helper.cc:218
context
grpc::ClientContext context
Definition: istio_echo_server_lib.cc:61
ToHex
static char ToHex(int ch)
Definition: benchmark/test/output_test_helper.cc:462
Results::name
std::string name
Definition: benchmark/test/output_test.h:94
internal::ResultsChecker::field_names
std::vector< std::string > field_names
Definition: benchmark/test/output_test_helper.cc:192
ch
char ch
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3621
autogen_x86imm.tmp
tmp
Definition: autogen_x86imm.py:12
Results::GetTime
double GetTime(BenchmarkTime which) const
Definition: benchmark/test/output_test_helper.cc:324
Results::Get
const std::string * Get(const char *entry_name) const
Definition: benchmark/test/output_test.h:122
subs
template_param_type subs
Definition: cxa_demangle.cpp:4906
Results::BenchmarkTime
BenchmarkTime
Definition: benchmark/test/output_test.h:104
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
offset
voidpf uLong offset
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:142
SetSubstitutions
int SetSubstitutions(std::initializer_list< std::pair< std::string, std::string >> il)
Definition: benchmark/test/output_test_helper.cc:367
benchmark::JSONReporter
Definition: benchmark/include/benchmark/benchmark.h:1599


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:36