Line data Source code
1 : // Copyright (c) 2006-2023 Made to Order Software Corp. All Rights Reserved 2 : // 3 : // https://snapwebsites.org/project/libaddr 4 : // contact@m2osw.com 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 2 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 along 17 : // with this program; if not, write to the Free Software Foundation, Inc., 18 : // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 : 20 : // self 21 : // 22 : #include "catch_main.h" 23 : 24 : 25 : // cppthread 26 : // 27 : #include <cppthread/log.h> 28 : 29 : 30 : // libexcept 31 : // 32 : #include <libexcept/exception.h> 33 : 34 : 35 : // last include 36 : // 37 : #include <snapdev/poison.h> 38 : 39 : 40 : 41 : 42 : namespace SNAP_CATCH2_NAMESPACE 43 : { 44 : 45 : 46 : 47 : namespace 48 : { 49 : 50 : std::vector<std::string> g_expected_logs = std::vector<std::string>(); 51 : 52 : } 53 : // no name namespace 54 : 55 : 56 : 57 23 : void push_expected_log(std::string const & message) 58 : { 59 23 : g_expected_logs.push_back(message); 60 23 : } 61 : 62 : 63 23 : void log_for_test(cppthread::log_level_t level, std::string const & message) 64 : { 65 23 : if(SNAP_CATCH2_NAMESPACE::g_verbose() 66 23 : || g_expected_logs.empty()) 67 : { 68 : std::cerr << "logger sent:\n" 69 0 : << cppthread::to_string(level) 70 : << ": " 71 0 : << message 72 0 : << std::endl; 73 : } 74 : 75 : // at this time it's impossible to debug the location of the empty 76 : // problem without a proper stack trace... 77 : // 78 23 : if(g_expected_logs.empty()) 79 : { 80 0 : libexcept::stack_trace_t trace(libexcept::collect_stack_trace_with_line_numbers()); 81 0 : std::cerr << "*** STACK TRACE ***" << std::endl; 82 0 : for(auto const & l : trace) 83 : { 84 0 : std::cerr << l << std::endl; 85 : } 86 0 : std::cerr << "***" << std::endl; 87 0 : } 88 : 89 23 : CATCH_REQUIRE_FALSE(g_expected_logs.empty()); 90 : 91 23 : std::stringstream ss; 92 23 : ss << cppthread::to_string(level) << ": " << message; 93 : 94 : // again, the REQUIRE() is not going to be useful in terms of line number 95 : // 96 23 : if(g_expected_logs[0] != ss.str()) 97 : { 98 0 : libexcept::stack_trace_t trace(libexcept::collect_stack_trace_with_line_numbers()); 99 0 : std::cerr << "*** STACK TRACE ***" << std::endl; 100 0 : for(auto const & l : trace) 101 : { 102 0 : std::cerr << l << std::endl; 103 : } 104 0 : std::cerr << "***" << std::endl; 105 0 : } 106 : 107 23 : std::string expected_msg(g_expected_logs[0]); 108 23 : g_expected_logs.erase(g_expected_logs.begin()); 109 : 110 23 : CATCH_REQUIRE(expected_msg == ss.str()); 111 46 : } 112 : 113 : 114 24 : void expected_logs_stack_is_empty() 115 : { 116 24 : if(!g_expected_logs.empty()) 117 : { 118 0 : std::cerr << "List of expected error logs which did not occur:" << std::endl; 119 0 : for(auto l : g_expected_logs) 120 : { 121 0 : std::cerr << " " << l << std::endl; 122 0 : } 123 0 : g_expected_logs.clear(); 124 0 : throw std::logic_error("a test left an unexpected error message in the g_expected_logs vector."); 125 : } 126 : 127 24 : cppthread::log.reset_counters(); 128 24 : } 129 : 130 : 131 : } // SNAP_CATCH2_NAMESPACE namespace 132 : // vim: ts=4 sw=4 et