1/* GDB self-testing. 2 Copyright (C) 2016-2020 Free Software Foundation, Inc. 3 4 This file is part of GDB. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 18 19#include "common-defs.h" 20#include "common-exceptions.h" 21#include "common-debug.h" 22#include "selftest.h" 23#include <map> 24 25namespace selftests 26{ 27/* All the tests that have been registered. Using an std::map allows keeping 28 the order of tests stable and easily looking up whether a test name 29 exists. */ 30 31static std::map<std::string, std::unique_ptr<selftest>> tests; 32 33/* A selftest that calls the test function without arguments. */ 34 35struct simple_selftest : public selftest 36{ 37 simple_selftest (self_test_function *function_) 38 : function (function_) 39 {} 40 41 void operator() () const override 42 { 43 function (); 44 } 45 46 self_test_function *function; 47}; 48 49/* See selftest.h. */ 50 51void 52register_test (const std::string &name, selftest *test) 53{ 54 /* Check that no test with this name already exist. */ 55 gdb_assert (tests.find (name) == tests.end ()); 56 57 tests[name] = std::unique_ptr<selftest> (test); 58} 59 60/* See selftest.h. */ 61 62void 63register_test (const std::string &name, self_test_function *function) 64{ 65 register_test (name, new simple_selftest (function)); 66} 67 68/* See selftest.h. */ 69 70void 71run_tests (gdb::array_view<const char *const> filters) 72{ 73 int ran = 0, failed = 0; 74 75 for (const auto &pair : tests) 76 { 77 const std::string &name = pair.first; 78 const std::unique_ptr<selftest> &test = pair.second; 79 bool run = false; 80 81 if (filters.empty ()) 82 run = true; 83 else 84 { 85 for (const char *filter : filters) 86 { 87 if (name.find (filter) != std::string::npos) 88 run = true; 89 } 90 } 91 92 if (!run) 93 continue; 94 95 try 96 { 97 debug_printf (_("Running selftest %s.\n"), name.c_str ()); 98 ++ran; 99 (*test) (); 100 } 101 catch (const gdb_exception_error &ex) 102 { 103 ++failed; 104 debug_printf ("Self test failed: %s\n", ex.what ()); 105 } 106 107 reset (); 108 } 109 110 debug_printf (_("Ran %d unit tests, %d failed\n"), 111 ran, failed); 112} 113 114/* See selftest.h. */ 115 116void for_each_selftest (for_each_selftest_ftype func) 117{ 118 for (const auto &pair : tests) 119 func (pair.first); 120} 121 122} // namespace selftests 123