C++ Library containing a lot of needful things: Stack Trace, Command Line Parser, Resource Handling, Configuration Files, Unix Command Execution, Directories, Regular Expressions, Tokenizer, Function Trace, Standard Extensions.
90 lines
3.8 KiB
90 lines
3.8 KiB
/** @file |
|
|
|
$Id$ |
|
|
|
$Date$ |
|
$Author$ |
|
|
|
@copy © Marc Wäckerlin |
|
@license LGPL, see file <a href="license.html">COPYING</a> |
|
|
|
1 2 3 4 5 6 7 8 |
|
5678901234567890123456789012345678901234567890123456789012345678901234567890 |
|
*/ |
|
|
|
#include <mrw/stacktrace.hxx> |
|
#include <cppunit/TestFixture.h> |
|
#include <cppunit/ui/text/TestRunner.h> |
|
#include <cppunit/extensions/HelperMacros.h> |
|
#include <cppunit/extensions/TestFactoryRegistry.h> |
|
#include <cppunit/XmlOutputter.h> |
|
#include <fstream> |
|
|
|
namespace mrw { |
|
class StackTraceTest: public CppUnit::TestFixture { |
|
public: |
|
/// test if symbols are correctely evaluated |
|
void StackTrace() { |
|
bool init(mrw::StackTrace::createSymtable()); |
|
CPPUNIT_ASSERT_MESSAGE("createSymtable() failed! ERROR=" |
|
+mrw::StackTrace::error(), |
|
init |
|
|| |
|
mrw::StackTrace::error().find("/valgrind/") |
|
!=std::string::npos); |
|
mrw::StackTrace s; int l(__LINE__); std::string f(__FILE__); |
|
std::stringstream ss; |
|
ss<<f<<':'<<l; |
|
std::string st(s); |
|
mrw::StackTrace::BinFiles files(mrw::StackTrace::filename()); |
|
std::string msg("----------------------------------------\n" |
|
"Stacktrace:\n-----------\n"+st+ |
|
"Files:\n------\n"); |
|
for (mrw::StackTrace::BinFiles::iterator it(files.begin()); |
|
it!=files.end(); ++it) |
|
msg += " - \""+it->first+"\"\n"; |
|
msg += "----------------------------------------\n"; |
|
std::string::size_type pos(st.find("mrw::StackTraceTest::StackTrace()")); |
|
CPPUNIT_ASSERT_MESSAGE("\"mrw::StackTraceTest::StackTrace()\"" |
|
" not found!\n"+msg, pos!=std::string::npos); |
|
CPPUNIT_ASSERT_MESSAGE('"'+ss.str()+"\" not found!\n"+msg, |
|
st.find(ss.str(), pos) < st.size()); |
|
CPPUNIT_ASSERT_MESSAGE("\"CppUnit::TestCaller<mrw::StackTraceTest>" |
|
"::runTest()\" not found!\n"+msg, |
|
st.find("CppUnit::TestCaller<mrw::StackTraceTest>" |
|
"::runTest()")<st.size()); |
|
// The following test case does not work any more! |
|
// Probable reason: The library has been stripped: |
|
// > nm /usr/lib/libcppunit-1.10.so.2.0.0 |
|
// nm: /usr/lib/libcppunit-1.10.so.2.0.0: no symbols |
|
// > file /usr/lib/libcppunit-1.10.so.2.0.0 |
|
// /usr/lib/libcppunit-1.10.so.2.0.0: |
|
// ELF 32-bit LSB shared object, Intel 80386, |
|
// version 1 (SYSV), stripped |
|
//CPPUNIT_ASSERT_MESSAGE("\"CppUnit::TestCase::run\" not found!\n"+msg, |
|
// st.find("CppUnit::TestCase::run")<st.size()); |
|
// The folowing test is probably wrong, because the syntax should be |
|
// different: |
|
// "???? ????:0" |
|
// Anyway, with the problem of stripped libraries, as above, it doesn't |
|
// pass anymore, if it is tested correctly... |
|
//CPPUNIT_ASSERT_MESSAGE("\"????:0 ????\" should not be in stack!\n"+msg, |
|
// st.find("????:0 ????")>=st.size()); |
|
} |
|
CPPUNIT_TEST_SUITE(StackTraceTest); |
|
CPPUNIT_TEST(StackTrace); |
|
CPPUNIT_TEST_SUITE_END(); |
|
}; |
|
CPPUNIT_TEST_SUITE_REGISTRATION(StackTraceTest); |
|
} |
|
|
|
int main(int argc, char** argv) try { |
|
std::ofstream ofs((*argv+std::string(".xml")).c_str()); |
|
CppUnit::TextUi::TestRunner runner; |
|
runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), ofs)); |
|
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); |
|
return runner.run() ? 0 : 1; |
|
} catch (std::exception& e) { |
|
std::cerr<<"***Exception: "<<e.what()<<std::endl; |
|
return 1; |
|
}
|
|
|