From: Simon Marchi <simon.marchi@polymtl.ca>
To: gdb-patches@sourceware.org
Subject: [PATCH] gdb: allow specifying multiple filters when running selftests
Date: Wed, 12 Aug 2020 18:12:45 -0400 [thread overview]
Message-ID: <20200812221245.69493-1-simon.marchi@polymtl.ca> (raw)
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
---
gdb/maint.c | 3 ++-
gdbserver/server.cc | 14 +++++++++++---
gdbsupport/selftest.cc | 17 ++++++++++++++---
gdbsupport/selftest.h | 8 +++++---
4 files changed, 32 insertions(+), 10 deletions(-)
diff --git a/gdb/maint.c b/gdb/maint.c
index b4890c34cab9..fd37acce5226 100644
--- a/gdb/maint.c
+++ b/gdb/maint.c
@@ -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"));
diff --git a/gdbserver/server.cc b/gdbserver/server.cc
index aadcb9b5d30d..d45154d1f547 100644
--- a/gdbserver/server.cc
+++ b/gdbserver/server.cc
@@ -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);
@@ -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
@@ -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
diff --git a/gdbsupport/selftest.cc b/gdbsupport/selftest.cc
index 8ab63be31391..2adb7245571c 100644
--- a/gdbsupport/selftest.cc
+++ b/gdbsupport/selftest.cc
@@ -68,7 +68,7 @@ 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;
@@ -76,9 +76,20 @@ run_tests (const char *filter)
{
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
diff --git a/gdbsupport/selftest.h b/gdbsupport/selftest.h
index 1c47fe1448ba..e0086132f7b9 100644
--- a/gdbsupport/selftest.h
+++ b/gdbsupport/selftest.h
@@ -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. */
@@ -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 ();
--
2.28.0
next reply other threads:[~2020-08-12 22:13 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-12 22:12 Simon Marchi [this message]
2020-08-13 1:46 ` Kevin Buettner
2020-08-13 12:06 ` Simon Marchi
2020-08-13 14:06 ` Tom Tromey
2020-08-13 15:01 ` Simon Marchi
2020-08-13 16:12 ` Tom Tromey
2020-08-13 22:24 ` [PATCH] gdb: add gdb_argv::as_array_view method Simon Marchi
2020-08-14 15:33 ` Tom Tromey
2020-08-14 16:33 ` Simon Marchi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200812221245.69493-1-simon.marchi@polymtl.ca \
--to=simon.marchi@polymtl.ca \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox