#include #include "benchmark/benchmark.h" #include "gtest/gtest.h" namespace { using benchmark::ClearRegisteredBenchmarks; using benchmark::ConsoleReporter; using benchmark::MemoryManager; using benchmark::RegisterBenchmark; using benchmark::RunSpecifiedBenchmarks; using benchmark::State; using benchmark::internal::Benchmark; constexpr int N_REPETITIONS = 100; constexpr int N_ITERATIONS = 1; int num_allocs = 0; int max_bytes_used = 0; int total_allocated_bytes = 0; int net_heap_growth = 0; void reset() { num_allocs = 0; max_bytes_used = 0; total_allocated_bytes = 0; net_heap_growth = 0; } class TestMemoryManager : public MemoryManager { void Start() override {} void Stop(Result& result) override { result.num_allocs = num_allocs; result.net_heap_growth = net_heap_growth; result.max_bytes_used = max_bytes_used; result.total_allocated_bytes = total_allocated_bytes; num_allocs += 1; max_bytes_used += 2; net_heap_growth += 4; total_allocated_bytes += 10; } }; class TestReporter : public ConsoleReporter { public: TestReporter() = default; virtual ~TestReporter() = default; bool ReportContext(const Context& /*unused*/) override { return true; } void PrintHeader(const Run&) override {} void PrintRunData(const Run& run) override { if (run.repetition_index == -1) return; if (!run.memory_result.memory_iterations) return; store.push_back(run.memory_result); } std::vector store; }; class MemoryResultsTest : public testing::Test { public: Benchmark* bm; TestReporter reporter; void SetUp() override { bm = RegisterBenchmark("BM", [](State& st) { for (auto _ : st) { } }); bm->Repetitions(N_REPETITIONS); bm->Iterations(N_ITERATIONS); reset(); } void TearDown() override { ClearRegisteredBenchmarks(); } }; TEST_F(MemoryResultsTest, NoMMTest) { RunSpecifiedBenchmarks(&reporter); EXPECT_EQ(reporter.store.size(), 0); } TEST_F(MemoryResultsTest, ResultsTest) { auto mm = std::make_unique(); RegisterMemoryManager(mm.get()); RunSpecifiedBenchmarks(&reporter); EXPECT_EQ(reporter.store.size(), N_REPETITIONS); for (size_t i = 0; i < reporter.store.size(); i++) { EXPECT_EQ(reporter.store[i].num_allocs, static_cast(i)); EXPECT_EQ(reporter.store[i].max_bytes_used, static_cast(i) * 2); EXPECT_EQ(reporter.store[i].net_heap_growth, static_cast(i) * 4); EXPECT_EQ(reporter.store[i].total_allocated_bytes, static_cast(i) * 10); } } } // namespace