mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-30 12:44:10 +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;
|
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. */
|
/* See selftest.h. */
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -44,6 +49,14 @@ register_test (const std::string &name,
|
|||||||
|
|
||||||
/* See selftest.h. */
|
/* 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;
|
static bool run_verbose_ = false;
|
||||||
|
|
||||||
/* See selftest.h. */
|
/* See selftest.h. */
|
||||||
@ -104,6 +117,14 @@ run_tests (gdb::array_view<const char *const> filters, bool verbose)
|
|||||||
selftests_range
|
selftests_range
|
||||||
all_selftests ()
|
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 ());
|
return selftests_range (tests.cbegin (), tests.cend ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "gdbsupport/function-view.h"
|
#include "gdbsupport/function-view.h"
|
||||||
#include "gdbsupport/iterator-range.h"
|
#include "gdbsupport/iterator-range.h"
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
/* A test is just a function that does some checks and throws an
|
/* A test is just a function that does some checks and throws an
|
||||||
exception if something has gone wrong. */
|
exception if something has gone wrong. */
|
||||||
@ -61,6 +62,16 @@ extern bool run_verbose ();
|
|||||||
extern void register_test (const std::string &name,
|
extern void register_test (const std::string &name,
|
||||||
std::function<void(void)> function);
|
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
|
/* Run all the self tests. This print a message describing the number
|
||||||
of test and the number of failures.
|
of test and the number of failures.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user