mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-18 12:24:38 +08:00
gdbsupport/selftest: Allow lazy registration
This patch adds a way to delay the registration of tests until the latest possible moment. This is intended for situations where GDB needs to be fully initialized in order to decide if a particular selftest can be executed or not. This mechanism will be used in the next patch. Change-Id: I7f6b061f4c0a6832226c7080ab4e3a2523e1b0b0
This commit is contained in:
parent
c57207c15c
commit
9a0f7f634e
@ -30,6 +30,11 @@ namespace selftests
|
||||
|
||||
static selftests_registry tests;
|
||||
|
||||
/* Set of callback functions used to register selftests after GDB is fully
|
||||
initialized. */
|
||||
|
||||
static std::vector<selftests_generator> lazy_generators;
|
||||
|
||||
/* See selftest.h. */
|
||||
|
||||
void
|
||||
@ -44,6 +49,14 @@ register_test (const std::string &name,
|
||||
|
||||
/* See selftest.h. */
|
||||
|
||||
void
|
||||
add_lazy_generator (selftests_generator generator)
|
||||
{
|
||||
lazy_generators.push_back (std::move (generator));
|
||||
}
|
||||
|
||||
/* See selftest.h. */
|
||||
|
||||
static bool run_verbose_ = false;
|
||||
|
||||
/* See selftest.h. */
|
||||
@ -104,6 +117,14 @@ run_tests (gdb::array_view<const char *const> filters, bool verbose)
|
||||
selftests_range
|
||||
all_selftests ()
|
||||
{
|
||||
/* Execute any function which might still want to register tests. Once each
|
||||
function has been executed, clear lazy_generators to ensure that
|
||||
callback functions are only executed once. */
|
||||
for (const auto &generator : lazy_generators)
|
||||
for (selftest &test : generator ())
|
||||
register_test (std::move (test.name), std::move (test.test));
|
||||
lazy_generators.clear ();
|
||||
|
||||
return selftests_range (tests.cbegin (), tests.cend ());
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "gdbsupport/function-view.h"
|
||||
#include "gdbsupport/iterator-range.h"
|
||||
#include <set>
|
||||
#include <vector>
|
||||
|
||||
/* A test is just a function that does some checks and throws an
|
||||
exception if something has gone wrong. */
|
||||
@ -61,6 +62,16 @@ extern bool run_verbose ();
|
||||
extern void register_test (const std::string &name,
|
||||
std::function<void(void)> function);
|
||||
|
||||
/* A selftest generator is a callback function used to delay the generation
|
||||
of selftests. */
|
||||
|
||||
using selftests_generator = std::function<std::vector<selftest> (void)>;
|
||||
|
||||
/* Register a function which can lazily register selftests once GDB is fully
|
||||
initialized. */
|
||||
|
||||
extern void add_lazy_generator (selftests_generator generator);
|
||||
|
||||
/* Run all the self tests. This print a message describing the number
|
||||
of test and the number of failures.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user