1a8c51b3fSopenharmony_ci#include <queue> 2a8c51b3fSopenharmony_ci#include <string> 3a8c51b3fSopenharmony_ci#include <vector> 4a8c51b3fSopenharmony_ci 5a8c51b3fSopenharmony_ci#include "../src/commandlineflags.h" 6a8c51b3fSopenharmony_ci#include "../src/string_util.h" 7a8c51b3fSopenharmony_ci#include "benchmark/benchmark.h" 8a8c51b3fSopenharmony_ci#include "gmock/gmock.h" 9a8c51b3fSopenharmony_ci#include "gtest/gtest.h" 10a8c51b3fSopenharmony_ci 11a8c51b3fSopenharmony_cinamespace benchmark { 12a8c51b3fSopenharmony_ci 13a8c51b3fSopenharmony_ciBM_DECLARE_bool(benchmark_enable_random_interleaving); 14a8c51b3fSopenharmony_ciBM_DECLARE_string(benchmark_filter); 15a8c51b3fSopenharmony_ciBM_DECLARE_int32(benchmark_repetitions); 16a8c51b3fSopenharmony_ci 17a8c51b3fSopenharmony_cinamespace internal { 18a8c51b3fSopenharmony_cinamespace { 19a8c51b3fSopenharmony_ci 20a8c51b3fSopenharmony_ciclass EventQueue : public std::queue<std::string> { 21a8c51b3fSopenharmony_ci public: 22a8c51b3fSopenharmony_ci void Put(const std::string& event) { push(event); } 23a8c51b3fSopenharmony_ci 24a8c51b3fSopenharmony_ci void Clear() { 25a8c51b3fSopenharmony_ci while (!empty()) { 26a8c51b3fSopenharmony_ci pop(); 27a8c51b3fSopenharmony_ci } 28a8c51b3fSopenharmony_ci } 29a8c51b3fSopenharmony_ci 30a8c51b3fSopenharmony_ci std::string Get() { 31a8c51b3fSopenharmony_ci std::string event = front(); 32a8c51b3fSopenharmony_ci pop(); 33a8c51b3fSopenharmony_ci return event; 34a8c51b3fSopenharmony_ci } 35a8c51b3fSopenharmony_ci}; 36a8c51b3fSopenharmony_ci 37a8c51b3fSopenharmony_ciEventQueue* queue = new EventQueue(); 38a8c51b3fSopenharmony_ci 39a8c51b3fSopenharmony_ciclass NullReporter : public BenchmarkReporter { 40a8c51b3fSopenharmony_ci public: 41a8c51b3fSopenharmony_ci bool ReportContext(const Context& /*context*/) override { return true; } 42a8c51b3fSopenharmony_ci void ReportRuns(const std::vector<Run>& /* report */) override {} 43a8c51b3fSopenharmony_ci}; 44a8c51b3fSopenharmony_ci 45a8c51b3fSopenharmony_ciclass BenchmarkTest : public testing::Test { 46a8c51b3fSopenharmony_ci public: 47a8c51b3fSopenharmony_ci static void SetupHook(int /* num_threads */) { queue->push("Setup"); } 48a8c51b3fSopenharmony_ci 49a8c51b3fSopenharmony_ci static void TeardownHook(int /* num_threads */) { queue->push("Teardown"); } 50a8c51b3fSopenharmony_ci 51a8c51b3fSopenharmony_ci void Execute(const std::string& pattern) { 52a8c51b3fSopenharmony_ci queue->Clear(); 53a8c51b3fSopenharmony_ci 54a8c51b3fSopenharmony_ci std::unique_ptr<BenchmarkReporter> reporter(new NullReporter()); 55a8c51b3fSopenharmony_ci FLAGS_benchmark_filter = pattern; 56a8c51b3fSopenharmony_ci RunSpecifiedBenchmarks(reporter.get()); 57a8c51b3fSopenharmony_ci 58a8c51b3fSopenharmony_ci queue->Put("DONE"); // End marker 59a8c51b3fSopenharmony_ci } 60a8c51b3fSopenharmony_ci}; 61a8c51b3fSopenharmony_ci 62a8c51b3fSopenharmony_civoid BM_Match1(benchmark::State& state) { 63a8c51b3fSopenharmony_ci const int64_t arg = state.range(0); 64a8c51b3fSopenharmony_ci 65a8c51b3fSopenharmony_ci for (auto _ : state) { 66a8c51b3fSopenharmony_ci } 67a8c51b3fSopenharmony_ci queue->Put(StrFormat("BM_Match1/%d", static_cast<int>(arg))); 68a8c51b3fSopenharmony_ci} 69a8c51b3fSopenharmony_ciBENCHMARK(BM_Match1) 70a8c51b3fSopenharmony_ci ->Iterations(100) 71a8c51b3fSopenharmony_ci ->Arg(1) 72a8c51b3fSopenharmony_ci ->Arg(2) 73a8c51b3fSopenharmony_ci ->Arg(3) 74a8c51b3fSopenharmony_ci ->Range(10, 80) 75a8c51b3fSopenharmony_ci ->Args({90}) 76a8c51b3fSopenharmony_ci ->Args({100}); 77a8c51b3fSopenharmony_ci 78a8c51b3fSopenharmony_ciTEST_F(BenchmarkTest, Match1) { 79a8c51b3fSopenharmony_ci Execute("BM_Match1"); 80a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/1", queue->Get()); 81a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/2", queue->Get()); 82a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/3", queue->Get()); 83a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/10", queue->Get()); 84a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/64", queue->Get()); 85a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/80", queue->Get()); 86a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/90", queue->Get()); 87a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/100", queue->Get()); 88a8c51b3fSopenharmony_ci ASSERT_EQ("DONE", queue->Get()); 89a8c51b3fSopenharmony_ci} 90a8c51b3fSopenharmony_ci 91a8c51b3fSopenharmony_ciTEST_F(BenchmarkTest, Match1WithRepetition) { 92a8c51b3fSopenharmony_ci FLAGS_benchmark_repetitions = 2; 93a8c51b3fSopenharmony_ci 94a8c51b3fSopenharmony_ci Execute("BM_Match1/(64|80)"); 95a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/64", queue->Get()); 96a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/64", queue->Get()); 97a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/80", queue->Get()); 98a8c51b3fSopenharmony_ci ASSERT_EQ("BM_Match1/80", queue->Get()); 99a8c51b3fSopenharmony_ci ASSERT_EQ("DONE", queue->Get()); 100a8c51b3fSopenharmony_ci} 101a8c51b3fSopenharmony_ci 102a8c51b3fSopenharmony_ciTEST_F(BenchmarkTest, Match1WithRandomInterleaving) { 103a8c51b3fSopenharmony_ci FLAGS_benchmark_enable_random_interleaving = true; 104a8c51b3fSopenharmony_ci FLAGS_benchmark_repetitions = 100; 105a8c51b3fSopenharmony_ci 106a8c51b3fSopenharmony_ci std::map<std::string, int> element_count; 107a8c51b3fSopenharmony_ci std::map<std::string, int> interleaving_count; 108a8c51b3fSopenharmony_ci Execute("BM_Match1/(64|80)"); 109a8c51b3fSopenharmony_ci for (int i = 0; i < 100; ++i) { 110a8c51b3fSopenharmony_ci std::vector<std::string> interleaving; 111a8c51b3fSopenharmony_ci interleaving.push_back(queue->Get()); 112a8c51b3fSopenharmony_ci interleaving.push_back(queue->Get()); 113a8c51b3fSopenharmony_ci element_count[interleaving[0]]++; 114a8c51b3fSopenharmony_ci element_count[interleaving[1]]++; 115a8c51b3fSopenharmony_ci interleaving_count[StrFormat("%s,%s", interleaving[0].c_str(), 116a8c51b3fSopenharmony_ci interleaving[1].c_str())]++; 117a8c51b3fSopenharmony_ci } 118a8c51b3fSopenharmony_ci EXPECT_EQ(element_count["BM_Match1/64"], 100) << "Unexpected repetitions."; 119a8c51b3fSopenharmony_ci EXPECT_EQ(element_count["BM_Match1/80"], 100) << "Unexpected repetitions."; 120a8c51b3fSopenharmony_ci EXPECT_GE(interleaving_count.size(), 2) << "Interleaving was not randomized."; 121a8c51b3fSopenharmony_ci ASSERT_EQ("DONE", queue->Get()); 122a8c51b3fSopenharmony_ci} 123a8c51b3fSopenharmony_ci 124a8c51b3fSopenharmony_ci} // namespace 125a8c51b3fSopenharmony_ci} // namespace internal 126a8c51b3fSopenharmony_ci} // namespace benchmark 127