From 73867c7a310f82e03e7d429f3e1a1af1d39dc1b8 Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sat, 12 Aug 2023 01:18:24 +0530 Subject: [PATCH 01/16] feat: benchmark_list_tests benchmark-format=json --- include/benchmark/benchmark.h | 18 +++++++++++++++++- src/benchmark.cc | 8 ++++++-- src/console_reporter.cc | 9 +++++++++ src/csv_reporter.cc | 6 ++++++ src/json_reporter.cc | 14 ++++++++++++++ 5 files changed, 52 insertions(+), 3 deletions(-) diff --git a/include/benchmark/benchmark.h b/include/benchmark/benchmark.h index e3857e717f..88bb963416 100644 --- a/include/benchmark/benchmark.h +++ b/include/benchmark/benchmark.h @@ -639,7 +639,7 @@ class Counter { Counter(double v = 0., Flags f = kDefaults, OneK k = kIs1000) : value(v), flags(f), oneK(k) {} - BENCHMARK_ALWAYS_INLINE operator double const &() const { return value; } + BENCHMARK_ALWAYS_INLINE operator double const&() const { return value; } BENCHMARK_ALWAYS_INLINE operator double&() { return value; } }; @@ -1878,6 +1878,19 @@ class BENCHMARK_EXPORT BenchmarkReporter { // REQUIRES: 'out' is non-null. static void PrintBasicContext(std::ostream* out, Context const& context); + /** + * @brief Lists and describes the provided benchmarks. + * + * This static method is intended to be overridden by derived classes + * to provide specific implementations for listing benchmarks. + * It can be used for outputting, logging, or any other operation + * needed to handle or display the benchmarks' names and metadata. + * + * @param benchmarks A vector containing names and details of benchmarks + * that need to be listed or processed. + */ + static void List(const std::vector& benchmarks); + private: std::ostream* output_stream_; std::ostream* error_stream_; @@ -1899,6 +1912,7 @@ class BENCHMARK_EXPORT ConsoleReporter : public BenchmarkReporter { bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; + static void List(const std::vector& benchmarks); protected: virtual void PrintRunData(const Run& report); @@ -1916,6 +1930,7 @@ class BENCHMARK_EXPORT JSONReporter : public BenchmarkReporter { bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; void Finalize() BENCHMARK_OVERRIDE; + static void List(const std::vector& benchmarks); private: void PrintRunData(const Run& report); @@ -1930,6 +1945,7 @@ class BENCHMARK_EXPORT BENCHMARK_DEPRECATED_MSG( CSVReporter() : printed_header_(false) {} bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; + static void List(const std::vector& benchmarks); private: void PrintRunData(const Run& report); diff --git a/src/benchmark.cc b/src/benchmark.cc index 3e9c7f9642..4104511f51 100644 --- a/src/benchmark.cc +++ b/src/benchmark.cc @@ -593,8 +593,12 @@ size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter, } if (FLAGS_benchmark_list_tests) { - for (auto const& benchmark : benchmarks) - Out << benchmark.name().str() << "\n"; + if (FLAGS_benchmark_format == "json") { + dynamic_cast(display_reporter)->List(benchmarks); + } else { + //ConsoleReporter::List(benchmarks); + dynamic_cast(display_reporter)->List(benchmarks); + } } else { internal::RunBenchmarks(benchmarks, display_reporter, file_reporter); } diff --git a/src/console_reporter.cc b/src/console_reporter.cc index 10e05e133e..562b106035 100644 --- a/src/console_reporter.cc +++ b/src/console_reporter.cc @@ -203,4 +203,13 @@ void ConsoleReporter::PrintRunData(const Run& result) { printer(Out, COLOR_DEFAULT, "\n"); } +BENCHMARK_EXPORT +void ConsoleReporter::List( + const std::vector& benchmarks) { + std::ostream& Out = GetOutputStream(); + for (auto const& benchmark : benchmarks) { + Out << benchmark.name().str() << "\n"; + } +} + } // end namespace benchmark diff --git a/src/csv_reporter.cc b/src/csv_reporter.cc index 7b56da107e..521e5e5a70 100644 --- a/src/csv_reporter.cc +++ b/src/csv_reporter.cc @@ -158,4 +158,10 @@ void CSVReporter::PrintRunData(const Run& run) { Out << '\n'; } +void CSVReporter::List( + const std::vector& benchmarks) { + std::ostream& err = GetErrorStream(); + err << "List() method is not implemented for CSVReporter.\n"; +} + } // end namespace benchmark diff --git a/src/json_reporter.cc b/src/json_reporter.cc index 6559dfd5e6..9db491d3c8 100644 --- a/src/json_reporter.cc +++ b/src/json_reporter.cc @@ -317,4 +317,18 @@ void JSONReporter::PrintRunData(Run const& run) { const int64_t MemoryManager::TombstoneValue = std::numeric_limits::max(); +void JSONReporter::List( + const std::vector& benchmarks) { + std::ostream& Out = GetOutputStream(); + Out << "["; + for (size_t i = 0; i < benchmarks.size(); ++i) { + const auto& benchmark = benchmarks[i]; + Out << "{ \"name\": \"" << benchmark.name().str() << "\" }"; + if (i != benchmarks.size() - 1) { + Out << ", "; + } + } + Out << "]"; +} + } // end namespace benchmark From a41e9d6e68281ff33aa34a5ae8d12881f2644f97 Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sat, 12 Aug 2023 08:00:51 +0530 Subject: [PATCH 02/16] feat: made method virtual and get rid of errors --- include/benchmark/benchmark.h | 19 +++++++++---------- src/benchmark.cc | 8 ++++---- src/console_reporter.cc | 2 +- src/csv_reporter.cc | 2 +- src/json_reporter.cc | 2 +- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/include/benchmark/benchmark.h b/include/benchmark/benchmark.h index 88bb963416..73d165b216 100644 --- a/include/benchmark/benchmark.h +++ b/include/benchmark/benchmark.h @@ -639,7 +639,7 @@ class Counter { Counter(double v = 0., Flags f = kDefaults, OneK k = kIs1000) : value(v), flags(f), oneK(k) {} - BENCHMARK_ALWAYS_INLINE operator double const&() const { return value; } + BENCHMARK_ALWAYS_INLINE operator double const &() const { return value; } BENCHMARK_ALWAYS_INLINE operator double&() { return value; } }; @@ -712,11 +712,9 @@ enum Skipped #if defined(BENCHMARK_HAS_CXX11) : unsigned #endif -{ - NotSkipped = 0, +{ NotSkipped = 0, SkippedWithMessage, - SkippedWithError -}; + SkippedWithError }; } // namespace internal @@ -1881,7 +1879,7 @@ class BENCHMARK_EXPORT BenchmarkReporter { /** * @brief Lists and describes the provided benchmarks. * - * This static method is intended to be overridden by derived classes + * This virtual method is intended to be overridden by derived classes * to provide specific implementations for listing benchmarks. * It can be used for outputting, logging, or any other operation * needed to handle or display the benchmarks' names and metadata. @@ -1889,7 +1887,8 @@ class BENCHMARK_EXPORT BenchmarkReporter { * @param benchmarks A vector containing names and details of benchmarks * that need to be listed or processed. */ - static void List(const std::vector& benchmarks); + virtual void List( + const std::vector& benchmarks) = 0; private: std::ostream* output_stream_; @@ -1912,7 +1911,7 @@ class BENCHMARK_EXPORT ConsoleReporter : public BenchmarkReporter { bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; - static void List(const std::vector& benchmarks); + void List(const std::vector& benchmarks); protected: virtual void PrintRunData(const Run& report); @@ -1930,7 +1929,7 @@ class BENCHMARK_EXPORT JSONReporter : public BenchmarkReporter { bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; void Finalize() BENCHMARK_OVERRIDE; - static void List(const std::vector& benchmarks); + void List(const std::vector& benchmarks); private: void PrintRunData(const Run& report); @@ -1945,7 +1944,7 @@ class BENCHMARK_EXPORT BENCHMARK_DEPRECATED_MSG( CSVReporter() : printed_header_(false) {} bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; - static void List(const std::vector& benchmarks); + void List(const std::vector& benchmarks); private: void PrintRunData(const Run& report); diff --git a/src/benchmark.cc b/src/benchmark.cc index 4104511f51..a0e5ca1e7f 100644 --- a/src/benchmark.cc +++ b/src/benchmark.cc @@ -594,10 +594,10 @@ size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter, if (FLAGS_benchmark_list_tests) { if (FLAGS_benchmark_format == "json") { - dynamic_cast(display_reporter)->List(benchmarks); - } else { - //ConsoleReporter::List(benchmarks); - dynamic_cast(display_reporter)->List(benchmarks); + display_reporter->List(benchmarks); + } else { + // ConsoleReporter::List(benchmarks); + display_reporter->List(benchmarks); } } else { internal::RunBenchmarks(benchmarks, display_reporter, file_reporter); diff --git a/src/console_reporter.cc b/src/console_reporter.cc index 562b106035..6664da21cf 100644 --- a/src/console_reporter.cc +++ b/src/console_reporter.cc @@ -21,7 +21,7 @@ #include #include -#include "benchmark/benchmark.h" +#include "benchmark_api_internal.h" #include "check.h" #include "colorprint.h" #include "commandlineflags.h" diff --git a/src/csv_reporter.cc b/src/csv_reporter.cc index 521e5e5a70..6ca1343081 100644 --- a/src/csv_reporter.cc +++ b/src/csv_reporter.cc @@ -19,7 +19,7 @@ #include #include -#include "benchmark/benchmark.h" +#include "benchmark_api_internal.h" #include "check.h" #include "complexity.h" #include "string_util.h" diff --git a/src/json_reporter.cc b/src/json_reporter.cc index 9db491d3c8..0b6fcb3d17 100644 --- a/src/json_reporter.cc +++ b/src/json_reporter.cc @@ -22,7 +22,7 @@ #include #include -#include "benchmark/benchmark.h" +#include "benchmark_api_internal.h" #include "complexity.h" #include "string_util.h" #include "timers.h" From b83465c75ff650d2d3062b6d8095204887539dc2 Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sat, 12 Aug 2023 08:12:49 +0530 Subject: [PATCH 03/16] feat: added the missing BENCHMARK_OVERRIDE --- include/benchmark/benchmark.h | 6 +-- test/benchmark.pc | 12 +++++ test/third_party/googletest/CMakeLists.txt | 59 ++++++++++++++++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 test/benchmark.pc create mode 100644 test/third_party/googletest/CMakeLists.txt diff --git a/include/benchmark/benchmark.h b/include/benchmark/benchmark.h index 73d165b216..f3042a1023 100644 --- a/include/benchmark/benchmark.h +++ b/include/benchmark/benchmark.h @@ -1911,7 +1911,7 @@ class BENCHMARK_EXPORT ConsoleReporter : public BenchmarkReporter { bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; - void List(const std::vector& benchmarks); + void List(const std::vector& benchmarks) BENCHMARK_OVERRIDE; protected: virtual void PrintRunData(const Run& report); @@ -1929,7 +1929,7 @@ class BENCHMARK_EXPORT JSONReporter : public BenchmarkReporter { bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; void Finalize() BENCHMARK_OVERRIDE; - void List(const std::vector& benchmarks); + void List(const std::vector& benchmarks) BENCHMARK_OVERRIDE; private: void PrintRunData(const Run& report); @@ -1944,7 +1944,7 @@ class BENCHMARK_EXPORT BENCHMARK_DEPRECATED_MSG( CSVReporter() : printed_header_(false) {} bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; - void List(const std::vector& benchmarks); + void List(const std::vector& benchmarks) BENCHMARK_OVERRIDE; private: void PrintRunData(const Run& report); diff --git a/test/benchmark.pc b/test/benchmark.pc new file mode 100644 index 0000000000..19b87b5098 --- /dev/null +++ b/test/benchmark.pc @@ -0,0 +1,12 @@ +prefix=/usr/local +exec_prefix=${prefix} +libdir=/usr/local/lib +includedir=/usr/local/include + +Name: benchmark +Description: Google microbenchmark framework +Version: 1.8.2 + +Libs: -L${libdir} -lbenchmark +Libs.private: -lpthread +Cflags: -I${includedir} diff --git a/test/third_party/googletest/CMakeLists.txt b/test/third_party/googletest/CMakeLists.txt new file mode 100644 index 0000000000..ce653ac375 --- /dev/null +++ b/test/third_party/googletest/CMakeLists.txt @@ -0,0 +1,59 @@ +cmake_minimum_required(VERSION 2.8.12) + +project(googletest-download NONE) + +# Enable ExternalProject CMake module +include(ExternalProject) + +option(ALLOW_DOWNLOADING_GOOGLETEST "If googletest src tree is not found in location specified by GOOGLETEST_PATH, do fetch the archive from internet" OFF) +set(GOOGLETEST_PATH "/usr/src/googletest" CACHE PATH + "Path to the googletest root tree. Should contain googletest and googlemock subdirs. And CMakeLists.txt in root, and in both of these subdirs") + +# Download and install GoogleTest + +message(STATUS "Looking for Google Test sources") +message(STATUS "Looking for Google Test sources in ${GOOGLETEST_PATH}") +if(EXISTS "${GOOGLETEST_PATH}" AND IS_DIRECTORY "${GOOGLETEST_PATH}" AND EXISTS "${GOOGLETEST_PATH}/CMakeLists.txt" AND + EXISTS "${GOOGLETEST_PATH}/googletest" AND IS_DIRECTORY "${GOOGLETEST_PATH}/googletest" AND EXISTS "${GOOGLETEST_PATH}/googletest/CMakeLists.txt" AND + EXISTS "${GOOGLETEST_PATH}/googlemock" AND IS_DIRECTORY "${GOOGLETEST_PATH}/googlemock" AND EXISTS "${GOOGLETEST_PATH}/googlemock/CMakeLists.txt") + message(STATUS "Found Google Test in ${GOOGLETEST_PATH}") + + ExternalProject_Add( + googletest + PREFIX "${CMAKE_BINARY_DIR}" + DOWNLOAD_DIR "${CMAKE_BINARY_DIR}/download" + SOURCE_DIR "${GOOGLETEST_PATH}" # use existing src dir. + BINARY_DIR "${CMAKE_BINARY_DIR}/build" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" + ) +else() + if(NOT ALLOW_DOWNLOADING_GOOGLETEST) + message(SEND_ERROR "Did not find Google Test sources! Either pass correct path in GOOGLETEST_PATH, or enable BENCHMARK_DOWNLOAD_DEPENDENCIES, or disable BENCHMARK_USE_BUNDLED_GTEST, or disable BENCHMARK_ENABLE_GTEST_TESTS / BENCHMARK_ENABLE_TESTING.") + return() + else() + message(WARNING "Did not find Google Test sources! Fetching from web...") + ExternalProject_Add( + googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG "release-1.11.0" + PREFIX "${CMAKE_BINARY_DIR}" + STAMP_DIR "${CMAKE_BINARY_DIR}/stamp" + DOWNLOAD_DIR "${CMAKE_BINARY_DIR}/download" + SOURCE_DIR "${CMAKE_BINARY_DIR}/src" + BINARY_DIR "${CMAKE_BINARY_DIR}/build" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" + ) + endif() +endif() + +ExternalProject_Get_Property(googletest SOURCE_DIR BINARY_DIR) +file(WRITE googletest-paths.cmake +"set(GOOGLETEST_SOURCE_DIR \"${SOURCE_DIR}\") +set(GOOGLETEST_BINARY_DIR \"${BINARY_DIR}\") +") From d37b7c3c578ef73c458943e576ea607efeaa0baf Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sat, 12 Aug 2023 08:20:32 +0530 Subject: [PATCH 04/16] feat: run the clang-format again --- include/benchmark/benchmark.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/include/benchmark/benchmark.h b/include/benchmark/benchmark.h index f3042a1023..3838e6cabb 100644 --- a/include/benchmark/benchmark.h +++ b/include/benchmark/benchmark.h @@ -1911,7 +1911,8 @@ class BENCHMARK_EXPORT ConsoleReporter : public BenchmarkReporter { bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; - void List(const std::vector& benchmarks) BENCHMARK_OVERRIDE; + void List(const std::vector& benchmarks) + BENCHMARK_OVERRIDE; protected: virtual void PrintRunData(const Run& report); @@ -1929,7 +1930,8 @@ class BENCHMARK_EXPORT JSONReporter : public BenchmarkReporter { bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; void Finalize() BENCHMARK_OVERRIDE; - void List(const std::vector& benchmarks) BENCHMARK_OVERRIDE; + void List(const std::vector& benchmarks) + BENCHMARK_OVERRIDE; private: void PrintRunData(const Run& report); @@ -1944,7 +1946,8 @@ class BENCHMARK_EXPORT BENCHMARK_DEPRECATED_MSG( CSVReporter() : printed_header_(false) {} bool ReportContext(const Context& context) BENCHMARK_OVERRIDE; void ReportRuns(const std::vector& reports) BENCHMARK_OVERRIDE; - void List(const std::vector& benchmarks) BENCHMARK_OVERRIDE; + void List(const std::vector& benchmarks) + BENCHMARK_OVERRIDE; private: void PrintRunData(const Run& report); From 644a5fb7226d243a0089064a70a910b529290374 Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sat, 12 Aug 2023 08:31:19 +0530 Subject: [PATCH 05/16] feat: removed Out as it's now in console reporter --- src/benchmark.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/benchmark.cc b/src/benchmark.cc index 35b90b5cba..0c3f9a3791 100644 --- a/src/benchmark.cc +++ b/src/benchmark.cc @@ -556,7 +556,6 @@ size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter, default_display_reporter.reset(CreateDefaultDisplayReporter()); display_reporter = default_display_reporter.get(); } - auto& Out = display_reporter->GetOutputStream(); auto& Err = display_reporter->GetErrorStream(); std::string const& fname = FLAGS_benchmark_out; From 5c5914cd937561cc43603b0b14277f89a7075a37 Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sat, 12 Aug 2023 08:36:57 +0530 Subject: [PATCH 06/16] feat: forgot to supress the unused parameter --- src/csv_reporter.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/csv_reporter.cc b/src/csv_reporter.cc index 6ca1343081..347e2616a5 100644 --- a/src/csv_reporter.cc +++ b/src/csv_reporter.cc @@ -160,6 +160,7 @@ void CSVReporter::PrintRunData(const Run& run) { void CSVReporter::List( const std::vector& benchmarks) { + (void)benchmarks; // Suppress unused parameter warning std::ostream& err = GetErrorStream(); err << "List() method is not implemented for CSVReporter.\n"; } From 4de740d59d06c05391daa38ebf2ce34f5b639d9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Devansh=20Varshney=20=28=E0=A4=A6=E0=A5=87=E0=A4=B5?= =?UTF-8?q?=E0=A4=BE=E0=A4=82=E0=A4=B6=20=E0=A4=B5=E0=A4=BE=E0=A4=B0?= =?UTF-8?q?=E0=A5=8D=E0=A4=B7=E0=A5=8D=E0=A4=A3=E0=A5=87=E0=A4=AF=29?= Date: Sat, 12 Aug 2023 08:38:36 +0530 Subject: [PATCH 07/16] feat: deleted test / benchmark.pc This should not be added. My mistake --- test/benchmark.pc | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 test/benchmark.pc diff --git a/test/benchmark.pc b/test/benchmark.pc deleted file mode 100644 index 19b87b5098..0000000000 --- a/test/benchmark.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/usr/local -exec_prefix=${prefix} -libdir=/usr/local/lib -includedir=/usr/local/include - -Name: benchmark -Description: Google microbenchmark framework -Version: 1.8.2 - -Libs: -L${libdir} -lbenchmark -Libs.private: -lpthread -Cflags: -I${includedir} From 550ceca687b5dda21417b9f72acf6efca256bfd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Devansh=20Varshney=20=28=E0=A4=A6=E0=A5=87=E0=A4=B5?= =?UTF-8?q?=E0=A4=BE=E0=A4=82=E0=A4=B6=20=E0=A4=B5=E0=A4=BE=E0=A4=B0?= =?UTF-8?q?=E0=A5=8D=E0=A4=B7=E0=A5=8D=E0=A4=A3=E0=A5=87=E0=A4=AF=29?= Date: Sat, 12 Aug 2023 08:39:59 +0530 Subject: [PATCH 08/16] feat: deleted CMakeLists.txt this file should not be added by me. test/ third_party / googletest / CMakeLists.txt --- test/third_party/googletest/CMakeLists.txt | 59 ---------------------- 1 file changed, 59 deletions(-) delete mode 100644 test/third_party/googletest/CMakeLists.txt diff --git a/test/third_party/googletest/CMakeLists.txt b/test/third_party/googletest/CMakeLists.txt deleted file mode 100644 index ce653ac375..0000000000 --- a/test/third_party/googletest/CMakeLists.txt +++ /dev/null @@ -1,59 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12) - -project(googletest-download NONE) - -# Enable ExternalProject CMake module -include(ExternalProject) - -option(ALLOW_DOWNLOADING_GOOGLETEST "If googletest src tree is not found in location specified by GOOGLETEST_PATH, do fetch the archive from internet" OFF) -set(GOOGLETEST_PATH "/usr/src/googletest" CACHE PATH - "Path to the googletest root tree. Should contain googletest and googlemock subdirs. And CMakeLists.txt in root, and in both of these subdirs") - -# Download and install GoogleTest - -message(STATUS "Looking for Google Test sources") -message(STATUS "Looking for Google Test sources in ${GOOGLETEST_PATH}") -if(EXISTS "${GOOGLETEST_PATH}" AND IS_DIRECTORY "${GOOGLETEST_PATH}" AND EXISTS "${GOOGLETEST_PATH}/CMakeLists.txt" AND - EXISTS "${GOOGLETEST_PATH}/googletest" AND IS_DIRECTORY "${GOOGLETEST_PATH}/googletest" AND EXISTS "${GOOGLETEST_PATH}/googletest/CMakeLists.txt" AND - EXISTS "${GOOGLETEST_PATH}/googlemock" AND IS_DIRECTORY "${GOOGLETEST_PATH}/googlemock" AND EXISTS "${GOOGLETEST_PATH}/googlemock/CMakeLists.txt") - message(STATUS "Found Google Test in ${GOOGLETEST_PATH}") - - ExternalProject_Add( - googletest - PREFIX "${CMAKE_BINARY_DIR}" - DOWNLOAD_DIR "${CMAKE_BINARY_DIR}/download" - SOURCE_DIR "${GOOGLETEST_PATH}" # use existing src dir. - BINARY_DIR "${CMAKE_BINARY_DIR}/build" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) -else() - if(NOT ALLOW_DOWNLOADING_GOOGLETEST) - message(SEND_ERROR "Did not find Google Test sources! Either pass correct path in GOOGLETEST_PATH, or enable BENCHMARK_DOWNLOAD_DEPENDENCIES, or disable BENCHMARK_USE_BUNDLED_GTEST, or disable BENCHMARK_ENABLE_GTEST_TESTS / BENCHMARK_ENABLE_TESTING.") - return() - else() - message(WARNING "Did not find Google Test sources! Fetching from web...") - ExternalProject_Add( - googletest - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG "release-1.11.0" - PREFIX "${CMAKE_BINARY_DIR}" - STAMP_DIR "${CMAKE_BINARY_DIR}/stamp" - DOWNLOAD_DIR "${CMAKE_BINARY_DIR}/download" - SOURCE_DIR "${CMAKE_BINARY_DIR}/src" - BINARY_DIR "${CMAKE_BINARY_DIR}/build" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - endif() -endif() - -ExternalProject_Get_Property(googletest SOURCE_DIR BINARY_DIR) -file(WRITE googletest-paths.cmake -"set(GOOGLETEST_SOURCE_DIR \"${SOURCE_DIR}\") -set(GOOGLETEST_BINARY_DIR \"${BINARY_DIR}\") -") From 4132a670340aa905e636deb7ebce3e8e1a05808c Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sat, 12 Aug 2023 08:58:26 +0530 Subject: [PATCH 09/16] feat: added virtual method to abstract class --- test/output_test_helper.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/output_test_helper.cc b/test/output_test_helper.cc index 25673700aa..5385025493 100644 --- a/test/output_test_helper.cc +++ b/test/output_test_helper.cc @@ -164,6 +164,17 @@ class TestReporter : public benchmark::BenchmarkReporter { for (auto rep : reporters_) rep->Finalize(); } + void List(const std::vector& + benchmarks) override { + // providing summary of bechmarks as of now + int total = benchmarks.size(); + int flaggedCount = + std::count_if(benchmarks.begin(), benchmarks.end(), + [](const auto& b) { return b.isFlagSet(); }); + std::cout << "Total benchmarks: " << total << ", Flagged: " << flaggedCount + << std::endl; + } + private: std::vector reporters_; }; From a29702c6f7946d324ce4f815970ca7af3bd87df2 Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sat, 12 Aug 2023 09:03:58 +0530 Subject: [PATCH 10/16] feat: modified the List() in output_test_helper --- test/output_test_helper.cc | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/test/output_test_helper.cc b/test/output_test_helper.cc index 5385025493..67f2c3d30e 100644 --- a/test/output_test_helper.cc +++ b/test/output_test_helper.cc @@ -166,13 +166,10 @@ class TestReporter : public benchmark::BenchmarkReporter { void List(const std::vector& benchmarks) override { - // providing summary of bechmarks as of now - int total = benchmarks.size(); - int flaggedCount = - std::count_if(benchmarks.begin(), benchmarks.end(), - [](const auto& b) { return b.isFlagSet(); }); - std::cout << "Total benchmarks: " << total << ", Flagged: " << flaggedCount - << std::endl; + // simply logging the status + for (const auto& benchmark : benchmarks) { + std::cout << benchmark.name().str() << std::endl; + } } private: From cd632b2586e8afd665e1401900d8a4e5270e88f9 Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sat, 12 Aug 2023 09:16:12 +0530 Subject: [PATCH 11/16] feat: added List() NullReporter & chnagedback enum --- include/benchmark/benchmark.h | 6 ++++-- test/benchmark_random_interleaving_gtest.cc | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/benchmark/benchmark.h b/include/benchmark/benchmark.h index 3838e6cabb..a2012c77c0 100644 --- a/include/benchmark/benchmark.h +++ b/include/benchmark/benchmark.h @@ -712,9 +712,11 @@ enum Skipped #if defined(BENCHMARK_HAS_CXX11) : unsigned #endif -{ NotSkipped = 0, +{ + NotSkipped = 0, SkippedWithMessage, - SkippedWithError }; + SkippedWithError +}; } // namespace internal diff --git a/test/benchmark_random_interleaving_gtest.cc b/test/benchmark_random_interleaving_gtest.cc index 7f2086750d..9b394efdbb 100644 --- a/test/benchmark_random_interleaving_gtest.cc +++ b/test/benchmark_random_interleaving_gtest.cc @@ -40,6 +40,8 @@ class NullReporter : public BenchmarkReporter { public: bool ReportContext(const Context& /*context*/) override { return true; } void ReportRuns(const std::vector& /* report */) override {} + void List( + const std::vector&) override {} }; class BenchmarkTest : public testing::Test { From cb5be7daaf03fb6081c69b9ab7679966e772466c Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sat, 12 Aug 2023 09:19:41 +0530 Subject: [PATCH 12/16] feat: removed the extra spaces from the endif --- include/benchmark/benchmark.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/benchmark/benchmark.h b/include/benchmark/benchmark.h index a2012c77c0..0480f52e13 100644 --- a/include/benchmark/benchmark.h +++ b/include/benchmark/benchmark.h @@ -712,10 +712,10 @@ enum Skipped #if defined(BENCHMARK_HAS_CXX11) : unsigned #endif -{ +{ NotSkipped = 0, SkippedWithMessage, - SkippedWithError + SkippedWithError }; } // namespace internal From fa29daba0209719fc38a6e75041988ed24fd6f1c Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sat, 12 Aug 2023 09:54:47 +0530 Subject: [PATCH 13/16] feat: Corrected if FLAGS_benchmark_list_tests) --- src/benchmark.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/benchmark.cc b/src/benchmark.cc index 0c3f9a3791..27b0be3bbd 100644 --- a/src/benchmark.cc +++ b/src/benchmark.cc @@ -592,10 +592,11 @@ size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter, if (FLAGS_benchmark_list_tests) { if (FLAGS_benchmark_format == "json") { - display_reporter->List(benchmarks); + JSONReporter json_reporter; + json_reporter.List(benchmarks); } else { - // ConsoleReporter::List(benchmarks); - display_reporter->List(benchmarks); + benchmark::ConsoleReporter console_reporter; + console_reporter.List(benchmarks); } } else { internal::RunBenchmarks(benchmarks, display_reporter, file_reporter); From 139e29c60903be371ffd3d89a25a0cab7ab442c3 Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Mon, 14 Aug 2023 17:02:10 +0530 Subject: [PATCH 14/16] feat: improvement with display_reporter, FormatKV --- src/benchmark.cc | 8 +------- src/json_reporter.cc | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/benchmark.cc b/src/benchmark.cc index 27b0be3bbd..22a9309642 100644 --- a/src/benchmark.cc +++ b/src/benchmark.cc @@ -591,13 +591,7 @@ size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter, } if (FLAGS_benchmark_list_tests) { - if (FLAGS_benchmark_format == "json") { - JSONReporter json_reporter; - json_reporter.List(benchmarks); - } else { - benchmark::ConsoleReporter console_reporter; - console_reporter.List(benchmarks); - } + display_reporter->List(benchmarks); } else { internal::RunBenchmarks(benchmarks, display_reporter, file_reporter); } diff --git a/src/json_reporter.cc b/src/json_reporter.cc index 0b6fcb3d17..c35a8ca7a3 100644 --- a/src/json_reporter.cc +++ b/src/json_reporter.cc @@ -323,7 +323,7 @@ void JSONReporter::List( Out << "["; for (size_t i = 0; i < benchmarks.size(); ++i) { const auto& benchmark = benchmarks[i]; - Out << "{ \"name\": \"" << benchmark.name().str() << "\" }"; + Out << "{" << FormatKV("name", benchmark.name().str()) << "}"; if (i != benchmarks.size() - 1) { Out << ", "; } From 3b07ebf1447d608d3493e9889d92156fb163d168 Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Sun, 12 May 2024 19:04:35 +0530 Subject: [PATCH 15/16] add the test case for List --- src/benchmark.cc | 1 + test/reporter_list_gtest.cc | 79 +++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 test/reporter_list_gtest.cc diff --git a/src/benchmark.cc b/src/benchmark.cc index dc2fa4e701..66ebfb7ca3 100644 --- a/src/benchmark.cc +++ b/src/benchmark.cc @@ -578,6 +578,7 @@ size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter, default_display_reporter.reset(CreateDefaultDisplayReporter()); display_reporter = default_display_reporter.get(); } + auto& Out = display_reporter->GetOutputStream(); auto& Err = display_reporter->GetErrorStream(); std::string const& fname = FLAGS_benchmark_out; diff --git a/test/reporter_list_gtest.cc b/test/reporter_list_gtest.cc new file mode 100644 index 0000000000..7b6583672d --- /dev/null +++ b/test/reporter_list_gtest.cc @@ -0,0 +1,79 @@ +#include +#include +#include +#include "benchmark/benchmark.h" + +namespace benchmark { +namespace internal { + +// Helper function to register benchmarks +void RegisterBenchmarks() { + benchmark::RegisterBenchmark("BM_simple", [](benchmark::State& state) { + for (auto _ : state) {} + }); + benchmark::RegisterBenchmark("BM_complex", [](benchmark::State& state) { + for (auto _ : state) {} + }); +} + +class ReporterListTest : public ::testing::Test { +protected: + std::stringstream ss; + BenchmarkReporter::Context context; + + void SetUp() override { + benchmark::ClearRegisteredBenchmarks(); + ss.str(""); + ss.clear(); + } + + void RunList(BenchmarkReporter& reporter) { + RegisterBenchmarks(); // Register all benchmarks + benchmark::RunSpecifiedBenchmarks(&reporter); + } +}; + +// Tests the behavior of reporters when no benchmarks are registered +TEST_F(ReporterListTest, HandlesEmptyBenchmarkList) { + benchmark::ConsoleReporter console_reporter(&ss); + benchmark::JSONReporter json_reporter(&ss); + benchmark::CSVReporter csv_reporter(&ss); + + // Expect no output as no benchmarks are registered + RunList(console_reporter); + EXPECT_TRUE(ss.str().empty()); + + ss.str(""); + RunList(json_reporter); + EXPECT_TRUE(ss.str().empty()); + + ss.str(""); + RunList(csv_reporter); + EXPECT_TRUE(ss.str().empty()); +} + +// Tests the output of reporters when benchmarks are listed +TEST_F(ReporterListTest, ListsBenchmarksWithDifferentReporters) { + benchmark::ConsoleReporter console_reporter(&ss); + benchmark::JSONReporter json_reporter(&ss); + benchmark::CSVReporter csv_reporter(&ss); + + RegisterBenchmarks(); // Ensure some benchmarks are registered + + RunList(console_reporter); + EXPECT_THAT(ss.str(), ::testing::HasSubstr("BM_simple")); + EXPECT_THAT(ss.str(), ::testing::HasSubstr("BM_complex")); + + ss.str(""); + RunList(json_reporter); + EXPECT_THAT(ss.str(), ::testing::HasSubstr("\"name\": \"BM_simple\"")); + EXPECT_THAT(ss.str(), ::testing::HasSubstr("\"name\": \"BM_complex\"")); + + ss.str(""); + RunList(csv_reporter); + EXPECT_THAT(ss.str(), ::testing::HasSubstr("BM_simple")); + EXPECT_THAT(ss.str(), ::testing::HasSubstr("BM_complex")); +} + +} // namespace internal +} // namespace benchmark From 438c8c30f4845e1e43b40e0704ea996f2358deac Mon Sep 17 00:00:00 2001 From: varshneydevansh Date: Thu, 23 May 2024 22:06:47 +0530 Subject: [PATCH 16/16] modified the gtest file --- test/reporter_list_gtest.cc | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/test/reporter_list_gtest.cc b/test/reporter_list_gtest.cc index 7b6583672d..b1f37537c9 100644 --- a/test/reporter_list_gtest.cc +++ b/test/reporter_list_gtest.cc @@ -1,3 +1,17 @@ +// Copyright 2015 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #include #include #include @@ -12,8 +26,16 @@ void RegisterBenchmarks() { for (auto _ : state) {} }); benchmark::RegisterBenchmark("BM_complex", [](benchmark::State& state) { - for (auto _ : state) {} + for (auto _ : state) { + // Simulating a complex operation + for (int i = 0; i < 1000; ++i) { + benchmark::DoNotOptimize(i * i); + } + } }); + benchmark::RegisterBenchmark("BM_special_chars", [](benchmark::State& state) { + for (auto _ : state) {} + })->Name("BM_special!@#"); } class ReporterListTest : public ::testing::Test { @@ -63,16 +85,24 @@ TEST_F(ReporterListTest, ListsBenchmarksWithDifferentReporters) { RunList(console_reporter); EXPECT_THAT(ss.str(), ::testing::HasSubstr("BM_simple")); EXPECT_THAT(ss.str(), ::testing::HasSubstr("BM_complex")); + EXPECT_THAT(ss.str(), ::testing::HasSubstr("BM_special!@#")); ss.str(""); RunList(json_reporter); EXPECT_THAT(ss.str(), ::testing::HasSubstr("\"name\": \"BM_simple\"")); EXPECT_THAT(ss.str(), ::testing::HasSubstr("\"name\": \"BM_complex\"")); + EXPECT_THAT(ss.str(), ::testing::HasSubstr("\"name\": \"BM_special!@#\"")); + + // Check JSON structure + std::string json_output = ss.str(); + EXPECT_THAT(json_output.front(), testing::Eq('[')); + EXPECT_THAT(json_output.back(), testing::Eq(']')) ss.str(""); RunList(csv_reporter); EXPECT_THAT(ss.str(), ::testing::HasSubstr("BM_simple")); EXPECT_THAT(ss.str(), ::testing::HasSubstr("BM_complex")); + EXPECT_THAT(ss.str(), ::testing::HasSubstr("BM_special!@#")); } } // namespace internal