Skip to content

Commit

Permalink
bench: add support for custom data directory
Browse files Browse the repository at this point in the history
Expands the benchmark framework with the existing '-testdatadir' arg,
enabling the ability to change the benchmark data directory.

This is useful for running benchmarks on different storage devices, and
not just under the OS /tmp/ directory.
  • Loading branch information
furszy committed Nov 8, 2024
1 parent 43d1a59 commit 4bbcc70
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 4 deletions.
18 changes: 17 additions & 1 deletion src/bench/bench.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,15 @@ using util::Join;

const std::function<void(const std::string&)> G_TEST_LOG_FUN{};

const std::function<std::vector<const char*>()> G_TEST_COMMAND_LINE_ARGUMENTS{};
/**
* Retrieves the available test setup command line arguments that may be used
* in the benchmark. They will be used only if the benchmark utilizes a
* 'BasicTestingSetup' or any child of it.
*/
static std::function<std::vector<const char*>()> g_bench_command_line_args{};
const std::function<std::vector<const char*>()> G_TEST_COMMAND_LINE_ARGUMENTS = []() {
return g_bench_command_line_args();
};

/**
* Retrieve the name of the currently in-use benchmark.
Expand Down Expand Up @@ -103,6 +111,14 @@ void BenchRunner::RunAll(const Args& args)
std::cout << "Running with -sanity-check option, output is being suppressed as benchmark results will be useless." << std::endl;
}

// Load inner test setup args
g_bench_command_line_args = [&args]() {
std::vector<const char*> ret;
ret.reserve(args.setup_args.size());
for (const auto& arg : args.setup_args) ret.emplace_back(arg.c_str());
return ret;
};

std::vector<ankerl::nanobench::Result> benchmarkResults;
for (const auto& [name, bench_func] : benchmarks()) {
const auto& [func, priority_level] = bench_func;
Expand Down
1 change: 1 addition & 0 deletions src/bench/bench.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ struct Args {
fs::path output_json;
std::string regex_filter;
uint8_t priority;
std::vector<std::string> setup_args;
};

class BenchRunner
Expand Down
15 changes: 15 additions & 0 deletions src/bench/bench_bitcoin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <tinyformat.h>
#include <util/fs.h>
#include <util/string.h>
#include <test/util/setup_common.h>

#include <chrono>
#include <cstdint>
Expand All @@ -27,6 +28,7 @@ static const std::string DEFAULT_PRIORITY{"all"};
static void SetupBenchArgs(ArgsManager& argsman)
{
SetupHelpOptions(argsman);
SetupCommonTestArgs(argsman);

argsman.AddArg("-asymptote=<n1,n2,n3,...>", "Test asymptotic growth of the runtime of an algorithm, if supported by the benchmark", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-filter=<regex>", strprintf("Regular expression filter to select benchmark by name (default: %s)", DEFAULT_BENCH_FILTER), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
Expand Down Expand Up @@ -60,6 +62,18 @@ static uint8_t parsePriorityLevel(const std::string& str) {
return levels;
}

static std::vector<std::string> parseTestSetupArgs(const ArgsManager& argsman)
{
// Parses unit test framework arguments supported by the benchmark framework.
std::vector<std::string> args;
static std::vector<std::string> AVAILABLE_ARGS = {"-testdatadir"};
for (const std::string& arg_name : AVAILABLE_ARGS) {
auto op_arg = argsman.GetArg(arg_name);
if (op_arg) args.emplace_back(strprintf("%s=%s", arg_name, *op_arg));
}
return args;
}

int main(int argc, char** argv)
{
ArgsManager argsman;
Expand Down Expand Up @@ -131,6 +145,7 @@ int main(int argc, char** argv)
args.regex_filter = argsman.GetArg("-filter", DEFAULT_BENCH_FILTER);
args.sanity_check = argsman.GetBoolArg("-sanity-check", false);
args.priority = parsePriorityLevel(argsman.GetArg("-priority-level", DEFAULT_PRIORITY));
args.setup_args = parseTestSetupArgs(argsman);

benchmark::BenchRunner::RunAll(args);

Expand Down
5 changes: 2 additions & 3 deletions src/test/util/setup_common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,7 @@ struct NetworkSetup
};
static NetworkSetup g_networksetup_instance;

/** Register test-only arguments */
static void SetupUnitTestArgs(ArgsManager& argsman)
void SetupCommonTestArgs(ArgsManager& argsman)
{
argsman.AddArg("-testdatadir", strprintf("Custom data directory (default: %s<random_string>)", fs::PathToString(fs::temp_directory_path() / TEST_DIR_PATH_ELEMENT / "")),
ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
Expand Down Expand Up @@ -127,7 +126,7 @@ BasicTestingSetup::BasicTestingSetup(const ChainType chainType, TestOpts opts)
gArgs.ClearPathCache();
{
SetupServerArgs(*m_node.args);
SetupUnitTestArgs(*m_node.args);
SetupCommonTestArgs(*m_node.args);
std::string error;
if (!m_node.args->ParseParameters(arguments.size(), arguments.data(), error)) {
m_node.args->ClearArgs();
Expand Down
3 changes: 3 additions & 0 deletions src/test/util/setup_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ extern const std::function<std::string()> G_TEST_GET_FULL_NAME;

static constexpr CAmount CENT{1000000};

/** Register common test args. Shared across binaries that rely on the test framework. */
void SetupCommonTestArgs(ArgsManager& argsman);

struct TestOpts {
std::vector<const char*> extra_args{};
bool coins_db_in_memory{true};
Expand Down

0 comments on commit 4bbcc70

Please sign in to comment.