Line data Source code
1 : // Copyright (c) 2018-2020 The Bitcoin Core developers 2 : // Distributed under the MIT software license, see the accompanying 3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : 5 : #include <test/util/setup_common.h> 6 : #include <util/string.h> 7 : #include <util/threadnames.h> 8 : 9 : #include <mutex> 10 : #include <set> 11 : #include <thread> 12 : #include <vector> 13 : 14 : #if defined(HAVE_CONFIG_H) 15 : #include <config/bitcoin-config.h> 16 : #endif 17 : 18 : #include <boost/test/unit_test.hpp> 19 : 20 89 : BOOST_FIXTURE_TEST_SUITE(util_threadnames_tests, BasicTestingSetup) 21 : 22 89 : const std::string TEST_THREAD_NAME_BASE = "test_thread."; 23 : 24 : /** 25 : * Run a bunch of threads to all call util::ThreadRename. 26 : * 27 : * @return the set of name each thread has after attempted renaming. 28 : */ 29 1 : std::set<std::string> RenameEnMasse(int num_threads) 30 : { 31 1 : std::vector<std::thread> threads; 32 1 : std::set<std::string> names; 33 1 : std::mutex lock; 34 : 35 101 : auto RenameThisThread = [&](int i) { 36 100 : util::ThreadRename(TEST_THREAD_NAME_BASE + ToString(i)); 37 97 : std::lock_guard<std::mutex> guard(lock); 38 97 : names.insert(util::ThreadGetInternalName()); 39 100 : }; 40 : 41 101 : for (int i = 0; i < num_threads; ++i) { 42 100 : threads.push_back(std::thread(RenameThisThread, i)); 43 : } 44 : 45 101 : for (std::thread& thread : threads) thread.join(); 46 : 47 : return names; 48 1 : } 49 : 50 : /** 51 : * Rename a bunch of threads with the same basename (expect_multiple=true), ensuring suffixes are 52 : * applied properly. 53 : */ 54 95 : BOOST_AUTO_TEST_CASE(util_threadnames_test_rename_threaded) 55 : { 56 : #if !defined(HAVE_THREAD_LOCAL) 57 : // This test doesn't apply to platforms where we don't have thread_local. 58 : return; 59 : #endif 60 : 61 1 : std::set<std::string> names = RenameEnMasse(100); 62 : 63 1 : BOOST_CHECK_EQUAL(names.size(), 100U); 64 : 65 : // Names "test_thread.[n]" should exist for n = [0, 99] 66 101 : for (int i = 0; i < 100; ++i) { 67 100 : BOOST_CHECK(names.find(TEST_THREAD_NAME_BASE + ToString(i)) != names.end()); 68 : } 69 : 70 1 : } 71 : 72 89 : BOOST_AUTO_TEST_SUITE_END()