Branch data Line data Source code
1 : : // Copyright (c) 2019-2021 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/logging.h> 6 : : 7 : : #include <logging.h> 8 : : #include <noui.h> 9 : : #include <tinyformat.h> 10 : : #include <util/check.h> 11 : : 12 : : #include <iostream> 13 : : #include <stdexcept> 14 : : 15 : 0 : DebugLogHelper::DebugLogHelper(std::string message, MatchFn match, std::optional<std::chrono::milliseconds> timeout) 16 : 0 : : m_message{std::move(message)}, m_timeout{timeout}, m_match(std::move(match)) 17 : : { 18 : 0 : m_print_connection = LogInstance().PushBackCallback( 19 : 0 : [this](const std::string& s) { 20 : 0 : StdLockGuard lock{m_mutex}; 21 : 0 : if (!m_found) { 22 : 0 : if (s.find(m_message) != std::string::npos && m_match(&s)) { 23 : 0 : m_found = true; 24 : 0 : m_cv.notify_all(); 25 : 0 : } 26 : 0 : } 27 : 0 : }); 28 : 0 : noui_test_redirect(); 29 : 0 : m_receiving_log = true; 30 : 0 : } 31 : : 32 : 0 : DebugLogHelper::~DebugLogHelper() 33 : : { 34 : : { 35 : 0 : StdUniqueLock lock{m_mutex}; 36 : 0 : if (m_timeout.has_value()) { 37 : 0 : m_cv.wait_for(lock, m_timeout.value(), [this]() EXCLUSIVE_LOCKS_REQUIRED(m_mutex) { return m_found; }); 38 : 0 : } 39 : 0 : } 40 : 0 : StopReceivingLog(); 41 : 0 : if (!m_found && m_match(nullptr)) { 42 : 0 : std::cerr << "Fatal error: expected message not found in the debug log: " << m_message << "\n"; 43 : 0 : std::abort(); 44 : : } 45 : 0 : } 46 : : 47 : 0 : void DebugLogHelper::StopReceivingLog() 48 : : { 49 : 0 : if (m_receiving_log) { 50 : 0 : noui_reconnect(); 51 : 0 : LogInstance().DeleteCallback(m_print_connection); 52 : 0 : m_receiving_log = false; 53 : 0 : } 54 : 0 : }