From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 65106 invoked by alias); 5 Sep 2017 11:51:01 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 65068 invoked by uid 89); 5 Sep 2017 11:50:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3 autolearn=ham version=3.3.2 spammy=1065, associates, 1066 X-HELO: sesbmg22.ericsson.net Received: from sesbmg22.ericsson.net (HELO sesbmg22.ericsson.net) (193.180.251.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 05 Sep 2017 11:50:52 +0000 Received: from ESESSHC007.ericsson.se (Unknown_Domain [153.88.183.39]) by sesbmg22.ericsson.net (Symantec Mail Security) with SMTP id E7.E8.22679.89F8EA95; Tue, 5 Sep 2017 13:50:49 +0200 (CEST) Received: from EUR01-VE1-obe.outbound.protection.outlook.com (153.88.183.145) by oa.msg.ericsson.com (153.88.183.39) with Microsoft SMTP Server (TLS) id 14.3.352.0; Tue, 5 Sep 2017 13:50:37 +0200 Received: from elxacz23q12.ki.sw.ericsson.se (192.176.1.81) by AM3PR07MB307.eurprd07.prod.outlook.com (2a01:111:e400:881b::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.35.3; Tue, 5 Sep 2017 11:50:35 +0000 From: Simon Marchi To: CC: Simon Marchi Subject: [PATCH] Add selftests run filtering Date: Tue, 05 Sep 2017 11:51:00 -0000 Message-ID: <1504612227-7159-1-git-send-email-simon.marchi@ericsson.com> MIME-Version: 1.0 Content-Type: text/plain X-ClientProxiedBy: HE1PR05CA0211.eurprd05.prod.outlook.com (2603:10a6:3:fa::11) To AM3PR07MB307.eurprd07.prod.outlook.com (2a01:111:e400:881b::15) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 948a9adf-8284-48ce-9d63-08d4f454521b X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:AM3PR07MB307; X-Microsoft-Exchange-Diagnostics: 1;AM3PR07MB307;3:zRS4Tyqk1YDvppujFpOUypESYt6Pr7+WH2a154m2CknYW4XjyV3G5fpYSbbKSSGuVKpENM5K2gG2IhhUn2sZJGbKTS+swrQ8DotUkyIFGLs0HdJUuk3jGx+JvXx0f4gszOa5lZI+Y9IFvjxhq1+AaysIyaWK8WTg+if8ncsKMi/0798AKOqPkHNtxAC95KtdputD+2QGvth9BEWme94yqxpYSYiiqn4Eb5WutBh0AILjtiakVGLV6U9B6x/sftMr;25:qKo6NhaR1HLgLbB3zJ7deDJ47WL03zKtdYqSoNQ0dJHxZhG9gJQrb4xlBzABelAz8VvW9o/K5gS21c+bGpTH0IUWS0Nzq5vUkN5mK6gbhtStTQJitdXWGkXbWcAFFVSaXv9dlYz/a30Ao8G6GFrLPoQEcskoEq1ybO4O9yDmr6B/qu1TFl+II11TBfLLPU2PWZjQYyEy2k0WWkd+B2fX/qP4Tz6CC150hydLHBdUyl3PK3Dpww+B+H5jU+X4HDIxXNZFNYiAT+HCStlJRoRo89IkFvLMdljWMHkljQ/9fJ8hF8BNohjg4rW3xCxx2yVUWHPcChs3JNOcrxNmV6RWBA==;31:PxnJUEooZBB2b8wZgWXtjmny7DTKrvSy+fuZ0F8vHRUaUrfHctYJTEPPlR78C7R/xwTbF8AtQHnCeq0aFL2FimcFaHM6pV4cgq2qSLBh9wuCt6Psf6RtvEWMkVu5HLO6D2Dvs2VhZNzZjKPvFIOKfWmIWeG/dOlp+F6IXX3xTZITOHmklb0JLCvihY0c8W1GrYISh1mgRIbGbQb/p8GPXk2Bqqkp6wlv978FVWj0fLw= X-MS-TrafficTypeDiagnostic: AM3PR07MB307: X-Microsoft-Exchange-Diagnostics: 1;AM3PR07MB307;20:naZyDNRmpnLe+wadiY8lEASCVB4AAiThA7N1z1O10vXRHXjsnArCUXTQgQ+/ZpRT465gcS5439l4pZ2gAUiZXbs1fJZ9T+23G1mHMXCQWGgdHy/aShZtY9tfsc6fLX3OlGfzYF4e2x17rt6dp7x2/cZ1HZoPvjBvbpPUkx18x16l/bliUDAwyPJc0xczj0f9OVu4xeq1KyDiOcqpiAz4AgiUpQ6kPqZ02K6khssEumN0zWOk+kwh6+3KCSJ7yTa9JVaV5G17G5QnX7AKixFzq9PIMnHTt645jSG9ncI3CPsCtqgs7GOU+1tb8kEvGrMkTByi3ZwlaLP56DypaI8Z9YMeXdJaYMIOydTNDYy+6vJtPbBm6rqI26UrSHPuccJUzULaQyinKCkfNLga7XvzTLvLw3lwnhezwrdwM3/T/Sgu4b9amCSgObmX13dmYNqYnu9c5Fv6tpQ39s0XaRj2G1tcGQd/DQNUK50Oq+Z+sB3l0VCGKl2ZS+g0e1jAIXN2;4:3Oe+73kdeaQjIE+M+qqhjjdJcpWWhz2amIZjII/w7ZiM+u7uLyIyN/hWefIxS5g6muj7SMaOFGmqkMCIL9nNXjaRTOvUbi0BPv6GHe6nyswSs9a54+D0nNTr8/WphjShDR/1rBICiW3Zsm754V01KuIDulspuShaXes7LztLCer5PGU7Ba8uhNE9naT8ea9rf5HI8THtj9/WxRa8SXT3eozVij2NJSTLuvd/v7XPVvw6/QEYDF1HrpUQeFh8e9oF X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(10201501046)(3002001)(100000703101)(100105400095)(93006095)(93001095)(6041248)(20161123558100)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123562025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:AM3PR07MB307;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:AM3PR07MB307; X-Forefront-PRVS: 0421BF7135 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(7370300001)(6009001)(39860400002)(54534003)(199003)(189002)(81166006)(8676002)(478600001)(3846002)(6116002)(68736007)(110136004)(81156014)(33646002)(2361001)(2906002)(6506006)(107886003)(105586002)(106356001)(6486002)(2351001)(50226002)(25786009)(4326008)(7736002)(5890100001)(575784001)(7350300001)(86362001)(305945005)(97736004)(6512007)(101416001)(66066001)(189998001)(47776003)(5003940100001)(50986999)(53936002)(50466002)(36756003)(42186005)(48376002)(6666003)(6916009)(5660300001);DIR:OUT;SFP:1101;SCL:1;SRVR:AM3PR07MB307;H:elxacz23q12.ki.sw.ericsson.se;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; Received-SPF: None (protection.outlook.com: ericsson.com does not designate permitted sender hosts) Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=simon.marchi@ericsson.com; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM3PR07MB307;23:tUtb4MzI9sLL2KZjMJwg0ooz18uVDUss9EaYXc0pTc?= =?us-ascii?Q?/ZMAgdNIrIBMFJMUjnZ2uRzAAxThw+bqrPBpUQxmUdF5Qx/Wk5Ne1c+fJrdc?= =?us-ascii?Q?EHN80a/YD4JdG2Aai878J5SCFIoa/qw7AmPGGUARjLaDpJRzQwW/pPZ78qX4?= =?us-ascii?Q?/Wh3tSTAsrQ761mZwb2hrq35mWCJ2nBn9RwHEIguE9lUz3RIDO2WDl90Hpem?= =?us-ascii?Q?gTXjzne2HGc7S/9WRQwhuaSkzMlZbqaLPhtvtg+9+X2ecBbyI3I+BFQeJYYi?= =?us-ascii?Q?UdjL8hCsJ/jjN8A19WRVelccQfdbRLwLR0cGVEeXAsK6R9XdI68N96CeQhfQ?= =?us-ascii?Q?wThRaLLYyyn5kR5IrYQuDAbw/Dqa1yULn+9D5iUArEQ/qQbYXe/frNXTWeYE?= =?us-ascii?Q?/n2OXKJx90r+4Y2coONBPXZoBHaatPi2BaIfsm0NLn+hCCJa+SC48/SsmPbk?= =?us-ascii?Q?nbKRaVrt8oTOwn8sk5YqgezegUDyDrnWyvk2KVyXJ8d8zKTlH3lMkPKvy/t2?= =?us-ascii?Q?9dOtA0pCfpGG8H8Ln+TAQmza2+fgYZyjQ52nzg+pd2tQDu5xyXivJW76Z1Xg?= =?us-ascii?Q?CKPa1jCGkQJxBp9M7vJ2NeMqROr4xTZ64/GO9xPZCZF9YatXLO5bTCuc+7w3?= =?us-ascii?Q?NqDlAfD4zJP2sUozsplAeJtvu56jDUuNvKOCcji8t3vBUBbcAjg1dCvkzBCw?= =?us-ascii?Q?+FAWDCQoIi8P93OeQ71B8ZLjIZtQRKDeQsMTXekWckjxmt42hcQ7sD09irM0?= =?us-ascii?Q?mU1wgW9gTewPF9IpmOGvVZLkfJx30WrtBypia2jUf+nf3W2fZANcvQQVeZYG?= =?us-ascii?Q?IySN9aczvQlD0plT4TJE3FwfR7p6Kt3y91a1dvdv86rtuwkq2Dkr/h32aQte?= =?us-ascii?Q?u3JP3lfrv4QQHOBhgaIjNKli3i+PCeZWjX/s6TUYL/MXu/dhanTFc2sQSro4?= =?us-ascii?Q?BHajAZMzBmu+TolmRIHr4XtIFI0mhEXTiIhVNFTbnPWf3QE99rlBYF6rtJKC?= =?us-ascii?Q?vE+CwKqeHJOPBCzM+LObVbWF8gYxxaLL+rnKo4JvnZW0kw0WiC9UsjAT12lL?= =?us-ascii?Q?3onp0AHIbj7bsSaN+awwAIxC5wE3Ml2xRsyVFVhk4AlZIqjilk2euAFMIlRl?= =?us-ascii?Q?fMTBulXTxQ8++nj3jTkt53mjQ4krA21Zlw9WiGk/wpKeEAHuJTc3bvXhz+er?= =?us-ascii?Q?VyznCpC1VbZd86g5IpoyDux8xdDyF1h0lY?= X-Microsoft-Exchange-Diagnostics: 1;AM3PR07MB307;6:s93nKZ8ls1cctF8Raj1asqdxwuKFT2BaVkKqQVo6qAd0i8Y6tFf+WOmfYOEJp6He5TFYLVdfwV0vIVHLZd2pX9CdKETe+h3E9deaB6IFs5CiDTcw26+Lz6BYkEbMRI2NNcAD2B6a2ZbvE3yCZ2OIuaXbUj3az0BPbCBxXTSbl14snNNiZVMwMXTyw4MP/EdobosbP9Mj/5wfmQmaW0wIsL7iFz9tGsanKa1e+dh1TcScavdUAGG58t49DCfmV5v2gb3xSiUJKIqhDj3EPJK58NcGVPu9DCr89Ws2ivuTeirtUE3fb3mkGLUb1v+8IMGsiayN9tvM/Ex4quNHwktrpw==;5:X1dQFCyy68ES1jzo/CaRMW2F+brEdG4eR+c84XnQA0TcVBsJ8q6FjROVj7OFNqeACE2Yg3K7AIdiUlGJ1fx8w3ONBFPNqjdamaVQkVpPjCbyG2aFEITaGx7pFRg5jk6B9bIdy5HOl0+NvtHsyqzKmg==;24:dlH18khCOuLiJK63G2i4uy81DhMSq/dB0Sm+cj/m7R/8RIBbRxCfW2twOowpHFmrLayV13ZlBiYnP+TRntpqeVbgt/zozdy2NXzAumpQCLE=;7:CaQkRMXa8MZ3k9GaINGXJOnhW3USt0ebzRaU6QqbnOgXbtj6q3JFM9DXo6JKZZygXBkCeEP6WJUjE1a1BdC5e2So73ZoY/NxRKMppQpoxKNV3Ze4xtFIK1LHRGNfYwzvkQ7RukFXvzXrgZC5ecg27TEAl9ehsE8nnps4DoKTKI1g4bUqLvV7jjjfvjDzfqgm36HL9iWHqAeZg01DnhsqpuJ6cOF8P/io+fSBnY8LPvQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Sep 2017 11:50:35.6335 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR07MB307 X-OriginatorOrg: ericsson.com X-IsSubscribed: yes X-SW-Source: 2017-09/txt/msg00087.txt.bz2 With the growing number of selftests, I think it would be useful to be able to run only a subset of the tests. This patch associates a name to each registered selftest. It then allows doing something like: (gdb) maintenance selftest aarch64 Running self-tests. Running selftest aarch64-analyze-prologue. Running selftest aarch64-process-record. Ran 2 unit tests, 0 failed which will only run the tests that contain "aarch64" in their name. To help validate that the tests you want to run were actually ran, it also prints a message with the test name before running each test. Right now, the arch-dependent tests are registered as a single test of the selftests. To be able to filter those too, I made them completely separate. run_tests and run_tests_with_arch now return their results, and maintenance_selftest takes care of printing the combined results. There aren't many selftests in gdbserver yet, but it wasn't too hard to make it accept a filter too. It can be given with --selftest=FILTER. gdb/ChangeLog: * common/selftest.h (struct selftests_results): New struct. (register_test): Add name parameter. (run_tests): Add filter parameter. * common/selftest.c (tests): Change type to std::map. (register_test): Add name parameter and use it. (run_tests): Add filter parameter and use it. Add prints. Adjust to vector -> map change. Return results. * aarch64-tdep.c (_initialize_aarch64_tdep): Add names when registering selftests. * arm-tdep.c (_initialize_arm_tdep): Likewise. * disasm-selftests.c (_initialize_disasm_selftests): Likewise. * dwarf2-frame.c (_initialize_dwarf2_frame): Likewise. * dwarf2loc.c (_initialize_dwarf2loc): Likewise. * findvar.c (_initialize_findvar): Likewise. * gdbarch-selftests.c (_initialize_gdbarch_selftests): Likewise. * maint.c: Include "selftest-arch.h". (maintenance_selftest): Call run_tests_with_arch. Print results. * regcache.c (_initialize_regcache): Add names when registering selftests. * rust-exp.y (_initialize_rust_exp): Likewise. * selftest-arch.c: Include . (gdbarch_tests): Change type to std::map. (register_test_foreach_arch): Add name parameter and use it. (run_tests_with_arch): Add filter parameter and use it. Add prints. Adjust to vector -> map change. Return results. (_initialize_selftests_foreach_arch): Remove. * selftest-arch.h (register_test_foreach_arch): Add name parameter. (run_tests_with_arch): New declaration. * utils-selftests.c (_initialize_utils_selftests): Add names when registering selftests. * utils.c (_initialize_utils): Likewise. * unittests/array-view-selftests.c (_initialize_array_view_selftests): Likewise. * unittests/environ-selftests.c (_initialize_environ_selftests): Likewise. * unittests/function-view-selftests.c (_initialize_function_view_selftests): Likewise. * unittests/offset-type-selftests.c (_initialize_offset_type_selftests): Likewise. * unittests/optional-selftests.c (_initialize_optional_selftests): Likewise. * unittests/scoped_restore-selftests.c (_initialize_scoped_restore_selftests): Likewise. gdb/gdbserver/ChangeLog: * server.c (captured_main): Accept argument for --selftest. Update run_tests call, print test results. * linux-x86-tdesc-selftest.c (initialize_low_tdesc): Add names when registering selftests. --- gdb/aarch64-tdep.c | 6 +++-- gdb/arm-tdep.c | 2 +- gdb/common/selftest.c | 32 ++++++++++++++--------- gdb/common/selftest.h | 19 +++++++++++--- gdb/disasm-selftests.c | 6 +++-- gdb/dwarf2-frame.c | 3 ++- gdb/dwarf2loc.c | 2 +- gdb/findvar.c | 4 ++- gdb/gdbarch-selftests.c | 3 ++- gdb/gdbserver/linux-x86-tdesc-selftest.c | 4 +-- gdb/gdbserver/server.c | 15 ++++++++++- gdb/maint.c | 8 +++++- gdb/regcache.c | 3 ++- gdb/rust-exp.y | 2 +- gdb/selftest-arch.c | 44 +++++++++++++++++--------------- gdb/selftest-arch.h | 10 +++++++- gdb/unittests/array-view-selftests.c | 3 ++- gdb/unittests/environ-selftests.c | 3 ++- gdb/unittests/function-view-selftests.c | 3 ++- gdb/unittests/offset-type-selftests.c | 2 +- gdb/unittests/optional-selftests.c | 2 +- gdb/unittests/scoped_restore-selftests.c | 3 ++- gdb/utils-selftests.c | 2 +- gdb/utils.c | 2 +- 24 files changed, 122 insertions(+), 61 deletions(-) diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 5a627a3..ebd3e47 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -3068,8 +3068,10 @@ When on, AArch64 specific debugging is enabled."), &setdebuglist, &showdebuglist); #if GDB_SELF_TEST - selftests::register_test (selftests::aarch64_analyze_prologue_test); - selftests::register_test (selftests::aarch64_process_record_test); + selftests::register_test ("aarch64-analyze-prologue", + selftests::aarch64_analyze_prologue_test); + selftests::register_test ("aarch64-process-record", + selftests::aarch64_process_record_test); #endif } diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 0c1a0b3..751ee27 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -9727,7 +9727,7 @@ vfp - VFP co-processor."), &setdebuglist, &showdebuglist); #if GDB_SELF_TEST - selftests::register_test (selftests::arm_record_test); + selftests::register_test ("arm-record", selftests::arm_record_test); #endif } diff --git a/gdb/common/selftest.c b/gdb/common/selftest.c index 0fb8f2a..ac34977 100644 --- a/gdb/common/selftest.c +++ b/gdb/common/selftest.c @@ -20,39 +20,48 @@ #include "common-exceptions.h" #include "common-debug.h" #include "selftest.h" -#include +#include namespace selftests { /* All the tests that have been registered. */ -static std::vector tests; +static std::map tests; /* See selftest.h. */ void -register_test (self_test_function *function) +register_test (const std::string &name, self_test_function *function) { - tests.push_back (function); + /* Make sure we don't already have a test with this name. */ + gdb_assert (tests.find (name) == tests.end ()); + + tests[name] = function; } /* See selftest.h. */ -void -run_tests (void) +selftests_results +run_tests (const char *filter) { - int failed = 0; + selftests_results results; - for (int i = 0; i < tests.size (); ++i) + for (const auto &test : tests) { + if (filter != NULL && *filter != '\0' + && test.first.find (filter) == std::string::npos) + continue; + TRY { - tests[i] (); + debug_printf (_("Running selftest %s.\n"), test.first.c_str ()); + results.ran++; + test.second (); } CATCH (ex, RETURN_MASK_ERROR) { - ++failed; + results.failed++; debug_printf ("Self test failed: %s\n", ex.message); } END_CATCH @@ -60,7 +69,6 @@ run_tests (void) reset (); } - debug_printf ("Ran %lu unit tests, %d failed\n", - (long) tests.size (), failed); + return results; } } // namespace selftests diff --git a/gdb/common/selftest.h b/gdb/common/selftest.h index e211c34..ece5da2 100644 --- a/gdb/common/selftest.h +++ b/gdb/common/selftest.h @@ -26,15 +26,26 @@ typedef void self_test_function (void); namespace selftests { +struct selftests_results +{ + /* Number of test cases executed. */ + int ran = 0; + + /* Number of test cases that failed. */ + int failed = 0; +}; /* Register a new self-test. */ -extern void register_test (self_test_function *function); +extern void register_test (const std::string &name, + self_test_function *function); + +/* Run all the architecture-agnostic self tests. -/* 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. */ -extern void run_tests (void); +extern selftests_results run_tests (const char *filter); /* Reset GDB or GDBserver's internal state. */ extern void reset (); diff --git a/gdb/disasm-selftests.c b/gdb/disasm-selftests.c index 4d38ccf..b8ef381 100644 --- a/gdb/disasm-selftests.c +++ b/gdb/disasm-selftests.c @@ -214,7 +214,9 @@ void _initialize_disasm_selftests (void) { #if GDB_SELF_TEST - selftests::register_test_foreach_arch (selftests::print_one_insn_test); - selftests::register_test_foreach_arch (selftests::memory_error_test); + selftests::register_test_foreach_arch ("print_one_insn", + selftests::print_one_insn_test); + selftests::register_test_foreach_arch ("memory_error", + selftests::memory_error_test); #endif } diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index aaf3aee..268ecda 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -2406,6 +2406,7 @@ _initialize_dwarf2_frame (void) dwarf2_frame_objfile_data = register_objfile_data (); #if GDB_SELF_TEST - selftests::register_test_foreach_arch (selftests::execute_cfa_program_test); + selftests::register_test_foreach_arch ("execute_cfa_program", + selftests::execute_cfa_program_test); #endif } diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 1a1b06a..6dd962d 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -4687,6 +4687,6 @@ _initialize_dwarf2loc (void) &setdebuglist, &showdebuglist); #if GDB_SELF_TEST - selftests::register_test (selftests::copy_bitwise_tests); + selftests::register_test ("copy_bitwise", selftests::copy_bitwise_tests); #endif } diff --git a/gdb/findvar.c b/gdb/findvar.c index de6b6ed..0787e74 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -1095,6 +1095,8 @@ void _initialize_findvar (void) { #if GDB_SELF_TEST - selftests::register_test (selftests::findvar_tests::copy_integer_to_size_test); + selftests::register_test ( + "copy_integer_to_size", + selftests::findvar_tests::copy_integer_to_size_test); #endif } diff --git a/gdb/gdbarch-selftests.c b/gdb/gdbarch-selftests.c index cb15964..f0b8d5d 100644 --- a/gdb/gdbarch-selftests.c +++ b/gdb/gdbarch-selftests.c @@ -151,6 +151,7 @@ void _initialize_gdbarch_selftests (void) { #if GDB_SELF_TEST - selftests::register_test_foreach_arch (selftests::register_to_value_test); + selftests::register_test_foreach_arch ("register_to_value", + selftests::register_to_value_test); #endif } diff --git a/gdb/gdbserver/linux-x86-tdesc-selftest.c b/gdb/gdbserver/linux-x86-tdesc-selftest.c index aa5a8e9..c5ab2ab 100644 --- a/gdb/gdbserver/linux-x86-tdesc-selftest.c +++ b/gdb/gdbserver/linux-x86-tdesc-selftest.c @@ -164,7 +164,7 @@ initialize_low_tdesc () init_registers_i386_avx_avx512_linux (); init_registers_i386_avx_mpx_avx512_pku_linux (); - selftests::register_test (selftests::tdesc::i386_tdesc_test); + selftests::register_test ("i386-tdesc", selftests::tdesc::i386_tdesc_test); #ifdef __x86_64__ init_registers_x32_linux (); @@ -178,6 +178,6 @@ initialize_low_tdesc () init_registers_amd64_avx_avx512_linux (); init_registers_amd64_avx_mpx_avx512_pku_linux (); - selftests::register_test (selftests::tdesc::amd64_tdesc_test); + selftests::register_test ("amd64-tdesc", selftests::tdesc::amd64_tdesc_test); #endif } diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 56c6393..c0a62c4 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -3587,6 +3587,7 @@ captured_main (int argc, char *argv[]) volatile int attach = 0; int was_running; bool selftest = false; + const char *selftest_filter = NULL; while (*next_arg != NULL && **next_arg == '-') { @@ -3707,6 +3708,11 @@ captured_main (int argc, char *argv[]) run_once = 1; else if (strcmp (*next_arg, "--selftest") == 0) selftest = true; + else if (startswith (*next_arg, "--selftest=")) + { + selftest = true; + selftest_filter = *next_arg + strlen ("--selftest="); + } else { fprintf (stderr, "Unknown argument: %s\n", *next_arg); @@ -3783,7 +3789,14 @@ captured_main (int argc, char *argv[]) if (selftest) { - selftests::run_tests (); + debug_printf (_("Running self-tests.\n")); + + selftests::selftests_results results + = selftests::run_tests (selftest_filter); + + debug_printf (_("Ran %d unit tests, %d failed\n"), + results.ran, results.failed); + throw_quit ("Quit"); } diff --git a/gdb/maint.c b/gdb/maint.c index 28f7287..e1eeb52 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -39,6 +39,7 @@ #include "top.h" #include "maint.h" #include "selftest.h" +#include "selftest-arch.h" #include "cli/cli-decode.h" #include "cli/cli-utils.h" @@ -959,7 +960,12 @@ show_per_command_cmd (char *args, int from_tty) static void maintenance_selftest (char *args, int from_tty) { - selftests::run_tests (); + selftests::selftests_results results_noarch = selftests::run_tests (args); + selftests::selftests_results results_arch = selftests::run_tests_with_arch (args); + + printf_filtered (_("Ran %d unit tests, %d failed\n"), + results_noarch.ran + results_arch.ran, + results_noarch.failed + results_arch.failed); } diff --git a/gdb/regcache.c b/gdb/regcache.c index dcbcedd..9e20b67 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -1775,7 +1775,8 @@ Print the internal register configuration including each register's\n\ remote register number and buffer offset in the g/G packets.\n\ Takes an optional file parameter."), &maintenanceprintlist); + #if GDB_SELF_TEST - selftests::register_test (selftests::current_regcache_test); + selftests::register_test ("current_regcache", selftests::current_regcache_test); #endif } diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y index 4cb3aa2..34070ee 100644 --- a/gdb/rust-exp.y +++ b/gdb/rust-exp.y @@ -2781,6 +2781,6 @@ _initialize_rust_exp (void) gdb_assert (code == 0); #if GDB_SELF_TEST - selftests::register_test (rust_lex_tests); + selftests::register_test ("rust-lex", rust_lex_tests); #endif } diff --git a/gdb/selftest-arch.c b/gdb/selftest-arch.c index 9a19f76..e6459cc 100644 --- a/gdb/selftest-arch.c +++ b/gdb/selftest-arch.c @@ -22,15 +22,20 @@ #include "selftest.h" #include "selftest-arch.h" #include "arch-utils.h" +#include namespace selftests { -static std::vector gdbarch_tests; +static std::map gdbarch_tests; void -register_test_foreach_arch (self_test_foreach_arch_function *function) +register_test_foreach_arch (const std::string &name, + self_test_foreach_arch_function *function) { - gdbarch_tests.push_back (function); + /* Make sure we don't already have a test with this name. */ + gdb_assert (gdbarch_tests.find (name) == gdbarch_tests.end ()); + + gdbarch_tests[name] = function; } void @@ -41,13 +46,17 @@ reset () reinit_frame_cache (); } -static void -tests_with_arch () +selftests_results +run_tests_with_arch (const char *filter) { - int failed = 0; + selftests_results results; - for (const auto &f : gdbarch_tests) + for (const auto &test : gdbarch_tests) { + if (filter != NULL && *filter != '\0' + && test.first.find (filter) == std::string::npos) + continue; + const char **arches = gdbarch_printable_names (); for (int i = 0; arches[i] != NULL; i++) @@ -80,11 +89,15 @@ tests_with_arch () struct gdbarch *gdbarch = gdbarch_find_by_info (info); SELF_CHECK (gdbarch != NULL); - f (gdbarch); + + printf_unfiltered (_("Running selftest %s for arch %s.\n"), + test.first.c_str (), arches[i]); + results.ran++; + test.second (gdbarch); } CATCH (ex, RETURN_MASK_ERROR) { - ++failed; + results.failed++; exception_fprintf (gdb_stderr, ex, _("Self test failed: arch %s: "), arches[i]); } @@ -94,19 +107,8 @@ tests_with_arch () } } - SELF_CHECK (failed == 0); + return results; } } // namespace selftests #endif /* GDB_SELF_TEST */ - -/* Suppress warning from -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_selftests_foreach_arch; - -void -_initialize_selftests_foreach_arch () -{ -#if GDB_SELF_TEST - selftests::register_test (selftests::tests_with_arch); -#endif -} diff --git a/gdb/selftest-arch.h b/gdb/selftest-arch.h index dc16c4d..e42eb86 100644 --- a/gdb/selftest-arch.h +++ b/gdb/selftest-arch.h @@ -24,7 +24,15 @@ typedef void self_test_foreach_arch_function (struct gdbarch *); namespace selftests { extern void - register_test_foreach_arch (self_test_foreach_arch_function *function); + register_test_foreach_arch (const std::string &name, + self_test_foreach_arch_function *function); + +/* Run all the architecture-dependent self tests. + + If FILTER is not NULL and not empty, only tests with names containing FILTER + will be ran. */ + +extern selftests_results run_tests_with_arch (const char *filter); } #endif /* SELFTEST_ARCH_H */ diff --git a/gdb/unittests/array-view-selftests.c b/gdb/unittests/array-view-selftests.c index e5c0043..f618c40 100644 --- a/gdb/unittests/array-view-selftests.c +++ b/gdb/unittests/array-view-selftests.c @@ -491,5 +491,6 @@ run_tests () void _initialize_array_view_selftests () { - selftests::register_test (selftests::array_view_tests::run_tests); + selftests::register_test ("array_view", + selftests::array_view_tests::run_tests); } diff --git a/gdb/unittests/environ-selftests.c b/gdb/unittests/environ-selftests.c index 81a71ee..f770901 100644 --- a/gdb/unittests/environ-selftests.c +++ b/gdb/unittests/environ-selftests.c @@ -301,5 +301,6 @@ run_tests () void _initialize_environ_selftests () { - selftests::register_test (selftests::gdb_environ_tests::run_tests); + selftests::register_test ("gdb_environ", + selftests::gdb_environ_tests::run_tests); } diff --git a/gdb/unittests/function-view-selftests.c b/gdb/unittests/function-view-selftests.c index d3018ba..a899299 100644 --- a/gdb/unittests/function-view-selftests.c +++ b/gdb/unittests/function-view-selftests.c @@ -174,5 +174,6 @@ run_tests () void _initialize_function_view_selftests () { - selftests::register_test (selftests::function_view::run_tests); + selftests::register_test ("function_view", + selftests::function_view::run_tests); } diff --git a/gdb/unittests/offset-type-selftests.c b/gdb/unittests/offset-type-selftests.c index 3e66547..5176f20 100644 --- a/gdb/unittests/offset-type-selftests.c +++ b/gdb/unittests/offset-type-selftests.c @@ -174,5 +174,5 @@ run_tests () void _initialize_offset_type_selftests () { - selftests::register_test (selftests::offset_type::run_tests); + selftests::register_test ("offset_type", selftests::offset_type::run_tests); } diff --git a/gdb/unittests/optional-selftests.c b/gdb/unittests/optional-selftests.c index 0bcf964..8ea19bb 100644 --- a/gdb/unittests/optional-selftests.c +++ b/gdb/unittests/optional-selftests.c @@ -90,5 +90,5 @@ run_tests () void _initialize_optional_selftests () { - selftests::register_test (selftests::optional::run_tests); + selftests::register_test ("optional", selftests::optional::run_tests); } diff --git a/gdb/unittests/scoped_restore-selftests.c b/gdb/unittests/scoped_restore-selftests.c index ea7492b..bc9aa2b 100644 --- a/gdb/unittests/scoped_restore-selftests.c +++ b/gdb/unittests/scoped_restore-selftests.c @@ -106,5 +106,6 @@ run_tests () void _initialize_scoped_restore_selftests () { - selftests::register_test (selftests::scoped_restore_tests::run_tests); + selftests::register_test ("scoped_restore", + selftests::scoped_restore_tests::run_tests); } diff --git a/gdb/utils-selftests.c b/gdb/utils-selftests.c index 08feac6..5a30a93 100644 --- a/gdb/utils-selftests.c +++ b/gdb/utils-selftests.c @@ -55,6 +55,6 @@ void _initialize_utils_selftests (void) { #if GDB_SELF_TEST - selftests::register_test (selftests::common_utils_tests); + selftests::register_test ("common-utils", selftests::common_utils_tests); #endif } diff --git a/gdb/utils.c b/gdb/utils.c index af50cf0..c67dc90 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -3307,6 +3307,6 @@ _initialize_utils (void) add_internal_problem_command (&demangler_warning_problem); #if GDB_SELF_TEST - selftests::register_test (gdb_realpath_tests); + selftests::register_test ("gdb_realpath", gdb_realpath_tests); #endif } -- 2.7.4