diff options
Diffstat (limited to 'indra')
-rw-r--r-- | indra/llcommon/tests/llprocess_test.cpp | 74 | ||||
-rw-r--r-- | indra/llcommon/tests/wrapllerrs.h | 65 |
2 files changed, 71 insertions, 68 deletions
diff --git a/indra/llcommon/tests/llprocess_test.cpp b/indra/llcommon/tests/llprocess_test.cpp index 3537133a47..c07a9d3925 100644 --- a/indra/llcommon/tests/llprocess_test.cpp +++ b/indra/llcommon/tests/llprocess_test.cpp @@ -35,7 +35,7 @@ #include "stringize.h" #include "llsdutil.h" #include "llevents.h" -#include "llerrorcontrol.h" +#include "wrapllerrs.h" #if defined(LL_WINDOWS) #define sleep(secs) _sleep((secs) * 1000) @@ -233,68 +233,6 @@ private: std::string mPath; }; -// statically reference the function in test.cpp... it's short, we could -// replicate, but better to reuse -extern void wouldHaveCrashed(const std::string& message); - -/** - * Capture log messages. This is adapted (simplified) from the one in - * llerror_test.cpp. Sigh, should've broken that out into a separate header - * file, but time for this project is short... - */ -class TestRecorder : public LLError::Recorder -{ -public: - TestRecorder(): - // Mostly what we're trying to accomplish by saving and resetting - // LLError::Settings is to bypass the default RecordToStderr and - // RecordToWinDebug Recorders. As these are visible only inside - // llerror.cpp, we can't just call LLError::removeRecorder() with - // each. For certain tests we need to produce, capture and examine - // DEBUG log messages -- but we don't want to spam the user's console - // with that output. If it turns out that saveAndResetSettings() has - // some bad effect, give up and just let the DEBUG level log messages - // display. - mOldSettings(LLError::saveAndResetSettings()) - { - LLError::setFatalFunction(wouldHaveCrashed); - LLError::setDefaultLevel(LLError::LEVEL_DEBUG); - LLError::addRecorder(this); - } - - ~TestRecorder() - { - LLError::removeRecorder(this); - LLError::restoreSettings(mOldSettings); - } - - void recordMessage(LLError::ELevel level, - const std::string& message) - { - mMessages.push_back(message); - } - - /// Don't assume the message we want is necessarily the LAST log message - /// emitted by the underlying code; search backwards through all messages - /// for the sought string. - std::string messageWith(const std::string& search) - { - for (std::list<std::string>::const_reverse_iterator rmi(mMessages.rbegin()), - rmend(mMessages.rend()); - rmi != rmend; ++rmi) - { - if (rmi->find(search) != std::string::npos) - return *rmi; - } - // failed to find any such message - return std::string(); - } - - typedef std::list<std::string> MessageList; - MessageList mMessages; - LLError::Settings* mOldSettings; -}; - /***************************************************************************** * TUT *****************************************************************************/ @@ -843,7 +781,7 @@ namespace tut void object::test<10>() { set_test_name("'bogus' test"); - TestRecorder recorder; + CaptureLog recorder; PythonProcessLauncher py(get_test_name(), "print 'Hello world'\n"); py.mParams.files.add(LLProcess::FileParam("bogus")); @@ -874,7 +812,7 @@ namespace tut set_test_name("'tpipe' test"); // Replace this test with one or more real 'tpipe' tests when we // implement 'tpipe' support - TestRecorder recorder; + CaptureLog recorder; PythonProcessLauncher py(get_test_name(), "print 'Hello world'\n"); py.mParams.files.add(LLProcess::FileParam()); @@ -892,7 +830,7 @@ namespace tut set_test_name("'npipe' test"); // Replace this test with one or more real 'npipe' tests when we // implement 'npipe' support - TestRecorder recorder; + CaptureLog recorder; PythonProcessLauncher py(get_test_name(), "print 'Hello world'\n"); py.mParams.files.add(LLProcess::FileParam()); @@ -909,7 +847,7 @@ namespace tut void object::test<14>() { set_test_name("internal pipe name warning"); - TestRecorder recorder; + CaptureLog recorder; PythonProcessLauncher py(get_test_name(), "import sys\n" "sys.exit(7)\n"); @@ -965,7 +903,7 @@ namespace tut #define EXPECT_FAIL_WITH_LOG(EXPECT, CODE) \ do \ { \ - TestRecorder recorder; \ + CaptureLog recorder; \ ensure(#CODE " succeeded", ! (CODE)); \ ensure("wrong log message", ! recorder.messageWith(EXPECT).empty()); \ } while (0) diff --git a/indra/llcommon/tests/wrapllerrs.h b/indra/llcommon/tests/wrapllerrs.h index ffda84729b..a61f8451b3 100644 --- a/indra/llcommon/tests/wrapllerrs.h +++ b/indra/llcommon/tests/wrapllerrs.h @@ -30,6 +30,14 @@ #define LL_WRAPLLERRS_H #include "llerrorcontrol.h" +#include <boost/bind.hpp> +#include <list> +#include <string> +#include <stdexcept> + +// statically reference the function in test.cpp... it's short, we could +// replicate, but better to reuse +extern void wouldHaveCrashed(const std::string& message); struct WrapLL_ERRS { @@ -70,4 +78,61 @@ struct WrapLL_ERRS LLError::FatalFunction mPriorFatal; }; +/** + * Capture log messages. This is adapted (simplified) from the one in + * llerror_test.cpp. + */ +class CaptureLog : public LLError::Recorder +{ +public: + CaptureLog(): + // Mostly what we're trying to accomplish by saving and resetting + // LLError::Settings is to bypass the default RecordToStderr and + // RecordToWinDebug Recorders. As these are visible only inside + // llerror.cpp, we can't just call LLError::removeRecorder() with + // each. For certain tests we need to produce, capture and examine + // DEBUG log messages -- but we don't want to spam the user's console + // with that output. If it turns out that saveAndResetSettings() has + // some bad effect, give up and just let the DEBUG level log messages + // display. + mOldSettings(LLError::saveAndResetSettings()) + { + LLError::setFatalFunction(wouldHaveCrashed); + LLError::setDefaultLevel(LLError::LEVEL_DEBUG); + LLError::addRecorder(this); + } + + ~CaptureLog() + { + LLError::removeRecorder(this); + LLError::restoreSettings(mOldSettings); + } + + void recordMessage(LLError::ELevel level, + const std::string& message) + { + mMessages.push_back(message); + } + + /// Don't assume the message we want is necessarily the LAST log message + /// emitted by the underlying code; search backwards through all messages + /// for the sought string. + std::string messageWith(const std::string& search) + { + for (std::list<std::string>::const_reverse_iterator rmi(mMessages.rbegin()), + rmend(mMessages.rend()); + rmi != rmend; ++rmi) + { + if (rmi->find(search) != std::string::npos) + return *rmi; + } + // failed to find any such message + return std::string(); + } + + typedef std::list<std::string> MessageList; + MessageList mMessages; + LLError::Settings* mOldSettings; +}; + #endif /* ! defined(LL_WRAPLLERRS_H) */ |