diff options
Diffstat (limited to 'indra/llcommon')
| -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) */ | 
