Skip to content

Commit

Permalink
gdb: allow specifying multiple filters when running selftests
Browse files Browse the repository at this point in the history
I found myself wanting to run a few specific selftests while developing.
I thought it would be nice to be able to provide multiple test names
when running `maintenant selftests`.  The arguments to that command is
currently interpreted as a single filter (not split by spaces), it now
becomes a list a filters, split by spaces.  A test is executed when it
matches at least one filter.

Here's an example of the result in GDB:

    (gdb) maintenance selftest xml
    Running selftest xml_escape_text.
    Running selftest xml_escape_text_append.
    Ran 2 unit tests, 0 failed
    (gdb) maintenance selftest xml unord
    Running selftest unordered_remove.
    Running selftest xml_escape_text.
    Running selftest xml_escape_text_append.
    Ran 3 unit tests, 0 failed
    (gdb) maintenance selftest xml unord foobar
    Running selftest unordered_remove.
    Running selftest xml_escape_text.
    Running selftest xml_escape_text_append.
    Ran 3 unit tests, 0 failed

Since the selftest machinery is also shared with gdbserver, I also
adapted gdbserver.  It accepts a `--selftest` switch, which accepts an
optional filter argument.  I made it so you can now pass `--selftest`
multiple time to add filters.

It's not so useful right now though: there's only a single selftest
right now in GDB and it's for an architecture I can't compile.  So I
tested by adding dummy tests, here's an example of the result:

    $ ./gdbserver --selftest=foo
    Running selftest foo.
    foo
    Running selftest foobar.
    foobar
    Ran 2 unit tests, 0 failed
    $ ./gdbserver --selftest=foo --selftest=bar
    Running selftest bar.
    bar
    Running selftest foo.
    foo
    Running selftest foobar.
    foobar
    Ran 3 unit tests, 0 failed

gdbsupport/ChangeLog:

	* selftest.h (run_tests): Change parameter to array_view.
	* selftest.c (run_tests): Change parameter to array_view and use
	it.

gdb/ChangeLog:

	* maint.c (maintenance_selftest): Split args and pass array_view
	to run_tests.

gdbserver/ChangeLog:

	* server.cc (captured_main): Accept multiple `--selftest=`
	options.  Pass all `--selftest=` arguments to run_tests.

Change-Id: I422bd49f08ea8095ae174c5d66a2dd502a59613a
  • Loading branch information
simark committed Aug 13, 2020
1 parent 8118fd4 commit ece5bc8
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 10 deletions.
5 changes: 5 additions & 0 deletions gdb/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2020-08-13 Simon Marchi <[email protected]>

* maint.c (maintenance_selftest): Split args and pass array_view
to run_tests.

2020-08-12 Luis Machado <[email protected]>

* value.c (check_type_length_before_alloc): Use ULONGEST to store a
Expand Down
3 changes: 2 additions & 1 deletion gdb/maint.c
Original file line number Diff line number Diff line change
Expand Up @@ -1041,7 +1041,8 @@ static void
maintenance_selftest (const char *args, int from_tty)
{
#if GDB_SELF_TEST
selftests::run_tests (args);
gdb_argv argv (args);
selftests::run_tests (gdb::array_view<char *> (argv.get (), argv.count ()));
#else
printf_filtered (_("\
Selftests have been disabled for this build.\n"));
Expand Down
5 changes: 5 additions & 0 deletions gdbserver/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2020-08-13 Simon Marchi <[email protected]>

* server.cc (captured_main): Accept multiple `--selftest=`
options. Pass all `--selftest=` arguments to run_tests.

2020-07-30 Rainer Orth <[email protected]>

* configure, config.in: Regenerate.
Expand Down
14 changes: 11 additions & 3 deletions gdbserver/server.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3610,7 +3610,7 @@ captured_main (int argc, char *argv[])
int was_running;
bool selftest = false;
#if GDB_SELF_TEST
const char *selftest_filter = NULL;
std::vector<const char *> selftest_filters;
#endif

current_directory = getcwd (NULL, 0);
Expand Down Expand Up @@ -3747,8 +3747,16 @@ captured_main (int argc, char *argv[])
else if (startswith (*next_arg, "--selftest="))
{
selftest = true;

#if GDB_SELF_TEST
selftest_filter = *next_arg + strlen ("--selftest=");
const char *filter = *next_arg + strlen ("--selftest=");
if (*filter == '\0')
{
fprintf (stderr, _("Error: selftest filter is empty.\n"));
exit (1);
}

selftest_filters.push_back (filter);
#endif
}
else
Expand Down Expand Up @@ -3825,7 +3833,7 @@ captured_main (int argc, char *argv[])
if (selftest)
{
#if GDB_SELF_TEST
selftests::run_tests (selftest_filter);
selftests::run_tests (selftest_filters);
#else
printf (_("Selftests have been disabled for this build.\n"));
#endif
Expand Down
6 changes: 6 additions & 0 deletions gdbsupport/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2020-08-13 Simon Marchi <[email protected]>

* selftest.h (run_tests): Change parameter to array_view.
* selftest.c (run_tests): Change parameter to array_view and use
it.

2020-07-30 Rainer Orth <[email protected]>

* Makefile.am (AM_CPPFLAGS): Add LARGEFILE_CPPFLAGS.
Expand Down
17 changes: 14 additions & 3 deletions gdbsupport/selftest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -68,17 +68,28 @@ register_test (const std::string &name, self_test_function *function)
/* See selftest.h. */

void
run_tests (const char *filter)
run_tests (gdb::array_view<const char *const> filters)
{
int ran = 0, failed = 0;

for (const auto &pair : tests)
{
const std::string &name = pair.first;
const std::unique_ptr<selftest> &test = pair.second;
bool run = false;

if (filter != NULL && *filter != '\0'
&& name.find (filter) == std::string::npos)
if (filters.empty ())
run = true;
else
{
for (const char *filter : filters)
{
if (name.find (filter) != std::string::npos)
run = true;
}
}

if (!run)
continue;

try
Expand Down
8 changes: 5 additions & 3 deletions gdbsupport/selftest.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
#ifndef COMMON_SELFTEST_H
#define COMMON_SELFTEST_H

#include "gdbsupport/array-view.h"

/* A test is just a function that does some checks and throws an
exception if something has gone wrong. */

Expand Down Expand Up @@ -47,10 +49,10 @@ extern void register_test (const std::string &name,
/* Run all the self tests. This print a message describing the number
of test and the number of failures.
If FILTER is not NULL and not empty, only tests with names containing FILTER
will be ran. */
If FILTERS is not empty, only run tests with names containing one of the
element of FILTERS. */

extern void run_tests (const char *filter);
extern void run_tests (gdb::array_view<const char *const> filters);

/* Reset GDB or GDBserver's internal state. */
extern void reset ();
Expand Down

0 comments on commit ece5bc8

Please sign in to comment.