| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: tests/log/logtest.cpp
- // Purpose: wxLog unit test
- // Author: Vadim Zeitlin
- // Created: 2009-07-07
- // Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
- ///////////////////////////////////////////////////////////////////////////////
- // ----------------------------------------------------------------------------
- // headers
- // ----------------------------------------------------------------------------
- #include "testprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- #ifndef WX_PRECOMP
- #include "wx/log.h"
- #include "wx/filefn.h"
- #endif // WX_PRECOMP
- #include "wx/scopeguard.h"
- #if WXWIN_COMPATIBILITY_2_8
- // we override deprecated DoLog() and DoLogString() in this test, suppress
- // warnings about it
- #if wxCHECK_VISUALC_VERSION(7)
- #pragma warning(disable: 4996)
- #endif // VC++ 7+
- #endif // WXWIN_COMPATIBILITY_2_8
- // all calls to wxLogXXX() functions from this file will use this log component
- #define wxLOG_COMPONENT "test"
- // ----------------------------------------------------------------------------
- // test loggers
- // ----------------------------------------------------------------------------
- // base class for all test loggers which simply store all logged messages for
- // future examination in the test code
- class TestLogBase : public wxLog
- {
- public:
- TestLogBase() { }
- const wxString& GetLog(wxLogLevel level) const
- {
- return m_logs[level];
- }
- const wxLogRecordInfo& GetInfo(wxLogLevel level) const
- {
- return m_logsInfo[level];
- }
- void Clear()
- {
- for ( unsigned n = 0; n < WXSIZEOF(m_logs); n++ )
- {
- m_logs[n].clear();
- m_logsInfo[n] = wxLogRecordInfo();
- }
- }
- protected:
- wxString m_logs[wxLOG_Trace + 1];
- wxLogRecordInfo m_logsInfo[wxLOG_Trace + 1];
- wxDECLARE_NO_COPY_CLASS(TestLogBase);
- };
- // simple log sink which just stores the messages logged for each level
- class TestLog : public TestLogBase
- {
- public:
- TestLog() { }
- protected:
- virtual void DoLogRecord(wxLogLevel level,
- const wxString& msg,
- const wxLogRecordInfo& info)
- {
- m_logs[level] = msg;
- m_logsInfo[level] = info;
- }
- private:
- wxDECLARE_NO_COPY_CLASS(TestLog);
- };
- #if WXWIN_COMPATIBILITY_2_8
- // log sink overriding the old DoLogXXX() functions should still work too
- // this one overrides DoLog(char*)
- class CompatTestLog : public TestLogBase
- {
- public:
- CompatTestLog() { }
- protected:
- virtual void DoLog(wxLogLevel level, const char *str, time_t WXUNUSED(t))
- {
- m_logs[level] = str;
- }
- // get rid of the warning about hiding the other overload
- virtual void DoLog(wxLogLevel WXUNUSED(level),
- const wchar_t *WXUNUSED(str),
- time_t WXUNUSED(t))
- {
- }
- private:
- wxDECLARE_NO_COPY_CLASS(CompatTestLog);
- };
- // and this one overload DoLogString(wchar_t*)
- class CompatTestLog2 : public wxLog
- {
- public:
- CompatTestLog2() { }
- const wxString& Get() const { return m_msg; }
- protected:
- virtual void DoLogString(const wchar_t *msg, time_t WXUNUSED(t))
- {
- m_msg = msg;
- }
- // get rid of the warning
- virtual void DoLogString(const char *WXUNUSED(msg), time_t WXUNUSED(t))
- {
- }
- private:
- wxString m_msg;
- wxDECLARE_NO_COPY_CLASS(CompatTestLog2);
- };
- #endif // WXWIN_COMPATIBILITY_2_8
- // ----------------------------------------------------------------------------
- // test class
- // ----------------------------------------------------------------------------
- class LogTestCase : public CppUnit::TestCase
- {
- public:
- LogTestCase() { }
- virtual void setUp();
- virtual void tearDown();
- private:
- CPPUNIT_TEST_SUITE( LogTestCase );
- CPPUNIT_TEST( Functions );
- CPPUNIT_TEST( Null );
- CPPUNIT_TEST( Component );
- #if wxDEBUG_LEVEL
- CPPUNIT_TEST( Trace );
- #endif // wxDEBUG_LEVEL
- #if WXWIN_COMPATIBILITY_2_8
- CPPUNIT_TEST( CompatLogger );
- CPPUNIT_TEST( CompatLogger2 );
- #endif // WXWIN_COMPATIBILITY_2_8
- CPPUNIT_TEST( SysError );
- CPPUNIT_TEST( NoWarnings );
- CPPUNIT_TEST_SUITE_END();
- void Functions();
- void Null();
- void Component();
- #if wxDEBUG_LEVEL
- void Trace();
- #endif // wxDEBUG_LEVEL
- #if WXWIN_COMPATIBILITY_2_8
- void CompatLogger();
- void CompatLogger2();
- #endif // WXWIN_COMPATIBILITY_2_8
- void SysError();
- void NoWarnings();
- TestLog *m_log;
- wxLog *m_logOld;
- bool m_logWasEnabled;
- wxDECLARE_NO_COPY_CLASS(LogTestCase);
- };
- // register in the unnamed registry so that these tests are run by default
- CPPUNIT_TEST_SUITE_REGISTRATION( LogTestCase );
- // also include in its own registry so that these tests can be run alone
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( LogTestCase, "LogTestCase" );
- void LogTestCase::setUp()
- {
- m_logOld = wxLog::SetActiveTarget(m_log = new TestLog);
- m_logWasEnabled = wxLog::EnableLogging();
- }
- void LogTestCase::tearDown()
- {
- delete wxLog::SetActiveTarget(m_logOld);
- wxLog::EnableLogging(m_logWasEnabled);
- }
- void LogTestCase::Functions()
- {
- wxLogMessage("Message");
- CPPUNIT_ASSERT_EQUAL( "Message", m_log->GetLog(wxLOG_Message) );
- wxLogError("Error %d", 17);
- CPPUNIT_ASSERT_EQUAL( "Error 17", m_log->GetLog(wxLOG_Error) );
- wxLogDebug("Debug");
- #if wxDEBUG_LEVEL
- CPPUNIT_ASSERT_EQUAL( "Debug", m_log->GetLog(wxLOG_Debug) );
- #else
- CPPUNIT_ASSERT_EQUAL( "", m_log->GetLog(wxLOG_Debug) );
- #endif
- }
- void LogTestCase::Null()
- {
- {
- wxLogNull noLog;
- wxLogWarning("%s warning", "Not important");
- CPPUNIT_ASSERT_EQUAL( "", m_log->GetLog(wxLOG_Warning) );
- }
- wxLogWarning("%s warning", "Important");
- CPPUNIT_ASSERT_EQUAL( "Important warning", m_log->GetLog(wxLOG_Warning) );
- }
- void LogTestCase::Component()
- {
- wxLogMessage("Message");
- CPPUNIT_ASSERT_EQUAL( wxLOG_COMPONENT,
- m_log->GetInfo(wxLOG_Message).component );
- // completely disable logging for this component
- wxLog::SetComponentLevel("test/ignore", wxLOG_FatalError);
- // but enable it for one of its subcomponents
- wxLog::SetComponentLevel("test/ignore/not", wxLOG_Max);
- #undef wxLOG_COMPONENT
- #define wxLOG_COMPONENT "test/ignore"
- // this shouldn't be output as this component is ignored
- wxLogError("Error");
- CPPUNIT_ASSERT_EQUAL( "", m_log->GetLog(wxLOG_Error) );
- // and so are its subcomponents
- #undef wxLOG_COMPONENT
- #define wxLOG_COMPONENT "test/ignore/sub/subsub"
- wxLogError("Error");
- CPPUNIT_ASSERT_EQUAL( "", m_log->GetLog(wxLOG_Error) );
- // but one subcomponent is not
- #undef wxLOG_COMPONENT
- #define wxLOG_COMPONENT "test/ignore/not"
- wxLogError("Error");
- CPPUNIT_ASSERT_EQUAL( "Error", m_log->GetLog(wxLOG_Error) );
- // restore the original value
- #undef wxLOG_COMPONENT
- #define wxLOG_COMPONENT "test"
- }
- #if wxDEBUG_LEVEL
- namespace
- {
- const char *TEST_MASK = "test";
- // this is a test vararg function (a real one, not a variadic-template-like as
- // wxVLogTrace(), so care should be taken with its arguments)
- void TraceTest(const char *format, ...)
- {
- va_list argptr;
- va_start(argptr, format);
- wxVLogTrace(TEST_MASK, format, argptr);
- va_end(argptr);
- }
- } // anonymous namespace
- void LogTestCase::Trace()
- {
- // we use wxLogTrace() or wxVLogTrace() from inside TraceTest()
- // interchangeably here, it shouldn't make any difference
- wxLogTrace(TEST_MASK, "Not shown");
- CPPUNIT_ASSERT_EQUAL( "", m_log->GetLog(wxLOG_Trace) );
- wxLog::AddTraceMask(TEST_MASK);
- TraceTest("Shown");
- CPPUNIT_ASSERT_EQUAL( wxString::Format("(%s) Shown", TEST_MASK),
- m_log->GetLog(wxLOG_Trace) );
- wxLog::RemoveTraceMask(TEST_MASK);
- m_log->Clear();
- TraceTest("Not shown again");
- CPPUNIT_ASSERT_EQUAL( "", m_log->GetLog(wxLOG_Trace) );
- }
- #endif // wxDEBUG_LEVEL
- #if WXWIN_COMPATIBILITY_2_8
- void LogTestCase::CompatLogger()
- {
- CompatTestLog log;
- wxLog * const logOld = wxLog::SetActiveTarget(&log);
- wxON_BLOCK_EXIT1( wxLog::SetActiveTarget, logOld );
- wxLogError("Old error");
- CPPUNIT_ASSERT_EQUAL( "Old error", log.GetLog(wxLOG_Error) );
- }
- void LogTestCase::CompatLogger2()
- {
- CompatTestLog2 log;
- wxLog * const logOld = wxLog::SetActiveTarget(&log);
- wxON_BLOCK_EXIT1( wxLog::SetActiveTarget, logOld );
- wxLogWarning("Old warning");
- CPPUNIT_ASSERT_EQUAL( "Old warning", log.Get() );
- }
- #endif // WXWIN_COMPATIBILITY_2_8
- void LogTestCase::SysError()
- {
- wxString s;
- wxLogSysError(17, "Error");
- CPPUNIT_ASSERT( m_log->GetLog(wxLOG_Error).StartsWith("Error (", &s) );
- WX_ASSERT_MESSAGE( ("Error message is \"(%s\"", s), s.StartsWith("error 17") );
- // The last error code seems to be set somewhere in MinGW CRT as its value
- // is just not what we expect (ERROR_INVALID_PARAMETER instead of 0 and 0
- // instead of ERROR_FILE_NOT_FOUND) so exclude the tests which rely on last
- // error being preserved for this compiler.
- #ifndef __MINGW32__
- wxLogSysError("Success");
- CPPUNIT_ASSERT( m_log->GetLog(wxLOG_Error).StartsWith("Success (", &s) );
- WX_ASSERT_MESSAGE( ("Error message is \"(%s\"", s), s.StartsWith("error 0") );
- wxOpen("no-such-file", 0, 0);
- wxLogSysError("Not found");
- CPPUNIT_ASSERT( m_log->GetLog(wxLOG_Error).StartsWith("Not found (", &s) );
- WX_ASSERT_MESSAGE( ("Error message is \"(%s\"", s), s.StartsWith("error 2") );
- #endif // __MINGW32__
- }
- void LogTestCase::NoWarnings()
- {
- // Check that "else" branch is [not] taken as expected and that this code
- // compiles without warnings (which used to not be the case).
- bool b = wxFalse;
- if ( b )
- wxLogError("Not logged");
- else
- b = !b;
- CPPUNIT_ASSERT( b );
- if ( b )
- wxLogError("If");
- else
- CPPUNIT_FAIL("Should not be taken");
- CPPUNIT_ASSERT_EQUAL( "If", m_log->GetLog(wxLOG_Error) );
- }
|