From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from barracuda.ebox.ca (barracuda.ebox.ca [96.127.255.19]) by sourceware.org (Postfix) with ESMTPS id 4A9B23858D38 for ; Wed, 12 Aug 2020 22:13:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 4A9B23858D38 X-ASG-Debug-ID: 1597270375-0c856e18104c8470001-fS2M51 Received: from smtp.ebox.ca (smtp.ebox.ca [96.127.255.82]) by barracuda.ebox.ca with ESMTP id 7pnEBMiFQ5FwSeDx (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 12 Aug 2020 18:12:55 -0400 (EDT) X-Barracuda-Envelope-From: simon.marchi@polymtl.ca X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from simark.localdomain (173-246-6-90.qc.cable.ebox.net [173.246.6.90]) by smtp.ebox.ca (Postfix) with ESMTP id 52545441D8A; Wed, 12 Aug 2020 18:12:55 -0400 (EDT) From: Simon Marchi X-Barracuda-RBL-IP: 173.246.6.90 X-Barracuda-Effective-Source-IP: 173-246-6-90.qc.cable.ebox.net[173.246.6.90] X-Barracuda-Apparent-Source-IP: 173.246.6.90 To: gdb-patches@sourceware.org Subject: [PATCH] gdb: allow specifying multiple filters when running selftests Date: Wed, 12 Aug 2020 18:12:45 -0400 X-ASG-Orig-Subj: [PATCH] gdb: allow specifying multiple filters when running selftests Message-Id: <20200812221245.69493-1-simon.marchi@polymtl.ca> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtp.ebox.ca[96.127.255.82] X-Barracuda-Start-Time: 1597270375 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at ebox.ca X-Barracuda-Scan-Msg-Size: 6098 X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.83864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_QUARANTINE, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_SOFTFAIL, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 12 Aug 2020 22:13:11 -0000 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 (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 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 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 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 filters); /* Reset GDB or GDBserver's internal state. */ extern void reset (); -- 2.28.0