From ece5bc8ac303ccf03dd066ce7e1cba3a12293e40 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 13 Aug 2020 07:55:48 -0400 Subject: gdb: allow specifying multiple filters when running selftests 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 --- gdbsupport/selftest.cc | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'gdbsupport/selftest.cc') diff --git a/gdbsupport/selftest.cc b/gdbsupport/selftest.cc index 8ab63be..2adb724 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 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 &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 -- cgit v1.1